From: Daniel Dunbar Date: Fri, 29 Aug 2008 17:28:43 +0000 (+0000) Subject: Downgrade a number of FIXME asserts to ErrorUnsupported. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=662174c82ef46b19a2329c7d37208e1d12dfb7b3;p=clang Downgrade a number of FIXME asserts to ErrorUnsupported. - Notably VLAs git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55544 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index c0ad1079be..4d90cbc84a 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -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(D).isBlockVarDecl()) - return EmitBlockVarDecl(cast(D)); - assert(0 && "Should not see file-scope variables inside a function!"); - - case Decl::EnumConstant: - return EmitEnumConstantDecl(cast(D)); + case Decl::Var: { + const VarDecl &VD = cast(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]; diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index 7334dd7e81..229b05f93e 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -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(V->getType()) && - isa(cast(V->getType()) - ->getElementType()) && - "Doesn't support VLAs yet!"); + if (!(isa(V->getType()) && + isa(cast(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 diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 69a0c4b06e..2f0158a9d4 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -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 Params(2); Params[0] = IsSuper ? SuperPtrTy : ObjectPtrTy; diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index 22370acc6d..6d3bd43d5b 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -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); diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 44d4cd251a..d1f3a6a539 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -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); diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 57d5377bc3..27dd600f0a 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -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: {