663 lines · cpp
1// RUN: %clang_cc1 -std=gnu++11 -fsyntax-only -verify %s2// RUN: not %clang_cc1 -std=gnu++11 -ast-dump %s | FileCheck %s3 4namespace attribute_aligned {5 template<int N>6 struct X {7 char c[1] __attribute__((__aligned__((N)))); // expected-error {{alignment is not a power of 2}}8 };9 10 template <bool X> struct check {11 int check_failed[X ? 1 : -1]; // expected-error {{array with a negative size}}12 };13 14 template <int N> struct check_alignment {15 typedef check<N == sizeof(X<N>)> t; // expected-note {{in instantiation}}16 };17 18 check_alignment<1>::t c1;19 check_alignment<2>::t c2;20 check_alignment<3>::t c3; // expected-note 2 {{in instantiation}}21 check_alignment<4>::t c4;22 23 template<unsigned Size, unsigned Align>24 class my_aligned_storage25 {26 __attribute__((aligned(Align))) char storage[Size];27 };28 29 template<typename T>30 class C {31 public:32 C() {33 static_assert(sizeof(t) == sizeof(T), "my_aligned_storage size wrong");34 static_assert(alignof(t) == alignof(T), "my_aligned_storage align wrong"); // expected-warning{{'alignof' applied to an expression is a GNU extension}}35 }36 37 private:38 my_aligned_storage<sizeof(T), alignof(T)> t;39 };40 41 C<double> cd;42}43 44namespace PR9049 {45 extern const void *CFRetain(const void *ref);46 47 template<typename T> __attribute__((cf_returns_retained))48 inline T WBCFRetain(T aValue) { return aValue ? (T)CFRetain(aValue) : (T)0; }49 50 51 extern void CFRelease(const void *ref);52 53 template<typename T>54 inline void WBCFRelease(__attribute__((cf_consumed)) T aValue) { if(aValue) CFRelease(aValue); }55}56 57namespace attribute_annotate {58// CHECK: FunctionTemplateDecl {{.*}} HasAnnotations59// CHECK: AnnotateAttr {{.*}} "ANNOTATE_FOO"60// CHECK: AnnotateAttr {{.*}} "ANNOTATE_BAR"61// CHECK: FunctionDecl {{.*}} HasAnnotations62// CHECK: TemplateArgument type 'int'63// CHECK: AnnotateAttr {{.*}} "ANNOTATE_FOO"64// CHECK: AnnotateAttr {{.*}} "ANNOTATE_BAR"65template<typename T> [[clang::annotate("ANNOTATE_FOO"), clang::annotate("ANNOTATE_BAR")]] void HasAnnotations();66void UseAnnotations() { HasAnnotations<int>(); }67 68// CHECK: FunctionTemplateDecl {{.*}} HasStmtAnnotations69// CHECK: AnnotateAttr {{.*}} "ANNOTATE_BAZ"70// CHECK: FunctionDecl {{.*}} HasStmtAnnotations71// CHECK: TemplateArgument type 'int'72// CHECK: AnnotateAttr {{.*}} "ANNOTATE_BAZ"73template<typename T> void HasStmtAnnotations() {74 int x = 0;75 [[clang::annotate("ANNOTATE_BAZ")]] x++;76}77void UseStmtAnnotations() { HasStmtAnnotations<int>(); }78 79// CHECK: FunctionTemplateDecl {{.*}} HasPackAnnotations80// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is81// CHECK-NEXT: FunctionDecl {{.*}} HasPackAnnotations 'void ()'82// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BAZ"83// CHECK-NEXT: PackExpansionExpr {{.*}} 'int'84// CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'85// CHECK-NEXT: FunctionDecl {{.*}} used HasPackAnnotations 'void ()'86// CHECK-NEXT: TemplateArgument{{.*}} pack87// CHECK-NEXT: TemplateArgument{{.*}} integral '1'88// CHECK-NEXT: TemplateArgument{{.*}} integral '2'89// CHECK-NEXT: TemplateArgument{{.*}} integral '3'90// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BAZ"91// CHECK-NEXT: ConstantExpr {{.*}} 'int'92// CHECK-NEXT: value: Int 193// CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'94// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is95// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 196// CHECK-NEXT: ConstantExpr {{.*}} 'int'97// CHECK-NEXT: value: Int 298// CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'99// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is100// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 2101// CHECK-NEXT: ConstantExpr {{.*}} 'int'102// CHECK-NEXT: value: Int 3103// CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'104// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is105// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3106template <int... Is> [[clang::annotate("ANNOTATE_BAZ", Is...)]] void HasPackAnnotations();107void UsePackAnnotations() { HasPackAnnotations<1, 2, 3>(); }108 109// CHECK: FunctionTemplateDecl {{.*}} HasStmtPackAnnotations110// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is111// CHECK-NEXT: FunctionDecl {{.*}} HasStmtPackAnnotations 'void ()'112// CHECK: AttributedStmt {{.*}}113// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_QUUX"114// CHECK-NEXT: PackExpansionExpr {{.*}} 'int'115// CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'116// CHECK: FunctionDecl {{.*}} used HasStmtPackAnnotations 'void ()'117// CHECK-NEXT: TemplateArgument{{.*}} pack118// CHECK-NEXT: TemplateArgument{{.*}} integral '1'119// CHECK-NEXT: TemplateArgument{{.*}} integral '2'120// CHECK-NEXT: TemplateArgument{{.*}} integral '3'121// CHECK: AttributedStmt {{.*}}122// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_QUUX"123// CHECK-NEXT: PackExpansionExpr {{.*}}124// CHECK-NEXT: SubstNonTypeTemplateParmPackExpr {{.*}}125// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is126// CHECK-NEXT: TemplateArgument pack '<1, 2, 3>'127// CHECK-NEXT: TemplateArgument integral '1'128// CHECK-NEXT: TemplateArgument integral '2'129// CHECK-NEXT: TemplateArgument integral '3'130template <int... Is> void HasStmtPackAnnotations() {131 int x = 0;132 [[clang::annotate("ANNOTATE_QUUX", Is...)]] x++;133}134void UseStmtPackAnnotations() { HasStmtPackAnnotations<1, 2, 3>(); }135 136template <int... Is> [[clang::annotate(Is...)]] void HasOnlyPackAnnotation() {} // expected-error {{expected string literal as argument of 'annotate' attribute}}137 138void UseOnlyPackAnnotations() {139 HasOnlyPackAnnotation<>();140 HasOnlyPackAnnotation<1>();141}142 143// CHECK: ClassTemplateDecl {{.*}} AnnotatedPackTemplateStruct144// CHECK-NEXT: TemplateTypeParmDecl {{.*}} typename depth 0 index 0 T145// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 1 ... Is146// CHECK-NEXT: CXXRecordDecl {{.*}} struct AnnotatedPackTemplateStruct definition147// CHECK-NEXT: DefinitionData148// CHECK-NEXT: DefaultConstructor149// CHECK-NEXT: CopyConstructor150// CHECK-NEXT: MoveConstructor151// CHECK-NEXT: CopyAssignment152// CHECK-NEXT: MoveAssignment153// CHECK-NEXT: Destructor154// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FOZ"155// CHECK-NEXT: PackExpansionExpr {{.*}} 'int'156// CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'157// CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct158// CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition159// CHECK-NEXT: DefinitionData160// CHECK-NEXT: DefaultConstructor161// CHECK-NEXT: CopyConstructor162// CHECK-NEXT: MoveConstructor163// CHECK-NEXT: CopyAssignment164// CHECK-NEXT: MoveAssignment165// CHECK-NEXT: Destructor166// CHECK-NEXT: TemplateArgument{{.*}} type 'int'167// CHECK-NEXT: BuiltinType {{.*}} 'int'168// CHECK-NEXT: TemplateArgument{{.*}} pack169// CHECK-NEXT: TemplateArgument{{.*}} integral '1'170// CHECK-NEXT: TemplateArgument{{.*}} integral '2'171// CHECK-NEXT: TemplateArgument{{.*}} integral '3'172// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BOO"173// CHECK-NEXT: ConstantExpr {{.*}} 'int'174// CHECK-NEXT: value: Int 1175// CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'176// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is177// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 1178// CHECK-NEXT: ConstantExpr {{.*}} 'int'179// CHECK-NEXT: value: Int 2180// CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'181// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is182// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 2183// CHECK-NEXT: ConstantExpr {{.*}} 'int'184// CHECK-NEXT: value: Int 3185// CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'186// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is187// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3188// CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct189// CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition190// CHECK-NEXT: DefinitionData191// CHECK-NEXT: DefaultConstructor192// CHECK-NEXT: CopyConstructor193// CHECK-NEXT: MoveConstructor194// CHECK-NEXT: CopyAssignment195// CHECK-NEXT: MoveAssignment196// CHECK-NEXT: Destructor197// CHECK-NEXT: TemplateArgument type 'float'198// CHECK-NEXT: BuiltinType {{.*}} 'float'199// CHECK-NEXT: TemplateArgument{{.*}} pack200// CHECK-NEXT: TemplateArgument{{.*}} integral '3'201// CHECK-NEXT: TemplateArgument{{.*}} integral '2'202// CHECK-NEXT: TemplateArgument{{.*}} integral '1'203// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FOZ"204// CHECK-NEXT: ConstantExpr {{.*}} 'int'205// CHECK-NEXT: value: Int 4206// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4207// CHECK-NEXT: ConstantExpr {{.*}} 'int'208// CHECK-NEXT: value: Int 5209// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5210// CHECK-NEXT: ConstantExpr {{.*}} 'int'211// CHECK-NEXT: value: Int 6212// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 6213// CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct214// CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition215// CHECK-NEXT: DefinitionData216// CHECK-NEXT: DefaultConstructor217// CHECK-NEXT: CopyConstructor218// CHECK-NEXT: MoveConstructor219// CHECK-NEXT: CopyAssignment220// CHECK-NEXT: MoveAssignment221// CHECK-NEXT: Destructor222// CHECK-NEXT: TemplateArgument type 'bool'223// CHECK-NEXT: BuiltinType {{.*}} 'bool'224// CHECK-NEXT: TemplateArgument{{.*}} pack225// CHECK-NEXT: TemplateArgument{{.*}} integral '7'226// CHECK-NEXT: TemplateArgument{{.*}} integral '8'227// CHECK-NEXT: TemplateArgument{{.*}} integral '9'228// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FOZ"229// CHECK-NEXT: ConstantExpr {{.*}} 'int'230// CHECK-NEXT: value: Int 7231// CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'232// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 1 ... Is233// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 7234// CHECK-NEXT: ConstantExpr {{.*}} 'int'235// CHECK-NEXT: value: Int 8236// CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'237// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 1 ... Is238// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 8239// CHECK-NEXT: ConstantExpr {{.*}} 'int'240// CHECK-NEXT: value: Int 9241// CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'242// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 1 ... Is243// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 9244// CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct245// CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition246// CHECK-NEXT: DefinitionData247// CHECK-NEXT: DefaultConstructor248// CHECK-NEXT: CopyConstructor249// CHECK-NEXT: MoveConstructor250// CHECK-NEXT: CopyAssignment251// CHECK-NEXT: MoveAssignment252// CHECK-NEXT: Destructor253// CHECK-NEXT: TemplateArgument type 'char'254// CHECK-NEXT: BuiltinType {{.*}} 'char'255// CHECK-NEXT: TemplateArgument{{.*}} pack256// CHECK-NEXT: TemplateArgument{{.*}} integral '1'257// CHECK-NEXT: TemplateArgument{{.*}} integral '2'258// CHECK-NEXT: TemplateArgument{{.*}} integral '3'259// CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct260// CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition261// CHECK-NEXT: DefinitionData262// CHECK-NEXT: DefaultConstructor263// CHECK-NEXT: CopyConstructor264// CHECK-NEXT: MoveConstructor265// CHECK-NEXT: CopyAssignment266// CHECK-NEXT: MoveAssignment267// CHECK-NEXT: Destructor268// CHECK-NEXT: TemplateArgument{{.*}} type 'char'269// CHECK-NEXT: BuiltinType {{.*}} 'char'270// CHECK-NEXT: TemplateArgument{{.*}} pack271// CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct272// CHECK-NEXT: ClassTemplatePartialSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition273// CHECK-NEXT: DefinitionData274// CHECK-NEXT: DefaultConstructor275// CHECK-NEXT: CopyConstructor276// CHECK-NEXT: MoveConstructor277// CHECK-NEXT: CopyAssignment278// CHECK-NEXT: MoveAssignment279// CHECK-NEXT: Destructor280// CHECK-NEXT: TemplateArgument{{.*}} type 'int'281// CHECK-NEXT: BuiltinType {{.*}} 'int'282// CHECK-NEXT: TemplateArgument{{.*}} pack283// CHECK-NEXT: TemplateArgument{{.*}} expr284// CHECK-NEXT: PackExpansionExpr {{.*}} 'int'285// CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'286// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is287// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BOO"288// CHECK-NEXT: PackExpansionExpr {{.*}} 'int'289// CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'290// CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct291// CHECK-NEXT: ClassTemplatePartialSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition292// CHECK-NEXT: DefinitionData293// CHECK-NEXT: DefaultConstructor294// CHECK-NEXT: CopyConstructor295// CHECK-NEXT: MoveConstructor296// CHECK-NEXT: CopyAssignment297// CHECK-NEXT: MoveAssignment298// CHECK-NEXT: Destructor299// CHECK-NEXT: TemplateArgument{{.*}} type 'float'300// CHECK-NEXT: BuiltinType {{.*}} 'float'301// CHECK-NEXT: TemplateArgument{{.*}} pack302// CHECK-NEXT: TemplateArgument{{.*}} expr303// CHECK-NEXT: PackExpansionExpr {{.*}} 'int'304// CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'305// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is306// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FOZ"307// CHECK-NEXT: ConstantExpr {{.*}} 'int'308// CHECK-NEXT: value: Int 4309// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4310// CHECK-NEXT: ConstantExpr {{.*}} 'int'311// CHECK-NEXT: value: Int 5312// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5313// CHECK-NEXT: ConstantExpr {{.*}} 'int'314// CHECK-NEXT: value: Int 6315// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 6316// CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct317template <typename T, int... Is> struct [[clang::annotate("ANNOTATE_FOZ", Is...)]] AnnotatedPackTemplateStruct{};318template <int... Is> struct [[clang::annotate("ANNOTATE_BOO", Is...)]] AnnotatedPackTemplateStruct<int, Is...>{};319template <int... Is> struct [[clang::annotate("ANNOTATE_FOZ", 4, 5, 6)]] AnnotatedPackTemplateStruct<float, Is...>{};320template <int... Is> struct [[clang::annotate(Is...)]] AnnotatedPackTemplateStruct<char, Is...>{}; // expected-error {{expected string literal as argument of 'annotate' attribute}}321void UseAnnotatedPackTemplateStructSpecializations() {322 AnnotatedPackTemplateStruct<int, 1, 2, 3> Instance1{};323 AnnotatedPackTemplateStruct<float, 3, 2, 1> Instance2{};324 AnnotatedPackTemplateStruct<bool, 7, 8, 9> Instance3{};325 AnnotatedPackTemplateStruct<char, 1, 2, 3> Instance4{};326 AnnotatedPackTemplateStruct<char> Instance5{};327}328 329// CHECK: ClassTemplateDecl {{.*}} InvalidAnnotatedPackTemplateStruct330// CHECK-NEXT: TemplateTypeParmDecl {{.*}} typename depth 0 index 0 T331// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} 'int' depth 0 index 1 ... Is332// CHECK-NEXT: CXXRecordDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition333// CHECK-NEXT: DefinitionData334// CHECK-NEXT: DefaultConstructor335// CHECK-NEXT: CopyConstructor336// CHECK-NEXT: MoveConstructor337// CHECK-NEXT: CopyAssignment338// CHECK-NEXT: MoveAssignment339// CHECK-NEXT: Destructor340// CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct341// CHECK-NEXT: ClassTemplateSpecialization {{.*}} 'InvalidAnnotatedPackTemplateStruct'342// CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition343// CHECK-NEXT: DefinitionData344// CHECK-NEXT: DefaultConstructor345// CHECK-NEXT: CopyConstructor346// CHECK-NEXT: MoveConstructor347// CHECK-NEXT: CopyAssignment348// CHECK-NEXT: MoveAssignment349// CHECK-NEXT: Destructor350// CHECK-NEXT: TemplateArgument{{.*}} type 'int'351// CHECK-NEXT: BuiltinType {{.*}} 'int'352// CHECK-NEXT: TemplateArgument{{.*}} pack353// CHECK-NEXT: TemplateArgument{{.*}} integral '1'354// CHECK-NEXT: TemplateArgument{{.*}} integral '2'355// CHECK-NEXT: TemplateArgument{{.*}} integral '3'356// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BIR"357// CHECK-NEXT: ConstantExpr {{.*}} 'int'358// CHECK-NEXT: value: Int 1359// CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'360// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is361// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 1362// CHECK-NEXT: ConstantExpr {{.*}} 'int'363// CHECK-NEXT: value: Int 2364// CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'365// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is366// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 2367// CHECK-NEXT: ConstantExpr {{.*}} 'int'368// CHECK-NEXT: value: Int 3369// CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'370// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is371// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3372// CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct373// CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition374// CHECK-NEXT: DefinitionData375// CHECK-NEXT: DefaultConstructor376// CHECK-NEXT: CopyConstructor377// CHECK-NEXT: MoveConstructor378// CHECK-NEXT: CopyAssignment379// CHECK-NEXT: MoveAssignment380// CHECK-NEXT: Destructor381// CHECK-NEXT: TemplateArgument{{.*}} type 'float'382// CHECK-NEXT: BuiltinType {{.*}} 'float'383// CHECK-NEXT: TemplateArgument{{.*}} pack384// CHECK-NEXT: TemplateArgument{{.*}} integral '3'385// CHECK-NEXT: TemplateArgument{{.*}} integral '2'386// CHECK-NEXT: TemplateArgument{{.*}} integral '1'387// CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct388// CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition389// CHECK-NEXT: DefinitionData390// CHECK-NEXT: DefaultConstructor391// CHECK-NEXT: CopyConstructor392// CHECK-NEXT: MoveConstructor393// CHECK-NEXT: CopyAssignment394// CHECK-NEXT: MoveAssignment395// CHECK-NEXT: Destructor396// CHECK-NEXT: TemplateArgument{{.*}} type 'bool'397// CHECK-NEXT: BuiltinType {{.*}} 'bool'398// CHECK-NEXT: TemplateArgument{{.*}} pack399// CHECK-NEXT: TemplateArgument{{.*}} integral '7'400// CHECK-NEXT: TemplateArgument{{.*}} integral '8'401// CHECK-NEXT: TemplateArgument{{.*}} integral '9'402// CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct403// CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition404// CHECK-NEXT: DefinitionData405// CHECK-NEXT: DefaultConstructor406// CHECK-NEXT: CopyConstructor407// CHECK-NEXT: MoveConstructor408// CHECK-NEXT: CopyAssignment409// CHECK-NEXT: MoveAssignment410// CHECK-NEXT: Destructor411// CHECK-NEXT: TemplateArgument{{.*}} type 'bool'412// CHECK-NEXT: BuiltinType {{.*}} 'bool'413// CHECK-NEXT: TemplateArgument{{.*}} pack414// CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct415// CHECK-NEXT: ClassTemplatePartialSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition416// CHECK-NEXT: DefinitionData417// CHECK-NEXT: DefaultConstructor418// CHECK-NEXT: CopyConstructor419// CHECK-NEXT: MoveConstructor420// CHECK-NEXT: CopyAssignment421// CHECK-NEXT: MoveAssignment422// CHECK-NEXT: Destructor423// CHECK-NEXT: TemplateArgument{{.*}} type 'int'424// CHECK-NEXT: BuiltinType {{.*}} 'int'425// CHECK-NEXT: TemplateArgument{{.*}} pack426// CHECK-NEXT: TemplateArgument{{.*}} expr427// CHECK-NEXT: PackExpansionExpr {{.*}} 'int'428// CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'429// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is430// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BIR"431// CHECK-NEXT: PackExpansionExpr {{.*}} 'int'432// CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'433// CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct434// CHECK-NEXT: ClassTemplatePartialSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition435// CHECK-NEXT: DefinitionData436// CHECK-NEXT: DefaultConstructor437// CHECK-NEXT: CopyConstructor438// CHECK-NEXT: MoveConstructor439// CHECK-NEXT: CopyAssignment440// CHECK-NEXT: MoveAssignment441// CHECK-NEXT: Destructor442// CHECK-NEXT: TemplateArgument{{.*}} type 'float'443// CHECK-NEXT: BuiltinType {{.*}} 'float'444// CHECK-NEXT: TemplateArgument{{.*}} pack445// CHECK-NEXT: TemplateArgument{{.*}} expr446// CHECK-NEXT: PackExpansionExpr {{.*}} 'int'447// CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'448// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is449// CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct450// CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition451// CHECK-NEXT: DefinitionData452// CHECK-NEXT: DefaultConstructor453// CHECK-NEXT: CopyConstructor454// CHECK-NEXT: MoveConstructor455// CHECK-NEXT: CopyAssignment456// CHECK-NEXT: MoveAssignment457// CHECK-NEXT: Destructor458// CHECK-NEXT: TemplateArgument{{.*}} type 'char'459// CHECK-NEXT: BuiltinType {{.*}} 'char'460// CHECK-NEXT: TemplateArgument{{.*}} pack461// CHECK-NEXT: TemplateArgument{{.*}} integral '5'462// CHECK-NEXT: TemplateArgument{{.*}} integral '6'463// CHECK-NEXT: TemplateArgument{{.*}} integral '7'464// CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct465template <typename T, int... Is> struct InvalidAnnotatedPackTemplateStruct{};466template <int... Is> struct [[clang::annotate("ANNOTATE_BIR", Is...)]] InvalidAnnotatedPackTemplateStruct<int, Is...>{};467template <int... Is> struct InvalidAnnotatedPackTemplateStruct<float, Is...> {};468template <> struct InvalidAnnotatedPackTemplateStruct<char, 5, 6, 7> {};469void UseInvalidAnnotatedPackTemplateStruct() {470 InvalidAnnotatedPackTemplateStruct<int, 1, 2, 3> Instance1{};471 InvalidAnnotatedPackTemplateStruct<float, 3, 2, 1> Instance2{};472 InvalidAnnotatedPackTemplateStruct<char, 5, 6, 7> Instance3{};473 InvalidAnnotatedPackTemplateStruct<bool, 7, 8, 9> Instance4{};474 InvalidAnnotatedPackTemplateStruct<bool> Instance5{};475}476 477// CHECK: FunctionTemplateDecl {{.*}} RedeclaredAnnotatedFunc478// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is479// CHECK-NEXT: FunctionDecl {{.*}} RedeclaredAnnotatedFunc 'void ()'480// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FAR"481// CHECK-NEXT: PackExpansionExpr {{.*}} 'int'482// CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'483// CHECK-NEXT: FunctionDecl {{.*}} used RedeclaredAnnotatedFunc 'void ()'484// CHECK-NEXT: TemplateArgument{{.*}} pack485// CHECK-NEXT: TemplateArgument{{.*}} integral '1'486// CHECK-NEXT: TemplateArgument{{.*}} integral '2'487// CHECK-NEXT: TemplateArgument{{.*}} integral '3'488// CHECK-NEXT: CompoundStmt489// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FAR"490// CHECK-NEXT: ConstantExpr {{.*}} 'int'491// CHECK-NEXT: value: Int 1492// CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'493// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is494// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 1495// CHECK-NEXT: ConstantExpr {{.*}} 'int'496// CHECK-NEXT: value: Int 2497// CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'498// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is499// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 2500// CHECK-NEXT: ConstantExpr {{.*}} 'int'501// CHECK-NEXT: value: Int 3502// CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int'503// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is504// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3505// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FIZ"506// CHECK-NEXT: ConstantExpr {{.*}} 'int'507// CHECK-NEXT: value: Int 4508// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4509// CHECK-NEXT: ConstantExpr {{.*}} 'int'510// CHECK-NEXT: value: Int 5511// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5512// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BOZ"513// CHECK-NEXT: ConstantExpr {{.*}} 'int'514// CHECK-NEXT: value: Int 6515// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 6516// CHECK-NEXT: FunctionTemplateDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc517// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is518// CHECK-NEXT: FunctionDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc 'void ()'519// CHECK-NEXT: AnnotateAttr {{.*}} Inherited "ANNOTATE_FAR"520// CHECK-NEXT: PackExpansionExpr {{.*}} 'int'521// CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'522// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BOZ"523// CHECK-NEXT: PackExpansionExpr {{.*}} 'int'524// CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'525// CHECK-NEXT: Function {{.*}} 'RedeclaredAnnotatedFunc' 'void ()'526// CHECK-NEXT: FunctionTemplateDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc527// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} 'int' depth 0 index 0 ... Is528// CHECK-NEXT: FunctionDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc 'void ()'529// CHECK-NEXT: AnnotateAttr {{.*}} Inherited "ANNOTATE_FAR"530// CHECK-NEXT: PackExpansionExpr {{.*}} 'int'531// CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'532// CHECK-NEXT: AnnotateAttr {{.*}} Inherited "ANNOTATE_BOZ"533// CHECK-NEXT: PackExpansionExpr {{.*}} 'int'534// CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'535// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FIZ"536// CHECK-NEXT: ConstantExpr {{.*}} 'int'537// CHECK-NEXT: value: Int 4538// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4539// CHECK-NEXT: ConstantExpr {{.*}} 'int'540// CHECK-NEXT: value: Int 5541// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5542// CHECK-NEXT: Function {{.*}} 'RedeclaredAnnotatedFunc' 'void ()'543// CHECK-NEXT: FunctionTemplateDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc544// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} 'int' depth 0 index 0 ... Is545// CHECK-NEXT: FunctionDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc 'void ()'546// CHECK-NEXT: CompoundStmt547// CHECK-NEXT: AnnotateAttr {{.*}} Inherited "ANNOTATE_FAR"548// CHECK-NEXT: PackExpansionExpr {{.*}} 'int'549// CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int'550// CHECK-NEXT: AnnotateAttr {{.*}} Inherited "ANNOTATE_FIZ"551// CHECK-NEXT: ConstantExpr {{.*}} 'int'552// CHECK-NEXT: value: Int 4553// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4554// CHECK-NEXT: ConstantExpr {{.*}} 'int'555// CHECK-NEXT: value: Int 5556// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5557// CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BOZ"558// CHECK-NEXT: ConstantExpr {{.*}} 'int'559// CHECK-NEXT: value: Int 6560// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 6561// CHECK-NEXT: Function {{.*}} 'RedeclaredAnnotatedFunc' 'void ()'562// CHECK-NEXT: EmptyDecl563template <int... Is> [[clang::annotate("ANNOTATE_FAR", Is...)]] void RedeclaredAnnotatedFunc();564template <int... Is> [[clang::annotate("ANNOTATE_BOZ", Is...)]] void RedeclaredAnnotatedFunc();565template <int... Is> [[clang::annotate("ANNOTATE_FIZ", 4, 5)]] void RedeclaredAnnotatedFunc();566template <int... Is> [[clang::annotate("ANNOTATE_BOZ", 6)]] void RedeclaredAnnotatedFunc(){};567void UseRedeclaredAnnotatedFunc() {568 RedeclaredAnnotatedFunc<1, 2, 3>();569}570 571} // namespace attribute_annotate572 573namespace preferred_name {574 int x [[clang::preferred_name("frank")]]; // expected-error {{expected a type}}575 int y [[clang::preferred_name(int)]]; // expected-warning {{'clang::preferred_name' attribute only applies to class templates}}576 struct [[clang::preferred_name(int)]] A; // expected-warning {{'clang::preferred_name' attribute only applies to class templates}}577 template<typename T> struct [[clang::preferred_name(int)]] B; // expected-error {{argument 'int' to 'clang::preferred_name' attribute is not a typedef for a specialization of 'B'}}578 template<typename T> struct C;579 using X = C<int>; // expected-note {{'X' declared here}}580 typedef C<float> Y;581 using Z = const C<double>; // expected-note {{'Z' declared here}}582 template<typename T> struct [[clang::preferred_name(C<int>)]] C; // expected-error {{argument 'C<int>' to 'clang::preferred_name' attribute is not a typedef for a specialization of 'C'}}583 template<typename T> struct [[clang::preferred_name(X), clang::preferred_name(Y)]] C;584 template<typename T> struct [[clang::preferred_name(const X)]] C; // expected-error {{argument 'const X'}}585 template<typename T> struct [[clang::preferred_name(Z)]] C; // expected-error {{argument 'Z' (aka 'const C<double>')}}586 template<typename T> struct C {};587 588 // CHECK: ClassTemplateDecl {{.*}} <line:[[@LINE-10]]:{{.*}} C589 // CHECK: ClassTemplateSpecializationDecl {{.*}} struct C definition590 // CHECK: TemplateArgument type 'int'591 // CHECK-NOT: PreferredNameAttr592 // CHECK: PreferredNameAttr {{.*}} X593 // CHECK-NOT: PreferredNameAttr594 // CHECK: CXXRecordDecl595 // CHECK: ClassTemplateSpecializationDecl {{.*}} struct C definition596 // CHECK: TemplateArgument type 'float'597 // CHECK-NOT: PreferredNameAttr598 // CHECK: PreferredNameAttr {{.*}} Y599 // CHECK-NOT: PreferredNameAttr600 // CHECK: CXXRecordDecl601 // CHECK: ClassTemplateSpecializationDecl {{.*}} struct C definition602 // CHECK: TemplateArgument type 'double'603 // CHECK-NOT: PreferredNameAttr604 // CHECK: CXXRecordDecl605 606 // Check this doesn't cause us to instantiate the same attribute multiple times.607 C<float> *cf1;608 C<float> *cf2;609 610 void f(C<int> a, C<float> b, C<double> c) {611 auto p = a;612 auto q = b;613 auto r = c;614 p.f(); // expected-error {{no member named 'f' in 'preferred_name::X'}}615 q.f(); // expected-error {{no member named 'f' in 'preferred_name::Y'}}616 r.f(); // expected-error {{no member named 'f' in 'preferred_name::C<double>'}}617 }618 619 template<typename T> struct D;620 using DInt = D<int>;621 template<typename T> struct __attribute__((__preferred_name__(DInt))) D {};622 template struct D<int>;623 int use_dint = D<int>().get(); // expected-error {{no member named 'get' in 'preferred_name::DInt'}}624 625 template<typename T> struct MemberTemplate {626 template<typename U> struct Iter;627 using iterator = Iter<T>;628 using const_iterator = Iter<const T>;629 template<typename U>630 struct [[clang::preferred_name(iterator),631 clang::preferred_name(const_iterator)]] Iter {};632 };633 template<typename T> T desugar(T);634 auto it = desugar(MemberTemplate<int>::Iter<const int>());635 int n = it; // expected-error {{no viable conversion from 'preferred_name::MemberTemplate<int>::const_iterator' to 'int'}}636 637 template<int A, int B, typename ...T> struct Foo;638 template<typename ...T> using Bar = Foo<1, 2, T...>;639 template<int A, int B, typename ...T> struct [[clang::preferred_name(::preferred_name::Bar<T...>)]] Foo {};640 Foo<1, 2, int, float>::nosuch x; // expected-error {{no type named 'nosuch' in 'preferred_name::Bar<int, float>'}}641}642::preferred_name::Foo<1, 2, int, float>::nosuch x; // expected-error {{no type named 'nosuch' in 'preferred_name::Bar<int, float>'}}643 644// GH169072: templated attribute((constructor)) function crashes clang645// constructor/destructor attribute without priority argument should not crash.646namespace gh169072 {647 template <typename T>648 [[gnu::constructor]] void foo() {}649 650 template void foo<int>();651 652 template <typename T>653 [[gnu::destructor]] void bar() {}654 655 template void bar<int>();656 657 // Also test with explicit priority argument658 template <typename T>659 [[gnu::constructor(101)]] void baz() {}660 661 template void baz<int>();662}663