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:
Eric Christopher 2011-12-16 23:40:14 +00:00
parent f7f36dc694
commit ea225fb412
2 changed files with 38 additions and 12 deletions

View File

@ -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,11 +1176,13 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty) {
else if (CXXDecl->isDynamicClass())
ContainingType = FwdDecl;
RealDecl = DBuilder.createClassType(RDContext, RDName, DefUnit, Line,
Size, Align, 0, 0, llvm::DIType(),
Elements, ContainingType,
TParamsArray);
} else
// 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,
TParamsArray);
} else
RealDecl = DBuilder.createStructType(RDContext, RDName, DefUnit, Line,
Size, Align, 0, Elements);

View File

@ -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 ]