void BinaryOperatorExpressionSyntax::resolveTypes(types::NameResolutionContextStack *ctx)
        {
            _left->resolveTypes(ctx);
            _right->resolveTypes(ctx);

            auto bin_op = getBinaryOperator();
            if (bin_op == nullptr) return;
            _overload = bin_op->findOverload(_left->getExpressionType(), _right->getExpressionType());

            if (_overload == nullptr)
            {
                this->reportError("Cannot find binary operator overload for operator %s", getOperatorSymbol());
                return;
            }

            _left->suggestExpressionType(_overload->getParameterInfo(0)->getType());
            _right->suggestExpressionType(_overload->getParameterInfo(1)->getType());
            _left->resolveTypes(ctx);
            _right->resolveTypes(ctx);

            if (!_left->getExpressionType()->isSameAs(_overload->getParameterInfo(0)->getType()))
            {
                _castLeft = op::Operator::implicitCast()->findOverload(_left->getExpressionType(), _overload->getParameterInfo(0)->getType());
            }
            if (!_right->getExpressionType()->isSameAs(_overload->getParameterInfo(1)->getType()))
            {
                _castRight = op::Operator::implicitCast()->findOverload(_right->getExpressionType(), _overload->getParameterInfo(1)->getType());
            }
        }
Example #2
0
	ArithmeticAssignmentNode* ArithmeticAssignmentNode::fromArithmeticAssignmentToken(const SourcePos& sourcePos, Compiler::Token::Type token, Node *left, Node *right)
	{
		return new ArithmeticAssignmentNode(sourcePos, getBinaryOperator(token), left, right);
	}