forked from OSchip/llvm-project
Start down the path of getting clang to internally agree on structs versus
classes. Part of rdar://10520586 and a couple others. llvm-svn: 146778
This commit is contained in:
parent
f7f36dc694
commit
ea225fb412
|
@ -499,7 +499,12 @@ llvm::DIType CGDebugInfo::CreatePointeeType(QualType PointeeTy,
|
|||
llvm::DIDescriptor FDContext =
|
||||
getContextDescriptor(cast<Decl>(RD->getDeclContext()));
|
||||
|
||||
if (RD->isStruct())
|
||||
CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD);
|
||||
if (CXXDecl)
|
||||
return DBuilder.createClassType(FDContext, RD->getName(), DefUnit,
|
||||
Line, 0, 0, 0, llvm::DIType::FlagFwdDecl,
|
||||
llvm::DIType(), llvm::DIArray());
|
||||
else if (RD->isStruct())
|
||||
return DBuilder.createStructType(FDContext, RD->getName(), DefUnit,
|
||||
Line, 0, 0, llvm::DIType::FlagFwdDecl,
|
||||
llvm::DIArray());
|
||||
|
@ -507,12 +512,8 @@ llvm::DIType CGDebugInfo::CreatePointeeType(QualType PointeeTy,
|
|||
return DBuilder.createUnionType(FDContext, RD->getName(), DefUnit,
|
||||
Line, 0, 0, llvm::DIType::FlagFwdDecl,
|
||||
llvm::DIArray());
|
||||
else {
|
||||
assert(RD->isClass() && "Unknown RecordType!");
|
||||
return DBuilder.createClassType(FDContext, RD->getName(), DefUnit,
|
||||
Line, 0, 0, 0, llvm::DIType::FlagFwdDecl,
|
||||
llvm::DIType(), llvm::DIArray());
|
||||
}
|
||||
else
|
||||
llvm_unreachable("Unknown RecordDecl type!");
|
||||
}
|
||||
return getOrCreateType(PointeeTy, Unit);
|
||||
|
||||
|
@ -1175,6 +1176,8 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty) {
|
|||
else if (CXXDecl->isDynamicClass())
|
||||
ContainingType = FwdDecl;
|
||||
|
||||
// FIXME: This could be a struct type giving a default visibility different
|
||||
// than C++ class type, but needs llvm metadata changes first.
|
||||
RealDecl = DBuilder.createClassType(RDContext, RDName, DefUnit, Line,
|
||||
Size, Align, 0, 0, llvm::DIType(),
|
||||
Elements, ContainingType,
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
// RUN: %clang_cc1 -emit-llvm -g %s -o - | FileCheck %s
|
||||
|
||||
struct baz {
|
||||
int h;
|
||||
baz(int a) : h(a) {}
|
||||
};
|
||||
|
||||
struct bar {
|
||||
baz b;
|
||||
baz& b_ref;
|
||||
bar(int x) : b(x), b_ref(b) {}
|
||||
};
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
bar myBar(1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Make sure we have two DW_TAG_class_types for baz and bar for their forward
|
||||
// references.
|
||||
// FIXME: These should be struct types to match the declaration.
|
||||
// CHECK: !17 = metadata !{i32 720898, null, metadata !"baz", metadata !6, i32 3, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null} ; [ DW_TAG_class_type ]
|
||||
// CHECK: !26 = metadata !{i32 720898, null, metadata !"bar", metadata !6, i32 8, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null} ; [ DW_TAG_class_type ]
|
Loading…
Reference in New Issue