llvm-project/clang/test/CodeGenCXX/debug-info-composite-triviality.cpp
Aaron Smith fa7745be7a [DebugInfo] Combine Trivial and NonTrivial flags
Summary:
These flags are used when emitting debug info and needed to initialize subprogram and member function attributes (function options) for Codeview. These function options are used to create an accurate compiler type for UDT symbols (class/struct/union) from PDBs.

The Trivial flag was introduced in https://reviews.llvm.org/D45122

It's been pointed out that Trivial and NonTrivial may imply each other and that seems to be the case in the current tests. This change combines them into a single flag -- NonTrivial -- and updates the corresponding unit tests. There is an additional change to llvm to update the flags.

Reviewers: rnk, zturner, dblaikie, probinson, Hui

Reviewed By: dblaikie

Subscribers: aprantl, jdoerfert, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D59347

llvm-svn: 358219
2019-04-11 20:24:54 +00:00

97 lines
2.9 KiB
C++

// RUN: %clang_cc1 -emit-llvm -debug-info-kind=standalone -triple %itanium_abi_triple %s -o - | FileCheck %s
// Cases to show some non-trivial types with flags combined with DIFlagNonTrivial and DIFlagTypePassByValue.
// CHECK-DAG: !DICompositeType({{.*}}, name: "Explicit",{{.*}}flags: DIFlagTypePassByValue | DIFlagNonTrivial
struct Explicit {
explicit Explicit();
int a;
} Explicit;
// CHECK-DAG: !DICompositeType({{.*}}, name: "Struct",{{.*}}flags: DIFlagTypePassByValue | DIFlagNonTrivial
struct Struct {
Struct() {}
} Struct;
// CHECK-DAG: !DICompositeType({{.*}}, name: "Annotated",{{.*}}flags: DIFlagTypePassByValue | DIFlagNonTrivial
struct __attribute__((trivial_abi)) Annotated {
Annotated() {};
} Annotated;
// Check a non-composite type
// CHECK-DAG: !DIGlobalVariable(name: "GlobalVar", {{.*}}type: {{.*}}, isLocal: false, isDefinition: true)
int GlobalVar = 0;
// Cases to test composite type's triviality
// CHECK-DAG: {{.*}}!DIGlobalVariable(name: "Union",
// CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}}
union Union {
int a;
} Union;
// CHECK-DAG: {{.*}}!DIGlobalVariable(name: "Trivial",
// CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}}
struct Trivial {
int i;
} Trivial;
// CHECK-DAG: {{.*}}!DIGlobalVariable(name: "TrivialA",
// CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}}
struct TrivialA {
TrivialA() = default;
} TrivialA;
// CHECK-DAG: {{.*}}!DIGlobalVariable(name: "TrivialB",
// CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}}
struct TrivialB {
int m;
TrivialB(int x) { m = x; }
TrivialB() = default;
} TrivialB;
// CHECK-DAG: {{.*}}!DIGlobalVariable(name: "TrivialC",
// CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}}
struct TrivialC {
struct Trivial x;
} TrivialC;
// CHECK-DAG: {{.*}}!DIGlobalVariable(name: "TrivialD",
// CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}}
struct NT {
NT() {};
};
struct TrivialD {
static struct NT x; // Member is non-trivial but is static.
} TrivialD;
// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivial",{{.*}}flags: {{.*}}DIFlagNonTrivial
struct NonTrivial {
NonTrivial() {}
} NonTrivial;
// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialA",{{.*}}flags: {{.*}}DIFlagNonTrivial
struct NonTrivialA {
~NonTrivialA();
} NonTrivialA;
// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialB",{{.*}}flags: {{.*}}DIFlagNonTrivial
struct NonTrivialB {
struct NonTrivial x;
} NonTrivialB;
// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialC",{{.*}}flags: {{.*}}DIFlagNonTrivial
struct NonTrivialC {
virtual void f() {}
} NonTrivialC;
// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialD",{{.*}}flags: {{.*}}DIFlagNonTrivial
struct NonTrivialD : NonTrivial {
} NonTrivialD;
// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialE",{{.*}}flags: {{.*}}DIFlagNonTrivial
struct NonTrivialE : Trivial, NonTrivial {
} NonTrivialE;