1 // RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -verify %s
3 // Check that we emit the correct warnings in various situations where the C++11
4 // spelling of the `address_space` attribute is applied to a declaration instead
5 // of a type. Also check that the attribute can instead be applied to the type.
7 void f([[clang::address_space(1)]] int* param
) { // expected-warning {{applying attribute 'address_space' to a declaration is deprecated; apply it to the type instead}}
8 [[clang::address_space(1)]] int* local1
; // expected-warning {{applying attribute 'address_space' to a declaration is deprecated; apply it to the type instead}}
9 int* local2
[[clang::address_space(1)]]; // expected-error {{automatic variable qualified with an address space}} expected-warning {{applying attribute 'address_space' to a declaration is deprecated; apply it to the type instead}}
10 int [[clang::address_space(1)]] * local3
;
11 int* [[clang::address_space(1)]] local4
; // expected-error {{automatic variable qualified with an address space}}
13 for ([[clang::address_space(1)]] int* p
= nullptr; p
; ++p
) {} // expected-warning {{applying attribute 'address_space' to a declaration is deprecated; apply it to the type instead}}
14 for (; [[clang::address_space(1)]] int* p
= nullptr; ) {} // expected-warning {{applying attribute 'address_space' to a declaration is deprecated; apply it to the type instead}}
15 while([[clang::address_space(1)]] int* p
= nullptr) {} // expected-warning {{applying attribute 'address_space' to a declaration is deprecated; apply it to the type instead}}
16 if ([[clang::address_space(1)]] int* p
= nullptr) {} // expected-warning {{applying attribute 'address_space' to a declaration is deprecated; apply it to the type instead}}
18 } catch([[clang::address_space(1)]] int& i
) { // expected-warning {{applying attribute 'address_space' to a declaration is deprecated; apply it to the type instead}}
21 for (int [[clang::address_space(1)]] * p
= nullptr; p
; ++p
) {}
22 for (; int [[clang::address_space(1)]] * p
= nullptr; ) {}
23 while(int [[clang::address_space(1)]] * p
= nullptr) {}
24 if (int [[clang::address_space(1)]] * p
= nullptr) {}
26 } catch(int [[clang::address_space(1)]] & i
) {
30 [[clang::address_space(1)]] int* return_value(); // expected-warning {{applying attribute 'address_space' to a declaration is deprecated; apply it to the type instead}}
31 int [[clang::address_space(1)]] * return_value();
33 [[clang::address_space(1)]] int global1
; // expected-warning {{applying attribute 'address_space' to a declaration is deprecated; apply it to the type instead}}
34 int global2
[[clang::address_space(1)]]; // expected-warning {{applying attribute 'address_space' to a declaration is deprecated; apply it to the type instead}}
35 int [[clang::address_space(1)]] global3
;
36 int [[clang::address_space(1)]] global4
;
38 struct [[clang::address_space(1)]] S
{ // expected-error {{'address_space' attribute cannot be applied to a declaration}}
39 [[clang::address_space(1)]] int* member_function_1(); // expected-warning {{applying attribute 'address_space' to a declaration is deprecated; apply it to the type instead}}
40 int [[clang::address_space(1)]] * member_function_2();
44 [[clang::address_space(1)]] T var_template_1
; // expected-warning {{applying attribute 'address_space' to a declaration is deprecated; apply it to the type instead}}
46 T
[[clang::address_space(1)]] var_template_2
;
48 using void_ptr
[[clang::address_space(1)]] = void *; // expected-warning {{applying attribute 'address_space' to a declaration is deprecated; apply it to the type instead}}
49 // Intentionally using the same alias name to check that the aliases define the
51 using void_ptr
= void [[clang::address_space(1)]] *;
54 [[clang::address_space(1)]] using namespace N
; // expected-error {{'address_space' attribute cannot be applied to a declaration}}