1 // RUN: %clang_cc1 -emit-llvm -debug-info-kind=standalone -triple %itanium_abi_triple %s -o - | FileCheck %s 2 3 // Cases to show some non-trivial types with flags combined with DIFlagNonTrivial and DIFlagTypePassByValue. 4 5 // CHECK-DAG: !DICompositeType({{.*}}, name: "Explicit",{{.*}}flags: DIFlagTypePassByValue | DIFlagNonTrivial 6 struct Explicit { 7 explicit Explicit(); 8 int a; 9 } Explicit; 10 11 // CHECK-DAG: !DICompositeType({{.*}}, name: "Struct",{{.*}}flags: DIFlagTypePassByValue | DIFlagNonTrivial 12 struct Struct { StructStruct13 Struct() {} 14 } Struct; 15 16 // CHECK-DAG: !DICompositeType({{.*}}, name: "Annotated",{{.*}}flags: DIFlagTypePassByValue | DIFlagNonTrivial 17 struct __attribute__((trivial_abi)) Annotated { AnnotatedAnnotated18 Annotated() {}; 19 } Annotated; 20 21 22 // Check a non-composite type 23 // CHECK-DAG: !DIGlobalVariable(name: "GlobalVar", {{.*}}type: {{.*}}, isLocal: false, isDefinition: true) 24 int GlobalVar = 0; 25 26 // Cases to test composite type's triviality 27 28 // CHECK-DAG: {{.*}}!DIGlobalVariable(name: "Union", 29 // CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}} 30 union Union { 31 int a; 32 } Union; 33 34 // CHECK-DAG: {{.*}}!DIGlobalVariable(name: "Trivial", 35 // CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}} 36 struct Trivial { 37 int i; 38 } Trivial; 39 40 // CHECK-DAG: {{.*}}!DIGlobalVariable(name: "TrivialA", 41 // CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}} 42 struct TrivialA { 43 TrivialA() = default; 44 } TrivialA; 45 46 // CHECK-DAG: {{.*}}!DIGlobalVariable(name: "TrivialB", 47 // CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}} 48 struct TrivialB { 49 int m; TrivialBTrivialB50 TrivialB(int x) { m = x; } 51 TrivialB() = default; 52 } TrivialB; 53 54 // CHECK-DAG: {{.*}}!DIGlobalVariable(name: "TrivialC", 55 // CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}} 56 struct TrivialC { 57 struct Trivial x; 58 } TrivialC; 59 60 // CHECK-DAG: {{.*}}!DIGlobalVariable(name: "TrivialD", 61 // CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}} 62 struct NT { NTNT63 NT() {}; 64 }; 65 struct TrivialD { 66 static struct NT x; // Member is non-trivial but is static. 67 } TrivialD; 68 69 70 // CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivial",{{.*}}flags: {{.*}}DIFlagNonTrivial 71 struct NonTrivial { NonTrivialNonTrivial72 NonTrivial() {} 73 } NonTrivial; 74 75 // CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialA",{{.*}}flags: {{.*}}DIFlagNonTrivial 76 struct NonTrivialA { 77 ~NonTrivialA(); 78 } NonTrivialA; 79 80 // CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialB",{{.*}}flags: {{.*}}DIFlagNonTrivial 81 struct NonTrivialB { 82 struct NonTrivial x; 83 } NonTrivialB; 84 85 // CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialC",{{.*}}flags: {{.*}}DIFlagNonTrivial 86 struct NonTrivialC { fNonTrivialC87 virtual void f() {} 88 } NonTrivialC; 89 90 // CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialD",{{.*}}flags: {{.*}}DIFlagNonTrivial 91 struct NonTrivialD : NonTrivial { 92 } NonTrivialD; 93 94 // CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialE",{{.*}}flags: {{.*}}DIFlagNonTrivial 95 struct NonTrivialE : Trivial, NonTrivial { 96 } NonTrivialE; 97