// RUN: %clang_cc1 -std=gnu++11 -fsyntax-only -verify %s // RUN: not %clang_cc1 -std=gnu++11 -ast-dump %s | FileCheck %s namespace attribute_aligned { template struct X { char c[1] __attribute__((__aligned__((N)))); // expected-error {{alignment is not a power of 2}} }; template struct check { int check_failed[X ? 1 : -1]; // expected-error {{array with a negative size}} }; template struct check_alignment { typedef check)> t; // expected-note {{in instantiation}} }; check_alignment<1>::t c1; check_alignment<2>::t c2; check_alignment<3>::t c3; // expected-note 2 {{in instantiation}} check_alignment<4>::t c4; template class my_aligned_storage { __attribute__((aligned(Align))) char storage[Size]; }; template class C { public: C() { static_assert(sizeof(t) == sizeof(T), "my_aligned_storage size wrong"); static_assert(alignof(t) == alignof(T), "my_aligned_storage align wrong"); // expected-warning{{'alignof' applied to an expression is a GNU extension}} } private: my_aligned_storage t; }; C cd; } namespace PR9049 { extern const void *CFRetain(const void *ref); template __attribute__((cf_returns_retained)) inline T WBCFRetain(T aValue) { return aValue ? (T)CFRetain(aValue) : (T)0; } extern void CFRelease(const void *ref); template inline void WBCFRelease(__attribute__((cf_consumed)) T aValue) { if(aValue) CFRelease(aValue); } } namespace attribute_annotate { // CHECK: FunctionTemplateDecl {{.*}} HasAnnotations // CHECK: AnnotateAttr {{.*}} "ANNOTATE_FOO" // CHECK: AnnotateAttr {{.*}} "ANNOTATE_BAR" // CHECK: FunctionDecl {{.*}} HasAnnotations // CHECK: TemplateArgument type 'int' // CHECK: AnnotateAttr {{.*}} "ANNOTATE_FOO" // CHECK: AnnotateAttr {{.*}} "ANNOTATE_BAR" template [[clang::annotate("ANNOTATE_FOO"), clang::annotate("ANNOTATE_BAR")]] void HasAnnotations(); void UseAnnotations() { HasAnnotations(); } // CHECK: FunctionTemplateDecl {{.*}} HasPackAnnotations // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: FunctionDecl {{.*}} HasPackAnnotations 'void ()' // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BAZ" // CHECK-NEXT: PackExpansionExpr {{.*}} '' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int' // CHECK-NEXT: FunctionDecl {{.*}} used HasPackAnnotations 'void ()' // CHECK-NEXT: TemplateArgument{{.*}} pack // CHECK-NEXT: TemplateArgument{{.*}} integral 1 // CHECK-NEXT: TemplateArgument{{.*}} integral 2 // CHECK-NEXT: TemplateArgument{{.*}} integral 3 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BAZ" // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 1 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 1 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 2 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 2 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 3 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3 template [[clang::annotate("ANNOTATE_BAZ", Is...)]] void HasPackAnnotations(); void UsePackAnnotations() { HasPackAnnotations<1, 2, 3>(); } template [[clang::annotate(Is...)]] void HasOnlyPackAnnotation() {} // expected-error {{expected string literal as argument of 'annotate' attribute}} void UseOnlyPackAnnotations() { HasOnlyPackAnnotation<>(); HasOnlyPackAnnotation<1>(); } // CHECK: ClassTemplateDecl {{.*}} AnnotatedPackTemplateStruct // CHECK-NEXT: TemplateTypeParmDecl {{.*}} typename depth 0 index 0 T // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 1 ... Is // CHECK-NEXT: CXXRecordDecl {{.*}} struct AnnotatedPackTemplateStruct definition // CHECK-NEXT: DefinitionData // CHECK-NEXT: DefaultConstructor // CHECK-NEXT: CopyConstructor // CHECK-NEXT: MoveConstructor // CHECK-NEXT: CopyAssignment // CHECK-NEXT: MoveAssignment // CHECK-NEXT: Destructor // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FOZ" // CHECK-NEXT: PackExpansionExpr {{.*}} '' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int' // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition // CHECK-NEXT: DefinitionData // CHECK-NEXT: DefaultConstructor // CHECK-NEXT: CopyConstructor // CHECK-NEXT: MoveConstructor // CHECK-NEXT: CopyAssignment // CHECK-NEXT: MoveAssignment // CHECK-NEXT: Destructor // CHECK-NEXT: TemplateArgument{{.*}} type 'int' // CHECK-NEXT: BuiltinType {{.*}} 'int' // CHECK-NEXT: TemplateArgument{{.*}} pack // CHECK-NEXT: TemplateArgument{{.*}} integral 1 // CHECK-NEXT: TemplateArgument{{.*}} integral 2 // CHECK-NEXT: TemplateArgument{{.*}} integral 3 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BOO" // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 1 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 1 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 2 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 2 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 3 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition // CHECK-NEXT: DefinitionData // CHECK-NEXT: DefaultConstructor // CHECK-NEXT: CopyConstructor // CHECK-NEXT: MoveConstructor // CHECK-NEXT: CopyAssignment // CHECK-NEXT: MoveAssignment // CHECK-NEXT: Destructor // CHECK-NEXT: TemplateArgument type 'float' // CHECK-NEXT: BuiltinType {{.*}} 'float' // CHECK-NEXT: TemplateArgument{{.*}} pack // CHECK-NEXT: TemplateArgument{{.*}} integral 3 // CHECK-NEXT: TemplateArgument{{.*}} integral 2 // CHECK-NEXT: TemplateArgument{{.*}} integral 1 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FOZ" // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 4 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 5 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 6 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 6 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition // CHECK-NEXT: DefinitionData // CHECK-NEXT: DefaultConstructor // CHECK-NEXT: CopyConstructor // CHECK-NEXT: MoveConstructor // CHECK-NEXT: CopyAssignment // CHECK-NEXT: MoveAssignment // CHECK-NEXT: Destructor // CHECK-NEXT: TemplateArgument type 'bool' // CHECK-NEXT: BuiltinType {{.*}} 'bool' // CHECK-NEXT: TemplateArgument{{.*}} pack // CHECK-NEXT: TemplateArgument{{.*}} integral 7 // CHECK-NEXT: TemplateArgument{{.*}} integral 8 // CHECK-NEXT: TemplateArgument{{.*}} integral 9 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FOZ" // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 7 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 1 ... Is // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 7 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 8 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 1 ... Is // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 8 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 9 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 1 ... Is // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 9 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition // CHECK-NEXT: DefinitionData // CHECK-NEXT: DefaultConstructor // CHECK-NEXT: CopyConstructor // CHECK-NEXT: MoveConstructor // CHECK-NEXT: CopyAssignment // CHECK-NEXT: MoveAssignment // CHECK-NEXT: Destructor // CHECK-NEXT: TemplateArgument type 'char' // CHECK-NEXT: BuiltinType {{.*}} 'char' // CHECK-NEXT: TemplateArgument{{.*}} pack // CHECK-NEXT: TemplateArgument{{.*}} integral 1 // CHECK-NEXT: TemplateArgument{{.*}} integral 2 // CHECK-NEXT: TemplateArgument{{.*}} integral 3 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition // CHECK-NEXT: DefinitionData // CHECK-NEXT: DefaultConstructor // CHECK-NEXT: CopyConstructor // CHECK-NEXT: MoveConstructor // CHECK-NEXT: CopyAssignment // CHECK-NEXT: MoveAssignment // CHECK-NEXT: Destructor // CHECK-NEXT: TemplateArgument{{.*}} type 'char' // CHECK-NEXT: BuiltinType {{.*}} 'char' // CHECK-NEXT: TemplateArgument{{.*}} pack // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct // CHECK-NEXT: ClassTemplatePartialSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition // CHECK-NEXT: DefinitionData // CHECK-NEXT: DefaultConstructor // CHECK-NEXT: CopyConstructor // CHECK-NEXT: MoveConstructor // CHECK-NEXT: CopyAssignment // CHECK-NEXT: MoveAssignment // CHECK-NEXT: Destructor // CHECK-NEXT: TemplateArgument{{.*}} type 'int' // CHECK-NEXT: BuiltinType {{.*}} 'int' // CHECK-NEXT: TemplateArgument{{.*}} pack // CHECK-NEXT: TemplateArgument{{.*}} expr // CHECK-NEXT: PackExpansionExpr {{.*}} 'int' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BOO" // CHECK-NEXT: PackExpansionExpr {{.*}} '' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int' // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct // CHECK-NEXT: ClassTemplatePartialSpecializationDecl {{.*}} struct AnnotatedPackTemplateStruct definition // CHECK-NEXT: DefinitionData // CHECK-NEXT: DefaultConstructor // CHECK-NEXT: CopyConstructor // CHECK-NEXT: MoveConstructor // CHECK-NEXT: CopyAssignment // CHECK-NEXT: MoveAssignment // CHECK-NEXT: Destructor // CHECK-NEXT: TemplateArgument{{.*}} type 'float' // CHECK-NEXT: BuiltinType {{.*}} 'float' // CHECK-NEXT: TemplateArgument{{.*}} pack // CHECK-NEXT: TemplateArgument{{.*}} expr // CHECK-NEXT: PackExpansionExpr {{.*}} 'int' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FOZ" // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 4 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 5 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 6 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 6 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct AnnotatedPackTemplateStruct template struct [[clang::annotate("ANNOTATE_FOZ", Is...)]] AnnotatedPackTemplateStruct{}; template struct [[clang::annotate("ANNOTATE_BOO", Is...)]] AnnotatedPackTemplateStruct{}; template struct [[clang::annotate("ANNOTATE_FOZ", 4, 5, 6)]] AnnotatedPackTemplateStruct{}; template struct [[clang::annotate(Is...)]] AnnotatedPackTemplateStruct{}; // expected-error {{expected string literal as argument of 'annotate' attribute}} void UseAnnotatedPackTemplateStructSpecializations() { AnnotatedPackTemplateStruct Instance1{}; AnnotatedPackTemplateStruct Instance2{}; AnnotatedPackTemplateStruct Instance3{}; AnnotatedPackTemplateStruct Instance4{}; AnnotatedPackTemplateStruct Instance5{}; } // CHECK: ClassTemplateDecl {{.*}} InvalidAnnotatedPackTemplateStruct // CHECK-NEXT: TemplateTypeParmDecl {{.*}} typename depth 0 index 0 T // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} 'int' depth 0 index 1 ... Is // CHECK-NEXT: CXXRecordDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition // CHECK-NEXT: DefinitionData // CHECK-NEXT: DefaultConstructor // CHECK-NEXT: CopyConstructor // CHECK-NEXT: MoveConstructor // CHECK-NEXT: CopyAssignment // CHECK-NEXT: MoveAssignment // CHECK-NEXT: Destructor // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct // CHECK-NEXT: ClassTemplateSpecialization {{.*}} 'InvalidAnnotatedPackTemplateStruct' // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition // CHECK-NEXT: DefinitionData // CHECK-NEXT: DefaultConstructor // CHECK-NEXT: CopyConstructor // CHECK-NEXT: MoveConstructor // CHECK-NEXT: CopyAssignment // CHECK-NEXT: MoveAssignment // CHECK-NEXT: Destructor // CHECK-NEXT: TemplateArgument{{.*}} type 'int' // CHECK-NEXT: BuiltinType {{.*}} 'int' // CHECK-NEXT: TemplateArgument{{.*}} pack // CHECK-NEXT: TemplateArgument{{.*}} integral 1 // CHECK-NEXT: TemplateArgument{{.*}} integral 2 // CHECK-NEXT: TemplateArgument{{.*}} integral 3 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BIR" // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 1 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 1 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 2 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 2 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 3 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition // CHECK-NEXT: DefinitionData // CHECK-NEXT: DefaultConstructor // CHECK-NEXT: CopyConstructor // CHECK-NEXT: MoveConstructor // CHECK-NEXT: CopyAssignment // CHECK-NEXT: MoveAssignment // CHECK-NEXT: Destructor // CHECK-NEXT: TemplateArgument{{.*}} type 'float' // CHECK-NEXT: BuiltinType {{.*}} 'float' // CHECK-NEXT: TemplateArgument{{.*}} pack // CHECK-NEXT: TemplateArgument{{.*}} integral 3 // CHECK-NEXT: TemplateArgument{{.*}} integral 2 // CHECK-NEXT: TemplateArgument{{.*}} integral 1 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition // CHECK-NEXT: DefinitionData // CHECK-NEXT: DefaultConstructor // CHECK-NEXT: CopyConstructor // CHECK-NEXT: MoveConstructor // CHECK-NEXT: CopyAssignment // CHECK-NEXT: MoveAssignment // CHECK-NEXT: Destructor // CHECK-NEXT: TemplateArgument{{.*}} type 'bool' // CHECK-NEXT: BuiltinType {{.*}} 'bool' // CHECK-NEXT: TemplateArgument{{.*}} pack // CHECK-NEXT: TemplateArgument{{.*}} integral 7 // CHECK-NEXT: TemplateArgument{{.*}} integral 8 // CHECK-NEXT: TemplateArgument{{.*}} integral 9 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition // CHECK-NEXT: DefinitionData // CHECK-NEXT: DefaultConstructor // CHECK-NEXT: CopyConstructor // CHECK-NEXT: MoveConstructor // CHECK-NEXT: CopyAssignment // CHECK-NEXT: MoveAssignment // CHECK-NEXT: Destructor // CHECK-NEXT: TemplateArgument{{.*}} type 'bool' // CHECK-NEXT: BuiltinType {{.*}} 'bool' // CHECK-NEXT: TemplateArgument{{.*}} pack // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct // CHECK-NEXT: ClassTemplatePartialSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition // CHECK-NEXT: DefinitionData // CHECK-NEXT: DefaultConstructor // CHECK-NEXT: CopyConstructor // CHECK-NEXT: MoveConstructor // CHECK-NEXT: CopyAssignment // CHECK-NEXT: MoveAssignment // CHECK-NEXT: Destructor // CHECK-NEXT: TemplateArgument{{.*}} type 'int' // CHECK-NEXT: BuiltinType {{.*}} 'int' // CHECK-NEXT: TemplateArgument{{.*}} pack // CHECK-NEXT: TemplateArgument{{.*}} expr // CHECK-NEXT: PackExpansionExpr {{.*}} 'int' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BIR" // CHECK-NEXT: PackExpansionExpr {{.*}} '' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int' // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct // CHECK-NEXT: ClassTemplatePartialSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition // CHECK-NEXT: DefinitionData // CHECK-NEXT: DefaultConstructor // CHECK-NEXT: CopyConstructor // CHECK-NEXT: MoveConstructor // CHECK-NEXT: CopyAssignment // CHECK-NEXT: MoveAssignment // CHECK-NEXT: Destructor // CHECK-NEXT: TemplateArgument{{.*}} type 'float' // CHECK-NEXT: BuiltinType {{.*}} 'float' // CHECK-NEXT: TemplateArgument{{.*}} pack // CHECK-NEXT: TemplateArgument{{.*}} expr // CHECK-NEXT: PackExpansionExpr {{.*}} 'int' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct // CHECK-NEXT: ClassTemplateSpecializationDecl {{.*}} struct InvalidAnnotatedPackTemplateStruct definition // CHECK-NEXT: DefinitionData // CHECK-NEXT: DefaultConstructor // CHECK-NEXT: CopyConstructor // CHECK-NEXT: MoveConstructor // CHECK-NEXT: CopyAssignment // CHECK-NEXT: MoveAssignment // CHECK-NEXT: Destructor // CHECK-NEXT: TemplateArgument{{.*}} type 'char' // CHECK-NEXT: BuiltinType {{.*}} 'char' // CHECK-NEXT: TemplateArgument{{.*}} pack // CHECK-NEXT: TemplateArgument{{.*}} integral 5 // CHECK-NEXT: TemplateArgument{{.*}} integral 6 // CHECK-NEXT: TemplateArgument{{.*}} integral 7 // CHECK-NEXT: CXXRecordDecl {{.*}} implicit struct InvalidAnnotatedPackTemplateStruct template struct InvalidAnnotatedPackTemplateStruct{}; template struct [[clang::annotate("ANNOTATE_BIR", Is...)]] InvalidAnnotatedPackTemplateStruct{}; template struct InvalidAnnotatedPackTemplateStruct {}; template <> struct InvalidAnnotatedPackTemplateStruct {}; void UseInvalidAnnotatedPackTemplateStruct() { InvalidAnnotatedPackTemplateStruct Instance1{}; InvalidAnnotatedPackTemplateStruct Instance2{}; InvalidAnnotatedPackTemplateStruct Instance3{}; InvalidAnnotatedPackTemplateStruct Instance4{}; InvalidAnnotatedPackTemplateStruct Instance5{}; } // CHECK: FunctionTemplateDecl {{.*}} RedeclaredAnnotatedFunc // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: FunctionDecl {{.*}} RedeclaredAnnotatedFunc 'void ()' // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FAR" // CHECK-NEXT: PackExpansionExpr {{.*}} '' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int' // CHECK-NEXT: FunctionDecl {{.*}} used RedeclaredAnnotatedFunc 'void ()' // CHECK-NEXT: TemplateArgument{{.*}} pack // CHECK-NEXT: TemplateArgument{{.*}} integral 1 // CHECK-NEXT: TemplateArgument{{.*}} integral 2 // CHECK-NEXT: TemplateArgument{{.*}} integral 3 // CHECK-NEXT: CompoundStmt // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FAR" // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 1 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 1 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 2 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 2 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 3 // CHECK-NEXT: SubstNonTypeTemplateParmExpr {{.*}} 'int' // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FIZ" // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 4 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 5 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BOZ" // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 6 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 6 // CHECK-NEXT: FunctionTemplateDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} referenced 'int' depth 0 index 0 ... Is // CHECK-NEXT: FunctionDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc 'void ()' // CHECK-NEXT: AnnotateAttr {{.*}} Inherited "ANNOTATE_FAR" // CHECK-NEXT: PackExpansionExpr {{.*}} '' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int' // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BOZ" // CHECK-NEXT: PackExpansionExpr {{.*}} '' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int' // CHECK-NEXT: Function {{.*}} 'RedeclaredAnnotatedFunc' 'void ()' // CHECK-NEXT: FunctionTemplateDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} 'int' depth 0 index 0 ... Is // CHECK-NEXT: FunctionDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc 'void ()' // CHECK-NEXT: AnnotateAttr {{.*}} Inherited "ANNOTATE_FAR" // CHECK-NEXT: PackExpansionExpr {{.*}} '' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int' // CHECK-NEXT: AnnotateAttr {{.*}} Inherited "ANNOTATE_BOZ" // CHECK-NEXT: PackExpansionExpr {{.*}} '' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int' // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_FIZ" // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 4 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 5 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 // CHECK-NEXT: Function {{.*}} 'RedeclaredAnnotatedFunc' 'void ()' // CHECK-NEXT: FunctionTemplateDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}} 'int' depth 0 index 0 ... Is // CHECK-NEXT: FunctionDecl {{.*}} prev {{.*}} RedeclaredAnnotatedFunc 'void ()' // CHECK-NEXT: CompoundStmt // CHECK-NEXT: AnnotateAttr {{.*}} Inherited "ANNOTATE_FAR" // CHECK-NEXT: PackExpansionExpr {{.*}} '' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'Is' 'int' // CHECK-NEXT: AnnotateAttr {{.*}} Inherited "ANNOTATE_FIZ" // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 4 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4 // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 5 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 // CHECK-NEXT: AnnotateAttr {{.*}} "ANNOTATE_BOZ" // CHECK-NEXT: ConstantExpr {{.*}} 'int' // CHECK-NEXT: value: Int 6 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 6 // CHECK-NEXT: Function {{.*}} 'RedeclaredAnnotatedFunc' 'void ()' // CHECK-NEXT: EmptyDecl template [[clang::annotate("ANNOTATE_FAR", Is...)]] void RedeclaredAnnotatedFunc(); template [[clang::annotate("ANNOTATE_BOZ", Is...)]] void RedeclaredAnnotatedFunc(); template [[clang::annotate("ANNOTATE_FIZ", 4, 5)]] void RedeclaredAnnotatedFunc(); template [[clang::annotate("ANNOTATE_BOZ", 6)]] void RedeclaredAnnotatedFunc(){}; void UseRedeclaredAnnotatedFunc() { RedeclaredAnnotatedFunc<1, 2, 3>(); } } // namespace attribute_annotate namespace preferred_name { int x [[clang::preferred_name("frank")]]; // expected-error {{expected a type}} int y [[clang::preferred_name(int)]]; // expected-warning {{'preferred_name' attribute only applies to class templates}} struct [[clang::preferred_name(int)]] A; // expected-warning {{'preferred_name' attribute only applies to class templates}} template struct [[clang::preferred_name(int)]] B; // expected-error {{argument 'int' to 'preferred_name' attribute is not a typedef for a specialization of 'B'}} template struct C; using X = C; // expected-note {{'X' declared here}} typedef C Y; using Z = const C; // expected-note {{'Z' declared here}} template struct [[clang::preferred_name(C)]] C; // expected-error {{argument 'C' to 'preferred_name' attribute is not a typedef for a specialization of 'C'}} template struct [[clang::preferred_name(X), clang::preferred_name(Y)]] C; template struct [[clang::preferred_name(const X)]] C; // expected-error {{argument 'const X'}} template struct [[clang::preferred_name(Z)]] C; // expected-error {{argument 'Z' (aka 'const C')}} template struct C {}; // CHECK: ClassTemplateDecl {{.*}} *cf1; C *cf2; void f(C a, C b, C c) { auto p = a; auto q = b; auto r = c; p.f(); // expected-error {{no member named 'f' in 'preferred_name::X'}} q.f(); // expected-error {{no member named 'f' in 'preferred_name::Y'}} r.f(); // expected-error {{no member named 'f' in 'preferred_name::C'}} } template struct D; using DInt = D; template struct __attribute__((__preferred_name__(DInt))) D {}; template struct D; int use_dint = D().get(); // expected-error {{no member named 'get' in 'preferred_name::DInt'}} template struct MemberTemplate { template struct Iter; using iterator = Iter; using const_iterator = Iter; template struct [[clang::preferred_name(iterator), clang::preferred_name(const_iterator)]] Iter {}; }; template T desugar(T); auto it = desugar(MemberTemplate::Iter()); int n = it; // expected-error {{no viable conversion from 'preferred_name::MemberTemplate::const_iterator' to 'int'}} template struct Foo; template using Bar = Foo<1, 2, T...>; template struct [[clang::preferred_name(::preferred_name::Bar)]] Foo {}; Foo<1, 2, int, float>::nosuch x; // expected-error {{no type named 'nosuch' in 'preferred_name::Bar'}} } ::preferred_name::Foo<1, 2, int, float>::nosuch x; // expected-error {{no type named 'nosuch' in 'preferred_name::Bar'}}