1 | // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s |
2 | |
3 | int i __attribute__((speculative_load_hardening)); // expected-error {{'speculative_load_hardening' attribute only applies to functions}} |
4 | |
5 | void f1() __attribute__((speculative_load_hardening)); |
6 | void f2() __attribute__((speculative_load_hardening(1))); // expected-error {{'speculative_load_hardening' attribute takes no arguments}} |
7 | |
8 | template <typename T> |
9 | void tf1() __attribute__((speculative_load_hardening)); |
10 | |
11 | int f3(int __attribute__((speculative_load_hardening)), int); // expected-error {{'speculative_load_hardening' attribute only applies to functions}} |
12 | |
13 | struct A { |
14 | int f __attribute__((speculative_load_hardening)); // expected-error {{'speculative_load_hardening' attribute only applies to functions}} |
15 | void mf1() __attribute__((speculative_load_hardening)); |
16 | static void mf2() __attribute__((speculative_load_hardening)); |
17 | }; |
18 | |
19 | void f4() __attribute__((no_speculative_load_hardening, speculative_load_hardening)); // expected-error {{attributes are not compatible}} |
20 | // expected-note@-1 {{conflicting attribute is here}} |
21 | |
22 | void f5() __attribute__((speculative_load_hardening, no_speculative_load_hardening)); // expected-error {{attributes are not compatible}} |
23 | // expected-note@-1 {{conflicting attribute is here}} |
24 | |
25 | void f6() __attribute__((no_speculative_load_hardening)); |
26 | |
27 | void f6() __attribute__((speculative_load_hardening)); // expected-error@-2 {{'no_speculative_load_hardening' and 'speculative_load_hardening' attributes are not compatible}} |
28 | // expected-note@-1 {{conflicting attribute is here}} |
29 | |
30 | int ci [[clang::speculative_load_hardening]]; // expected-error {{'speculative_load_hardening' attribute only applies to functions}} |
31 | |
32 | [[clang::speculative_load_hardening]] void cf1(); |
33 | [[clang::speculative_load_hardening(1)]] void cf2(); // expected-error {{'speculative_load_hardening' attribute takes no arguments}} |
34 | |
35 | template <typename T> |
36 | [[clang::speculative_load_hardening]] |
37 | void ctf1(); |
38 | |
39 | int cf3(int c[[clang::speculative_load_hardening]], int); // expected-error {{'speculative_load_hardening' attribute only applies to functions}} |
40 | |
41 | struct CA { |
42 | int f [[clang::speculative_load_hardening]]; // expected-error {{'speculative_load_hardening' attribute only applies to functions}} |
43 | [[clang::speculative_load_hardening]] void mf1(); |
44 | [[clang::speculative_load_hardening]] static void mf2(); |
45 | }; |
46 | |
47 | [[clang::speculative_load_hardening, clang::no_speculative_load_hardening]] void cf4(); // expected-error {{attributes are not compatible}} |
48 | // expected-note@-1 {{conflicting attribute is here}} |
49 | |
50 | [[clang::no_speculative_load_hardening, clang::speculative_load_hardening]] void cf5(); // expected-error {{attributes are not compatible}} |
51 | // expected-note@-1 {{conflicting attribute is here}} |
52 | |
53 | [[clang::speculative_load_hardening]] |
54 | void cf6(); |
55 | |
56 | [[clang::no_speculative_load_hardening]] |
57 | void cf6(); // expected-error@-4 {{'speculative_load_hardening' and 'no_speculative_load_hardening' attributes are not compatible}} \ |
58 | // expected-note@-1 {{conflicting attribute is here}} |
59 | |