summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2012-11-15 23:40:48 +0000
committerEli Friedman <eli.friedman@gmail.com>2012-11-15 23:40:48 +0000
commitab19712823b2c3b92bf7022747570c4675c308a7 (patch)
treeaca68f6551f228a79907d73187832c310ce37696 /clang/lib/CodeGen
parent0608cd8bd48badd5358783f9e0cfb88667c34e9c (diff)
downloadbcm5719-llvm-ab19712823b2c3b92bf7022747570c4675c308a7.tar.gz
bcm5719-llvm-ab19712823b2c3b92bf7022747570c4675c308a7.zip
Make sure CodeGenTypes correctly reconverts function types. Fixes PR14355, a crash in IR generation.
llvm-svn: 168112
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CodeGenTypes.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp b/clang/lib/CodeGen/CodeGenTypes.cpp
index 3c6c5c9a2e2..d7f15a730bf 100644
--- a/clang/lib/CodeGen/CodeGenTypes.cpp
+++ b/clang/lib/CodeGen/CodeGenTypes.cpp
@@ -453,9 +453,19 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
// cannot lower the function type.
if (!isFuncTypeConvertible(FT)) {
// This function's type depends on an incomplete tag type.
+
+ // Force conversion of all the relevant record types, to make sure
+ // we re-convert the FunctionType when appropriate.
+ if (const RecordType *RT = FT->getResultType()->getAs<RecordType>())
+ ConvertRecordDeclType(RT->getDecl());
+ if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT))
+ for (unsigned i = 0, e = FPT->getNumArgs(); i != e; i++)
+ if (const RecordType *RT = FPT->getArgType(i)->getAs<RecordType>())
+ ConvertRecordDeclType(RT->getDecl());
+
// Return a placeholder type.
ResultType = llvm::StructType::get(getLLVMContext());
-
+
SkippedLayout = true;
break;
}
OpenPOWER on IntegriCloud