Alex Lorenz | 9e7bf16 | 2017-04-18 14:33:39 +0000 | [diff] [blame] | 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 |
Richard Smith | dfc4bff | 2017-09-22 00:11:15 +0000 | [diff] [blame] | 20 | // CHECK: AnnotateAttr{{.*}} "test" |
Alex Lorenz | 9e7bf16 | 2017-04-18 14:33:39 +0000 | [diff] [blame] | 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 |
Richard Smith | dfc4bff | 2017-09-22 00:11:15 +0000 | [diff] [blame] | 79 | // CHECK: CXXMethodDecl{{.*}} operator() |
Alex Lorenz | 9e7bf16 | 2017-04-18 14:33:39 +0000 | [diff] [blame] | 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 |
Richard Smith | a6e8b68 | 2019-09-04 20:30:37 +0000 | [diff] [blame] | 90 | // CHECK-NEXT: ConstInitAttr |
Alex Lorenz | 9e7bf16 | 2017-04-18 14:33:39 +0000 | [diff] [blame] | 91 | |
| 92 | #pragma clang attribute pop |
| 93 | |
| 94 | int testNoCI = 0; |
| 95 | // CHECK-LABEL: VarDecl{{.*}} testNoCI |
| 96 | // CHECK-NEXT: IntegerLiteral |
Richard Smith | a6e8b68 | 2019-09-04 20:30:37 +0000 | [diff] [blame] | 97 | // CHECK-NOT: ConstInitAttr |
Alex Lorenz | 9e7bf16 | 2017-04-18 14:33:39 +0000 | [diff] [blame] | 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 |