llvm-project/clang/test/Sema/attr-ms-forceinline.cpp
Trung Nguyen 9dc1da6e87
[clang] Add support for MSVC force inline attrs (#185282)
Add support for `[[msvc::forceinline]]` and
`[[msvc::forceinline_calls]]`.

`[[msvc::forceinline]]` is equivalent to Microsoft's `__forceinline`
when placed before a function declaration.
Unlike `__forceinline`, `[[msvc::forceinline]]` works with lambdas.

`[[msvc::forceinline_calls]]` is simliar to `[[clang::always_inline]]`
but only works on statements.

Both are implemented as aliases of `[[clang::always_inline]]` with
special checks.

Fixes #186539.
2026-04-02 16:42:26 +02:00

39 lines
1.5 KiB
C++

// RUN: %clang_cc1 -verify=ms-ext -fms-extensions -fsyntax-only -std=c++23 %s
// RUN: %clang_cc1 -verify=no-ms-ext -fsyntax-only -std=c++23 %s
void foo();
[[msvc::forceinline]] void func() {}
// no-ms-ext-warning@-1 {{'msvc::forceinline' attribute ignored}}
void lambda_func() {
auto l = [] [[msvc::forceinline]] () {};
// no-ms-ext-warning@-1 {{'msvc::forceinline' attribute ignored}}
l();
}
void stmt_forceinline() {
[[msvc::forceinline]] func();
// ms-ext-warning@-1 {{attribute is ignored on this statement as it only applies to functions; use '[[msvc::forceinline_calls]]' on statements}}
// no-ms-ext-warning@-2 {{'msvc::forceinline' attribute ignored}}
}
[[msvc::forceinline_calls]] void func2() {}
// ms-ext-warning@-1 {{attribute is ignored on this function as it only applies to statements; use '[[msvc::forceinline]]' for functions}}
// no-ms-ext-warning@-2 {{'msvc::forceinline_calls' attribute ignored}}
void stmt_forceinline_calls() {
[[msvc::forceinline_calls]] foo();
// no-ms-ext-warning@-1 {{'msvc::forceinline_calls' attribute ignored}}
}
[[msvc::forceinline(0)]] void func3();
// ms-ext-error@-1 {{'msvc::forceinline' attribute takes no arguments}}
// no-ms-ext-error@-2 {{'msvc::forceinline' attribute takes no arguments}}
void func4() {
[[msvc::forceinline_calls("foo")]] foo();
// ms-ext-error@-1 {{'msvc::forceinline_calls' attribute takes no arguments}}
// no-ms-ext-error@-2 {{'msvc::forceinline_calls' attribute takes no arguments}}
}