xref: /aosp_15_r20/external/clang/test/CodeGenCXX/debug-info-codeview-display-name.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li void 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 Li void _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 Li void 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 Li int 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 Li void *OverloadedNewDelete::operator new(__SIZE_TYPE__ s) { return 0; }
operator new[](__SIZE_TYPE__ s)72*67e74705SXin Li void *OverloadedNewDelete::operator new[](__SIZE_TYPE__ s) { return 0; }
operator delete(void *)73*67e74705SXin Li void OverloadedNewDelete::operator delete(void *) { }
operator delete[](void *)74*67e74705SXin Li void OverloadedNewDelete::operator delete[](void *) { }
operator +(int x)75*67e74705SXin Li int 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 Li void fn_tmpl() {}
91*67e74705SXin Li 
92*67e74705SXin Li template void fn_tmpl<int, freefunc>();
93*67e74705SXin Li // CHECK-DAG: "fn_tmpl<int,&freefunc>"
94