summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/qml/v4/qdeclarativev4irbuilder.cpp')
-rw-r--r--src/declarative/qml/v4/qdeclarativev4irbuilder.cpp15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp b/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp
index a2b65e4da6..103d5ba0df 100644
--- a/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp
+++ b/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp
@@ -891,18 +891,25 @@ bool QDeclarativeV4IRBuilder::visit(AST::BinaryExpression *ast)
IR::BasicBlock *iftrue = _function->newBasicBlock();
IR::BasicBlock *endif = _function->newBasicBlock();
- IR::Temp *r = _block->TEMP(IR::BoolType);
-
ExprResult left = expression(ast->left);
+ IR::Temp *r = _block->TEMP(left.type());
_block->MOVE(r, left);
- _block->CJUMP(_block->UNOP(IR::OpNot, r), iftrue, endif);
+ IR::Expr *cond = r;
+ if (r->type != IR::BoolType) {
+ cond = _block->TEMP(IR::BoolType);
+ _block->MOVE(cond, r);
+ }
+
+ _block->CJUMP(_block->UNOP(IR::OpNot, cond), iftrue, endif);
_block = iftrue;
ExprResult right = expression(ast->right);
_block->MOVE(r, right);
- r->type = maxType(left.type(), right.type()); // ### not exactly.
+ if (left.type() != right.type())
+ discard();
+
_expr.code = r;
_block = endif;