107 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
// 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
 |