// RUN: %clang -cc1 -debug-info-kind=constructor -emit-llvm %s -o - | FileCheck %s // CHECK-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "A"{{.*}}DIFlagTypePassByValue struct A { } TestA; // CHECK-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "B"{{.*}}flags: DIFlagFwdDecl struct B { B(); } TestB; // CHECK-DAG: ![[C:[0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "C"{{.*}}DIFlagTypePassByValue struct C { C() {} } TestC; // CHECK-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "D"{{.*}}DIFlagTypePassByValue struct D { D(); }; D::D() {} // Test for constexpr constructor. // CHECK-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "E"{{.*}}DIFlagTypePassByValue struct E { constexpr E(){}; } TestE; // Test for trivial constructor. // CHECK-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "F"{{.*}}DIFlagTypePassByValue struct F { F() = default; F(int) {} int i; } TestF; // Test for trivial constructor. // CHECK-DAG: ![[G:.*]] ={{.*}}!DICompositeType({{.*}}name: "G"{{.*}}DIFlagTypePassByValue // CHECK-DAG: !DICompositeType({{.*}}scope: ![[G]], {{.*}}DIFlagTypePassByValue struct G { G() : g_(0) {} struct { int g_; }; } TestG; // Test for an aggregate class with an implicit non-trivial default constructor // that is not instantiated. // CHECK-DAG: !DICompositeType({{.*}}name: "H",{{.*}}DIFlagTypePassByValue struct H { B b; }; void f(H h) {} // Test for an aggregate class with an implicit non-trivial default constructor // that is instantiated. // CHECK-DAG: !DICompositeType({{.*}}name: "J",{{.*}}DIFlagTypePassByValue struct J { B b; }; void f(decltype(J()) j) {} // Test for a class with trivial default constructor that is not instantiated. // CHECK-DAG: !DICompositeType({{.*}}name: "K",{{.*}}DIFlagTypePassByValue class K { int i; }; void f(K k) {} // Test that we don't use constructor homing on lambdas. // CHECK-DAG: ![[L:.*]] ={{.*}}!DISubprogram({{.*}}name: "L" // CHECK-DAG: !DICompositeType({{.*}}scope: ![[L]], {{.*}}DIFlagTypePassByValue void L() { auto func = [&]() {}; } // Check that types are being added to retained types list. // CHECK-DAG: !DICompileUnit{{.*}}retainedTypes: ![[RETAINED:[0-9]+]] // CHECK-DAG: ![[RETAINED]] = {{.*}}![[C]]