blob: ab3344bc991c5529d0aaa3547b011410a21dac50 [file] [log] [blame]
Reid Kleckner31abd802016-06-30 17:41:31 +00001// RUN: %clang_cc1 -fblocks -debug-info-kind=limited -gcodeview -emit-llvm %s \
2// RUN: -o - -triple=x86_64-pc-win32 -std=c++98 | \
Hubert Tong8d92f592019-06-19 15:48:12 +00003// RUN: grep -E 'DISubprogram|DICompositeType' | sed -e 's/.*name: "\([^"]*\)".*/"\1"/' | \
Reid Kleckner31abd802016-06-30 17:41:31 +00004// RUN: FileCheck %s --check-prefix=CHECK --check-prefix=UNQUAL
5// RUN: %clang_cc1 -fblocks -debug-info-kind=line-tables-only -gcodeview -emit-llvm %s \
6// RUN: -o - -triple=x86_64-pc-win32 -std=c++98 | \
7// RUN: grep 'DISubprogram' | sed -e 's/.*name: "\([^"]*\)".*/"\1"/' | \
8// RUN: FileCheck %s --check-prefix=CHECK --check-prefix=QUAL
Reid Kleckner60103382015-12-16 02:04:40 +00009
10void freefunc() { }
11// CHECK-DAG: "freefunc"
12
13namespace N {
14 int b() { return 0; }
Reid Kleckner31abd802016-06-30 17:41:31 +000015// UNQUAL-DAG: "b"
16// QUAL-DAG: "N::b"
Reid Kleckner60103382015-12-16 02:04:40 +000017 namespace { void func() { } }
Reid Kleckner31abd802016-06-30 17:41:31 +000018// UNQUAL-DAG: "func"
19// QUAL-DAG: "N::`anonymous namespace'::func"
Reid Kleckner60103382015-12-16 02:04:40 +000020}
21
22void _c(void) {
23 N::func();
24}
25// CHECK-DAG: "_c"
26
27struct foo {
28 int operator+(int);
29 foo(){}
Reid Kleckner31abd802016-06-30 17:41:31 +000030// UNQUAL-DAG: "foo"
31// QUAL-DAG: "foo::foo"
Reid Kleckner60103382015-12-16 02:04:40 +000032
33 ~foo(){}
Reid Kleckner31abd802016-06-30 17:41:31 +000034// UNQUAL-DAG: "~foo"
35// QUAL-DAG: "foo::~foo"
Reid Kleckner60103382015-12-16 02:04:40 +000036
37 foo(int i){}
Reid Kleckner31abd802016-06-30 17:41:31 +000038// UNQUAL-DAG: "foo"
39// QUAL-DAG: "foo::foo"
Reid Kleckner60103382015-12-16 02:04:40 +000040
41 foo(char *q){}
Reid Kleckner31abd802016-06-30 17:41:31 +000042// UNQUAL-DAG: "foo"
43// QUAL-DAG: "foo::foo"
Reid Kleckner60103382015-12-16 02:04:40 +000044
45 static foo* static_method() { return 0; }
Reid Kleckner31abd802016-06-30 17:41:31 +000046// UNQUAL-DAG: "static_method"
47// QUAL-DAG: "foo::static_method"
Reid Kleckner60103382015-12-16 02:04:40 +000048
49};
50
51void use_foo() {
52 foo f1, f2(1), f3((char*)0);
53 foo::static_method();
54}
55
Reid Kleckner31abd802016-06-30 17:41:31 +000056// UNQUAL-DAG: "operator+"
57// QUAL-DAG: "foo::operator+"
Reid Kleckner60103382015-12-16 02:04:40 +000058int foo::operator+(int a) { return a; }
59
60// PR17371
61struct OverloadedNewDelete {
62 // __cdecl
63 void *operator new(__SIZE_TYPE__);
64 void *operator new[](__SIZE_TYPE__);
65 void operator delete(void *);
66 void operator delete[](void *);
67 // __thiscall
68 int operator+(int);
69};
70
71void *OverloadedNewDelete::operator new(__SIZE_TYPE__ s) { return 0; }
72void *OverloadedNewDelete::operator new[](__SIZE_TYPE__ s) { return 0; }
73void OverloadedNewDelete::operator delete(void *) { }
74void OverloadedNewDelete::operator delete[](void *) { }
75int OverloadedNewDelete::operator+(int x) { return x; };
76
Reid Kleckner31abd802016-06-30 17:41:31 +000077// UNQUAL-DAG: "operator new"
78// UNQUAL-DAG: "operator new[]"
79// UNQUAL-DAG: "operator delete"
80// UNQUAL-DAG: "operator delete[]"
81// UNQUAL-DAG: "operator+"
82// QUAL-DAG: "OverloadedNewDelete::operator new"
83// QUAL-DAG: "OverloadedNewDelete::operator new[]"
84// QUAL-DAG: "OverloadedNewDelete::operator delete"
85// QUAL-DAG: "OverloadedNewDelete::operator delete[]"
86// QUAL-DAG: "OverloadedNewDelete::operator+"
87
Reid Kleckner60103382015-12-16 02:04:40 +000088
Reid Kleckner829398e2016-06-17 16:11:20 +000089template <typename T, void (*)(void)>
Reid Kleckner60103382015-12-16 02:04:40 +000090void fn_tmpl() {}
91
Reid Kleckner829398e2016-06-17 16:11:20 +000092template void fn_tmpl<int, freefunc>();
93// CHECK-DAG: "fn_tmpl<int,&freefunc>"
Reid Kleckner59d12202017-08-08 01:33:53 +000094
95template <typename A, typename B, typename C> struct ClassTemplate { A a; B b; C c; };
96ClassTemplate<char, short, ClassTemplate<int, int, int> > f;
97// This will only show up in normal debug builds.
98// UNQUAL-DAG: "ClassTemplate<char,short,ClassTemplate<int,int,int> >"