forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			99 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -fblocks -debug-info-kind=limited -gcodeview -emit-llvm %s \
 | |
| // RUN:       -o - -triple=x86_64-pc-win32 -std=c++98 | \
 | |
| // RUN:    grep -E 'DISubprogram|DICompositeType' | sed -e 's/.*name: "\([^"]*\)".*/"\1"/' | \
 | |
| // RUN:    FileCheck %s --check-prefix=CHECK --check-prefix=UNQUAL
 | |
| // RUN: %clang_cc1 -fblocks -debug-info-kind=line-tables-only -gcodeview -emit-llvm %s \
 | |
| // RUN:       -o - -triple=x86_64-pc-win32 -std=c++98 | \
 | |
| // RUN:    grep 'DISubprogram' | sed -e 's/.*name: "\([^"]*\)".*/"\1"/' | \
 | |
| // RUN:    FileCheck %s --check-prefix=CHECK --check-prefix=QUAL
 | |
| 
 | |
| void freefunc() { }
 | |
| // CHECK-DAG: "freefunc"
 | |
| 
 | |
| namespace N {
 | |
|   int b() { return 0; }
 | |
| // UNQUAL-DAG: "b"
 | |
| // QUAL-DAG: "N::b"
 | |
|   namespace { void func() { } }
 | |
| // UNQUAL-DAG: "func"
 | |
| // QUAL-DAG: "N::`anonymous namespace'::func"
 | |
| }
 | |
| 
 | |
| void _c(void) {
 | |
|   N::func();
 | |
| }
 | |
| // CHECK-DAG: "_c"
 | |
| 
 | |
| struct foo {
 | |
|   int operator+(int);
 | |
|   foo(){}
 | |
| // UNQUAL-DAG: "foo"
 | |
| // QUAL-DAG: "foo::foo"
 | |
| 
 | |
|   ~foo(){}
 | |
| // UNQUAL-DAG: "~foo"
 | |
| // QUAL-DAG: "foo::~foo"
 | |
| 
 | |
|   foo(int i){}
 | |
| // UNQUAL-DAG: "foo"
 | |
| // QUAL-DAG: "foo::foo"
 | |
| 
 | |
|   foo(char *q){}
 | |
| // UNQUAL-DAG: "foo"
 | |
| // QUAL-DAG: "foo::foo"
 | |
| 
 | |
|   static foo* static_method() { return 0; }
 | |
| // UNQUAL-DAG: "static_method"
 | |
| // QUAL-DAG: "foo::static_method"
 | |
| 
 | |
| };
 | |
| 
 | |
| void use_foo() {
 | |
|   foo f1, f2(1), f3((char*)0);
 | |
|   foo::static_method();
 | |
| }
 | |
| 
 | |
| // UNQUAL-DAG: "operator+"
 | |
| // QUAL-DAG: "foo::operator+"
 | |
| int foo::operator+(int a) { return a; }
 | |
| 
 | |
| // PR17371
 | |
| struct OverloadedNewDelete {
 | |
|   // __cdecl
 | |
|   void *operator new(__SIZE_TYPE__);
 | |
|   void *operator new[](__SIZE_TYPE__);
 | |
|   void operator delete(void *);
 | |
|   void operator delete[](void *);
 | |
|   // __thiscall
 | |
|   int operator+(int);
 | |
| };
 | |
| 
 | |
| void *OverloadedNewDelete::operator new(__SIZE_TYPE__ s) { return 0; }
 | |
| void *OverloadedNewDelete::operator new[](__SIZE_TYPE__ s) { return 0; }
 | |
| void OverloadedNewDelete::operator delete(void *) { }
 | |
| void OverloadedNewDelete::operator delete[](void *) { }
 | |
| int OverloadedNewDelete::operator+(int x) { return x; };
 | |
| 
 | |
| // UNQUAL-DAG: "operator new"
 | |
| // UNQUAL-DAG: "operator new[]"
 | |
| // UNQUAL-DAG: "operator delete"
 | |
| // UNQUAL-DAG: "operator delete[]"
 | |
| // UNQUAL-DAG: "operator+"
 | |
| // QUAL-DAG: "OverloadedNewDelete::operator new"
 | |
| // QUAL-DAG: "OverloadedNewDelete::operator new[]"
 | |
| // QUAL-DAG: "OverloadedNewDelete::operator delete"
 | |
| // QUAL-DAG: "OverloadedNewDelete::operator delete[]"
 | |
| // QUAL-DAG: "OverloadedNewDelete::operator+"
 | |
| 
 | |
| 
 | |
| template <typename T, void (*)(void)>
 | |
| void fn_tmpl() {}
 | |
| 
 | |
| template void fn_tmpl<int, freefunc>();
 | |
| // CHECK-DAG: "fn_tmpl<int,&freefunc>"
 | |
| 
 | |
| template <typename A, typename B, typename C> struct ClassTemplate { A a; B b; C c; };
 | |
| ClassTemplate<char, short, ClassTemplate<int, int, int> > f;
 | |
| // This will only show up in normal debug builds.
 | |
| // UNQUAL-DAG: "ClassTemplate<char,short,ClassTemplate<int,int,int> >"
 |