forked from OSchip/llvm-project
[DebugInfo] Look through type sugar on union types when casting
Fixes PR25584. llvm-svn: 253680
This commit is contained in:
parent
4c152690be
commit
43ecd7c71d
|
@ -3329,7 +3329,7 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var,
|
|||
// variable for each member of the anonymous union so that it's possible
|
||||
// to find the name of any field in the union.
|
||||
if (T->isUnionType() && DeclName.empty()) {
|
||||
const RecordDecl *RD = cast<RecordType>(T)->getDecl();
|
||||
const RecordDecl *RD = T->castAs<RecordType>()->getDecl();
|
||||
assert(RD->isAnonymousStructOrUnion() &&
|
||||
"unnamed non-anonymous struct or union?");
|
||||
GV = CollectAnonRecordDecls(RD, Unit, LineNo, LinkageName, Var, DContext);
|
||||
|
|
|
@ -29,11 +29,28 @@ void foo() {
|
|||
i = 8;
|
||||
}
|
||||
|
||||
// A funky reinterpret cast idiom that we used to crash on.
|
||||
template <class T>
|
||||
unsigned char *buildBytes(const T v) {
|
||||
static union {
|
||||
unsigned char result[sizeof(T)];
|
||||
T value;
|
||||
};
|
||||
value = v;
|
||||
return result;
|
||||
}
|
||||
|
||||
void instantiate(int x) {
|
||||
buildBytes(x);
|
||||
}
|
||||
|
||||
// CHECK: [[FILE:.*]] = !DIFile(filename: "{{.*}}debug-info-anon-union-vars.cpp",
|
||||
// CHECK: !DIGlobalVariable(name: "c",{{.*}} file: [[FILE]], line: 6,{{.*}} isLocal: true, isDefinition: true
|
||||
// CHECK: !DIGlobalVariable(name: "d",{{.*}} file: [[FILE]], line: 6,{{.*}} isLocal: true, isDefinition: true
|
||||
// CHECK: !DIGlobalVariable(name: "a",{{.*}} file: [[FILE]], line: 6,{{.*}} isLocal: true, isDefinition: true
|
||||
// CHECK: !DIGlobalVariable(name: "b",{{.*}} file: [[FILE]], line: 6,{{.*}} isLocal: true, isDefinition: true
|
||||
// CHECK: !DIGlobalVariable(name: "result", {{.*}} isLocal: false, isDefinition: true
|
||||
// CHECK: !DIGlobalVariable(name: "value", {{.*}} isLocal: false, isDefinition: true
|
||||
// CHECK: !DILocalVariable(name: "i", {{.*}}, flags: DIFlagArtificial
|
||||
// CHECK: !DILocalVariable(name: "c", {{.*}}, flags: DIFlagArtificial
|
||||
// CHECK: !DILocalVariable(
|
||||
|
|
Loading…
Reference in New Issue