diff --git a/src/core/errors_test.go b/src/core/errors_test.go index df8b6ae..f3963fe 100644 --- a/src/core/errors_test.go +++ b/src/core/errors_test.go @@ -86,6 +86,7 @@ var errs = []struct { {"TypeMismatch14.q", &core.TypeMismatch{Encountered: "int", Expected: "function"}}, {"TypeMismatch15.q", &core.TypeMismatch{Encountered: "string", Expected: "int"}}, {"TypeMismatch16.q", &core.TypeMismatch{Encountered: "string", Expected: "int"}}, + {"TypeMismatch17.q", &core.TypeMismatch{Encountered: "(int64, int64)", Expected: "int"}}, {"UndefinedStructField.q", &core.UndefinedStructField{Identifier: "p", FieldName: "y"}}, {"UnknownEnumMember.q", &core.UnknownEnumMember{EnumName: "MyEnum", MemberName: "unknown"}}, {"UnknownIdentifier.q", &core.UnknownIdentifier{Name: "x"}}, diff --git a/src/core/evaluateBinary.go b/src/core/evaluateBinary.go index c2d47f6..75006c4 100644 --- a/src/core/evaluateBinary.go +++ b/src/core/evaluateBinary.go @@ -37,8 +37,10 @@ func (f *Function) evaluateBinary(expr *expression.Expression) (ssa.Value, error return nil, err } - leftStructType, leftIsStruct := types.Unwrap(leftValue.Type()).(*types.Struct) - rightStructType, rightIsStruct := types.Unwrap(rightValue.Type()).(*types.Struct) + leftType := leftValue.Type() + rightType := rightValue.Type() + leftStructType, leftIsStruct := types.Unwrap(leftType).(*types.Struct) + rightStructType, rightIsStruct := types.Unwrap(rightType).(*types.Struct) if leftIsStruct && rightIsStruct && leftStructType == types.String && rightStructType == types.String { switch expr.Token.Kind { @@ -67,6 +69,10 @@ func (f *Function) evaluateBinary(expr *expression.Expression) (ssa.Value, error return nil, errors.New(InvalidStructOperation, f.File, expr.Token) } + if !types.IsCastable(leftType, rightType) && !types.IsCastable(rightType, leftType) { + return nil, errors.New(&TypeMismatch{Encountered: leftType.Name(), Expected: rightType.Name()}, f.File, left.Source()) + } + v := &ssa.BinaryOp{ Left: leftValue, Right: rightValue, diff --git a/src/core/testdata/TypeMismatch17.q b/src/core/testdata/TypeMismatch17.q new file mode 100644 index 0000000..32e126f --- /dev/null +++ b/src/core/testdata/TypeMismatch17.q @@ -0,0 +1,7 @@ +main() { + assert f() == 1 +} + +f() -> (int, int) { + return 1, 2 +} \ No newline at end of file diff --git a/src/types/IsCastable.go b/src/types/IsCastable.go index 100006b..da4890a 100644 --- a/src/types/IsCastable.go +++ b/src/types/IsCastable.go @@ -2,7 +2,7 @@ package types // IsCastable returns true if the `a` type can be casted to the `b` type using an explicit cast. func IsCastable(a Type, b Type) bool { - if a == Any { + if a == b || a == Any { return true }