1*67e74705SXin Li // RUN: %clang_cc1 -fblocks -debug-info-kind=limited -gcodeview -emit-llvm %s \ 2*67e74705SXin Li // RUN: -o - -triple=x86_64-pc-win32 -std=c++98 | \ 3*67e74705SXin Li // RUN: grep 'DISubprogram' | sed -e 's/.*name: "\([^"]*\)".*/"\1"/' | \ 4*67e74705SXin Li // RUN: FileCheck %s --check-prefix=CHECK --check-prefix=UNQUAL 5*67e74705SXin Li // RUN: %clang_cc1 -fblocks -debug-info-kind=line-tables-only -gcodeview -emit-llvm %s \ 6*67e74705SXin Li // RUN: -o - -triple=x86_64-pc-win32 -std=c++98 | \ 7*67e74705SXin Li // RUN: grep 'DISubprogram' | sed -e 's/.*name: "\([^"]*\)".*/"\1"/' | \ 8*67e74705SXin Li // RUN: FileCheck %s --check-prefix=CHECK --check-prefix=QUAL 9*67e74705SXin Li freefunc()10*67e74705SXin Livoid freefunc() { } 11*67e74705SXin Li // CHECK-DAG: "freefunc" 12*67e74705SXin Li 13*67e74705SXin Li namespace N { b()14*67e74705SXin Li int b() { return 0; } 15*67e74705SXin Li // UNQUAL-DAG: "b" 16*67e74705SXin Li // QUAL-DAG: "N::b" func()17*67e74705SXin Li namespace { void func() { } } 18*67e74705SXin Li // UNQUAL-DAG: "func" 19*67e74705SXin Li // QUAL-DAG: "N::`anonymous namespace'::func" 20*67e74705SXin Li } 21*67e74705SXin Li _c(void)22*67e74705SXin Livoid _c(void) { 23*67e74705SXin Li N::func(); 24*67e74705SXin Li } 25*67e74705SXin Li // CHECK-DAG: "_c" 26*67e74705SXin Li 27*67e74705SXin Li struct foo { 28*67e74705SXin Li int operator+(int); foofoo29*67e74705SXin Li foo(){} 30*67e74705SXin Li // UNQUAL-DAG: "foo" 31*67e74705SXin Li // QUAL-DAG: "foo::foo" 32*67e74705SXin Li ~foofoo33*67e74705SXin Li ~foo(){} 34*67e74705SXin Li // UNQUAL-DAG: "~foo" 35*67e74705SXin Li // QUAL-DAG: "foo::~foo" 36*67e74705SXin Li foofoo37*67e74705SXin Li foo(int i){} 38*67e74705SXin Li // UNQUAL-DAG: "foo" 39*67e74705SXin Li // QUAL-DAG: "foo::foo" 40*67e74705SXin Li foofoo41*67e74705SXin Li foo(char *q){} 42*67e74705SXin Li // UNQUAL-DAG: "foo" 43*67e74705SXin Li // QUAL-DAG: "foo::foo" 44*67e74705SXin Li static_methodfoo45*67e74705SXin Li static foo* static_method() { return 0; } 46*67e74705SXin Li // UNQUAL-DAG: "static_method" 47*67e74705SXin Li // QUAL-DAG: "foo::static_method" 48*67e74705SXin Li 49*67e74705SXin Li }; 50*67e74705SXin Li use_foo()51*67e74705SXin Livoid use_foo() { 52*67e74705SXin Li foo f1, f2(1), f3((char*)0); 53*67e74705SXin Li foo::static_method(); 54*67e74705SXin Li } 55*67e74705SXin Li 56*67e74705SXin Li // UNQUAL-DAG: "operator+" 57*67e74705SXin Li // QUAL-DAG: "foo::operator+" operator +(int a)58*67e74705SXin Liint foo::operator+(int a) { return a; } 59*67e74705SXin Li 60*67e74705SXin Li // PR17371 61*67e74705SXin Li struct OverloadedNewDelete { 62*67e74705SXin Li // __cdecl 63*67e74705SXin Li void *operator new(__SIZE_TYPE__); 64*67e74705SXin Li void *operator new[](__SIZE_TYPE__); 65*67e74705SXin Li void operator delete(void *); 66*67e74705SXin Li void operator delete[](void *); 67*67e74705SXin Li // __thiscall 68*67e74705SXin Li int operator+(int); 69*67e74705SXin Li }; 70*67e74705SXin Li operator new(__SIZE_TYPE__ s)71*67e74705SXin Livoid *OverloadedNewDelete::operator new(__SIZE_TYPE__ s) { return 0; } operator new[](__SIZE_TYPE__ s)72*67e74705SXin Livoid *OverloadedNewDelete::operator new[](__SIZE_TYPE__ s) { return 0; } operator delete(void *)73*67e74705SXin Livoid OverloadedNewDelete::operator delete(void *) { } operator delete[](void *)74*67e74705SXin Livoid OverloadedNewDelete::operator delete[](void *) { } operator +(int x)75*67e74705SXin Liint OverloadedNewDelete::operator+(int x) { return x; }; 76*67e74705SXin Li 77*67e74705SXin Li // UNQUAL-DAG: "operator new" 78*67e74705SXin Li // UNQUAL-DAG: "operator new[]" 79*67e74705SXin Li // UNQUAL-DAG: "operator delete" 80*67e74705SXin Li // UNQUAL-DAG: "operator delete[]" 81*67e74705SXin Li // UNQUAL-DAG: "operator+" 82*67e74705SXin Li // QUAL-DAG: "OverloadedNewDelete::operator new" 83*67e74705SXin Li // QUAL-DAG: "OverloadedNewDelete::operator new[]" 84*67e74705SXin Li // QUAL-DAG: "OverloadedNewDelete::operator delete" 85*67e74705SXin Li // QUAL-DAG: "OverloadedNewDelete::operator delete[]" 86*67e74705SXin Li // QUAL-DAG: "OverloadedNewDelete::operator+" 87*67e74705SXin Li 88*67e74705SXin Li 89*67e74705SXin Li template <typename T, void (*)(void)> fn_tmpl()90*67e74705SXin Livoid fn_tmpl() {} 91*67e74705SXin Li 92*67e74705SXin Li template void fn_tmpl<int, freefunc>(); 93*67e74705SXin Li // CHECK-DAG: "fn_tmpl<int,&freefunc>" 94