mirror of
https://github.com/golang/go
synced 2024-11-11 20:50:23 -07:00
gc: do not allow slice of array literal
R=ken2 CC=golang-dev https://golang.org/cl/5440083
This commit is contained in:
parent
da5a251dde
commit
7d15eda95d
@ -541,7 +541,8 @@ reswitch:
|
||||
case OMAPLIT:
|
||||
case OSTRUCTLIT:
|
||||
case OARRAYLIT:
|
||||
break;
|
||||
if(!n->implicit)
|
||||
break;
|
||||
default:
|
||||
checklvalue(n->left, "take the address of");
|
||||
}
|
||||
@ -757,9 +758,13 @@ reswitch:
|
||||
defaultlit(&n->right->left, T);
|
||||
defaultlit(&n->right->right, T);
|
||||
if(isfixedarray(n->left->type)) {
|
||||
if(!islvalue(n->left)) {
|
||||
yyerror("invalid operation %N (slice of unaddressable value)", n);
|
||||
goto error;
|
||||
}
|
||||
n->left = nod(OADDR, n->left, N);
|
||||
n->left->implicit = 1;
|
||||
typecheck(&n->left, top);
|
||||
typecheck(&n->left, Erv);
|
||||
}
|
||||
if(n->right->left != N) {
|
||||
if((t = n->right->left->type) == T)
|
||||
|
24
test/complit1.go
Normal file
24
test/complit1.go
Normal file
@ -0,0 +1,24 @@
|
||||
// errchk $G -e $D/$F.go
|
||||
|
||||
// Copyright 2011 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
|
||||
|
||||
var m map[int][3]int
|
||||
func f() [3]int
|
||||
|
||||
func fp() *[3]int
|
||||
var mp map[int]*[3]int
|
||||
|
||||
var (
|
||||
_ = [3]int{1,2,3}[:] // ERROR "slice of unaddressable value"
|
||||
_ = m[0][:] // ERROR "slice of unaddressable value"
|
||||
_ = f()[:] // ERROR "slice of unaddressable value"
|
||||
|
||||
// these are okay because they are slicing a pointer to an array
|
||||
_ = (&[3]int{1,2,3})[:]
|
||||
_ = mp[0][:]
|
||||
_ = fp()[:]
|
||||
)
|
@ -1,53 +0,0 @@
|
||||
// $G $D/$F.go && $L $F.$A && ./$A.out
|
||||
|
||||
// Copyright 2010 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.
|
||||
|
||||
// http://code.google.com/p/go/issues/detail?id=745
|
||||
|
||||
package main
|
||||
|
||||
type T1 struct {
|
||||
T2 *T2
|
||||
}
|
||||
|
||||
type T2 struct {
|
||||
T3 *T3
|
||||
}
|
||||
|
||||
type T3 struct {
|
||||
T4 []*T4
|
||||
}
|
||||
|
||||
type T4 struct {
|
||||
X int
|
||||
}
|
||||
|
||||
func f() *T1 {
|
||||
x := &T1{
|
||||
&T2{
|
||||
&T3{
|
||||
[1]*T4{
|
||||
&T4{5},
|
||||
}[0:],
|
||||
},
|
||||
},
|
||||
}
|
||||
return x
|
||||
}
|
||||
|
||||
func g(x int) {
|
||||
if x == 0 {
|
||||
return
|
||||
}
|
||||
g(x-1)
|
||||
}
|
||||
|
||||
func main() {
|
||||
x := f()
|
||||
g(100) // smash temporaries left over on stack
|
||||
if x.T2.T3.T4[0].X != 5 {
|
||||
println("BUG", x.T2.T3.T4[0].X)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user