Something went wrong. Try again.
🌱 A minimal programming language and compiler. git.urbach.dev/cli/q
high-performance programming-language compiler
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445package core
import ( "git.urbach.dev/cli/q/src/errors" "git.urbach.dev/cli/q/src/expression" "git.urbach.dev/cli/q/src/ssa" "git.urbach.dev/cli/q/src/types")
// evaluateCast converts a type cast to an SSA value.func (f *Function) evaluateCast(expr *expression.Expression) (ssa.Value, error) { left := expr.Children[0] leftValue, err := f.evaluateRight(left)
if err != nil { return nil, err }
right := expr.Children[1] typ, err := f.Env.TypeFromToken(right.Token, f.File)
if err != nil { return nil, err }
if leftValue.Type() == typ { return nil, errors.New(UnnecessaryCast, f.File, expr.Token) }
fromType := types.Unwrap(leftValue.Type()) toType := types.Unwrap(typ)
if !types.IsCastable(fromType, toType) { return nil, errors.New(&TypeCastNotAllowed{From: fromType.Name(), To: toType.Name()}, f.File, right.Source()) }
v := f.Append(&ssa.Copy{ Value: leftValue, Typ: typ, Source: left.Source(), Read: true, })
return v, nil}