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> >"
 |