blob: 3332571d758c84f8ef63aa65175b238cc61b0373 [file] [log] [blame]
Nikolas Klauser874217f2023-07-22 09:33:55 -07001// RUN: %clang_cc1 -std=c11 -E -P %s -o - | FileCheck %s
Aaron Ballman9936b962020-08-13 08:47:40 -04002// RUN: %clang_cc1 -std=c2x -E -P %s -o - | FileCheck %s
Aaron Ballman7c181592017-12-07 23:10:09 +00003
Aaron Ballman9936b962020-08-13 08:47:40 -04004#define C2x(x) x: __has_c_attribute(x)
Aaron Ballman7c181592017-12-07 23:10:09 +00005
Aaron Ballmanb8266f52022-09-13 11:06:01 -04006// CHECK: fallthrough: 201910L
Aaron Ballman9936b962020-08-13 08:47:40 -04007C2x(fallthrough)
Aaron Ballman7c181592017-12-07 23:10:09 +00008
Aaron Ballman1b19df12022-09-13 08:09:55 -04009// CHECK: __nodiscard__: 202003L
Aaron Ballman9936b962020-08-13 08:47:40 -040010C2x(__nodiscard__)
Aaron Ballmand930ed12019-11-25 17:32:07 -050011
Sergei Barannikov79f87be2023-09-02 05:22:25 +030012// CHECK: warn_unused_result: 0
13C2x(warn_unused_result)
14
15// CHECK: gnu::warn_unused_result: 1
16C2x(gnu::warn_unused_result)
17
18// CHECK: clang::warn_unused_result: 0
19C2x(clang::warn_unused_result)
20
Aaron Ballman9936b962020-08-13 08:47:40 -040021// CHECK: selectany: 0
22C2x(selectany); // Known attribute not supported in C mode
23
24// CHECK: frobble: 0
25C2x(frobble) // Unknown attribute
26
27// CHECK: frobble::frobble: 0
28C2x(frobble::frobble) // Unknown vendor namespace
29
30// CHECK: clang::annotate: 1
31C2x(clang::annotate)
32
33// CHECK: deprecated: 201904L
34C2x(deprecated)
35
Aaron Ballman0f28cf42022-09-13 09:27:13 -040036// CHECK: maybe_unused: 202106L
Aaron Ballman9936b962020-08-13 08:47:40 -040037C2x(maybe_unused)
38
Sergei Barannikov79f87be2023-09-02 05:22:25 +030039// CHECK: __gnu__::warn_unused_result: 1
Aaron Ballman9936b962020-08-13 08:47:40 -040040C2x(__gnu__::warn_unused_result)
41
Sergei Barannikov79f87be2023-09-02 05:22:25 +030042// CHECK: gnu::__warn_unused_result__: 1
Aaron Ballman9936b962020-08-13 08:47:40 -040043C2x(gnu::__warn_unused_result__)
44
Aaron Ballman2edb89c2021-10-17 07:54:48 -040045// Test that macro expansion of the builtin argument works.
46#define C clang
47#define L likely
48#define CL clang::likely
49#define N nodiscard
50
51#if __has_c_attribute(N)
52int has_nodiscard;
53#endif
54// CHECK: int has_nodiscard;
55
56#if __has_c_attribute(C::L)
57int has_clang_likely_1;
58#endif
59// CHECK: int has_clang_likely_1;
60
61#if __has_c_attribute(clang::L)
62int has_clang_likely_2;
63#endif
64// CHECK: int has_clang_likely_2;
65
66#if __has_c_attribute(C::likely)
67int has_clang_likely_3;
68#endif
69// CHECK: int has_clang_likely_3;
70
71#if __has_c_attribute(CL)
72int has_clang_likely_4;
73#endif
74// CHECK: int has_clang_likely_4;
75
76#define FUNCLIKE1(x) clang::x
77#if __has_c_attribute(FUNCLIKE1(likely))
78int funclike_1;
79#endif
80// CHECK: int funclike_1;
81
82#define FUNCLIKE2(x) _Clang::x
83#if __has_c_attribute(FUNCLIKE2(likely))
84int funclike_2;
85#endif
86// CHECK: int funclike_2;