mirror of
https://github.com/golang/go
synced 2024-11-25 06:07:58 -07:00
gc: check for assignment to private fields during initialization
R=ken2 https://golang.org/cl/165055
This commit is contained in:
parent
62be24d949
commit
9da6666a8a
@ -1961,8 +1961,12 @@ typecheckas(Node *n)
|
|||||||
|
|
||||||
checkassign(n->left);
|
checkassign(n->left);
|
||||||
typecheck(&n->right, Erv);
|
typecheck(&n->right, Erv);
|
||||||
if(n->left->type != T && n->right && n->right->type != T)
|
if(n->right && n->right->type != T) {
|
||||||
n->right = typecheckconv(nil, n->right, n->left->type, 0, nil);
|
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) {
|
if(n->left->defn == n && n->left->ntype == N) {
|
||||||
defaultlit(&n->right, T);
|
defaultlit(&n->right, T);
|
||||||
n->left->type = n->right->type;
|
n->left->type = n->right->type;
|
||||||
|
@ -42,4 +42,12 @@ func main() {
|
|||||||
x := sync.Mutex{key: 0}; // ERROR "(unknown|assignment).*Mutex"
|
x := sync.Mutex{key: 0}; // ERROR "(unknown|assignment).*Mutex"
|
||||||
_ = x;
|
_ = x;
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
x := &sync.Mutex{}; // ok
|
||||||
|
var y sync.Mutex; // ok
|
||||||
|
y = *x; // ERROR "assignment.*Mutex"
|
||||||
|
*x = y; // ERROR "assignment.*Mutex"
|
||||||
|
_ = x;
|
||||||
|
_ = y;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
9
test/fixedbugs/bug226.dir/x.go
Normal file
9
test/fixedbugs/bug226.dir/x.go
Normal 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()
|
31
test/fixedbugs/bug226.dir/y.go
Normal file
31
test/fixedbugs/bug226.dir/y.go
Normal 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
7
test/fixedbugs/bug226.go
Normal 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
|
Loading…
Reference in New Issue
Block a user