]> Cypherpunks.ru repositories - gostls13.git/commitdiff
gc: do not allow slice of array literal
authorRuss Cox <rsc@golang.org>
Fri, 2 Dec 2011 17:30:56 +0000 (12:30 -0500)
committerRuss Cox <rsc@golang.org>
Fri, 2 Dec 2011 17:30:56 +0000 (12:30 -0500)
R=ken2
CC=golang-dev
https://golang.org/cl/5440083

src/cmd/gc/typecheck.c
test/complit1.go [new file with mode: 0644]
test/fixedbugs/bug268.go [deleted file]

index d9501358d919a8514ae866b1ca6378accf8a9a37..25072a7fa2a276d81340a3b1052d8b2cda0af050 100644 (file)
@@ -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)
diff --git a/test/complit1.go b/test/complit1.go
new file mode 100644 (file)
index 0000000..23b3bbd
--- /dev/null
@@ -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()[:]
+)
\ No newline at end of file
diff --git a/test/fixedbugs/bug268.go b/test/fixedbugs/bug268.go
deleted file mode 100644 (file)
index a38d054..0000000
+++ /dev/null
@@ -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)
-       }
-}