1 // RUN: clang-tblgen -gen-clang-attr-parser-string-switches -I%p/../../include %s -o - 2>&1 | FileCheck %s
3 // Tests that the tablegen can support attributes with the same spellings but
4 // different argument types.
6 include "clang/Basic/Attr.td"
8 // Test attributeParsedArgsUnevaluated : different ParseArgumentsAsUnevaluated
9 def TestUnEvalOne : InheritableAttr {
10 let Spellings = [Clang<"test_uneval">];
11 let Args = [ExprArgument<"Count">];
12 let Subjects = SubjectList<[Function]>;
13 let ParseArgumentsAsUnevaluated = 1;
14 let Documentation = [Undocumented];
17 def TestUnEvalTwo : InheritableAttr {
18 let Spellings = [Pragma<"", "test_uneval">];
19 let Args = [ExprArgument<"Count">];
20 let Subjects = SubjectList<[Function]>;
21 let Documentation = [Undocumented];
24 // CHECK: #if defined(CLANG_ATTR_ARG_CONTEXT_LIST)
25 // CHECK: .Case("test_uneval", (Syntax==AttributeCommonInfo::AS_GNU && !ScopeName) ? 1 :
26 // CHECK-SAME: (Syntax==AttributeCommonInfo::AS_CXX11 && ScopeName && ScopeName->getName()=="clang") ? 1 :
27 // CHECK-SAME: (Syntax==AttributeCommonInfo::AS_C23 && ScopeName && ScopeName->getName()=="clang") ? 1 : 0)
28 // CHECK: #endif // CLANG_ATTR_ARG_CONTEXT_LIST
30 // Test attributeHasIdentifierArg: Same spelling, one with and one without
32 def TestIdentOne : Attr {
33 let Spellings = [GNU<"test_ident">];
34 let Args = [EnumArgument<"Option", "OptionType", /*is_string=*/false,
35 ["optA", "optB"], ["OPTA", "OPTB"]>];
36 let Subjects = SubjectList<[Function]>;
37 let Documentation = [Undocumented];
40 def TestIdentTwo : StmtAttr {
41 let Spellings = [Pragma<"", "test_ident">];
42 let Args = [UnsignedArgument<"val", /*opt*/1>];
43 let Subjects = SubjectList<[Function]>;
44 let Documentation = [Undocumented];
47 // Checks that the simple value is produced if only one attribute with a
49 def TestOnlyIdent : Attr {
50 let Spellings = [GNU<"test_only_ident">];
51 let Args = [EnumArgument<"Option", "OptionType", /*is_string=*/false,
52 ["optA", "optB"], ["OPTA", "OPTB"]>];
53 let Subjects = SubjectList<[Function]>;
54 let Documentation = [Undocumented];
57 // CHECK: #if defined(CLANG_ATTR_IDENTIFIER_ARG_LIST)
58 // CHECK: .Case("test_ident", (Syntax==AttributeCommonInfo::AS_GNU && !ScopeName)
59 // CHECK: .Case("test_only_ident", true)
60 // CHECK: .Case("test_targspec",
61 // CHECK-SAME: (T.getArch() == llvm::Triple::arm)) ? 1 : 0
62 // CHECK: #endif // CLANG_ATTR_IDENTIFIER_ARG_LIST
64 // Test attributeStringLiteralListArg : Same spelling, some with a
65 // StringArgument, some without, some in different locations.
66 def TestStringOne : DeclOrTypeAttr {
67 let Spellings = [Clang<"test_string">];
68 let Args = [UnsignedArgument<"unsarg">];
69 let Subjects = SubjectList<[Function, TypedefName, ParmVar]>;
70 let Documentation = [AcquireHandleDocs];
73 def TestStringTwo : InheritableAttr {
74 let Spellings = [Pragma<"", "test_string">];
75 let Args = [StringArgument<"strarg">];
76 let Subjects = SubjectList<[Function], ErrorDiag>;
77 let Documentation = [Undocumented];
80 // In a different position
81 def TestStringThree : Attr {
82 let Spellings = [Declspec<"test_string">];
83 let Args = [UnsignedArgument<"uarg">, StringArgument<"strarg">];
84 let Subjects = SubjectList<[Function, TypedefName, ParmVar]>;
85 let Documentation = [AcquireHandleDocs];
88 // CHECK: #if defined(CLANG_ATTR_STRING_LITERAL_ARG_LIST)
89 // CHECK: .Case("test_string", (Syntax==AttributeCommonInfo::AS_Declspec && !ScopeName) ? 2 :
90 // CHECK-SAME: (Syntax==AttributeCommonInfo::AS_Pragma && !ScopeName) ? 1 : 0)
91 // CHECK: .Case("test_targspec",
92 // CHECK-SAME: (T.getArch() == llvm::Triple::arm)) ? 4294967294 :
93 // CHECK-SAME: (T.getArch() == llvm::Triple::ppc)) ? 1 :
94 // CHECK: #endif // CLANG_ATTR_STRING_LITERAL_ARG_LIST
96 // Test attributeHasVariadicIdentifierArg : One with VariadicIdentifierArgument
98 def TestVariadicIdentOne : InheritableAttr {
99 let Spellings = [Clang<"test_var_ident">];
100 let Args = [UnsignedArgument<"Hint">];
101 let Subjects = SubjectList<[Function], ErrorDiag>;
102 let Documentation = [Undocumented];
105 def TestVariadicIdentTwo : InheritableAttr {
106 let Spellings = [Pragma<"", "test_var_ident">];
107 let Args = [VariadicIdentifierArgument<"iargs">];
108 let Subjects = SubjectList<[Function], ErrorDiag>;
109 let Documentation = [Undocumented];
112 // CHECK: #if defined(CLANG_ATTR_VARIADIC_IDENTIFIER_ARG_LIST)
113 // CHECK: .Case("test_var_ident", (Syntax==AttributeCommonInfo::AS_Pragma && !ScopeName))
114 // CHECK: #endif // CLANG_ATTR_VARIADIC_IDENTIFIER_ARG_LIST
116 // Test attributeTreatsKeywordThisAsIdentifier : Same spelling, one with and
117 // one without VariadicParamOrParamIdxArgument.
118 def TestVarOrIdxOne : InheritableAttr {
119 let Spellings = [Clang<"test_var_idx">];
120 let Args = [VariadicParamOrParamIdxArgument<"arg">];
121 let Subjects = SubjectList<[Function], ErrorDiag>;
122 let Documentation = [Undocumented];
125 def TestVarOrIdxTwo : InheritableAttr {
126 let Spellings = [Pragma<"", "test_var_idx">];
127 let Args = [UnsignedArgument<"Hint">];
128 let Subjects = SubjectList<[Function], ErrorDiag>;
129 let Documentation = [Undocumented];
132 // CHECK: #if defined(CLANG_ATTR_THIS_ISA_IDENTIFIER_ARG_LIST)
133 // CHECK: .Case("test_var_idx", (Syntax==AttributeCommonInfo::AS_GNU && !ScopeName) ? 1 :
134 // CHECK-SAME: (Syntax==AttributeCommonInfo::AS_CXX11 && ScopeName && ScopeName->getName()=="clang") ? 1 :
135 // CHECK-SAME: (Syntax==AttributeCommonInfo::AS_C23 && ScopeName && ScopeName->getName()=="clang") ? 1 : 0)
136 // CHECK: #endif // CLANG_ATTR_THIS_ISA_IDENTIFIER_ARG_LIST
138 // Test attributeAcceptsExprPack : One with, one without.
139 def TestExprPackOne : InheritableAttr {
140 let Spellings = [Clang<"test_expr_pack">];
141 let Args = [StringArgument<"str">, VariadicExprArgument<"args">];
142 let Subjects = SubjectList<[Function], ErrorDiag>;
143 let AcceptsExprPack = 1;
144 let Documentation = [Undocumented];
147 def TestExprPackTwo : InheritableAttr {
148 let Spellings = [Pragma<"", "test_expr_pack">];
149 let Args = [StringArgument<"str">, VariadicExprArgument<"args">];
150 let Subjects = SubjectList<[Function], ErrorDiag>;
151 let Documentation = [Undocumented];
154 // CHECK: #if defined(CLANG_ATTR_ACCEPTS_EXPR_PACK)
155 // CHECK: .Case("test_expr_pack", (Syntax==AttributeCommonInfo::AS_GNU && !ScopeName) ? 1 :
156 // CHECK-SAME: (Syntax==AttributeCommonInfo::AS_CXX11 && ScopeName && ScopeName->getName()=="clang") ? 1 :
157 // CHECK-SAME: (Syntax==AttributeCommonInfo::AS_C23 && ScopeName && ScopeName->getName()=="clang") ? 1 : 0)
158 // CHECK: #endif // CLANG_ATTR_ACCEPTS_EXPR_PACK
161 // Test attributeIsTypeArgAttr : Same spelling, one with TypeArgument and one
163 def TestTypeOne : InheritableAttr {
164 let Spellings = [Clang<"test_type">];
165 let Args = [TypeArgument<"Hint">];
166 let Subjects = SubjectList<[Function], ErrorDiag>;
167 let Documentation = [Undocumented];
170 def TestTypeTwo : InheritableAttr {
171 let Spellings = [Pragma<"", "test_type">];
172 let Args = [UnsignedArgument<"Hint">];
173 let Subjects = SubjectList<[Function], ErrorDiag>;
174 let Documentation = [Undocumented];
177 // CHECK: #if defined(CLANG_ATTR_TYPE_ARG_LIST)
178 // CHECK: .Case("test_type", (Syntax==AttributeCommonInfo::AS_GNU && !ScopeName) ? 1 :
179 // CHECK-SAME: (Syntax==AttributeCommonInfo::AS_CXX11 && ScopeName && ScopeName->getName()=="clang") ? 1 :
180 // CHECK-SAME: (Syntax==AttributeCommonInfo::AS_C23 && ScopeName && ScopeName->getName()=="clang") ? 1 : 0)
181 // CHECK: #endif // CLANG_ATTR_TYPE_ARG_LIST
183 // Test attributeHasStrictIdentifierArgs, one used StrictEnumParameters, the
185 def TestStrictEnumOne : InheritableAttr {
186 let Spellings = [Clang<"strict_enum">];
187 let StrictEnumParameters = 1;
188 let Args = [EnumArgument<"One", "OneType", /*is_string=*/true,
189 ["a", "b", "c", "d"],
190 ["A", "B", "C", "D"]>,
191 IntArgument<"Other", 1>,
192 EnumArgument<"Two", "TwoType", /*is_string=*/true,
193 ["e", "f", "g", "h"],
194 ["E", "F", "G", "H"]>];
195 let Subjects = SubjectList<[Function], ErrorDiag>;
196 let Documentation = [Undocumented];
199 def TestStrictEnumTwo : InheritableAttr {
200 let Spellings = [Pragma<"", "strict_enum">];
201 let Args = [VariadicExprArgument<"Args">];
202 let Subjects = SubjectList<[Function], ErrorDiag>;
203 let Documentation = [Undocumented];
206 // CHECK: #if defined(CLANG_ATTR_STRICT_IDENTIFIER_ARG_LIST)
207 // CHECK: .Case("strict_enum", (Syntax==AttributeCommonInfo::AS_GNU && !ScopeName) ? 1 :
208 // CHECK-SAME: (Syntax==AttributeCommonInfo::AS_CXX11 && ScopeName && ScopeName->getName()=="clang") ? 1 :
209 // CHECK-SAME: (Syntax==AttributeCommonInfo::AS_C23 && ScopeName && ScopeName->getName()=="clang") ? 1 : 0)
210 // CHECK: #endif // CLANG_ATTR_STRICT_IDENTIFIER_ARG_LIST
212 // Test that TargetSpecific attributes work as expected.
214 def TargSpecX86 : InheritableAttr, TargetSpecificAttr<TargetArch<["x86"]>> {
215 let Spellings = [GCC<"test_targspec">];
216 let Subjects = SubjectList<[Function]>;
217 let Args = [UnsignedArgument<"ua">, DefaultIntArgument<"o", 0>];
218 let ParseKind = "TargSpec";
219 let Documentation = [Undocumented];
221 def TargSpecPPC : InheritableAttr, TargetSpecificAttr<TargetArch<["ppc"]>> {
222 let Spellings = [GCC<"test_targspec">];
223 let Subjects = SubjectList<[Function]>;
224 let Args = [StringArgument<"str">, VariadicExprArgument<"args">];
225 let ParseKind = "TargSpec";
226 let Documentation = [Undocumented];
228 def TargSpecARM : InheritableAttr, TargetSpecificAttr<TargetArch<["arm"]>> {
229 let Spellings = [GCC<"test_targspec">];
230 let Subjects = SubjectList<[Function]>;
231 let Args = [IdentifierArgument<"id">, VariadicStringArgument<"sargs">];
232 let ParseKind = "TargSpec";
233 let Documentation = [Undocumented];