[cfe-commits] r69567 - in /cfe/trunk: lib/CodeGen/CGDecl.cpp lib/CodeGen/CGExprScalar.cpp test/CodeGen/variable-array.c

Eli Friedman eli.friedman at gmail.com
Sun Apr 19 20:54:16 PDT 2009


Author: efriedma
Date: Sun Apr 19 22:54:15 2009
New Revision: 69567

URL: http://llvm.org/viewvc/llvm-project?rev=69567&view=rev
Log:
PR3247: Handle a couple of cases where we weren't emitting VLA sizes (and 
subsequently crashed).


Modified:
    cfe/trunk/lib/CodeGen/CGDecl.cpp
    cfe/trunk/lib/CodeGen/CGExprScalar.cpp
    cfe/trunk/test/CodeGen/variable-array.c

Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDecl.cpp?rev=69567&r1=69566&r2=69567&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGDecl.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGDecl.cpp Sun Apr 19 22:54:15 2009
@@ -122,6 +122,10 @@
   // circular references.
   DMEntry = GV;
 
+  // Make sure to evaluate VLA bounds now so that we have them for later.
+  if (D.getType()->isVariablyModifiedType())
+    EmitVLASize(D.getType());
+
   if (D.getInit()) {
     llvm::Constant *Init = CGM.EmitConstantExpr(D.getInit(), D.getType(), this);
 

Modified: cfe/trunk/lib/CodeGen/CGExprScalar.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprScalar.cpp?rev=69567&r1=69566&r2=69567&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprScalar.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprScalar.cpp Sun Apr 19 22:54:15 2009
@@ -213,7 +213,11 @@
     return llvm::Constant::getNullValue(ConvertType(E->getType()));
   }
   Value *VisitImplicitCastExpr(const ImplicitCastExpr *E);
-  Value *VisitCastExpr(const CastExpr *E) { 
+  Value *VisitCastExpr(const CastExpr *E) {
+    // Make sure to evaluate VLA bounds now so that we have them for later.
+    if (E->getType()->isVariablyModifiedType())
+      CGF.EmitVLASize(E->getType());
+
     return EmitCastExpr(E->getSubExpr(), E->getType());
   }
   Value *EmitCastExpr(const Expr *E, QualType T);

Modified: cfe/trunk/test/CodeGen/variable-array.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/variable-array.c?rev=69567&r1=69566&r2=69567&view=diff

==============================================================================
--- cfe/trunk/test/CodeGen/variable-array.c (original)
+++ cfe/trunk/test/CodeGen/variable-array.c Sun Apr 19 22:54:15 2009
@@ -1,7 +1,19 @@
-// RUN: clang-cc -emit-llvm < %s | grep puts
+// RUN: clang-cc -emit-llvm < %s | grep puts | count 4
 
+// PR3248
 int a(int x)
 {
   int (*y)[x];
   return sizeof(*(puts("asdf"),y));
 }
+
+// PR3247
+int b() {
+  return sizeof(*(char(*)[puts("asdf")])0);
+}
+
+// PR3247
+int c() {
+  static int (*y)[puts("asdf")];
+  return sizeof(*y);
+}





More information about the cfe-commits mailing list