150
|
1 // RUN: %clang_cc1 -verify -ast-dump %s | \
|
|
2 // RUN: FileCheck --implicit-check-not OwnerAttr --implicit-check-not PointerAttr %s
|
|
3
|
|
4 int [[gsl::Owner]] i;
|
|
5 // expected-error@-1 {{'Owner' attribute cannot be applied to types}}
|
|
6 void [[gsl::Owner]] f();
|
|
7 // expected-error@-1 {{'Owner' attribute cannot be applied to types}}
|
|
8
|
|
9 [[gsl::Owner]] void f();
|
|
10 // expected-warning@-1 {{'Owner' attribute only applies to structs}}
|
|
11
|
|
12 union [[gsl::Owner(int)]] Union{};
|
|
13 // expected-warning@-1 {{'Owner' attribute only applies to structs}}
|
|
14
|
|
15 struct S {
|
|
16 };
|
|
17
|
|
18 S [[gsl::Owner]] Instance;
|
|
19 // expected-error@-1 {{'Owner' attribute cannot be applied to types}}
|
|
20
|
|
21 class [[gsl::Owner(7)]] OwnerDerefNoType{};
|
|
22 // expected-error@-1 {{expected a type}}
|
|
23
|
|
24 class [[gsl::Pointer("int")]] PointerDerefNoType{};
|
|
25 // expected-error@-1 {{expected a type}}
|
|
26
|
|
27 class [[gsl::Owner(int)]] [[gsl::Pointer(int)]] BothOwnerPointer{};
|
|
28 // expected-error@-1 {{'Pointer' and 'Owner' attributes are not compatible}}
|
|
29 // expected-note@-2 {{conflicting attribute is here}}
|
|
30 // CHECK: CXXRecordDecl {{.*}} BothOwnerPointer
|
|
31 // CHECK: OwnerAttr {{.*}} int
|
|
32
|
|
33 class [[gsl::Owner(void)]] OwnerVoidDerefType{};
|
|
34 // CHECK: CXXRecordDecl {{.*}} OwnerVoidDerefType
|
|
35 // CHECK: OwnerAttr {{.*}} void
|
|
36 class [[gsl::Pointer(void)]] PointerVoidDerefType{};
|
|
37 // CHECK: CXXRecordDecl {{.*}} PointerVoidDerefType
|
|
38 // CHECK: PointerAttr {{.*}} void
|
|
39
|
|
40 class [[gsl::Pointer(int)]] AddConflictLater{};
|
|
41 // CHECK: CXXRecordDecl {{.*}} AddConflictLater
|
|
42 // CHECK: PointerAttr {{.*}} int
|
|
43 class [[gsl::Owner(int)]] AddConflictLater;
|
|
44 // expected-error@-1 {{'Owner' and 'Pointer' attributes are not compatible}}
|
|
45 // expected-note@-5 {{conflicting attribute is here}}
|
|
46 // CHECK: CXXRecordDecl {{.*}} AddConflictLater
|
|
47 // CHECK: PointerAttr {{.*}} Inherited int
|
|
48
|
|
49 class [[gsl::Owner(int)]] AddConflictLater2{};
|
|
50 // CHECK: CXXRecordDecl {{.*}} AddConflictLater2
|
|
51 // CHECK: OwnerAttr {{.*}} int
|
|
52 class [[gsl::Owner(float)]] AddConflictLater2;
|
|
53 // expected-error@-1 {{'Owner' and 'Owner' attributes are not compatible}}
|
|
54 // expected-note@-5 {{conflicting attribute is here}}
|
|
55 // CHECK: CXXRecordDecl {{.*}} AddConflictLater
|
|
56 // CHECK: OwnerAttr {{.*}} Inherited int
|
|
57
|
|
58 class [[gsl::Owner()]] [[gsl::Owner(int)]] WithAndWithoutParameter{};
|
|
59 // expected-error@-1 {{'Owner' and 'Owner' attributes are not compatible}}
|
|
60 // expected-note@-2 {{conflicting attribute is here}}
|
|
61 // CHECK: CXXRecordDecl {{.*}} WithAndWithoutParameter
|
|
62 // CHECK: OwnerAttr
|
|
63
|
|
64 class [[gsl::Owner(int &)]] ReferenceType{};
|
|
65 // expected-error@-1 {{a reference type is an invalid argument to attribute 'Owner'}}
|
|
66
|
|
67 class [[gsl::Pointer(int[])]] ArrayType{};
|
|
68 // expected-error@-1 {{an array type is an invalid argument to attribute 'Pointer'}}
|
|
69
|
|
70 class [[gsl::Owner]] OwnerMissingParameter{};
|
|
71 // CHECK: CXXRecordDecl {{.*}} OwnerMissingParameter
|
|
72 // CHECK: OwnerAttr
|
|
73
|
|
74 class [[gsl::Pointer]] PointerMissingParameter{};
|
|
75 // CHECK: CXXRecordDecl {{.*}} PointerMissingParameter
|
|
76 // CHECK: PointerAttr
|
|
77
|
|
78 class [[gsl::Owner()]] OwnerWithEmptyParameterList{};
|
|
79 // CHECK: CXXRecordDecl {{.*}} OwnerWithEmptyParameterList
|
|
80 // CHECK: OwnerAttr {{.*}}
|
|
81
|
|
82 class [[gsl::Pointer()]] PointerWithEmptyParameterList{};
|
|
83 // CHECK: CXXRecordDecl {{.*}} PointerWithEmptyParameterList
|
|
84 // CHECK: PointerAttr {{.*}}
|
|
85
|
|
86 struct [[gsl::Owner(int)]] AnOwner{};
|
|
87 // CHECK: CXXRecordDecl {{.*}} AnOwner
|
|
88 // CHECK: OwnerAttr {{.*}} int
|
|
89
|
|
90 struct S;
|
|
91 class [[gsl::Pointer(S)]] APointer{};
|
|
92 // CHECK: CXXRecordDecl {{.*}} APointer
|
|
93 // CHECK: PointerAttr {{.*}} S
|
|
94
|
|
95 class [[gsl::Owner(int)]] [[gsl::Owner(int)]] DuplicateOwner{};
|
|
96 // CHECK: CXXRecordDecl {{.*}} DuplicateOwner
|
|
97 // CHECK: OwnerAttr {{.*}} int
|
|
98
|
|
99 class [[gsl::Pointer(int)]] [[gsl::Pointer(int)]] DuplicatePointer{};
|
|
100 // CHECK: CXXRecordDecl {{.*}} DuplicatePointer
|
|
101 // CHECK: PointerAttr {{.*}} int
|
|
102
|
|
103 class [[gsl::Owner(int)]] AddTheSameLater{};
|
|
104 // CHECK: CXXRecordDecl {{.*}} AddTheSameLater
|
|
105 // CHECK: OwnerAttr {{.*}} int
|
|
106
|
|
107 class [[gsl::Owner(int)]] AddTheSameLater;
|
|
108 // CHECK: CXXRecordDecl {{.*}} prev {{.*}} AddTheSameLater
|
|
109 // CHECK: OwnerAttr {{.*}} int
|
|
110
|
|
111 template <class T>
|
|
112 class [[gsl::Owner]] ForwardDeclared;
|
|
113 // CHECK: ClassTemplateDecl {{.*}} ForwardDeclared
|
|
114 // CHECK: OwnerAttr {{.*}}
|
|
115 // CHECK: ClassTemplateSpecializationDecl {{.*}} ForwardDeclared
|
|
116 // CHECK: TemplateArgument type 'int'
|
|
117 // CHECK: OwnerAttr {{.*}}
|
|
118
|
|
119 template <class T>
|
|
120 class [[gsl::Owner]] ForwardDeclared {
|
|
121 // CHECK: ClassTemplateDecl {{.*}} ForwardDeclared
|
|
122 // CHECK: CXXRecordDecl {{.*}} ForwardDeclared definition
|
|
123 // CHECK: OwnerAttr {{.*}}
|
|
124 };
|
|
125
|
|
126 static_assert(sizeof(ForwardDeclared<int>), ""); // Force instantiation.
|