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.
39 lines
1.5 KiB
C++
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}}
|
|
}
|