| // RUN: %clang_cc1 -verify=ms-ext -fms-extensions -fsyntax-only -std=c23 %s | |
| // RUN: %clang_cc1 -verify=no-ms-ext -fsyntax-only -std=c23 %s | |
| void foo(void); | |
| [[msvc::forceinline]] void func(void) {} | |
| // no-ms-ext-warning@-1 {{'msvc::forceinline' attribute ignored}} | |
| void stmt_forceinline(void) { | |
| [[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(void) {} | |
| // 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(void) { | |
| [[msvc::forceinline_calls]] foo(); | |
| // no-ms-ext-warning@-1 {{'msvc::forceinline_calls' attribute ignored}} | |
| } | |
| [[msvc::forceinline(0)]] void func3(void); | |
| // ms-ext-error@-1 {{'msvc::forceinline' attribute takes no arguments}} | |
| // no-ms-ext-error@-2 {{'msvc::forceinline' attribute takes no arguments}} | |
| void func4(void) { | |
| [[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}} | |
| } |