Reid Kleckner | 31abd80 | 2016-06-30 17:41:31 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -fblocks -debug-info-kind=limited -gcodeview -emit-llvm %s \ |
| 2 | // RUN: -o - -triple=x86_64-pc-win32 -std=c++98 | \ |
Hubert Tong | 8d92f59 | 2019-06-19 15:48:12 +0000 | [diff] [blame] | 3 | // RUN: grep -E 'DISubprogram|DICompositeType' | sed -e 's/.*name: "\([^"]*\)".*/"\1"/' | \ |
Reid Kleckner | 31abd80 | 2016-06-30 17:41:31 +0000 | [diff] [blame] | 4 | // 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 Kleckner | 6010338 | 2015-12-16 02:04:40 +0000 | [diff] [blame] | 9 | |
| 10 | void freefunc() { } |
| 11 | // CHECK-DAG: "freefunc" |
| 12 | |
| 13 | namespace N { |
| 14 | int b() { return 0; } |
Reid Kleckner | 31abd80 | 2016-06-30 17:41:31 +0000 | [diff] [blame] | 15 | // UNQUAL-DAG: "b" |
| 16 | // QUAL-DAG: "N::b" |
Reid Kleckner | 6010338 | 2015-12-16 02:04:40 +0000 | [diff] [blame] | 17 | namespace { void func() { } } |
Reid Kleckner | 31abd80 | 2016-06-30 17:41:31 +0000 | [diff] [blame] | 18 | // UNQUAL-DAG: "func" |
| 19 | // QUAL-DAG: "N::`anonymous namespace'::func" |
Reid Kleckner | 6010338 | 2015-12-16 02:04:40 +0000 | [diff] [blame] | 20 | } |
| 21 | |
| 22 | void _c(void) { |
| 23 | N::func(); |
| 24 | } |
| 25 | // CHECK-DAG: "_c" |
| 26 | |
| 27 | struct foo { |
| 28 | int operator+(int); |
| 29 | foo(){} |
Reid Kleckner | 31abd80 | 2016-06-30 17:41:31 +0000 | [diff] [blame] | 30 | // UNQUAL-DAG: "foo" |
| 31 | // QUAL-DAG: "foo::foo" |
Reid Kleckner | 6010338 | 2015-12-16 02:04:40 +0000 | [diff] [blame] | 32 | |
| 33 | ~foo(){} |
Reid Kleckner | 31abd80 | 2016-06-30 17:41:31 +0000 | [diff] [blame] | 34 | // UNQUAL-DAG: "~foo" |
| 35 | // QUAL-DAG: "foo::~foo" |
Reid Kleckner | 6010338 | 2015-12-16 02:04:40 +0000 | [diff] [blame] | 36 | |
| 37 | foo(int i){} |
Reid Kleckner | 31abd80 | 2016-06-30 17:41:31 +0000 | [diff] [blame] | 38 | // UNQUAL-DAG: "foo" |
| 39 | // QUAL-DAG: "foo::foo" |
Reid Kleckner | 6010338 | 2015-12-16 02:04:40 +0000 | [diff] [blame] | 40 | |
| 41 | foo(char *q){} |
Reid Kleckner | 31abd80 | 2016-06-30 17:41:31 +0000 | [diff] [blame] | 42 | // UNQUAL-DAG: "foo" |
| 43 | // QUAL-DAG: "foo::foo" |
Reid Kleckner | 6010338 | 2015-12-16 02:04:40 +0000 | [diff] [blame] | 44 | |
| 45 | static foo* static_method() { return 0; } |
Reid Kleckner | 31abd80 | 2016-06-30 17:41:31 +0000 | [diff] [blame] | 46 | // UNQUAL-DAG: "static_method" |
| 47 | // QUAL-DAG: "foo::static_method" |
Reid Kleckner | 6010338 | 2015-12-16 02:04:40 +0000 | [diff] [blame] | 48 | |
| 49 | }; |
| 50 | |
| 51 | void use_foo() { |
| 52 | foo f1, f2(1), f3((char*)0); |
| 53 | foo::static_method(); |
| 54 | } |
| 55 | |
Reid Kleckner | 31abd80 | 2016-06-30 17:41:31 +0000 | [diff] [blame] | 56 | // UNQUAL-DAG: "operator+" |
| 57 | // QUAL-DAG: "foo::operator+" |
Reid Kleckner | 6010338 | 2015-12-16 02:04:40 +0000 | [diff] [blame] | 58 | int foo::operator+(int a) { return a; } |
| 59 | |
| 60 | // PR17371 |
| 61 | struct 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 | |
| 71 | void *OverloadedNewDelete::operator new(__SIZE_TYPE__ s) { return 0; } |
| 72 | void *OverloadedNewDelete::operator new[](__SIZE_TYPE__ s) { return 0; } |
| 73 | void OverloadedNewDelete::operator delete(void *) { } |
| 74 | void OverloadedNewDelete::operator delete[](void *) { } |
| 75 | int OverloadedNewDelete::operator+(int x) { return x; }; |
| 76 | |
Reid Kleckner | 31abd80 | 2016-06-30 17:41:31 +0000 | [diff] [blame] | 77 | // 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 Kleckner | 6010338 | 2015-12-16 02:04:40 +0000 | [diff] [blame] | 88 | |
Reid Kleckner | 829398e | 2016-06-17 16:11:20 +0000 | [diff] [blame] | 89 | template <typename T, void (*)(void)> |
Reid Kleckner | 6010338 | 2015-12-16 02:04:40 +0000 | [diff] [blame] | 90 | void fn_tmpl() {} |
| 91 | |
Reid Kleckner | 829398e | 2016-06-17 16:11:20 +0000 | [diff] [blame] | 92 | template void fn_tmpl<int, freefunc>(); |
| 93 | // CHECK-DAG: "fn_tmpl<int,&freefunc>" |
Reid Kleckner | 59d1220 | 2017-08-08 01:33:53 +0000 | [diff] [blame] | 94 | |
| 95 | template <typename A, typename B, typename C> struct ClassTemplate { A a; B b; C c; }; |
| 96 | ClassTemplate<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> >" |