From 8162d4ad319d309be3ede9cefc0bd9870396b87f Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Mon, 20 Sep 2010 23:50:22 +0000 Subject: Implements in IRgen gnu extensions missing LHS for complex conditionals. Radar 8453812. llvm-svn: 114376 --- clang/lib/CodeGen/CGExprComplex.cpp | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) (limited to 'clang/lib/CodeGen/CGExprComplex.cpp') diff --git a/clang/lib/CodeGen/CGExprComplex.cpp b/clang/lib/CodeGen/CGExprComplex.cpp index 79e9dd4..517a8da 100644 --- a/clang/lib/CodeGen/CGExprComplex.cpp +++ b/clang/lib/CodeGen/CGExprComplex.cpp @@ -102,6 +102,15 @@ public: // Visitor Methods //===--------------------------------------------------------------------===// + ComplexPairTy Visit(Expr *E) { + llvm::DenseMap::iterator I = + CGF.ConditionalSaveComplexExprs.find(E); + if (I != CGF.ConditionalSaveComplexExprs.end()) + return I->second; + + return StmtVisitor::Visit(E); + } + ComplexPairTy VisitStmt(Stmt *S) { S->dump(CGF.getContext().getSourceManager()); assert(0 && "Stmt can't have complex result type!"); @@ -622,13 +631,6 @@ ComplexPairTy ComplexExprEmitter::VisitBinComma(const BinaryOperator *E) { ComplexPairTy ComplexExprEmitter:: VisitConditionalOperator(const ConditionalOperator *E) { - if (!E->getLHS()) { - CGF.ErrorUnsupported(E, "conditional operator with missing LHS"); - const llvm::Type *EltTy = - CGF.ConvertType(E->getType()->getAs()->getElementType()); - llvm::Value *U = llvm::UndefValue::get(EltTy); - return ComplexPairTy(U, U); - } TestAndClearIgnoreReal(); TestAndClearIgnoreImag(); @@ -638,14 +640,19 @@ VisitConditionalOperator(const ConditionalOperator *E) { llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("cond.false"); llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.end"); - CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock); + if (E->getLHS()) + CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock); + else { + Expr *save = E->getSAVE(); + assert(save && "VisitConditionalOperator - save is null"); + // Intentianlly not doing direct assignment to ConditionalSaveExprs[save] !! + ComplexPairTy SaveVal = Visit(save); + CGF.ConditionalSaveComplexExprs[save] = SaveVal; + CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock); + } CGF.EmitBlock(LHSBlock); - - // Handle the GNU extension for missing LHS. - assert(E->getLHS() && "Must have LHS for complex value"); - - ComplexPairTy LHS = Visit(E->getLHS()); + ComplexPairTy LHS = Visit(E->getTrueExpr()); LHSBlock = Builder.GetInsertBlock(); CGF.EmitBranch(ContBlock); -- cgit v1.1