]> granicus.if.org Git - clang/commitdiff
Downgrade a number of FIXME asserts to ErrorUnsupported.
authorDaniel Dunbar <daniel@zuster.org>
Fri, 29 Aug 2008 17:28:43 +0000 (17:28 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Fri, 29 Aug 2008 17:28:43 +0000 (17:28 +0000)
 - Notably VLAs

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55544 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGDecl.cpp
lib/CodeGen/CGExprScalar.cpp
lib/CodeGen/CGObjCMac.cpp
lib/CodeGen/CGStmt.cpp
lib/CodeGen/CodeGenFunction.h
lib/CodeGen/CodeGenModule.cpp

index c0ad1079bec7eaf1d415b4425729113e284b4e11..4d90cbc84ae52ac5fb939c2c5d8ead0d909ca19d 100644 (file)
@@ -37,24 +37,20 @@ void CodeGenFunction::EmitDecl(const Decl &D) {
   case Decl::Union:     // union X;
   case Decl::Class:     // class X;
   case Decl::Enum:      // enum X;
+  case Decl::EnumConstant: // enum ? { X = ? } 
   case Decl::CXXStruct: // struct X; [C++]
   case Decl::CXXUnion:  // union X; [C++]
   case Decl::CXXClass:  // class X; [C++]
     // None of these decls require codegen support.
     return;
     
-  case Decl::Var:
-    if (cast<VarDecl>(D).isBlockVarDecl())
-      return EmitBlockVarDecl(cast<VarDecl>(D));
-    assert(0 && "Should not see file-scope variables inside a function!");
-  
-  case Decl::EnumConstant:
-    return EmitEnumConstantDecl(cast<EnumConstantDecl>(D));
+  case Decl::Var: {
+    const VarDecl &VD = cast<VarDecl>(D);
+    assert(VD.isBlockVarDecl() && 
+           "Should not see file-scope variables inside a function!");
+    return EmitBlockVarDecl(VD);
+  }
   }
-}
-
-void CodeGenFunction::EmitEnumConstantDecl(const EnumConstantDecl &D) {
-  assert(0 && "FIXME: Enum constant decls not implemented yet!");  
 }
 
 /// EmitBlockVarDecl - This method handles emission of any variable declaration
@@ -169,8 +165,13 @@ void CodeGenFunction::EmitLocalBlockVarDecl(const VarDecl &D) {
       DeclPtr = GenerateStaticBlockVarDecl(D, true, Class);
     }
   } else {
-    // TODO: Create a dynamic alloca.
-    assert(0 && "FIXME: Local VLAs not implemented yet");
+    CGM.ErrorUnsupported(&D, "variable-length array");
+
+    // FIXME: VLA: Add VLA support. For now just make up enough to let
+    // the compile go through.
+    const llvm::Type *LTy = ConvertType(Ty);
+    llvm::AllocaInst * Alloc = CreateTempAlloca(LTy, D.getName());
+    DeclPtr = Alloc;
   }
   
   llvm::Value *&DMEntry = LocalDeclMap[&D];
index 7334dd7e818065d75d0708c7801c6ebf563e478c..229b05f93e013363554bccc812361748b618ca3e 100644 (file)
@@ -513,10 +513,14 @@ Value *ScalarExprEmitter::VisitImplicitCastExpr(const ImplicitCastExpr *E) {
     // will not true when we add support for VLAs.
     Value *V = EmitLValue(Op).getAddress();  // Bitfields can't be arrays.
     
-    assert(isa<llvm::PointerType>(V->getType()) &&
-           isa<llvm::ArrayType>(cast<llvm::PointerType>(V->getType())
-                                ->getElementType()) &&
-           "Doesn't support VLAs yet!");
+    if (!(isa<llvm::PointerType>(V->getType()) &&
+          isa<llvm::ArrayType>(cast<llvm::PointerType>(V->getType())
+                               ->getElementType()))) {
+      CGF.ErrorUnsupported(E, "variable-length array cast");
+      if (E->getType()->isVoidType())
+        return 0;
+      return llvm::UndefValue::get(CGF.ConvertType(E->getType()));
+    }
     V = Builder.CreateStructGEP(V, 0, "arraydecay");
     
     // The resultant pointer type can be implicitly casted to other pointer
index 69a0c4b06e87e2f4566ecfc42c9815e31a8ee118..2f0158a9d4f193533dbd4c367c43670aa8217fd3 100644 (file)
@@ -1911,7 +1911,7 @@ llvm::Value *ObjCTypesHelper::getMessageSendFn(bool IsSuper,
     Params[1] = IsSuper ? SuperPtrTy : ObjectPtrTy;
     Params[2] = SelectorPtrTy;
     CallFTy = llvm::FunctionType::get(llvm::Type::VoidTy, Params, true);
-  } else { // XXX floating point?
+  } else { // FIXME: floating point?
     F = IsSuper ? MessageSendSuperFn : MessageSendFn;
     std::vector<const llvm::Type*> Params(2);
     Params[0] = IsSuper ? SuperPtrTy : ObjectPtrTy;
index 22370acc6d07cdabc56cfdd4094ffee22ce9263b..6d3bd43d5b5904893e84d0ccd42ae53fb1e49476 100644 (file)
@@ -464,7 +464,7 @@ void CodeGenFunction::EmitContinueStmt() {
 /// add multiple cases to switch instruction, one for each value within
 /// the range. If range is too big then emit "if" condition check.
 void CodeGenFunction::EmitCaseStmtRange(const CaseStmt &S) {
-  // XXX kill me with param - ddunbar
+  // FIXME: kill me with param - ddunbar
   assert(S.getRHS() && "Expected RHS value in CaseStmt");
 
   llvm::APSInt LHS = S.getLHS()->getIntegerConstantExprValue(getContext());
@@ -755,7 +755,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
         if (ConvertType(InputExpr->getType())->isSingleValueType()) {
           Arg = EmitScalarExpr(InputExpr);
         } else {
-          assert(0 && "FIXME: Implement passing multiple-value types as inputs");
+          ErrorUnsupported(&S, "asm statement passing multiple-value types as inputs");
         }
       } else {
         LValue Dest = EmitLValue(InputExpr);
@@ -796,7 +796,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
       if (ConvertType(InputExpr->getType())->isSingleValueType()) {
         Arg = EmitScalarExpr(InputExpr);
       } else {
-        assert(0 && "FIXME: Implement passing multiple-value types as inputs");
+        ErrorUnsupported(&S, "asm statement passing multiple-value types as inputs");
       }
     } else {
       LValue Dest = EmitLValue(InputExpr);
index 44d4cd251a10e05c9f857ee09e558dd0de4f74a2..d1f3a6a539edcd84052e42e820643c35426049ba 100644 (file)
@@ -198,7 +198,6 @@ public:
   //===--------------------------------------------------------------------===//
   
   void EmitDecl(const Decl &D);
-  void EmitEnumConstantDecl(const EnumConstantDecl &D);
   void EmitBlockVarDecl(const VarDecl &D);
   void EmitLocalBlockVarDecl(const VarDecl &D);
   void EmitStaticBlockVarDecl(const VarDecl &D);
index 57d5377bc377f966f301d8841ea155d1d0777410..27dd600f0a2b32b4dd406779fecfa3c629663247 100644 (file)
@@ -764,7 +764,11 @@ GetAddrOfConstantCFString(const std::string &str) {
 /// GetStringForStringLiteral - Return the appropriate bytes for a
 /// string literal, properly padded to match the literal type.
 std::string CodeGenModule::GetStringForStringLiteral(const StringLiteral *E) {
-  assert(!E->isWide() && "FIXME: Wide strings not supported yet!");
+  if (E->isWide()) {
+    ErrorUnsupported(E, "wide string");
+    return "FIXME";
+  }
+
   const char *StrData = E->getStrData();
   unsigned Len = E->getByteLength();
 
@@ -877,7 +881,7 @@ void CodeGenModule::EmitTopLevelDecl(Decl *D) {
     break;
 
   case Decl::Namespace:
-    assert(0 && "FIXME: Namespace unsupported");
+    ErrorUnsupported(D, "namespace");
     break;
 
     // Objective-C Decls
@@ -914,7 +918,7 @@ void CodeGenModule::EmitTopLevelDecl(Decl *D) {
     break;
   }
   case Decl::ObjCCompatibleAlias: 
-    assert(0 && "FIXME: ObjCCompatibleAlias unsupported");
+    ErrorUnsupported(D, "Objective-C compatible alias");
     break;
 
   case Decl::LinkageSpec: {