return;
if(eqtype(t, n->type))
return;
+ if(!explicit && n->type->etype != TIDEAL && n->type != idealstring && n->type->etype != TNIL)
+ return;
//dump("convlit1", n);
if(n->op == OLITERAL) {
OCMPIFACE, OCMPSTR,
OCOMPLIT, OMAPLIT, OSTRUCTLIT, OARRAYLIT,
OCOMPSLICE, OCOMPMAP,
- OCONV, OCONVNOP, OCONVA2S, OCONVIFACE, OCONVSLICE,
+ OCONV, OCONVNOP, OCONVIFACE, OCONVSLICE,
ODCL, ODCLFUNC, ODCLFIELD, ODCLCONST, ODCLTYPE,
ODOT, ODOTPTR, ODOTMETH, ODOTINTER, OXDOT,
ODOTTYPE,
break;
case OCONV:
+ case OCONVNOP:
+ case OCONVSLICE:
+ case OCONVIFACE:
fmtprint(f, "%T(", n->type);
exprfmt(f, n->left, 0);
fmtprint(f, ")");
ok |= Erv;
if(n->iota && !(top & Eiota))
yyerror("use of iota not in constant initializer");
+ if(n->val.ctype == CTSTR)
+ n->type = idealstring;
goto ret;
case ONONAME:
if(n->type == T)
return n;
- if(cvttype(t, n->type) && n->op == OLITERAL) {
+ if(n->op == OLITERAL)
+ if(explicit || n->type->etype == TIDEAL || n->type == idealstring || n->type->etype == TNIL)
+ if(cvttype(t, n->type)) {
// can convert literal in place
// TODO(rsc) is this needed?
n1 = nod(OXXX, N, N);
return n;
case 0:
+ if(nconv) {
+ nconv->op = OCONVNOP;
+ return nconv;
+ }
return n;
}
--- /dev/null
+// errchk $G $D/$F.go
+
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+type T int
+type U int
+
+var x int
+
+var t T = int(0) // ERROR "cannot use"
+var t1 T = int(x) // ERROR "cannot use"
+var u U = int(0) // ERROR "cannot use"
+var u1 U = int(x) // ERROR "cannot use"
+
+type S string
+var s S
+
+var s1 = s + "hello"
+var s2 = "hello" + s
+var s3 = s + string("hello") // ERROR "invalid operation"
+var s4 = string("hello") + s // ERROR "invalid operation"
+
+var r string
+
+var r1 = r + "hello"
+var r2 = "hello" + r
+var r3 = r + string("hello")
+var r4 = string("hello") + r
+