// RUN: %clang_cc1 -fblocks -debug-info-kind=limited -gcodeview -emit-llvm %s \ // RUN: -o - -triple=x86_64-pc-win32 -Wno-new-returns-null -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 -Wno-new-returns-null -std=c++98 | \ // RUN: grep 'DISubprogram' | sed -e 's/.*name: "\([^"]*\)".*/"\1"/' | \ // RUN: FileCheck %s --check-prefix=CHECK --check-prefix=QUAL // RUN: %clang_cc1 -fblocks -debug-info-kind=limited -gcodeview -emit-llvm %s \ // RUN: -o - -triple=x86_64-pc-win32 -Wno-new-returns-null -std=c++11 | \ // 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=limited -gcodeview -emit-llvm %s \ // RUN: -o - -triple=x86_64-pc-win32 -Wno-new-returns-null | \ // RUN: grep -E 'DISubprogram|DICompositeType' | sed -e 's/.*name: "\([^"]*\)".*/"\1"/' | \ // RUN: FileCheck %s --check-prefix=CHECK --check-prefix=UNQUAL 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 void fn_tmpl() {} template void fn_tmpl(); // CHECK-DAG: "fn_tmpl" template struct ClassTemplate { A a; B b; C c; }; ClassTemplate > f; // This will only show up in normal debug builds. The space in `> >` is // important for compatibility with Windows debuggers, so it should always be // there when generating CodeView. // UNQUAL-DAG: "ClassTemplate >"