Hi rsmith, nicholas, bkramer,
Hi All,
A small patch ti fix PR19195. A call to getExpr from CXXDefaultInitExpr can
return null in case we have not yet parsed and attached the in class
initializer like in this test case.
Check if getExpr returns null and handle the same to prevent a crash during
dynamic cast in StmtVisitor.
It would be great if someone could review the same and let me know if this is
good for commit.
Thanks
Karthik Bhat
http://llvm-reviews.chandlerc.com/D3243
Files:
test/CodeGenCXX/pr19195.cpp
lib/CodeGen/CGExprScalar.cpp
lib/CodeGen/CGDecl.cpp
Index: test/CodeGenCXX/pr19195.cpp
===================================================================
--- test/CodeGenCXX/pr19195.cpp
+++ test/CodeGenCXX/pr19195.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -std=c++11 -emit-llvm-only %s -o %t
+/* Testcase for PR19195 - clang hits assert during in class initialization */
+
+class Cls {
+ Cls();
+ template <typename> struct Templ {
+ Templ() {}
+ int initialized_member = 0;
+ };
+ Templ<int> trigger_instantiation;
+};
+Cls::Cls() {}
Index: lib/CodeGen/CGExprScalar.cpp
===================================================================
--- lib/CodeGen/CGExprScalar.cpp
+++ lib/CodeGen/CGExprScalar.cpp
@@ -349,6 +349,8 @@
}
Value *VisitCXXDefaultInitExpr(CXXDefaultInitExpr *DIE) {
CodeGenFunction::CXXDefaultInitExprScope Scope(CGF);
+ if(!DIE->getExpr())
+ return 0;
return Visit(DIE->getExpr());
}
Value *VisitCXXThisExpr(CXXThisExpr *TE) {
Index: lib/CodeGen/CGDecl.cpp
===================================================================
--- lib/CodeGen/CGDecl.cpp
+++ lib/CodeGen/CGDecl.cpp
@@ -571,6 +571,8 @@
Qualifiers::ObjCLifetime lifetime = lvalue.getObjCLifetime();
if (!lifetime) {
llvm::Value *value = EmitScalarExpr(init);
+ if (!value)
+ return;
if (capturedByInit)
drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
EmitStoreThroughLValue(RValue::get(value), lvalue, true);
Index: test/CodeGenCXX/pr19195.cpp
===================================================================
--- test/CodeGenCXX/pr19195.cpp
+++ test/CodeGenCXX/pr19195.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -std=c++11 -emit-llvm-only %s -o %t
+/* Testcase for PR19195 - clang hits assert during in class initialization */
+
+class Cls {
+ Cls();
+ template <typename> struct Templ {
+ Templ() {}
+ int initialized_member = 0;
+ };
+ Templ<int> trigger_instantiation;
+};
+Cls::Cls() {}
Index: lib/CodeGen/CGExprScalar.cpp
===================================================================
--- lib/CodeGen/CGExprScalar.cpp
+++ lib/CodeGen/CGExprScalar.cpp
@@ -349,6 +349,8 @@
}
Value *VisitCXXDefaultInitExpr(CXXDefaultInitExpr *DIE) {
CodeGenFunction::CXXDefaultInitExprScope Scope(CGF);
+ if(!DIE->getExpr())
+ return 0;
return Visit(DIE->getExpr());
}
Value *VisitCXXThisExpr(CXXThisExpr *TE) {
Index: lib/CodeGen/CGDecl.cpp
===================================================================
--- lib/CodeGen/CGDecl.cpp
+++ lib/CodeGen/CGDecl.cpp
@@ -571,6 +571,8 @@
Qualifiers::ObjCLifetime lifetime = lvalue.getObjCLifetime();
if (!lifetime) {
llvm::Value *value = EmitScalarExpr(init);
+ if (!value)
+ return;
if (capturedByInit)
drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
EmitStoreThroughLValue(RValue::get(value), lvalue, true);
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits