// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -fcxx-exceptions %s // RUN: %clang_cc1 -fsyntax-only -ast-dump -ast-dump-filter test -std=c++11 -fcxx-exceptions %s | FileCheck %s // expected-no-diagnostics class testClass1 { }; // CHECK-LABEL: CXXRecordDecl{{.*}} testClass1 // CHECK-NOT: AnnotateAttr #pragma clang attribute push (__attribute__((annotate("test"))), apply_to=any(record, field, variable, function, namespace, type_alias)) class testClass2 { void testMethod1(int param); testClass2(); testClass2 *operator -> (); }; // CHECK-LABEL: CXXRecordDecl{{.*}} testClass2 // CHECK: AnnotateAttr{{.*}} "test" // CHECK: CXXMethodDecl{{.*}} testMethod1 // CHECK-NEXT: ParmVarDecl{{.*}} param // CHECK-NEXT: AnnotateAttr{{.*}} "test" // CHECK-NEXT: AnnotateAttr{{.*}} "test" // CHECK-NEXT: CXXConstructorDecl // CHECK-NEXT: AnnotateAttr{{.*}} "test" // CHECK-NEXT: CXXMethodDecl{{.*}} operator-> // CHECK-NEXT: AnnotateAttr{{.*}} "test" #pragma clang attribute push (__attribute__((annotate("method"))), apply_to=any(record, field, variable, function, namespace, type_alias)) void testClass2::testMethod1(int param) { #pragma clang attribute pop } // CHECK-LABEL: CXXMethodDecl{{.*}}prev{{.*}} testMethod1 // CHECK-NEXT: ParmVarDecl{{.*}} param // CHECK-NEXT: AnnotateAttr{{.*}} "test" // CHECK-NEXT: AnnotateAttr{{.*}} "method" // CHECK-NEXT: CompoundStmt // CHECK-NEXT: AnnotateAttr{{.*}} "test" // CHECK-NEXT: AnnotateAttr{{.*}} "method" namespace testNamespace { } // CHECK-LABEL: NamespaceDecl{{.*}} testNamespace // CHECK-NEXT: AnnotateAttr{{.*}} "test" class testClassForward; // CHECK-LABEL: CXXRecordDecl{{.*}} testClassForward // CHECK-NEXT: AnnotateAttr{{.*}} "test" namespace testNamespaceAlias = testNamespace; // CHECK-LABEL: NamespaceAliasDecl{{.*}} testNamespaceAlias // CHECK-NOT: AnnotateAttr using testTypeAlias = testClass2; // CHECK-LABEL: TypeAliasDecl{{.*}} testTypeAlias // CHECK: AnnotateAttr{{.*}} "test" void testCatchVariable() { try { } catch (int testCatch) { } testCatchVariable(); } // CHECK-LABEL: FunctionDecl{{.*}} testCatchVariable // CHECK: CXXCatchStmt // CHECK-NEXT: VarDecl{{.*}} testCatch // CHECK-NEXT: AnnotateAttr{{.*}} "test" void testLambdaMethod() { auto l = [] () { }; testLambdaMethod(); } // CHECK-LABEL: FunctionDecl{{.*}} testLambdaMethod // CHECK: LambdaExpr // CHECK-NEXT: CXXRecordDecl // CHECK: CXXMethodDecl{{.*}} operator() // CHECK-NEXT: CompoundStmt // CHECK-NEXT: AnnotateAttr{{.*}} "test" #pragma clang attribute pop #pragma clang attribute push (__attribute__((require_constant_initialization)), apply_to=variable(is_global)) int testCI1 = 1; // CHECK-LABEL: VarDecl{{.*}} testCI1 // CHECK-NEXT: IntegerLiteral // CHECK-NEXT: ConstInitAttr #pragma clang attribute pop int testNoCI = 0; // CHECK-LABEL: VarDecl{{.*}} testNoCI // CHECK-NEXT: IntegerLiteral // CHECK-NOT: ConstInitAttr // Check support for CXX11 style attributes #pragma clang attribute push ([[noreturn]], apply_to = function) void testNoReturn(); // CHECK-LABEL: FunctionDecl{{.*}} testNoReturn // CHECK-NEXT: CXX11NoReturnAttr #pragma clang attribute pop