summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGExprComplex.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2010-09-20 23:50:22 +0000
committerFariborz Jahanian <fjahanian@apple.com>2010-09-20 23:50:22 +0000
commit8162d4ad319d309be3ede9cefc0bd9870396b87f (patch)
tree01fe4ac6fd5e4b223e8c02240f50544a45d03681 /clang/lib/CodeGen/CGExprComplex.cpp
parentf86e4da7ae8084261d95565568354b92e5790373 (diff)
downloadbcm5719-llvm-8162d4ad319d309be3ede9cefc0bd9870396b87f.tar.gz
bcm5719-llvm-8162d4ad319d309be3ede9cefc0bd9870396b87f.zip
Implements in IRgen gnu extensions missing LHS for
complex conditionals. Radar 8453812. llvm-svn: 114376
Diffstat (limited to 'clang/lib/CodeGen/CGExprComplex.cpp')
-rw-r--r--clang/lib/CodeGen/CGExprComplex.cpp33
1 files changed, 20 insertions, 13 deletions
diff --git a/clang/lib/CodeGen/CGExprComplex.cpp b/clang/lib/CodeGen/CGExprComplex.cpp
index 79e9dd42ee2..517a8da34d3 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<const Expr *, ComplexPairTy>::iterator I =
+ CGF.ConditionalSaveComplexExprs.find(E);
+ if (I != CGF.ConditionalSaveComplexExprs.end())
+ return I->second;
+
+ return StmtVisitor<ComplexExprEmitter, ComplexPairTy>::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<ComplexType>()->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);
OpenPOWER on IntegriCloud