170 lines · cpp
1// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-filter test "-DSUBJECT=namespace" %s | FileCheck --check-prefix=CHECK-NAMESPACE %s2// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-filter test "-DSUBJECT=type_alias" %s | FileCheck --check-prefix=CHECK-TYPE_ALIAS %s3// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-filter test "-DSUBJECT=enum" %s | FileCheck --check-prefix=CHECK-ENUM %s4// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-filter test "-DSUBJECT=enum_constant" %s | FileCheck --check-prefix=CHECK-ENUM_CONSTANT %s5// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-filter test "-DSUBJECT=record" %s | FileCheck --check-prefix=CHECK-RECORD %s6// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-filter test "-DSUBJECT=record(unless(is_union))" %s | FileCheck --check-prefix=CHECK-RECORD_UNLESS_IS_UNION %s7// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-filter test "-DSUBJECT=field" %s | FileCheck --check-prefix=CHECK-FIELD %s8// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-filter test "-DSUBJECT=function" %s | FileCheck --check-prefix=CHECK-FUNCTION %s9// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-filter test "-DSUBJECT=hasType(functionType)" %s | FileCheck --check-prefix=CHECK-HAS_TYPE_FUNCTION_TYPE %s10// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-filter test "-DSUBJECT=function(is_member)" %s | FileCheck --check-prefix=CHECK-FUNCTION_IS_MEMBER %s11// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-filter test "-DSUBJECT=variable" %s | FileCheck --check-prefix=CHECK-VARIABLE %s12// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-filter test "-DSUBJECT=variable(is_global)" %s | FileCheck --check-prefix=CHECK-VARIABLE_IS_GLOBAL %s13// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-filter test "-DSUBJECT=variable(is_parameter)" %s | FileCheck --check-prefix=CHECK-VARIABLE_IS_PARAMETER %s14// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-filter test "-DSUBJECT=variable(unless(is_parameter))" %s | FileCheck --check-prefix=CHECK-VARIABLE_UNLESS_IS_PARAMETER %s15 16#pragma clang attribute push (__attribute__((annotate("test"))), apply_to = any(SUBJECT))17 18namespace testNamespace {19// CHECK-NAMESPACE: NamespaceDecl{{.*}} testNamespace20// CHECK-NAMESPACE-NEXT: AnnotateAttr{{.*}} "test"21 22typedef int testTypedef;23// CHECK-TYPE_ALIAS: TypedefDecl{{.*}} testTypedef24// CHECK-TYPE_ALIAS-NEXT: BuiltinType25// CHECK-TYPE_ALIAS-NEXT: AnnotateAttr{{.*}} "test"26 27using testTypeAlias = double;28// CHECK-TYPE_ALIAS: TypeAliasDecl{{.*}} testTypeAlias29// CHECK-TYPE_ALIAS-NEXT: BuiltinType30// CHECK-TYPE_ALIAS-NEXT: AnnotateAttr{{.*}} "test"31 32enum testEnum {33 testEnumCase1,34 testEnumCase235};36// CHECK-ENUM: EnumDecl{{.*}} testEnum37// CHECK-ENUM-NEXT: AnnotateAttr{{.*}} "test"38// CHECK-ENUM_CONSTANT: EnumConstantDecl{{.*}} testEnumCase139// CHECK-ENUM_CONSTANT-NEXT: AnnotateAttr{{.*}} "test"40// CHECK-ENUM_CONSTANT: EnumConstantDecl{{.*}} testEnumCase241// CHECK-ENUM_CONSTANT-NEXT: AnnotateAttr{{.*}} "test"42 43struct testStructRecord {44 int testStructRecordField;45};46// CHECK-RECORD: CXXRecordDecl{{.*}} testStructRecord47// CHECK-RECORD: AnnotateAttr{{.*}} "test"48// CHECK-RECORD_UNLESS_IS_UNION-LABEL: CXXRecordDecl{{.*}} testStructRecord49// CHECK-RECORD_UNLESS_IS_UNION: AnnotateAttr{{.*}} "test"50// CHECK-FIELD: FieldDecl{{.*}} testStructRecordField51// CHECK-FIELD-NEXT: AnnotateAttr{{.*}} "test"52 53class testClassRecord {54 int testClassRecordField;55};56// CHECK-RECORD: CXXRecordDecl{{.*}} testClassRecord57// CHECK-RECORD: AnnotateAttr{{.*}} "test"58// CHECK-RECORD_UNLESS_IS_UNION-LABEL: CXXRecordDecl{{.*}} testClassRecord59// CHECK-RECORD_UNLESS_IS_UNION: AnnotateAttr{{.*}} "test"60// CHECK-FIELD: FieldDecl{{.*}} testClassRecordField61// CHECK-FIELD-NEXT: AnnotateAttr{{.*}} "test"62 63union testUnionRecord {64 int testUnionRecordField;65};66// CHECK-RECORD: CXXRecordDecl{{.*}} testUnionRecord67// CHECK-RECORD: AnnotateAttr{{.*}} "test"68// CHECK-RECORD_UNLESS_IS_UNION-LABEL: CXXRecordDecl{{.*}} testUnionRecord69// CHECK-RECORD_UNLESS_IS_UNION-NOT: AnnotateAttr{{.*}} "test"70// CHECK-FIELD: FieldDecl{{.*}} testUnionRecordField71// CHECK-FIELD-NEXT: AnnotateAttr{{.*}} "test"72 73// CHECK-RECORD_UNLESS_IS_UNION-LABEL: CXXRecordDecl74void testFunctionDecl();75// CHECK-FUNCTION: FunctionDecl{{.*}} testFunctionDecl76// CHECK-FUNCTION-NEXT: AnnotateAttr{{.*}} "test"77// CHECK-HAS_TYPE_FUNCTION_TYPE: FunctionDecl{{.*}} testFunctionDecl78// CHECK-HAS_TYPE_FUNCTION_TYPE-NEXT: AnnotateAttr{{.*}} "test"79 80void testFunctionDecl() { }81// CHECK-FUNCTION: FunctionDecl{{.*}} testFunctionDecl82// CHECK-FUNCTION-NEXT: CompoundStmt83// CHECK-FUNCTION-NEXT: AnnotateAttr{{.*}} "test"84// CHECK-HAS_TYPE_FUNCTION_TYPE: FunctionDecl{{.*}} testFunctionDecl85// CHECK-HAS_TYPE_FUNCTION_TYPE-NEXT: CompoundStmt86// CHECK-HAS_TYPE_FUNCTION_TYPE-NEXT: AnnotateAttr{{.*}} "test"87 88void (*testFunctionVar)();89// CHECK-HAS_TYPE_FUNCTION_TYPE: VarDecl{{.*}} testFunctionVar90// CHECK-HAS_TYPE_FUNCTION_TYPE-NEXT: AnnotateAttr{{.*}} "test"91// 'function' should not apply to variables with a function type!92// CHECK-FUNCTION: VarDecl{{.*}} testFunctionVar93// CHECK-FUNCTION-NOT: AnnotateAttr{{.*}} "test"94 95class testMethods {96 testMethods();97 void testMethod();98};99void testMethods::testMethod() { }100void testFunctionNotMethod();101// CHECK-FUNCTION-LABEL: CXXConstructorDecl{{.*}} testMethods102// CHECK-FUNCTION-NEXT: AnnotateAttr{{.*}} "test"103// CHECK-FUNCTION_IS_MEMBER: CXXConstructorDecl{{.*}} testMethods104// CHECK-FUNCTION_IS_MEMBER-NEXT: AnnotateAttr{{.*}} "test"105// CHECK-HAS_TYPE_FUNCTION_TYPE: CXXConstructorDecl{{.*}} testMethods106// CHECK-HAS_TYPE_FUNCTION_TYPE-NEXT: AnnotateAttr{{.*}} "test"107// CHECK-FUNCTION: CXXMethodDecl{{.*}} testMethod108// CHECK-FUNCTION-NEXT: AnnotateAttr{{.*}} "test"109// CHECK-FUNCTION_IS_MEMBER: CXXMethodDecl{{.*}} testMethod110// CHECK-FUNCTION_IS_MEMBER-NEXT: AnnotateAttr{{.*}} "test"111// CHECK-HAS_TYPE_FUNCTION_TYPE: CXXMethodDecl{{.*}} testMethod112// CHECK-HAS_TYPE_FUNCTION_TYPE-NEXT: AnnotateAttr{{.*}} "test"113// CHECK-FUNCTION: CXXMethodDecl{{.*}} testMethod114// CHECK-FUNCTION-NEXT: CompoundStmt115// CHECK-FUNCTION-NEXT: AnnotateAttr{{.*}} "test"116// CHECK-FUNCTION_IS_MEMBER: CXXMethodDecl{{.*}} testMethod117// CHECK-FUNCTION_IS_MEMBER-NEXT: CompoundStmt118// CHECK-CXX_METHOD-NEXT: AnnotateAttr{{.*}} "test"119// CHECK-HAS_TYPE_FUNCTION_TYPE: CXXMethodDecl{{.*}} testMethod120// CHECK-HAS_TYPE_FUNCTION_TYPE-NEXT: CompoundStmt121// CHECK-HAS_TYPE_FUNCTION_TYPE-NEXT: AnnotateAttr{{.*}} "test"122// CHECK-FUNCTION_IS_MEMBER: FunctionDecl{{.*}} testFunctionNotMethod123// CHECK-FUNCTION_IS_MEMBER-NOT: AnnotateAttr{{.*}} "test"124 125int testVariable;126// CHECK-VARIABLE: VarDecl{{.*}} testVariable127// CHECK-VARIABLE-NEXT: AnnotateAttr{{.*}} "test"128// CHECK-VARIABLE_IS_GLOBAL-LABEL: VarDecl{{.*}} testVariable129// CHECK-VARIABLE_IS_GLOBAL-NEXT: AnnotateAttr{{.*}} "test"130// CHECK-VARIABLE_IS_PARAMETER-LABEL: VarDecl{{.*}} testVariable131// CHECK-VARIABLE_IS_PARAMETER-NOT: AnnotateAttr{{.*}} "test"132// CHECK-VARIABLE_UNLESS_IS_PARAMETER-LABEL: VarDecl{{.*}} testVariable133// CHECK-VARIABLE_UNLESS_IS_PARAMETER-NEXT: AnnotateAttr{{.*}} "test"134void testVarFunction(int testParam) {135// CHECK-VARIABLE: VarDecl{{.*}} testParam136// CHECK-VARIABLE-NEXT: AnnotateAttr{{.*}} "test"137// CHECK-VARIABLE_IS_GLOBAL-LABEL: VarDecl{{.*}} testParam138// CHECK-VARIABLE_IS_GLOBAL-NOT: AnnotateAttr{{.*}} "test"139// CHECK-VARIABLE_IS_PARAMETER-LABEL: VarDecl{{.*}} testParam140// CHECK-VARIABLE_IS_PARAMETER-NEXT: AnnotateAttr{{.*}} "test"141// CHECK-VARIABLE_UNLESS_IS_PARAMETER-LABEL: VarDecl{{.*}} testParam142// CHECK-VARIABLE_UNLESS_IS_PARAMETER-NOT: AnnotateAttr{{.*}} "test"143 144 int testLocalVariable;145// CHECK-VARIABLE: VarDecl{{.*}} testLocalVariable146// CHECK-VARIABLE-NEXT: AnnotateAttr{{.*}} "test"147// CHECK-VARIABLE_IS_GLOBAL-LABEL: VarDecl{{.*}} testLocalVariable148// CHECK-VARIABLE_IS_GLOBAL-NOT: AnnotateAttr{{.*}} "test"149// CHECK-VARIABLE_IS_PARAMETER-LABEL: VarDecl{{.*}} testLocalVariable150// CHECK-VARIABLE_IS_PARAMETER-NOT: AnnotateAttr{{.*}} "test"151// CHECK-VARIABLE_UNLESS_IS_PARAMETER-LABEL: VarDecl{{.*}} testLocalVariable152// CHECK-VARIABLE_UNLESS_IS_PARAMETER-NEXT: AnnotateAttr{{.*}} "test"153}154class testVarClass {155 static int testStaticVar;156};157// CHECK-VARIABLE: VarDecl{{.*}} testStaticVar158// CHECK-VARIABLE-NEXT: AnnotateAttr{{.*}} "test"159// CHECK-VARIABLE_IS_GLOBAL-LABEL: VarDecl{{.*}} testStaticVar160// CHECK-VARIABLE_IS_GLOBAL-NEXT: AnnotateAttr{{.*}} "test"161// CHECK-VARIABLE_IS_PARAMETER-LABEL: VarDecl{{.*}} testStaticVar162// CHECK-VARIABLE_IS_PARAMETER-NOT: AnnotateAttr{{.*}} "test"163// CHECK-VARIABLE_UNLESS_IS_PARAMETER-LABEL: VarDecl{{.*}} testStaticVar164// CHECK-VARIABLE_UNLESS_IS_PARAMETER-NEXT: AnnotateAttr{{.*}} "test"165 166 167}168 169#pragma clang attribute pop170