diff options
Diffstat (limited to 'lib/CodeGen/CGExprScalar.cpp')
-rw-r--r-- | lib/CodeGen/CGExprScalar.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index 73e94d1ece..055e3f7e67 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -209,8 +209,17 @@ public: } Value *VisitCastExpr(CastExpr *E) { // Make sure to evaluate VLA bounds now so that we have them for later. - if (E->getType()->isVariablyModifiedType()) - CGF.EmitVLASize(E->getType()); + if (E->getType()->isVariablyModifiedType()) { + // Implicit cast of a null pointer to a vla type need not result in vla + // size computation which is not always possible in any case (see pr7827). + bool NeedSize = true; + if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) + NeedSize = + !ICE->getSubExpr()->isNullPointerConstant(CGF.getContext(), + Expr::NPC_ValueDependentIsNull); + if (NeedSize) + CGF.EmitVLASize(E->getType()); + } return EmitCastExpr(E); } |