1*8e7f073eSSander de Smalen // RUN: sed -e "s@ATTR_USE@__arm_streaming@g" -e "s@ATTR_NAME@__arm_streaming@g" %s > %t
2*8e7f073eSSander de Smalen // RUN: %clang_cc1 -fcxx-exceptions -fdeclspec -fexceptions -fsyntax-only -verify -std=c++11 -Wc++14-compat -Wc++14-extensions -Wc++17-extensions -triple aarch64-none-linux-gnu -target-feature +sme -x c++ %t
3*8e7f073eSSander de Smalen // RUN: sed -e "s@ATTR_USE@__arm_inout\(\"za\"\)@g" -e "s@ATTR_NAME@__arm_inout@g" %s > %t
4*8e7f073eSSander de Smalen // RUN: %clang_cc1 -fcxx-exceptions -fdeclspec -fexceptions -fsyntax-only -verify -std=c++11 -Wc++14-compat -Wc++14-extensions -Wc++17-extensions -triple aarch64-none-linux-gnu -target-feature +sme -x c++ %t
533ee5c46SRichard Sandiford
633ee5c46SRichard Sandiford // Need std::initializer_list
733ee5c46SRichard Sandiford namespace std {
833ee5c46SRichard Sandiford typedef decltype(sizeof(int)) size_t;
933ee5c46SRichard Sandiford
1033ee5c46SRichard Sandiford // libc++'s implementation
1133ee5c46SRichard Sandiford template <class _E>
1233ee5c46SRichard Sandiford class initializer_list
1333ee5c46SRichard Sandiford {
1433ee5c46SRichard Sandiford const _E* __begin_;
1533ee5c46SRichard Sandiford size_t __size_;
1633ee5c46SRichard Sandiford
initializer_list(const _E * __b,size_t __s)1733ee5c46SRichard Sandiford initializer_list(const _E* __b, size_t __s)
1833ee5c46SRichard Sandiford : __begin_(__b),
1933ee5c46SRichard Sandiford __size_(__s)
2033ee5c46SRichard Sandiford {}
2133ee5c46SRichard Sandiford
2233ee5c46SRichard Sandiford public:
2333ee5c46SRichard Sandiford typedef _E value_type;
2433ee5c46SRichard Sandiford typedef const _E& reference;
2533ee5c46SRichard Sandiford typedef const _E& const_reference;
2633ee5c46SRichard Sandiford typedef size_t size_type;
2733ee5c46SRichard Sandiford
2833ee5c46SRichard Sandiford typedef const _E* iterator;
2933ee5c46SRichard Sandiford typedef const _E* const_iterator;
3033ee5c46SRichard Sandiford
initializer_list()3133ee5c46SRichard Sandiford initializer_list() : __begin_(nullptr), __size_(0) {}
3233ee5c46SRichard Sandiford
size() const3333ee5c46SRichard Sandiford size_t size() const {return __size_;}
begin() const3433ee5c46SRichard Sandiford const _E* begin() const {return __begin_;}
end() const3533ee5c46SRichard Sandiford const _E* end() const {return __begin_ + __size_;}
3633ee5c46SRichard Sandiford };
3733ee5c46SRichard Sandiford }
3833ee5c46SRichard Sandiford
3933ee5c46SRichard Sandiford
4033ee5c46SRichard Sandiford // Declaration syntax checks
41*8e7f073eSSander de Smalen ATTR_USE int before_attr; // expected-error {{'ATTR_NAME' only applies to function types}}
42*8e7f073eSSander de Smalen int ATTR_USE between_attr; // expected-error {{'ATTR_NAME' only applies to function types}}
43*8e7f073eSSander de Smalen const ATTR_USE int between_attr_2 = 0; // expected-error {{'ATTR_NAME' cannot appear here}}
44*8e7f073eSSander de Smalen int after_attr ATTR_USE; // expected-error {{'ATTR_NAME' only applies to function types}}
45*8e7f073eSSander de Smalen int * ATTR_USE ptr_attr; // expected-error {{'ATTR_NAME' only applies to function types}}
46*8e7f073eSSander de Smalen int & ATTR_USE ref_attr = after_attr; // expected-error {{'ATTR_NAME' only applies to function types}}
47*8e7f073eSSander de Smalen int && ATTR_USE rref_attr = 0; // expected-error {{'ATTR_NAME' only applies to function types}}
48*8e7f073eSSander de Smalen int array_attr [1] ATTR_USE; // expected-error {{'ATTR_NAME' only applies to function types}}
49*8e7f073eSSander de Smalen void fn_attr () ATTR_USE;
50*8e7f073eSSander de Smalen void noexcept_fn_attr () noexcept ATTR_USE;
5133ee5c46SRichard Sandiford struct MemberFnOrder {
52*8e7f073eSSander de Smalen virtual void f() const volatile && noexcept ATTR_USE final = 0;
5333ee5c46SRichard Sandiford };
54*8e7f073eSSander de Smalen struct ATTR_USE struct_attr; // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
55*8e7f073eSSander de Smalen class ATTR_USE class_attr {}; // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
56*8e7f073eSSander de Smalen union ATTR_USE union_attr; // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
57*8e7f073eSSander de Smalen enum ATTR_USE E { }; // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
5833ee5c46SRichard Sandiford namespace test_misplacement {
59*8e7f073eSSander de Smalen ATTR_USE struct struct_attr2; // expected-error {{misplaced 'ATTR_NAME'}}
60*8e7f073eSSander de Smalen ATTR_USE class class_attr2; // expected-error {{misplaced 'ATTR_NAME'}}
61*8e7f073eSSander de Smalen ATTR_USE union union_attr2; // expected-error {{misplaced 'ATTR_NAME'}}
62*8e7f073eSSander de Smalen ATTR_USE enum E2 { }; // expected-error {{misplaced 'ATTR_NAME'}}
6333ee5c46SRichard Sandiford }
6433ee5c46SRichard Sandiford
6533ee5c46SRichard Sandiford // Checks attributes placed at wrong syntactic locations of class specifiers.
66*8e7f073eSSander de Smalen class ATTR_USE ATTR_USE // expected-error 2 {{'ATTR_NAME' only applies to non-K&R-style functions}}
67*8e7f073eSSander de Smalen attr_after_class_name_decl ATTR_USE ATTR_USE; // expected-error {{'ATTR_NAME' cannot appear here}} \
68*8e7f073eSSander de Smalen expected-error 2 {{'ATTR_NAME' only applies to non-K&R-style functions}}
6933ee5c46SRichard Sandiford
70*8e7f073eSSander de Smalen class ATTR_USE ATTR_USE // expected-error 2 {{'ATTR_NAME' only applies to non-K&R-style functions}}
71*8e7f073eSSander de Smalen attr_after_class_name_definition ATTR_USE ATTR_USE ATTR_USE{}; // expected-error {{'ATTR_NAME' cannot appear here}} \
72*8e7f073eSSander de Smalen expected-error 3 {{'ATTR_NAME' only applies to non-K&R-style functions}}
7333ee5c46SRichard Sandiford
74*8e7f073eSSander de Smalen class ATTR_USE c {}; // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
75*8e7f073eSSander de Smalen class c ATTR_USE ATTR_USE x; // expected-error 2 {{'ATTR_NAME' only applies to function types}}
76*8e7f073eSSander de Smalen class c ATTR_USE ATTR_USE y ATTR_USE ATTR_USE; // expected-error 4 {{'ATTR_NAME' only applies to function types}}
7733ee5c46SRichard Sandiford class c final [(int){0}];
7833ee5c46SRichard Sandiford
7933ee5c46SRichard Sandiford class base {};
80*8e7f073eSSander de Smalen class ATTR_USE ATTR_USE final_class // expected-error 2 {{'ATTR_NAME' only applies to non-K&R-style functions}}
81*8e7f073eSSander de Smalen ATTR_USE alignas(float) final // expected-error {{'ATTR_NAME' cannot appear here}} \
82*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
83*8e7f073eSSander de Smalen ATTR_USE alignas(float) ATTR_USE alignas(float): base{}; // expected-error {{'ATTR_NAME' cannot appear here}}
8433ee5c46SRichard Sandiford
85*8e7f073eSSander de Smalen class ATTR_USE ATTR_USE final_class_another // expected-error 2 {{'ATTR_NAME' only applies to non-K&R-style functions}}
86*8e7f073eSSander de Smalen ATTR_USE ATTR_USE alignas(16) final // expected-error {{'ATTR_NAME' cannot appear here}} \
87*8e7f073eSSander de Smalen expected-error 2 {{'ATTR_NAME' only applies to non-K&R-style functions}}
88*8e7f073eSSander de Smalen ATTR_USE ATTR_USE alignas(16) ATTR_USE{}; // expected-error {{'ATTR_NAME' cannot appear here}}
8933ee5c46SRichard Sandiford
90*8e7f073eSSander de Smalen class after_class_close {} ATTR_USE; // expected-error {{'ATTR_NAME' cannot appear here, place it after "class" to apply it to the type declaration}}
9133ee5c46SRichard Sandiford
9233ee5c46SRichard Sandiford class C {};
9333ee5c46SRichard Sandiford
94*8e7f073eSSander de Smalen ATTR_USE struct with_init_declarators {} init_declarator; // expected-error {{'ATTR_NAME' only applies to function types}}
95*8e7f073eSSander de Smalen ATTR_USE struct no_init_declarators; // expected-error {{misplaced 'ATTR_NAME'}}
96*8e7f073eSSander de Smalen template<typename> ATTR_USE struct no_init_declarators_template; // expected-error {{'ATTR_NAME' cannot appear here}}
fn_with_structs()9733ee5c46SRichard Sandiford void fn_with_structs() {
98*8e7f073eSSander de Smalen ATTR_USE struct with_init_declarators {} init_declarator; // expected-error {{'ATTR_NAME' only applies to function types}}
99*8e7f073eSSander de Smalen ATTR_USE struct no_init_declarators; // expected-error {{'ATTR_NAME' cannot appear here}}
10033ee5c46SRichard Sandiford }
101*8e7f073eSSander de Smalen ATTR_USE; // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
10233ee5c46SRichard Sandiford struct ctordtor {
103*8e7f073eSSander de Smalen ATTR_USE ctordtor ATTR_USE () ATTR_USE; // expected-error 2 {{'ATTR_NAME' cannot be applied to a declaration}}
104*8e7f073eSSander de Smalen ctordtor (C) ATTR_USE;
105*8e7f073eSSander de Smalen ATTR_USE ~ctordtor ATTR_USE () ATTR_USE; // expected-error 2 {{'ATTR_NAME' cannot be applied to a declaration}}
10633ee5c46SRichard Sandiford };
ATTR_USE()107*8e7f073eSSander de Smalen ATTR_USE ctordtor::ctordtor ATTR_USE () ATTR_USE {} // expected-error 2 {{'ATTR_NAME' cannot be applied to a declaration}}
ctordtor(C)108*8e7f073eSSander de Smalen ATTR_USE ctordtor::ctordtor (C) ATTR_USE try {} catch (...) {} // expected-error {{'ATTR_NAME' cannot be applied to a declaration}}
ATTR_USE()109*8e7f073eSSander de Smalen ATTR_USE ctordtor::~ctordtor ATTR_USE () ATTR_USE {} // expected-error 2 {{'ATTR_NAME' cannot be applied to a declaration}}
110*8e7f073eSSander de Smalen extern "C++" ATTR_USE int extern_attr; // expected-error {{'ATTR_NAME' only applies to function types}}
111*8e7f073eSSander de Smalen template <typename T> ATTR_USE void template_attr (); // expected-error {{'ATTR_NAME' cannot be applied to a declaration}}
112*8e7f073eSSander de Smalen ATTR_USE ATTR_USE int ATTR_USE ATTR_USE multi_attr ATTR_USE ATTR_USE; // expected-error 6 {{'ATTR_NAME' only applies to function types}}
11333ee5c46SRichard Sandiford
114*8e7f073eSSander de Smalen int (paren_attr) ATTR_USE; // expected-error {{'ATTR_NAME' cannot appear here}}
115*8e7f073eSSander de Smalen unsigned ATTR_USE int attr_in_decl_spec; // expected-error {{'ATTR_NAME' cannot appear here}}
116*8e7f073eSSander de Smalen unsigned ATTR_USE int ATTR_USE const double_decl_spec = 0; // expected-error 2 {{'ATTR_NAME' cannot appear here}}
11733ee5c46SRichard Sandiford class foo {
118*8e7f073eSSander de Smalen void const_after_attr () ATTR_USE const; // expected-error {{expected ';'}}
11933ee5c46SRichard Sandiford };
120*8e7f073eSSander de Smalen extern "C++" ATTR_USE { } // expected-error {{'ATTR_NAME' cannot appear here}}
121*8e7f073eSSander de Smalen ATTR_USE extern "C++" { } // expected-error {{'ATTR_NAME' cannot appear here}}
122*8e7f073eSSander de Smalen ATTR_USE template <typename T> void before_template_attr (); // expected-error {{'ATTR_NAME' cannot appear here}}
123*8e7f073eSSander de Smalen ATTR_USE namespace ns { int i; } // expected-error {{'ATTR_NAME' cannot appear here}}
124*8e7f073eSSander de Smalen ATTR_USE static_assert(true, ""); //expected-error {{'ATTR_NAME' cannot appear here}}
125*8e7f073eSSander de Smalen ATTR_USE asm(""); // expected-error {{'ATTR_NAME' cannot appear here}}
12633ee5c46SRichard Sandiford
127*8e7f073eSSander de Smalen ATTR_USE using ns::i; // expected-warning {{ISO C++}} \
128*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
129*8e7f073eSSander de Smalen ATTR_USE using namespace ns; // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
130*8e7f073eSSander de Smalen namespace ATTR_USE ns2 {} // expected-warning {{attributes on a namespace declaration are a C++17 extension}} \
131*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
13233ee5c46SRichard Sandiford
133*8e7f073eSSander de Smalen using ATTR_USE alignas(4)ATTR_USE ns::i; // expected-warning 2 {{ISO C++}} \
134*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' cannot appear here}} \
13533ee5c46SRichard Sandiford expected-error {{'alignas' attribute only applies to variables, data members and tag types}} \
13633ee5c46SRichard Sandiford expected-warning {{ISO C++}} \
137*8e7f073eSSander de Smalen expected-error 2 {{'ATTR_NAME' only applies to non-K&R-style functions}}
138*8e7f073eSSander de Smalen using ATTR_USE alignas(4) ATTR_USE foobar = int; // expected-error {{'ATTR_NAME' cannot appear here}} \
13933ee5c46SRichard Sandiford expected-error {{'alignas' attribute only applies to}} \
140*8e7f073eSSander de Smalen expected-error 2 {{'ATTR_NAME' only applies to function types}}
14133ee5c46SRichard Sandiford
142*8e7f073eSSander de Smalen ATTR_USE using T = int; // expected-error {{'ATTR_NAME' cannot appear here}}
143*8e7f073eSSander de Smalen using T ATTR_USE = int; // expected-error {{'ATTR_NAME' only applies to function types}}
144*8e7f073eSSander de Smalen template<typename T> using U ATTR_USE = T; // expected-error {{'ATTR_NAME' only applies to function types}}
145*8e7f073eSSander de Smalen using ns::i ATTR_USE; // expected-warning {{ISO C++}} \
146*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
147*8e7f073eSSander de Smalen using ns::i ATTR_USE, ns::i ATTR_USE; // expected-warning 2 {{ISO C++}} \
14833ee5c46SRichard Sandiford expected-warning {{use of multiple declarators in a single using declaration is a C++17 extension}} \
149*8e7f073eSSander de Smalen expected-error 2 {{'ATTR_NAME' only applies to non-K&R-style functions}}
15033ee5c46SRichard Sandiford struct using_in_struct_base {
15133ee5c46SRichard Sandiford typedef int i, j, k, l;
15233ee5c46SRichard Sandiford };
15333ee5c46SRichard Sandiford struct using_in_struct : using_in_struct_base {
154*8e7f073eSSander de Smalen ATTR_USE using using_in_struct_base::i; // expected-warning {{ISO C++}} \
155*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
156*8e7f073eSSander de Smalen using using_in_struct_base::j ATTR_USE; // expected-warning {{ISO C++}} \
157*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
158*8e7f073eSSander de Smalen ATTR_USE using using_in_struct_base::k ATTR_USE, using_in_struct_base::l ATTR_USE; // expected-warning 3 {{ISO C++}} \
15933ee5c46SRichard Sandiford expected-warning {{use of multiple declarators in a single using declaration is a C++17 extension}} \
160*8e7f073eSSander de Smalen expected-error 4 {{'ATTR_NAME' only applies to non-K&R-style functions}}
16133ee5c46SRichard Sandiford };
162*8e7f073eSSander de Smalen using ATTR_USE ns::i; // expected-warning {{ISO C++}} \
163*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' cannot appear here}} \
164*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
165*8e7f073eSSander de Smalen using T ATTR_USE = int; // expected-error {{'ATTR_NAME' only applies to function types}}
16633ee5c46SRichard Sandiford
167*8e7f073eSSander de Smalen auto trailing() -> ATTR_USE const int; // expected-error {{'ATTR_NAME' cannot appear here}}
168*8e7f073eSSander de Smalen auto trailing() -> const ATTR_USE int; // expected-error {{'ATTR_NAME' cannot appear here}}
169*8e7f073eSSander de Smalen auto trailing() -> const int ATTR_USE; // expected-error {{'ATTR_NAME' only applies to function types}}
170*8e7f073eSSander de Smalen auto trailing_2() -> struct struct_attr ATTR_USE; // expected-error {{'ATTR_NAME' only applies to function types}}
17133ee5c46SRichard Sandiford
17233ee5c46SRichard Sandiford namespace N {
17333ee5c46SRichard Sandiford struct S {};
17433ee5c46SRichard Sandiford };
17533ee5c46SRichard Sandiford template<typename> struct Template {};
17633ee5c46SRichard Sandiford
17733ee5c46SRichard Sandiford // FIXME: Improve this diagnostic
178*8e7f073eSSander de Smalen struct ATTR_USE N::S s; // expected-error {{'ATTR_NAME' cannot appear here}}
179*8e7f073eSSander de Smalen struct ATTR_USE Template<int> t; // expected-error {{'ATTR_NAME' cannot appear here}}
180*8e7f073eSSander de Smalen struct ATTR_USE ::template Template<int> u; // expected-error {{'ATTR_NAME' cannot appear here}}
181*8e7f073eSSander de Smalen template struct ATTR_USE Template<char>; // expected-error {{'ATTR_NAME' cannot appear here}}
18233ee5c46SRichard Sandiford template struct __attribute__((pure)) Template<std::size_t>; // We still allow GNU-style attributes here
183*8e7f073eSSander de Smalen template <> struct ATTR_USE Template<void>; // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
18433ee5c46SRichard Sandiford
185*8e7f073eSSander de Smalen enum ATTR_USE E1 {}; // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
186*8e7f073eSSander de Smalen enum ATTR_USE E2; // expected-error {{forbids forward references}} \
187*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
188*8e7f073eSSander de Smalen enum ATTR_USE E1; // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
189*8e7f073eSSander de Smalen enum ATTR_USE E3 : int; // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
190*8e7f073eSSander de Smalen enum ATTR_USE { // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
191*8e7f073eSSander de Smalen k_123 ATTR_USE = 123 // expected-warning {{attributes on an enumerator declaration are a C++17 extension}} \
192*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
19333ee5c46SRichard Sandiford };
194*8e7f073eSSander de Smalen enum ATTR_USE E1 e; // expected-error {{'ATTR_NAME' cannot appear here}}
195*8e7f073eSSander de Smalen enum ATTR_USE class E4 { }; // expected-error {{'ATTR_NAME' cannot appear here}}
196*8e7f073eSSander de Smalen enum struct ATTR_USE E5; // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
197*8e7f073eSSander de Smalen enum E6 {} ATTR_USE; // expected-error {{'ATTR_NAME' cannot appear here, place it after "enum" to apply it to the type declaration}}
19833ee5c46SRichard Sandiford
19933ee5c46SRichard Sandiford struct S {
200*8e7f073eSSander de Smalen friend int f ATTR_USE (); // expected-error {{'ATTR_NAME' cannot appear here}} \
201*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' cannot be applied to a declaration}}
ATTR_USE()202*8e7f073eSSander de Smalen friend int f2 ATTR_USE () {} // expected-error {{'ATTR_NAME' cannot be applied to a declaration}}
203*8e7f073eSSander de Smalen ATTR_USE friend int g(); // expected-error {{'ATTR_NAME' cannot appear here}}
h()204*8e7f073eSSander de Smalen ATTR_USE friend int h() { // expected-error {{'ATTR_NAME' cannot be applied to a declaration}}
20533ee5c46SRichard Sandiford }
206*8e7f073eSSander de Smalen ATTR_USE friend int f3(), f4(), f5(); // expected-error {{'ATTR_NAME' cannot appear here}}
207*8e7f073eSSander de Smalen friend int f6 ATTR_USE (), f7 ATTR_USE (), f8 ATTR_USE (); // expected-error3 {{'ATTR_NAME' cannot appear here}} \
208*8e7f073eSSander de Smalen expected-error 3 {{'ATTR_NAME' cannot be applied to a declaration}}
209*8e7f073eSSander de Smalen friend class ATTR_USE C; // expected-error {{'ATTR_NAME' cannot appear here}}
210*8e7f073eSSander de Smalen ATTR_USE friend class D; // expected-error {{'ATTR_NAME' cannot appear here}}
211*8e7f073eSSander de Smalen ATTR_USE friend int; // expected-error {{'ATTR_NAME' cannot appear here}}
21233ee5c46SRichard Sandiford };
tmpl(T)21333ee5c46SRichard Sandiford template<typename T> void tmpl (T) {}
214*8e7f073eSSander de Smalen template ATTR_USE void tmpl(char); // expected-error {{'ATTR_NAME' cannot appear here}}
215*8e7f073eSSander de Smalen template void ATTR_USE tmpl(short); // expected-error {{'ATTR_NAME' only applies to function types}}
21633ee5c46SRichard Sandiford
21733ee5c46SRichard Sandiford // Statement tests
foo()21833ee5c46SRichard Sandiford void foo () {
219*8e7f073eSSander de Smalen ATTR_USE ; // expected-error {{'ATTR_NAME' cannot be applied to a statement}}
220*8e7f073eSSander de Smalen ATTR_USE { } // expected-error {{'ATTR_NAME' cannot be applied to a statement}}
221*8e7f073eSSander de Smalen ATTR_USE if (0) { } // expected-error {{'ATTR_NAME' cannot be applied to a statement}}
222*8e7f073eSSander de Smalen ATTR_USE for (;;); // expected-error {{'ATTR_NAME' cannot be applied to a statement}}
223*8e7f073eSSander de Smalen ATTR_USE do { // expected-error {{'ATTR_NAME' cannot be applied to a statement}}
224*8e7f073eSSander de Smalen ATTR_USE continue; // expected-error {{'ATTR_NAME' cannot be applied to a statement}}
22533ee5c46SRichard Sandiford } while (0);
226*8e7f073eSSander de Smalen ATTR_USE while (0); // expected-error {{'ATTR_NAME' cannot be applied to a statement}}
22733ee5c46SRichard Sandiford
228*8e7f073eSSander de Smalen ATTR_USE switch (i) { // expected-error {{'ATTR_NAME' cannot be applied to a statement}}
229*8e7f073eSSander de Smalen ATTR_USE case 0: // expected-error {{'ATTR_NAME' cannot be applied to a statement}}
230*8e7f073eSSander de Smalen ATTR_USE default: // expected-error {{'ATTR_NAME' cannot be applied to a statement}}
231*8e7f073eSSander de Smalen ATTR_USE break; // expected-error {{'ATTR_NAME' cannot be applied to a statement}}
23233ee5c46SRichard Sandiford }
23333ee5c46SRichard Sandiford
234*8e7f073eSSander de Smalen ATTR_USE goto there; // expected-error {{'ATTR_NAME' cannot be applied to a statement}}
235*8e7f073eSSander de Smalen ATTR_USE there: // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
23633ee5c46SRichard Sandiford
237*8e7f073eSSander de Smalen ATTR_USE try { // expected-error {{'ATTR_NAME' cannot be applied to a statement}}
238*8e7f073eSSander de Smalen } ATTR_USE catch (...) { // expected-error {{'ATTR_NAME' cannot appear here}}
23933ee5c46SRichard Sandiford }
24033ee5c46SRichard Sandiford
241*8e7f073eSSander de Smalen void bar ATTR_USE (ATTR_USE int i, ATTR_USE int j); // expected-error 2 {{'ATTR_NAME' only applies to function types}} \
242*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' cannot be applied to a declaration}}
243*8e7f073eSSander de Smalen using FuncType = void (ATTR_USE int); // expected-error {{'ATTR_NAME' only applies to function types}}
244*8e7f073eSSander de Smalen void baz(ATTR_USE...); // expected-error {{expected parameter declarator}}
24533ee5c46SRichard Sandiford
246*8e7f073eSSander de Smalen ATTR_USE return; // expected-error {{'ATTR_NAME' cannot be applied to a statement}}
24733ee5c46SRichard Sandiford }
24833ee5c46SRichard Sandiford
24933ee5c46SRichard Sandiford // Expression tests
bar()25033ee5c46SRichard Sandiford void bar () {
251*8e7f073eSSander de Smalen new int[42]ATTR_USE[5]ATTR_USE{}; // expected-error {{'ATTR_NAME' only applies to function types}}
25233ee5c46SRichard Sandiford }
25333ee5c46SRichard Sandiford
25433ee5c46SRichard Sandiford // Condition tests
baz()25533ee5c46SRichard Sandiford void baz () {
256*8e7f073eSSander de Smalen if (ATTR_USE bool b = true) { // expected-error {{'ATTR_NAME' only applies to function types}}
257*8e7f073eSSander de Smalen switch (ATTR_USE int n { 42 }) { // expected-error {{'ATTR_NAME' only applies to function types}}
25833ee5c46SRichard Sandiford default:
259*8e7f073eSSander de Smalen for (ATTR_USE int n = 0; ATTR_USE char b = n < 5; ++b) { // expected-error 2 {{'ATTR_NAME' only applies to function types}}
26033ee5c46SRichard Sandiford }
26133ee5c46SRichard Sandiford }
26233ee5c46SRichard Sandiford }
26333ee5c46SRichard Sandiford int x;
26433ee5c46SRichard Sandiford // An attribute can be applied to an expression-statement, such as the first
26533ee5c46SRichard Sandiford // statement in a for. But it can't be applied to a condition which is an
26633ee5c46SRichard Sandiford // expression.
267*8e7f073eSSander de Smalen for (ATTR_USE x = 0; ; ) {} // expected-error {{'ATTR_NAME' cannot appear here}}
268*8e7f073eSSander de Smalen for (; ATTR_USE x < 5; ) {} // expected-error {{'ATTR_NAME' cannot appear here}}
269*8e7f073eSSander de Smalen while (ATTR_USE bool k { false }) { // expected-error {{'ATTR_NAME' only applies to function types}}
27033ee5c46SRichard Sandiford }
271*8e7f073eSSander de Smalen while (ATTR_USE true) { // expected-error {{'ATTR_NAME' cannot appear here}}
27233ee5c46SRichard Sandiford }
27333ee5c46SRichard Sandiford do {
274*8e7f073eSSander de Smalen } while (ATTR_USE false); // expected-error {{'ATTR_NAME' cannot appear here}}
27533ee5c46SRichard Sandiford
276*8e7f073eSSander de Smalen for (ATTR_USE int n : { 1, 2, 3 }) { // expected-error {{'ATTR_NAME' only applies to function types}}
27733ee5c46SRichard Sandiford }
27833ee5c46SRichard Sandiford }
27933ee5c46SRichard Sandiford
28033ee5c46SRichard Sandiford enum class __attribute__((visibility("hidden"))) SecretKeepers {
28133ee5c46SRichard Sandiford one, /* rest are deprecated */ two, three
28233ee5c46SRichard Sandiford };
283*8e7f073eSSander de Smalen enum class ATTR_USE EvenMoreSecrets {}; // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
28433ee5c46SRichard Sandiford
28533ee5c46SRichard Sandiford // Forbid attributes on decl specifiers.
286*8e7f073eSSander de Smalen unsigned ATTR_USE static int ATTR_USE v1; // expected-error {{'ATTR_NAME' only applies to function types}} \
287*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' cannot appear here}}
288*8e7f073eSSander de Smalen typedef ATTR_USE unsigned long ATTR_USE v2; // expected-error {{'ATTR_NAME' only applies to function types}} \
289*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' cannot appear here}}
290*8e7f073eSSander de Smalen int ATTR_USE foo(int ATTR_USE x); // expected-error 2 {{'ATTR_NAME' only applies to function types}}
29133ee5c46SRichard Sandiford
292*8e7f073eSSander de Smalen ATTR_USE; // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}}
29333ee5c46SRichard Sandiford
29433ee5c46SRichard Sandiford class A {
295*8e7f073eSSander de Smalen A(ATTR_USE int a); // expected-error {{'ATTR_NAME' only applies to function types}}
29633ee5c46SRichard Sandiford };
A(ATTR_USE int a)297*8e7f073eSSander de Smalen A::A(ATTR_USE int a) {} // expected-error {{'ATTR_NAME' only applies to function types}}
29833ee5c46SRichard Sandiford
29933ee5c46SRichard Sandiford template<typename T> struct TemplateStruct {};
30033ee5c46SRichard Sandiford class FriendClassesWithAttributes {
30133ee5c46SRichard Sandiford // We allow GNU-style attributes here
30233ee5c46SRichard Sandiford template <class _Tp, class _Alloc> friend class __attribute__((__type_visibility__("default"))) vector;
30333ee5c46SRichard Sandiford template <class _Tp, class _Alloc> friend class __declspec(code_seg("foo,whatever")) vector2;
30433ee5c46SRichard Sandiford // But not C++11 ones
305*8e7f073eSSander de Smalen template <class _Tp, class _Alloc> friend class ATTR_USE vector3; // expected-error {{'ATTR_NAME' cannot appear here}}
30633ee5c46SRichard Sandiford
30733ee5c46SRichard Sandiford // Also allowed
30833ee5c46SRichard Sandiford friend struct __attribute__((__type_visibility__("default"))) TemplateStruct<FriendClassesWithAttributes>;
30933ee5c46SRichard Sandiford friend struct __declspec(code_seg("foo,whatever")) TemplateStruct<FriendClassesWithAttributes>;
310*8e7f073eSSander de Smalen friend struct ATTR_USE TemplateStruct<FriendClassesWithAttributes>; // expected-error {{'ATTR_NAME' cannot appear here}}
31133ee5c46SRichard Sandiford };
31233ee5c46SRichard Sandiford
31333ee5c46SRichard Sandiford // Check ordering: C++11 attributes must appear before GNU attributes.
31433ee5c46SRichard Sandiford class Ordering {
f1(int (ATTR_USE int n))31533ee5c46SRichard Sandiford void f1(
316*8e7f073eSSander de Smalen int (ATTR_USE __attribute__(()) int n) // expected-error {{'ATTR_NAME' only applies to function types}}
31733ee5c46SRichard Sandiford ) {
31833ee5c46SRichard Sandiford }
31933ee5c46SRichard Sandiford
f2(int (*)(ATTR_USE int n))32033ee5c46SRichard Sandiford void f2(
321*8e7f073eSSander de Smalen int (*)(ATTR_USE __attribute__(()) int n) // expected-error {{'ATTR_NAME' only applies to function types}}
32233ee5c46SRichard Sandiford ) {
32333ee5c46SRichard Sandiford }
32433ee5c46SRichard Sandiford
f3(int (ATTR_USE int n))32533ee5c46SRichard Sandiford void f3(
326*8e7f073eSSander de Smalen int (__attribute__(()) ATTR_USE int n) // expected-error {{'ATTR_NAME' cannot appear here}}
32733ee5c46SRichard Sandiford ) {
32833ee5c46SRichard Sandiford }
32933ee5c46SRichard Sandiford
f4(int (*)(ATTR_USE int n))33033ee5c46SRichard Sandiford void f4(
331*8e7f073eSSander de Smalen int (*)(__attribute__(()) ATTR_USE int n) // expected-error {{'ATTR_NAME' cannot appear here}}
33233ee5c46SRichard Sandiford ) {
33333ee5c46SRichard Sandiford }
33433ee5c46SRichard Sandiford };
33533ee5c46SRichard Sandiford
33633ee5c46SRichard Sandiford namespace base_specs {
33733ee5c46SRichard Sandiford struct A {};
338*8e7f073eSSander de Smalen struct B : ATTR_USE A {}; // expected-error {{'ATTR_NAME' cannot be applied to a base specifier}}
339*8e7f073eSSander de Smalen struct C : ATTR_USE virtual A {}; // expected-error {{'ATTR_NAME' cannot be applied to a base specifier}}
340*8e7f073eSSander de Smalen struct D : ATTR_USE public virtual A {}; // expected-error {{'ATTR_NAME' cannot be applied to a base specifier}}
341*8e7f073eSSander de Smalen struct E : public ATTR_USE virtual A {}; // expected-error {{'ATTR_NAME' cannot appear here}} \
342*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' cannot be applied to a base specifier}}
343*8e7f073eSSander de Smalen struct F : virtual ATTR_USE public A {}; // expected-error {{'ATTR_NAME' cannot appear here}} \
344*8e7f073eSSander de Smalen expected-error {{'ATTR_NAME' cannot be applied to a base specifier}}
34533ee5c46SRichard Sandiford }
34633ee5c46SRichard Sandiford
347*8e7f073eSSander de Smalen namespace ATTR_USE ns_attr {}; // expected-error {{'ATTR_NAME' only applies to non-K&R-style functions}} \
34833ee5c46SRichard Sandiford expected-warning {{attributes on a namespace declaration are a C++17 extension}}
349