1
0
mirror of https://github.com/golang/go synced 2024-11-21 14:14:40 -07:00

gc: check for assignment to private fields during initialization

R=ken2
https://golang.org/cl/165055
This commit is contained in:
Russ Cox 2009-12-03 22:09:58 -08:00
parent 62be24d949
commit 9da6666a8a
5 changed files with 61 additions and 2 deletions

View File

@ -1961,8 +1961,12 @@ typecheckas(Node *n)
checkassign(n->left);
typecheck(&n->right, Erv);
if(n->left->type != T && n->right && n->right->type != T)
n->right = typecheckconv(nil, n->right, n->left->type, 0, nil);
if(n->right && n->right->type != T) {
if(n->left->type != T)
n->right = typecheckconv(nil, n->right, n->left->type, 0, "assignment");
else
exportassignok(n->right->type, "assignment");
}
if(n->left->defn == n && n->left->ntype == N) {
defaultlit(&n->right, T);
n->left->type = n->right->type;

View File

@ -42,4 +42,12 @@ func main() {
x := sync.Mutex{key: 0}; // ERROR "(unknown|assignment).*Mutex"
_ = x;
}
{
x := &sync.Mutex{}; // ok
var y sync.Mutex; // ok
y = *x; // ERROR "assignment.*Mutex"
*x = y; // ERROR "assignment.*Mutex"
_ = x;
_ = y;
}
}

View File

@ -0,0 +1,9 @@
// 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 x
type T struct { x, Y int }
func (t T) M()

View File

@ -0,0 +1,31 @@
// 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 y
import "./x"
func f() {
ok := new(x.T);
var ok1 x.T;
ok2 := &ok1;
ok3 := &x.T{};
ok4 := &x.T{Y:2};
_ = x.T{};
_ = x.T{Y:2};
ok1.M(); // ERROR "assignment.*T"
bad1 := *ok; // ERROR "assignment.*T"
bad2 := ok1; // ERROR "assignment.*T"
*ok4 = ok1; // ERROR "assignment.*T"
*ok4 = *ok2; // ERROR "assignment.*T"
ok1 = *ok4; // ERROR "assignment.*T"
_ = bad1;
_ = bad2;
_ = ok4;
_ = ok3;
_ = ok2;
_ = ok1;
_ = ok;
}

7
test/fixedbugs/bug226.go Normal file
View File

@ -0,0 +1,7 @@
// $G $D/$F.dir/x.go && errchk $G $D/$F.dir/y.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.
ignored