case TARRAY:
goto bad
- case TPTR, TUNSAFEPTR:
- n.SetVal(Val{new(Mpint)})
-
- case TCHAN, TFUNC, TINTER, TMAP, TSLICE:
+ case TCHAN, TFUNC, TINTER, TMAP, TPTR, TSLICE, TUNSAFEPTR:
break
}
case OEQ, ONE, OLT, OLE, OGT, OGE:
if nl.Op == OLITERAL && nr.Op == OLITERAL {
- if nl.Type.IsInterface() != nr.Type.IsInterface() {
- // Mixed interface/non-interface
- // constant comparison means comparing
- // nil interface with some typed
- // constant, which is always unequal.
- // E.g., interface{}(nil) == (*int)(nil).
- setboolconst(n, op == ONE)
- } else {
- setboolconst(n, compareOp(nl.Val(), op, nr.Val()))
- }
+ setboolconst(n, compareOp(nl.Val(), op, nr.Val()))
}
case OLSH, ORSH:
x, y = match(x, y)
switch x.Ctype() {
- case CTNIL:
- _, _ = x.U.(*NilVal), y.U.(*NilVal) // assert dynamic types match
- switch op {
- case OEQ:
- return true
- case ONE:
- return false
- }
-
case CTBOOL:
x, y := x.U.(bool), y.U.(bool)
switch op {
}
switch typ.Etype {
- case TCHAN, TFUNC, TMAP, TNIL, TINTER, TSLICE:
+ case TCHAN, TFUNC, TMAP, TNIL, TINTER, TPTR, TSLICE, TUNSAFEPTR:
return CTNIL
case TBOOL:
return CTBOOL
case TSTRING:
return CTSTR
case TINT, TINT8, TINT16, TINT32, TINT64,
- TUINT, TUINT8, TUINT16, TUINT32, TUINT64, TUINTPTR,
- TPTR, TUNSAFEPTR:
+ TUINT, TUINT8, TUINT16, TUINT32, TUINT64, TUINTPTR:
return CTINT
case TFLOAT32, TFLOAT64:
return CTFLT
if v.Op == OpAddr && v.Args[0].Op == OpSB {
return true // address of a global
}
- if v.Op == OpConst64 || v.Op == OpConst32 {
- return true // nil, the only possible pointer constant
+ if v.Op == OpConstNil {
+ return true
}
return false
}
if !IsGlobalAddr(v) {
return false
}
- if v.Op == OpConst64 || v.Op == OpConst32 {
+ if v.Op == OpConstNil {
// Nil pointers are read only. See issue 33438.
return true
}