forked from OSchip/llvm-project
Fix debug tag type of forward declarations of struct/class in C++.
llvm-svn: 167308
This commit is contained in:
parent
7df3501b49
commit
d37bbc3e00
|
@ -518,21 +518,17 @@ llvm::DIType CGDebugInfo::createRecordFwdDecl(const RecordDecl *RD,
|
|||
llvm::DIDescriptor Ctx) {
|
||||
llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation());
|
||||
unsigned Line = getLineNumber(RD->getLocation());
|
||||
StringRef RDName = RD->getName();
|
||||
StringRef RDName = getClassName(RD);
|
||||
|
||||
// Get the tag.
|
||||
const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD);
|
||||
unsigned Tag = 0;
|
||||
if (CXXDecl) {
|
||||
RDName = getClassName(RD);
|
||||
Tag = llvm::dwarf::DW_TAG_class_type;
|
||||
}
|
||||
else if (RD->isStruct() || RD->isInterface())
|
||||
if (RD->isStruct() || RD->isInterface())
|
||||
Tag = llvm::dwarf::DW_TAG_structure_type;
|
||||
else if (RD->isUnion())
|
||||
Tag = llvm::dwarf::DW_TAG_union_type;
|
||||
else
|
||||
llvm_unreachable("Unknown RecordDecl type!");
|
||||
else {
|
||||
assert(RD->isClass());
|
||||
Tag = llvm::dwarf::DW_TAG_class_type;
|
||||
}
|
||||
|
||||
// Create the type.
|
||||
return DBuilder.createForwardDecl(Tag, RDName, Ctx, DefUnit, Line);
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
// RUN: %clang_cc1 -triple x86_64-unk-unk -o %t -emit-llvm -g %s
|
||||
// RUN: FileCheck --input-file=%t %s
|
||||
// RUN: %clang_cc1 -triple x86_64-unk-unk -o - -emit-llvm -g %s | FileCheck %s
|
||||
|
||||
// PR3023
|
||||
void convert(void) {
|
||||
|
@ -8,7 +7,7 @@ void convert(void) {
|
|||
|
||||
|
||||
// PR2784
|
||||
struct OPAQUE;
|
||||
struct OPAQUE; // CHECK: DW_TAG_structure_type
|
||||
typedef struct OPAQUE *PTR;
|
||||
PTR p;
|
||||
|
||||
|
|
|
@ -1,12 +1,24 @@
|
|||
// RUN: %clang -emit-llvm -g -S %s -o - | grep HdrSize
|
||||
struct A {
|
||||
// RUN: %clang -emit-llvm -g -S %s -o - | FileCheck %s
|
||||
struct foo;
|
||||
void func(foo *f) { // CHECK: DW_TAG_structure_type
|
||||
}
|
||||
class bar;
|
||||
void func(bar *f) { // CHECK: DW_TAG_class_type
|
||||
}
|
||||
union baz;
|
||||
void func(baz *f) { // CHECK: DW_TAG_union_type
|
||||
}
|
||||
struct A { // FIXME: we're still emitting this as DW_TAG_class_type
|
||||
int one;
|
||||
static const int HdrSize = 52;
|
||||
static const int HdrSize = 52; // CHECK: HdrSize
|
||||
int two;
|
||||
A() {
|
||||
int x = 1;
|
||||
}
|
||||
};
|
||||
class B { // CHECK: DW_TAG_class_type
|
||||
};
|
||||
int main() {
|
||||
A a;
|
||||
B b;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue