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