Commit 7d15eda9 authored by Russ Cox's avatar Russ Cox

gc: do not allow slice of array literal

R=ken2
CC=golang-dev
https://golang.org/cl/5440083
parent da5a251d
...@@ -541,6 +541,7 @@ reswitch: ...@@ -541,6 +541,7 @@ reswitch:
case OMAPLIT: case OMAPLIT:
case OSTRUCTLIT: case OSTRUCTLIT:
case OARRAYLIT: case OARRAYLIT:
if(!n->implicit)
break; break;
default: default:
checklvalue(n->left, "take the address of"); checklvalue(n->left, "take the address of");
...@@ -757,9 +758,13 @@ reswitch: ...@@ -757,9 +758,13 @@ reswitch:
defaultlit(&n->right->left, T); defaultlit(&n->right->left, T);
defaultlit(&n->right->right, T); defaultlit(&n->right->right, T);
if(isfixedarray(n->left->type)) { 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 = nod(OADDR, n->left, N);
n->left->implicit = 1; n->left->implicit = 1;
typecheck(&n->left, top); typecheck(&n->left, Erv);
} }
if(n->right->left != N) { if(n->right->left != N) {
if((t = n->right->left->type) == T) if((t = n->right->left->type) == T)
......
// 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()[:]
)
\ No newline at end of file
// $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)
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment