brintos

brintos / llvm-project-archived public Read only

0
0
Text · 33.0 KiB · d0ab0a6 Raw
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