1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ast-dump -ast-dump-filter Test %s | FileCheck -check-prefix CHECK -strict-whitespace %s 2*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ast-dump %s | FileCheck -check-prefix CHECK-TU -strict-whitespace %s 3*67e74705SXin Li 4*67e74705SXin Li int TestLocation; 5*67e74705SXin Li // CHECK: VarDecl 0x{{[^ ]*}} <{{.*}}:4:1, col:5> col:5 TestLocation 6*67e74705SXin Li 7*67e74705SXin Li struct TestIndent { 8*67e74705SXin Li int x; 9*67e74705SXin Li }; 10*67e74705SXin Li // CHECK: {{^}}RecordDecl{{.*TestIndent[^()]*$}} 11*67e74705SXin Li // CHECK-NEXT: {{^}}`-FieldDecl{{.*x[^()]*$}} 12*67e74705SXin Li 13*67e74705SXin Li struct TestChildren { 14*67e74705SXin Li int x; 15*67e74705SXin Li struct y { 16*67e74705SXin Li int z; 17*67e74705SXin Li }; 18*67e74705SXin Li }; 19*67e74705SXin Li // CHECK: RecordDecl{{.*}}TestChildren 20*67e74705SXin Li // CHECK-NEXT: FieldDecl{{.*}}x 21*67e74705SXin Li // CHECK-NEXT: RecordDecl{{.*}}y 22*67e74705SXin Li // CHECK-NEXT: FieldDecl{{.*}}z 23*67e74705SXin Li 24*67e74705SXin Li // CHECK-TU: TranslationUnitDecl 25*67e74705SXin Li testLabelDecl()26*67e74705SXin Livoid testLabelDecl() { 27*67e74705SXin Li __label__ TestLabelDecl; 28*67e74705SXin Li TestLabelDecl: goto TestLabelDecl; 29*67e74705SXin Li } 30*67e74705SXin Li // CHECK: LabelDecl{{.*}} TestLabelDecl 31*67e74705SXin Li 32*67e74705SXin Li typedef int TestTypedefDecl; 33*67e74705SXin Li // CHECK: TypedefDecl{{.*}} TestTypedefDecl 'int' 34*67e74705SXin Li 35*67e74705SXin Li __module_private__ typedef int TestTypedefDeclPrivate; 36*67e74705SXin Li // CHECK: TypedefDecl{{.*}} TestTypedefDeclPrivate 'int' __module_private__ 37*67e74705SXin Li 38*67e74705SXin Li enum TestEnumDecl { 39*67e74705SXin Li testEnumDecl 40*67e74705SXin Li }; 41*67e74705SXin Li // CHECK: EnumDecl{{.*}} TestEnumDecl 42*67e74705SXin Li // CHECK-NEXT: EnumConstantDecl{{.*}} testEnumDecl 43*67e74705SXin Li 44*67e74705SXin Li struct TestEnumDeclAnon { 45*67e74705SXin Li enum { 46*67e74705SXin Li testEnumDeclAnon 47*67e74705SXin Li } e; 48*67e74705SXin Li }; 49*67e74705SXin Li // CHECK: RecordDecl{{.*}} TestEnumDeclAnon 50*67e74705SXin Li // CHECK-NEXT: EnumDecl{{.*> .*$}} 51*67e74705SXin Li 52*67e74705SXin Li enum TestEnumDeclForward; 53*67e74705SXin Li // CHECK: EnumDecl{{.*}} TestEnumDeclForward 54*67e74705SXin Li 55*67e74705SXin Li __module_private__ enum TestEnumDeclPrivate; 56*67e74705SXin Li // CHECK: EnumDecl{{.*}} TestEnumDeclPrivate __module_private__ 57*67e74705SXin Li 58*67e74705SXin Li struct TestRecordDecl { 59*67e74705SXin Li int i; 60*67e74705SXin Li }; 61*67e74705SXin Li // CHECK: RecordDecl{{.*}} struct TestRecordDecl 62*67e74705SXin Li // CHECK-NEXT: FieldDecl 63*67e74705SXin Li 64*67e74705SXin Li struct TestRecordDeclEmpty { 65*67e74705SXin Li }; 66*67e74705SXin Li // CHECK: RecordDecl{{.*}} struct TestRecordDeclEmpty 67*67e74705SXin Li 68*67e74705SXin Li struct TestRecordDeclAnon1 { 69*67e74705SXin Li struct { 70*67e74705SXin Li } testRecordDeclAnon1; 71*67e74705SXin Li }; 72*67e74705SXin Li // CHECK: RecordDecl{{.*}} struct TestRecordDeclAnon1 73*67e74705SXin Li // CHECK-NEXT: RecordDecl{{.*}} struct 74*67e74705SXin Li 75*67e74705SXin Li struct TestRecordDeclAnon2 { 76*67e74705SXin Li struct { 77*67e74705SXin Li }; 78*67e74705SXin Li }; 79*67e74705SXin Li // CHECK: RecordDecl{{.*}} struct TestRecordDeclAnon2 80*67e74705SXin Li // CHECK-NEXT: RecordDecl{{.*}} struct 81*67e74705SXin Li 82*67e74705SXin Li struct TestRecordDeclForward; 83*67e74705SXin Li // CHECK: RecordDecl{{.*}} struct TestRecordDeclForward 84*67e74705SXin Li 85*67e74705SXin Li __module_private__ struct TestRecordDeclPrivate; 86*67e74705SXin Li // CHECK: RecordDecl{{.*}} struct TestRecordDeclPrivate __module_private__ 87*67e74705SXin Li 88*67e74705SXin Li enum testEnumConstantDecl { 89*67e74705SXin Li TestEnumConstantDecl, 90*67e74705SXin Li TestEnumConstantDeclInit = 1 91*67e74705SXin Li }; 92*67e74705SXin Li // CHECK: EnumConstantDecl{{.*}} TestEnumConstantDecl 'int' 93*67e74705SXin Li // CHECK: EnumConstantDecl{{.*}} TestEnumConstantDeclInit 'int' 94*67e74705SXin Li // CHECK-NEXT: IntegerLiteral 95*67e74705SXin Li 96*67e74705SXin Li struct testIndirectFieldDecl { 97*67e74705SXin Li struct { 98*67e74705SXin Li int TestIndirectFieldDecl; 99*67e74705SXin Li }; 100*67e74705SXin Li }; 101*67e74705SXin Li // CHECK: IndirectFieldDecl{{.*}} TestIndirectFieldDecl 'int' 102*67e74705SXin Li // CHECK-NEXT: Field{{.*}} '' 103*67e74705SXin Li // CHECK-NEXT: Field{{.*}} 'TestIndirectFieldDecl' 104*67e74705SXin Li TestFunctionDecl(int x,enum{ e } y)105*67e74705SXin Liint TestFunctionDecl(int x, enum { e } y) { 106*67e74705SXin Li return x; 107*67e74705SXin Li } 108*67e74705SXin Li // CHECK: FunctionDecl{{.*}} TestFunctionDecl 'int (int, enum {{.*}})' 109*67e74705SXin Li // CHECK-NEXT: EnumDecl 110*67e74705SXin Li // CHECK-NEXT: EnumConstantDecl{{.*}} e 111*67e74705SXin Li // CHECK-NEXT: ParmVarDecl{{.*}} x 112*67e74705SXin Li // CHECK-NEXT: ParmVarDecl{{.*}} y 113*67e74705SXin Li // CHECK-NEXT: CompoundStmt 114*67e74705SXin Li 115*67e74705SXin Li int TestFunctionDeclProto(int x); 116*67e74705SXin Li // CHECK: FunctionDecl{{.*}} TestFunctionDeclProto 'int (int)' 117*67e74705SXin Li // CHECK-NEXT: ParmVarDecl{{.*}} x 118*67e74705SXin Li 119*67e74705SXin Li extern int TestFunctionDeclSC(); 120*67e74705SXin Li // CHECK: FunctionDecl{{.*}} TestFunctionDeclSC 'int ()' extern 121*67e74705SXin Li 122*67e74705SXin Li inline int TestFunctionDeclInline(); 123*67e74705SXin Li // CHECK: FunctionDecl{{.*}} TestFunctionDeclInline 'int ()' inline 124*67e74705SXin Li 125*67e74705SXin Li struct testFieldDecl { 126*67e74705SXin Li int TestFieldDecl; 127*67e74705SXin Li int TestFieldDeclWidth : 1; 128*67e74705SXin Li __module_private__ int TestFieldDeclPrivate; 129*67e74705SXin Li }; 130*67e74705SXin Li // CHECK: FieldDecl{{.*}} TestFieldDecl 'int' 131*67e74705SXin Li // CHECK: FieldDecl{{.*}} TestFieldDeclWidth 'int' 132*67e74705SXin Li // CHECK-NEXT: IntegerLiteral 133*67e74705SXin Li // CHECK: FieldDecl{{.*}} TestFieldDeclPrivate 'int' __module_private__ 134*67e74705SXin Li 135*67e74705SXin Li int TestVarDecl; 136*67e74705SXin Li // CHECK: VarDecl{{.*}} TestVarDecl 'int' 137*67e74705SXin Li 138*67e74705SXin Li extern int TestVarDeclSC; 139*67e74705SXin Li // CHECK: VarDecl{{.*}} TestVarDeclSC 'int' extern 140*67e74705SXin Li 141*67e74705SXin Li __thread int TestVarDeclThread; 142*67e74705SXin Li // CHECK: VarDecl{{.*}} TestVarDeclThread 'int' tls{{$}} 143*67e74705SXin Li 144*67e74705SXin Li __module_private__ int TestVarDeclPrivate; 145*67e74705SXin Li // CHECK: VarDecl{{.*}} TestVarDeclPrivate 'int' __module_private__ 146*67e74705SXin Li 147*67e74705SXin Li int TestVarDeclInit = 0; 148*67e74705SXin Li // CHECK: VarDecl{{.*}} TestVarDeclInit 'int' 149*67e74705SXin Li // CHECK-NEXT: IntegerLiteral 150*67e74705SXin Li 151*67e74705SXin Li void testParmVarDecl(int TestParmVarDecl); 152*67e74705SXin Li // CHECK: ParmVarDecl{{.*}} TestParmVarDecl 'int' 153