gc: relax assignability of method receivers
The spec was adjusted in commit df410d6a4842 to allow the
implicit assignment of strutures with unexported fields in
method receivers. This change updates the compiler.
Also moved bug322 into fixedbugs and updated golden.out
to reflect the removal of the last known bug.
Fixes #1402.
R=golang-dev, gri, rsc
CC=golang-dev
https://golang.org/cl/4526069
diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c
index 9aaf3e6..0cf1168 100644
--- a/src/cmd/gc/typecheck.c
+++ b/src/cmd/gc/typecheck.c
@@ -822,7 +822,13 @@
case ODOTMETH:
n->op = OCALLMETH;
- typecheckaste(OCALL, n->left, 0, getthisx(t), list1(l->left), "method receiver");
+ // typecheckaste was used here but there wasn't enough
+ // information further down the call chain to know if we
+ // were testing a method receiver for unexported fields.
+ // It isn't necessary, so just do a sanity check.
+ tp = getthisx(t)->type->type;
+ if(l->left == N || !eqtype(l->left->type, tp))
+ fatal("method receiver");
break;
default:
diff --git a/test/fixedbugs/bug226.dir/y.go b/test/fixedbugs/bug226.dir/y.go
index 01e8b7b..c66d592 100644
--- a/test/fixedbugs/bug226.dir/y.go
+++ b/test/fixedbugs/bug226.dir/y.go
@@ -15,7 +15,7 @@
_ = x.T{};
_ = x.T{Y:2};
- ok1.M(); // ERROR "assignment.*T"
+ ok1.M();
bad1 := *ok; // ERROR "assignment.*T"
bad2 := ok1; // ERROR "assignment.*T"
*ok4 = ok1; // ERROR "assignment.*T"
diff --git a/test/bugs/bug322.dir/lib.go b/test/fixedbugs/bug322.dir/lib.go
similarity index 100%
rename from test/bugs/bug322.dir/lib.go
rename to test/fixedbugs/bug322.dir/lib.go
diff --git a/test/bugs/bug322.dir/main.go b/test/fixedbugs/bug322.dir/main.go
similarity index 69%
rename from test/bugs/bug322.dir/main.go
rename to test/fixedbugs/bug322.dir/main.go
index 0ab5b32..f403c7d 100644
--- a/test/bugs/bug322.dir/main.go
+++ b/test/fixedbugs/bug322.dir/main.go
@@ -38,10 +38,3 @@
var pi2 PI = pt
pi2.PM()
}
-
-/*
-These should not be errors anymore:
-
-bug322.dir/main.go:19: implicit assignment of unexported field 'x' of lib.T in method receiver
-bug322.dir/main.go:32: implicit assignment of unexported field 'x' of lib.T in method receiver
-*/
diff --git a/test/bugs/bug322.go b/test/fixedbugs/bug322.go
similarity index 100%
rename from test/bugs/bug322.go
rename to test/fixedbugs/bug322.go
diff --git a/test/golden.out b/test/golden.out
index 725e8de..4400e41 100644
--- a/test/golden.out
+++ b/test/golden.out
@@ -161,8 +161,3 @@
0x0
== bugs/
-
-=========== bugs/bug322.go
-bugs/bug322.dir/main.go:19: implicit assignment of unexported field 'x' of lib.T in method receiver
-bugs/bug322.dir/main.go:32: implicit assignment of unexported field 'x' of lib.T in method receiver
-BUG: fails incorrectly