1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -fcxx-exceptions %s 2 // RUN: %clang_cc1 -fsyntax-only -ast-dump -ast-dump-filter test -std=c++11 -fcxx-exceptions %s | FileCheck %s 3 // expected-no-diagnostics 4 5 class testClass1 { 6 }; 7 // CHECK-LABEL: CXXRecordDecl{{.*}} testClass1 8 // CHECK-NOT: AnnotateAttr 9 10 #pragma clang attribute push (__attribute__((annotate("test"))), apply_to=any(record, field, variable, function, namespace, type_alias)) 11 12 class testClass2 { 13 void testMethod1(int param); 14 15 testClass2(); 16 17 testClass2 *operator -> (); 18 }; 19 // CHECK-LABEL: CXXRecordDecl{{.*}} testClass2 20 // CHECK: AnnotateAttr{{.*}} "test" 21 // CHECK: CXXMethodDecl{{.*}} testMethod1 22 // CHECK-NEXT: ParmVarDecl{{.*}} param 23 // CHECK-NEXT: AnnotateAttr{{.*}} "test" 24 // CHECK-NEXT: AnnotateAttr{{.*}} "test" 25 // CHECK-NEXT: CXXConstructorDecl 26 // CHECK-NEXT: AnnotateAttr{{.*}} "test" 27 // CHECK-NEXT: CXXMethodDecl{{.*}} operator-> 28 // CHECK-NEXT: AnnotateAttr{{.*}} "test" 29 30 #pragma clang attribute push (__attribute__((annotate("method"))), apply_to=any(record, field, variable, function, namespace, type_alias)) 31 32 void testClass2::testMethod1(int param) { 33 34 #pragma clang attribute pop 35 } 36 // CHECK-LABEL: CXXMethodDecl{{.*}}prev{{.*}} testMethod1 37 // CHECK-NEXT: ParmVarDecl{{.*}} param 38 // CHECK-NEXT: AnnotateAttr{{.*}} "test" 39 // CHECK-NEXT: AnnotateAttr{{.*}} "method" 40 // CHECK-NEXT: CompoundStmt 41 // CHECK-NEXT: AnnotateAttr{{.*}} "test" 42 // CHECK-NEXT: AnnotateAttr{{.*}} "method" 43 44 namespace testNamespace { 45 } 46 // CHECK-LABEL: NamespaceDecl{{.*}} testNamespace 47 // CHECK-NEXT: AnnotateAttr{{.*}} "test" 48 49 class testClassForward; 50 // CHECK-LABEL: CXXRecordDecl{{.*}} testClassForward 51 // CHECK-NEXT: AnnotateAttr{{.*}} "test" 52 53 namespace testNamespaceAlias = testNamespace; 54 // CHECK-LABEL: NamespaceAliasDecl{{.*}} testNamespaceAlias 55 // CHECK-NOT: AnnotateAttr 56 57 using testTypeAlias = testClass2; 58 // CHECK-LABEL: TypeAliasDecl{{.*}} testTypeAlias 59 // CHECK: AnnotateAttr{{.*}} "test" 60 61 void testCatchVariable() { 62 try { 63 } catch (int testCatch) { 64 } 65 testCatchVariable(); 66 } 67 // CHECK-LABEL: FunctionDecl{{.*}} testCatchVariable 68 // CHECK: CXXCatchStmt 69 // CHECK-NEXT: VarDecl{{.*}} testCatch 70 // CHECK-NEXT: AnnotateAttr{{.*}} "test" 71 72 void testLambdaMethod() { 73 auto l = [] () { }; 74 testLambdaMethod(); 75 } 76 // CHECK-LABEL: FunctionDecl{{.*}} testLambdaMethod 77 // CHECK: LambdaExpr 78 // CHECK-NEXT: CXXRecordDecl 79 // CHECK: CXXMethodDecl{{.*}} operator() 80 // CHECK-NEXT: CompoundStmt 81 // CHECK-NEXT: AnnotateAttr{{.*}} "test" 82 83 #pragma clang attribute pop 84 85 #pragma clang attribute push (__attribute__((require_constant_initialization)), apply_to=variable(is_global)) 86 87 int testCI1 = 1; 88 // CHECK-LABEL: VarDecl{{.*}} testCI1 89 // CHECK-NEXT: IntegerLiteral 90 // CHECK-NEXT: RequireConstantInitAttr 91 92 #pragma clang attribute pop 93 94 int testNoCI = 0; 95 // CHECK-LABEL: VarDecl{{.*}} testNoCI 96 // CHECK-NEXT: IntegerLiteral 97 // CHECK-NOT: RequireConstantInitAttr 98 99 // Check support for CXX11 style attributes 100 #pragma clang attribute push ([[noreturn]], apply_to = function) 101 102 void testNoReturn(); 103 // CHECK-LABEL: FunctionDecl{{.*}} testNoReturn 104 // CHECK-NEXT: CXX11NoReturnAttr 105 106 #pragma clang attribute pop 107