return Val{}
}
u.Quo(y)
- case OMOD, OOR, OAND, OANDNOT, OXOR:
- // TODO(mdempsky): Move to typecheck; see #31060.
- yyerror("invalid operation: operator %v not defined on untyped float", op)
- return Val{}
default:
break Outer
}
yyerror("complex division by zero")
return Val{}
}
- case OMOD, OOR, OAND, OANDNOT, OXOR:
- // TODO(mdempsky): Move to typecheck; see #31060.
- yyerror("invalid operation: operator %v not defined on untyped complex", op)
- return Val{}
default:
break Outer
}
}
u.Xor(x)
return Val{U: u}
-
- case CTFLT:
- // TODO(mdempsky): Move to typecheck; see #31060.
- yyerror("invalid operation: operator %v not defined on untyped float", op)
- return Val{}
- case CTCPLX:
- // TODO(mdempsky): Move to typecheck; see #31060.
- yyerror("invalid operation: operator %v not defined on untyped complex", op)
- return Val{}
}
case ONOT:
}
func defaultType(t *types.Type) *types.Type {
- if !t.IsUntyped() {
+ if !t.IsUntyped() || t.Etype == TNIL {
return t
}
}
}
- if !okfor[op][et] {
- yyerror("invalid operation: %v (operator %v not defined on %s)", n, op, typekind(t))
+ if t.Etype == TIDEAL {
+ switch {
+ case l.Type == types.Idealcomplex || r.Type == types.Idealcomplex:
+ t = types.Idealcomplex
+ case l.Type == types.Idealfloat || r.Type == types.Idealfloat:
+ t = types.Idealfloat
+ case l.Type == types.Idealrune || r.Type == types.Idealrune:
+ t = types.Idealrune
+ case l.Type == types.Idealint || r.Type == types.Idealint:
+ t = types.Idealint
+ default:
+ Fatalf("bad untyped type: %v", t)
+ }
+ }
+ if dt := defaultType(t); !okfor[op][dt.Etype] {
+ yyerror("invalid operation: %v (operator %v not defined on %v)", n, op, t)
n.Type = nil
return n
}
}
}
- t = l.Type
if iscmp[n.Op] {
- // TIDEAL includes complex constant, but only OEQ and ONE are defined for complex,
- // so check that the n.op is available for complex here before doing evconst.
- if !okfor[n.Op][TCOMPLEX128] && (Isconst(l, CTCPLX) || Isconst(r, CTCPLX)) {
- yyerror("invalid operation: %v (operator %v not defined on untyped complex)", n, n.Op)
- n.Type = nil
- return n
- }
evconst(n)
t = types.Idealbool
if n.Op != OLITERAL {
}
n.Type = t
- if t.Etype == TIDEAL {
- switch {
- case l.Type == types.Idealcomplex || r.Type == types.Idealcomplex:
- n.Type = types.Idealcomplex
- case l.Type == types.Idealfloat || r.Type == types.Idealfloat:
- n.Type = types.Idealfloat
- case l.Type == types.Idealrune || r.Type == types.Idealrune:
- n.Type = types.Idealrune
- case l.Type == types.Idealint || r.Type == types.Idealint:
- n.Type = types.Idealint
- default:
- Fatalf("bad untyped type: %v", t)
- }
- }
case OBITNOT, ONEG, ONOT, OPLUS:
ok |= ctxExpr
n.Type = nil
return n
}
- if !okfor[n.Op][t.Etype] {
- yyerror("invalid operation: %v %v", n.Op, t)
+ if !okfor[n.Op][defaultType(t).Etype] {
+ yyerror("invalid operation: %v (operator %v not defined on %s)", n, n.Op, typekind(t))
n.Type = nil
return n
}