forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			174 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
// 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
 | 
						|
 |