| // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ast-dump -ast-dump-filter Test %s | FileCheck -strict-whitespace %s | 
 | // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ast-dump %s | FileCheck -check-prefix CHECK-TU -strict-whitespace %s | 
 | // RUN: %clang_cc1 -fmodules -fmodules-local-submodule-visibility -fmodule-name=X -triple x86_64-unknown-unknown -fmodule-map-file=%S/Inputs/module.modulemap -ast-dump -ast-dump-filter Test %s -DMODULES | FileCheck -check-prefix CHECK -check-prefix CHECK-MODULES -strict-whitespace %s | 
 |  | 
 | int TestLocation; | 
 | // CHECK: VarDecl 0x{{[^ ]*}} <{{.*}}:[[@LINE-1]]:1, col:5> col:5 TestLocation | 
 |  | 
 | #ifdef MODULES | 
 | #pragma clang module begin X | 
 | #endif | 
 |  | 
 | struct TestIndent { | 
 |   int x; | 
 | }; | 
 | // CHECK:      {{^}}RecordDecl{{.*TestIndent[^()]*$}} | 
 | // CHECK-NEXT: {{^}}`-FieldDecl{{.*x[^()]*$}} | 
 |  | 
 | struct TestChildren { | 
 |   int x; | 
 |   struct y { | 
 |     int z; | 
 |   }; | 
 | }; | 
 | // CHECK:      RecordDecl{{.*}}TestChildren | 
 | // CHECK-NEXT:   FieldDecl{{.*}}x | 
 | // CHECK-NEXT:   RecordDecl{{.*}}y | 
 | // CHECK-NEXT:     FieldDecl{{.*}}z | 
 |  | 
 | // CHECK-TU: TranslationUnitDecl | 
 |  | 
 | void testLabelDecl() { | 
 |   __label__ TestLabelDecl; | 
 |   TestLabelDecl: goto TestLabelDecl; | 
 | } | 
 | // CHECK:      LabelDecl{{.*}} TestLabelDecl | 
 |  | 
 | typedef int TestTypedefDecl; | 
 | // CHECK:      TypedefDecl{{.*}} TestTypedefDecl 'int' | 
 |  | 
 | __module_private__ typedef int TestTypedefDeclPrivate; | 
 | // CHECK-MODULE:      TypedefDecl{{.*}} TestTypedefDeclPrivate 'int' __module_private__ | 
 |  | 
 | enum TestEnumDecl { | 
 |   testEnumDecl | 
 | }; | 
 | // CHECK:      EnumDecl{{.*}} TestEnumDecl | 
 | // CHECK-NEXT:   EnumConstantDecl{{.*}} testEnumDecl | 
 |  | 
 | struct TestEnumDeclAnon { | 
 |   enum { | 
 |     testEnumDeclAnon | 
 |   } e; | 
 | }; | 
 | // CHECK:      RecordDecl{{.*}} TestEnumDeclAnon | 
 | // CHECK-NEXT:   EnumDecl{{.*> .*$}} | 
 |  | 
 | enum TestEnumDeclForward; | 
 | // CHECK:      EnumDecl{{.*}} TestEnumDeclForward | 
 |  | 
 | __module_private__ enum TestEnumDeclPrivate; | 
 | // CHECK-MODULE:      EnumDecl{{.*}} TestEnumDeclPrivate __module_private__ | 
 |  | 
 | struct TestRecordDecl { | 
 |   int i; | 
 | }; | 
 | // CHECK:      RecordDecl{{.*}} struct TestRecordDecl | 
 | // CHECK-NEXT:   FieldDecl | 
 |  | 
 | struct TestRecordDeclEmpty { | 
 | }; | 
 | // CHECK:      RecordDecl{{.*}} struct TestRecordDeclEmpty | 
 |  | 
 | struct TestRecordDeclAnon1 { | 
 |   struct { | 
 |   } testRecordDeclAnon1; | 
 | }; | 
 | // CHECK:      RecordDecl{{.*}} struct TestRecordDeclAnon1 | 
 | // CHECK-NEXT:   RecordDecl{{.*}} struct | 
 |  | 
 | struct TestRecordDeclAnon2 { | 
 |   struct { | 
 |   }; | 
 | }; | 
 | // CHECK:      RecordDecl{{.*}} struct TestRecordDeclAnon2 | 
 | // CHECK-NEXT:   RecordDecl{{.*}} struct | 
 |  | 
 | struct TestRecordDeclForward; | 
 | // CHECK:      RecordDecl{{.*}} struct TestRecordDeclForward | 
 |  | 
 | __module_private__ struct TestRecordDeclPrivate; | 
 | // CHECK-MODULE:      RecordDecl{{.*}} struct TestRecordDeclPrivate __module_private__ | 
 |  | 
 | enum testEnumConstantDecl { | 
 |   TestEnumConstantDecl, | 
 |   TestEnumConstantDeclInit = 1 | 
 | }; | 
 | // CHECK:      EnumConstantDecl{{.*}} TestEnumConstantDecl 'int' | 
 | // CHECK:      EnumConstantDecl{{.*}} TestEnumConstantDeclInit 'int' | 
 | // CHECK-NEXT:   ConstantExpr | 
 | // CHECK-NEXT:     IntegerLiteral | 
 |  | 
 | struct testIndirectFieldDecl { | 
 |   struct { | 
 |     int TestIndirectFieldDecl; | 
 |   }; | 
 | }; | 
 | // CHECK:      IndirectFieldDecl{{.*}} TestIndirectFieldDecl 'int' | 
 | // CHECK-NEXT:   Field{{.*}} '' | 
 | // CHECK-NEXT:   Field{{.*}} 'TestIndirectFieldDecl' | 
 |  | 
 | // FIXME: It would be nice to dump the enum and its enumerators. | 
 | int TestFunctionDecl(int x, enum { e } y) { | 
 |   return x; | 
 | } | 
 | // CHECK:      FunctionDecl{{.*}} TestFunctionDecl 'int (int, enum {{.*}})' | 
 | // CHECK-NEXT:   ParmVarDecl{{.*}} x | 
 | // CHECK-NEXT:   ParmVarDecl{{.*}} y | 
 | // CHECK-NEXT:   CompoundStmt | 
 |  | 
 | // FIXME: It would be nice to 'Enum' and 'e'. | 
 | int TestFunctionDecl2(enum Enum { e } x) { return x; } | 
 | // CHECK:      FunctionDecl{{.*}} TestFunctionDecl2 'int (enum {{.*}})' | 
 | // CHECK-NEXT:   ParmVarDecl{{.*}} x | 
 | // CHECK-NEXT:   CompoundStmt | 
 |  | 
 |  | 
 | int TestFunctionDeclProto(int x); | 
 | // CHECK:      FunctionDecl{{.*}} TestFunctionDeclProto 'int (int)' | 
 | // CHECK-NEXT:   ParmVarDecl{{.*}} x | 
 |  | 
 | void TestFunctionDeclNoProto(); | 
 | // CHECK:      FunctionDecl{{.*}} TestFunctionDeclNoProto 'void ()' | 
 |  | 
 | extern int TestFunctionDeclSC(); | 
 | // CHECK:      FunctionDecl{{.*}} TestFunctionDeclSC 'int ()' extern | 
 |  | 
 | inline int TestFunctionDeclInline(); | 
 | // CHECK:      FunctionDecl{{.*}} TestFunctionDeclInline 'int ()' inline | 
 |  | 
 | struct testFieldDecl { | 
 |   int TestFieldDecl; | 
 |   int TestFieldDeclWidth : 1; | 
 |   __module_private__ int TestFieldDeclPrivate; | 
 | }; | 
 | // CHECK:      FieldDecl{{.*}} TestFieldDecl 'int' | 
 | // CHECK:      FieldDecl{{.*}} TestFieldDeclWidth 'int' | 
 | // CHECK-NEXT:   ConstantExpr | 
 | // CHECK-NEXT:     IntegerLiteral | 
 | // CHECK-MODULE:      FieldDecl{{.*}} TestFieldDeclPrivate 'int' __module_private__ | 
 |  | 
 | int TestVarDecl; | 
 | // CHECK:      VarDecl{{.*}} TestVarDecl 'int' | 
 |  | 
 | extern int TestVarDeclSC; | 
 | // CHECK:      VarDecl{{.*}} TestVarDeclSC 'int' extern | 
 |  | 
 | __thread int TestVarDeclThread; | 
 | // CHECK:      VarDecl{{.*}} TestVarDeclThread 'int' tls{{$}} | 
 |  | 
 | __module_private__ int TestVarDeclPrivate; | 
 | // CHECK-MODULE:      VarDecl{{.*}} TestVarDeclPrivate 'int' __module_private__ | 
 |  | 
 | int TestVarDeclInit = 0; | 
 | // CHECK:      VarDecl{{.*}} TestVarDeclInit 'int' | 
 | // CHECK-NEXT:   IntegerLiteral | 
 |  | 
 | void testParmVarDecl(int TestParmVarDecl); | 
 | // CHECK: ParmVarDecl{{.*}} TestParmVarDecl 'int' | 
 |  | 
 | #ifdef MODULES | 
 | #pragma clang module end | 
 | #endif | 
 |  |