1fa52674aSReid Kleckner // RUN: %clang_cc1 -triple i386-unknown-unknown -fms-compatibility -std=c++11 -E -P %s -o - | FileCheck %s --check-prefixes=CHECK,ITANIUM --implicit-check-not=:
2fa52674aSReid Kleckner // RUN: %clang_cc1 -triple i386-windows -fms-compatibility -std=c++11 -E -P %s -o - | FileCheck %s --check-prefixes=CHECK,WINDOWS --implicit-check-not=:
3a0344c5dSAaron Ballman 
45050a8daSRichard Smith #define CXX11(x) x: __has_cpp_attribute(x)
5a0344c5dSAaron Ballman 
65050a8daSRichard Smith // CHECK: clang::fallthrough: 201603L
75050a8daSRichard Smith CXX11(clang::fallthrough)
8a0344c5dSAaron Ballman 
95050a8daSRichard Smith // CHECK: selectany: 0
105050a8daSRichard Smith CXX11(selectany)
11a0344c5dSAaron Ballman 
12a0344c5dSAaron Ballman // The attribute name can be bracketed with double underscores.
135050a8daSRichard Smith // CHECK: clang::__fallthrough__: 201603L
145050a8daSRichard Smith CXX11(clang::__fallthrough__)
15a0344c5dSAaron Ballman 
16c44c1742SAaron Ballman // The scope cannot be bracketed with double underscores unless it is
17c44c1742SAaron Ballman // for gnu or clang.
185050a8daSRichard Smith // CHECK: __gsl__::suppress: 0
195050a8daSRichard Smith CXX11(__gsl__::suppress)
20c44c1742SAaron Ballman 
215050a8daSRichard Smith // CHECK: _Clang::fallthrough: 201603L
225050a8daSRichard Smith CXX11(_Clang::fallthrough)
23c44c1742SAaron Ballman 
242ed4573eSAaron Ballman // CHECK: __nodiscard__: 201907L
252ed4573eSAaron Ballman CXX11(__nodiscard__)
262ed4573eSAaron Ballman 
275050a8daSRichard Smith // CHECK: __gnu__::__const__: 1
285050a8daSRichard Smith CXX11(__gnu__::__const__)
29a0344c5dSAaron Ballman 
30a0344c5dSAaron Ballman // Test that C++11, target-specific attributes behave properly.
31a0344c5dSAaron Ballman 
325050a8daSRichard Smith // CHECK: gnu::mips16: 0
335050a8daSRichard Smith CXX11(gnu::mips16)
34a0344c5dSAaron Ballman 
355050a8daSRichard Smith // Test for standard attributes as listed in C++2a [cpp.cond] paragraph 6.
36a0344c5dSAaron Ballman 
375050a8daSRichard Smith CXX11(assert)
385050a8daSRichard Smith CXX11(carries_dependency)
395050a8daSRichard Smith CXX11(deprecated)
405050a8daSRichard Smith CXX11(ensures)
415050a8daSRichard Smith CXX11(expects)
425050a8daSRichard Smith CXX11(fallthrough)
435050a8daSRichard Smith CXX11(likely)
445050a8daSRichard Smith CXX11(maybe_unused)
455050a8daSRichard Smith CXX11(no_unique_address)
465050a8daSRichard Smith CXX11(nodiscard)
475050a8daSRichard Smith CXX11(noreturn)
485050a8daSRichard Smith CXX11(unlikely)
495050a8daSRichard Smith // FIXME(201806L) CHECK: assert: 0
505050a8daSRichard Smith // CHECK: carries_dependency: 200809L
515050a8daSRichard Smith // CHECK: deprecated: 201309L
525050a8daSRichard Smith // FIXME(201806L) CHECK: ensures: 0
535050a8daSRichard Smith // FIXME(201806L) CHECK: expects: 0
545050a8daSRichard Smith // CHECK: fallthrough: 201603L
552bcda6bbSMark de Wever // CHECK: likely: 201803L
565050a8daSRichard Smith // CHECK: maybe_unused: 201603L
575050a8daSRichard Smith // ITANIUM: no_unique_address: 201803L
585050a8daSRichard Smith // WINDOWS: no_unique_address: 0
5946441fdbSErich Keane // CHECK: nodiscard: 201907L
605050a8daSRichard Smith // CHECK: noreturn: 200809L
612bcda6bbSMark de Wever // CHECK: unlikely: 201803L
62a0344c5dSAaron Ballman 
63*2edb89c7SAaron Ballman namespace PR48462 {
64*2edb89c7SAaron Ballman // Test that macro expansion of the builtin argument works.
65*2edb89c7SAaron Ballman #define C clang
66*2edb89c7SAaron Ballman #define F fallthrough
67*2edb89c7SAaron Ballman #define CF clang::fallthrough
68*2edb89c7SAaron Ballman 
69*2edb89c7SAaron Ballman #if __has_cpp_attribute(F)
70*2edb89c7SAaron Ballman int has_fallthrough;
71*2edb89c7SAaron Ballman #endif
72*2edb89c7SAaron Ballman // CHECK: int has_fallthrough;
73*2edb89c7SAaron Ballman 
74*2edb89c7SAaron Ballman #if __has_cpp_attribute(C::F)
75*2edb89c7SAaron Ballman int has_clang_falthrough_1;
76*2edb89c7SAaron Ballman #endif
77*2edb89c7SAaron Ballman // CHECK: int has_clang_falthrough_1;
78*2edb89c7SAaron Ballman 
79*2edb89c7SAaron Ballman #if __has_cpp_attribute(clang::F)
80*2edb89c7SAaron Ballman int has_clang_falthrough_2;
81*2edb89c7SAaron Ballman #endif
82*2edb89c7SAaron Ballman // CHECK: int has_clang_falthrough_2;
83*2edb89c7SAaron Ballman 
84*2edb89c7SAaron Ballman #if __has_cpp_attribute(C::fallthrough)
85*2edb89c7SAaron Ballman int has_clang_falthrough_3;
86*2edb89c7SAaron Ballman #endif
87*2edb89c7SAaron Ballman // CHECK: int has_clang_falthrough_3;
88*2edb89c7SAaron Ballman 
89*2edb89c7SAaron Ballman #if __has_cpp_attribute(CF)
90*2edb89c7SAaron Ballman int has_clang_falthrough_4;
91*2edb89c7SAaron Ballman #endif
92*2edb89c7SAaron Ballman // CHECK: int has_clang_falthrough_4;
93*2edb89c7SAaron Ballman 
94*2edb89c7SAaron Ballman #define FUNCLIKE1(x) clang::x
95*2edb89c7SAaron Ballman #if __has_cpp_attribute(FUNCLIKE1(fallthrough))
96*2edb89c7SAaron Ballman int funclike_1;
97*2edb89c7SAaron Ballman #endif
98*2edb89c7SAaron Ballman // CHECK: int funclike_1;
99*2edb89c7SAaron Ballman 
100*2edb89c7SAaron Ballman #define FUNCLIKE2(x) _Clang::x
101*2edb89c7SAaron Ballman #if __has_cpp_attribute(FUNCLIKE2(fallthrough))
102*2edb89c7SAaron Ballman int funclike_2;
103*2edb89c7SAaron Ballman #endif
104*2edb89c7SAaron Ballman // CHECK: int funclike_2;
105*2edb89c7SAaron Ballman }
106*2edb89c7SAaron Ballman 
1075050a8daSRichard Smith // Test for Microsoft __declspec attributes
108a0344c5dSAaron Ballman 
1095050a8daSRichard Smith #define DECLSPEC(x) x: __has_declspec_attribute(x)
1103c0f9b4aSAaron Ballman 
1115050a8daSRichard Smith // CHECK: uuid: 1
1125050a8daSRichard Smith // CHECK: __uuid__: 1
1135050a8daSRichard Smith DECLSPEC(uuid)
1145050a8daSRichard Smith DECLSPEC(__uuid__)
115d5d796ecSRichard Smith 
1165050a8daSRichard Smith // CHECK: fallthrough: 0
1175050a8daSRichard Smith DECLSPEC(fallthrough)
118*2edb89c7SAaron Ballman 
119*2edb89c7SAaron Ballman namespace PR48462 {
120*2edb89c7SAaron Ballman // Test that macro expansion of the builtin argument works.
121*2edb89c7SAaron Ballman #define U uuid
122*2edb89c7SAaron Ballman 
123*2edb89c7SAaron Ballman #if __has_declspec_attribute(U)
124*2edb89c7SAaron Ballman int has_uuid;
125*2edb89c7SAaron Ballman #endif
126*2edb89c7SAaron Ballman // CHECK: int has_uuid;
127*2edb89c7SAaron Ballman }
128