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