Home | History | Annotate | Download | only in CodeGenCXX
      1 // RUN: %clang_cc1 -triple x86_64-none-linux-gnu -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s
      2 // RUN: %clang_cc1 -triple i686-pc-windows-msvc -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s --check-prefix=MSVC
      3 
      4 template<typename T> struct Identity {
      5   typedef T Type;
      6 };
      7 
      8 void f(Identity<int>::Type a) {}
      9 void f(Identity<int> a) {}
     10 void f(int& a) { }
     11 
     12 template<typename T> struct A {
     13   A<T> *next;
     14 };
     15 void f(A<int>) { }
     16 
     17 struct B { };
     18 
     19 void f() {
     20   int B::*a = 0;
     21   void (B::*b)() = 0;
     22 }
     23 
     24 namespace EmptyNameCrash {
     25   struct A { A(); };
     26   typedef struct { A x; } B;
     27   B x;
     28 }
     29 
     30 // PR4890
     31 namespace PR4890 {
     32   struct X {
     33     ~X();
     34   };
     35 
     36   X::~X() { }
     37 }
     38 
     39 namespace VirtualDtor {
     40   struct Y {
     41     virtual ~Y();
     42   };
     43 
     44   Y::~Y() { }
     45 }
     46 
     47 namespace VirtualBase {
     48   struct A { int a; };
     49   struct B : virtual A { int b; };
     50 
     51   void f() {
     52     B b;
     53   }
     54 }
     55 
     56 // CHECK: define void @_ZN7pr147634funcENS_3fooE
     57 // CHECK: call void @llvm.dbg.declare({{.*}}, metadata ![[F:.*]], metadata ![[EXPR:.*]])
     58 
     59 // MSVC: [[VBASE_B:![0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "B",{{.*}} line: 49
     60 // MSVC-SAME:                                            size: 96, align: 32
     61 // MSVC-NOT:                                             offset:
     62 // MSVC-NOT:                                             DIFlagFwdDecl
     63 // MSVC-SAME:                                            elements: [[VBASE_B_DEF:![0-9]+]]
     64 // MSVC: [[VBASE_B_DEF]] = !{[[VBASE_A_IN_B:![0-9]+]],
     65 //
     66 // Look for the vbtable offset of A, which should be 4.
     67 // MSVC: [[VBASE_A_IN_B]] = !DIDerivedType(tag: DW_TAG_inheritance, scope: [[VBASE_B]],
     68 // MSVC-SAME:                              baseType: !{{[0-9]*}}
     69 
     70 // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "B",{{.*}} line: 49,
     71 // CHECK-SAME:             size: 128, align: 64,
     72 // CHECK-NOT:              offset:
     73 // CHECK-NOT:              DIFlagFwdDecl
     74 // CHECK-SAME:             elements: [[VBASE_B_DEF:![^,)]+]]
     75 // CHECK: [[VBASE_B_DEF]] = !{[[VBASE_A_IN_B:![0-9]+]],
     76 //
     77 // Look for the vtable offset offset, which should be -24.
     78 // CHECK: [[VBASE_A_IN_B]] = !DIDerivedType(tag: DW_TAG_inheritance
     79 // CHECK-SAME:                              scope: !"_ZTSN11VirtualBase1BE"
     80 // CHECK-SAME:                              baseType: !"_ZTSN11VirtualBase1AE"
     81 // CHECK-SAME:                              offset: 24,
     82 namespace b5249287 {
     83 template <typename T> class A {
     84   struct B;
     85 };
     86 
     87 class Cls {
     88   template <typename T> friend class A<T>::B;
     89 };
     90 
     91 Cls obj;
     92 }
     93 
     94 namespace pr14763 {
     95 struct foo {
     96   foo(const foo&);
     97 };
     98 
     99 foo func(foo f) {
    100   return f; // reference 'f' for now because otherwise we hit another bug
    101 }
    102 
    103 // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "foo"
    104 // CHECK-SAME:             scope: [[PR14763:![0-9]+]]
    105 // CHECK-SAME:             identifier: "[[FOO:.*]]"
    106 // CHECK: [[PR14763]] = !DINamespace(name: "pr14763"
    107 // CHECK: [[INCTYPE:![0-9]*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "incomplete"
    108 // CHECK-SAME:                                   DIFlagFwdDecl
    109 // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "a"
    110 // CHECK-SAME:             elements: [[A_MEM:![0-9]+]]
    111 // CHECK-SAME:             identifier: "_ZTSN7pr162141aE"
    112 // CHECK: [[A_MEM]] = !{[[A_I:![0-9]*]]}
    113 // CHECK: [[A_I]] = !DIDerivedType(tag: DW_TAG_member, name: "i"
    114 // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "b"
    115 // CHECK-SAME:             DIFlagFwdDecl
    116 
    117 // CHECK: [[FUNC:![0-9]+]] = distinct !DISubprogram(name: "func", linkageName: "_ZN7pr147634funcENS_3fooE"
    118 // CHECK-SAME:                                      type: [[FUNC_TYPE:![0-9]*]]
    119 // CHECK-SAME:                                      isDefinition: true
    120 }
    121 
    122 void foo() {
    123   const wchar_t c = L'x';
    124   wchar_t d = c;
    125 }
    126 
    127 // CHECK-NOT: !DIGlobalVariable(name: "c"
    128 
    129 namespace pr9608 { // also pr9600
    130 struct incomplete;
    131 incomplete (*x)[3];
    132 // CHECK: !DIGlobalVariable(name: "x", linkageName: "_ZN6pr96081xE"
    133 // CHECK-SAME:              type: [[INCARRAYPTR:![0-9]*]]
    134 // CHECK-SAME:              variable: [3 x i8]** @_ZN6pr96081xE
    135 // CHECK: [[INCARRAYPTR]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[INCARRAY:![0-9]+]]
    136 // CHECK: [[INCARRAY]] = !DICompositeType(tag: DW_TAG_array_type
    137 // CHECK-NOT:                             line:
    138 // CHECK-NOT:                             size:
    139 // CHECK-NOT:                             align:
    140 // CHECK-NOT:                             offset:
    141 // CHECK-SAME:                            baseType: !"_ZTSN6pr960810incompleteE"
    142 }
    143 
    144 // For some reason function arguments ended up down here
    145 // CHECK: ![[F]] = !DILocalVariable(name: "f", arg: 1, scope: [[FUNC]]
    146 // CHECK-SAME:                      type: !"[[FOO]]"
    147 // CHECK: ![[EXPR]] = !DIExpression(DW_OP_deref)
    148 
    149 // CHECK: !DILocalVariable(name: "c"
    150 // CHECK-NOT:              arg:
    151 // CHECK-SAME:            )
    152 
    153 namespace pr16214 {
    154 struct a {
    155   int i;
    156 };
    157 
    158 typedef a at;
    159 
    160 struct b {
    161 };
    162 
    163 typedef b bt;
    164 
    165 void func() {
    166   at a_inst;
    167   bt *b_ptr_inst;
    168   const bt *b_cnst_ptr_inst;
    169 }
    170 
    171 }
    172