]> granicus.if.org Git - clang/commitdiff
Handle typedefs to VLAs (Emit the size expr when we encounter the typedef
authorAnders Carlsson <andersca@mac.com>
Sat, 20 Dec 2008 21:51:53 +0000 (21:51 +0000)
committerAnders Carlsson <andersca@mac.com>
Sat, 20 Dec 2008 21:51:53 +0000 (21:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61290 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGDecl.cpp
lib/CodeGen/CodeGenFunction.cpp
lib/Sema/SemaDecl.cpp

index e8084dcf179941beea9010afd1ac595a4d160e59..86bc3475761af418b7fad028c764daea0f1e8c02 100644 (file)
@@ -31,7 +31,6 @@ void CodeGenFunction::EmitDecl(const Decl &D) {
   default: assert(0 && "Unknown decl kind!");
   case Decl::ParmVar:
     assert(0 && "Parmdecls should not be in declstmts!");
-  case Decl::Typedef:   // typedef int X;
   case Decl::Function:  // void X();
   case Decl::Record:    // struct/union/class X;
   case Decl::Enum:      // enum X;
@@ -46,6 +45,14 @@ void CodeGenFunction::EmitDecl(const Decl &D) {
            "Should not see file-scope variables inside a function!");
     return EmitBlockVarDecl(VD);
   }
+        
+  case Decl::Typedef: {   // typedef int X;
+    const TypedefDecl &TD = cast<TypedefDecl>(D);
+    QualType Ty = TD.getUnderlyingType();
+    
+    if (Ty->isVariablyModifiedType())
+      EmitVLASize(Ty);
+  }
   }
 }
 
index 73b71b2f6260baaa166d317c745d2921a57c7678..2ef4bcf981019c569367f581455078ed5faf9342 100644 (file)
@@ -428,25 +428,25 @@ llvm::Value *CodeGenFunction::EmitVLASize(QualType Ty)
   if (const VariableArrayType *VAT = getContext().getAsVariableArrayType(Ty)) {
     llvm::Value *&SizeEntry = VLASizeMap[VAT];
     
-    assert(!SizeEntry && "Must not emit the same VLA size more than once!");
+    if (!SizeEntry) {
+      // Get the element size;
+      llvm::Value *ElemSize;
     
-    // Get the element size;
-    llvm::Value *ElemSize;
+      QualType ElemTy = VAT->getElementType();
     
-    QualType ElemTy = VAT->getElementType();
-    
-    if (ElemTy->isVariableArrayType())
-      ElemSize = EmitVLASize(ElemTy);
-    else {
-      // FIXME: We use Int32Ty here because the alloca instruction takes a
-      // 32-bit integer. What should we do about overflow?
-      ElemSize = llvm::ConstantInt::get(llvm::Type::Int32Ty, 
-                                        getContext().getTypeSize(ElemTy) / 8);
-    }
+      if (ElemTy->isVariableArrayType())
+        ElemSize = EmitVLASize(ElemTy);
+      else {
+        // FIXME: We use Int32Ty here because the alloca instruction takes a
+        // 32-bit integer. What should we do about overflow?
+        ElemSize = llvm::ConstantInt::get(llvm::Type::Int32Ty, 
+                                          getContext().getTypeSize(ElemTy) / 8);
+      }
     
-    llvm::Value *NumElements = EmitScalarExpr(VAT->getSizeExpr());
+      llvm::Value *NumElements = EmitScalarExpr(VAT->getSizeExpr());
     
-    SizeEntry = Builder.CreateMul(ElemSize, NumElements);
+      SizeEntry = Builder.CreateMul(ElemSize, NumElements);
+    }
     
     return SizeEntry;
   } else if (const PointerType *PT = Ty->getAsPointerType())
index 86af21024b636cfd0cde473181cfe8849cb53021..024ca8138a6a9c9b7e0fadffb1fddfee8e266c63 100644 (file)
@@ -2184,8 +2184,7 @@ Sema::DeclTy *Sema::FinalizeDeclaratorGroup(Scope *S, DeclTy *group) {
     QualType T = IDecl->getType();
     
     if (T->isVariableArrayType()) {
-      const VariableArrayType *VAT = 
-        cast<VariableArrayType>(T.getUnqualifiedType());
+      const VariableArrayType *VAT = Context.getAsVariableArrayType(T);
       
       // FIXME: This won't give the correct result for 
       // int a[10][n];