diff mbox

Go patch committed: Do not allow slice of array literal

Message ID mcrsjj4wx0z.fsf@dhcp-172-18-216-180.mtv.corp.google.com
State New
Headers show

Commit Message

Ian Lance Taylor Jan. 24, 2012, 10:33 p.m. UTC
Go does not permit taking a slice of an array literal.  This patch
implements that in the gccgo frontend, and cleans up a bit of the
surrounding code.  One now-obsolete test case is removed.  Bootstrapped
and ran Go testsuite on x86_64-unknown-linux-gnu.  Committed to
mainline.

Ian
diff mbox

Patch

Index: gcc/go/gofrontend/expressions.cc
===================================================================
--- gcc/go/gofrontend/expressions.cc	(revision 183490)
+++ gcc/go/gofrontend/expressions.cc	(working copy)
@@ -10593,7 +10593,7 @@  Array_index_expression::do_check_types(G
   if (this->end_ != NULL && !array_type->is_slice_type())
     {
       if (!this->array_->is_addressable())
-	this->report_error(_("array is not addressable"));
+	this->report_error(_("slice of unaddressable value"));
       else
 	this->array_->address_taken(true);
     }
@@ -10834,13 +10834,6 @@  Expression*
 Expression::make_array_index(Expression* array, Expression* start,
 			     Expression* end, Location location)
 {
-  // Taking a slice of a composite literal requires moving the literal
-  // onto the heap.
-  if (end != NULL && array->is_composite_literal())
-    {
-      array = Expression::make_heap_composite(array, location);
-      array = Expression::make_unary(OPERATOR_MULT, array, location);
-    }
   return new Array_index_expression(array, start, end, location);
 }
 
@@ -11954,10 +11947,6 @@  class Struct_construction_expression : p
 					      this->location());
   }
 
-  bool
-  do_is_addressable() const
-  { return true; }
-
   tree
   do_get_tree(Translate_context*);
 
@@ -12239,10 +12228,6 @@  protected:
   void
   do_check_types(Gogo*);
 
-  bool
-  do_is_addressable() const
-  { return true; }
-
   void
   do_export(Export*) const;
 
Index: gcc/testsuite/go.test/test/fixedbugs/bug268.go
===================================================================
--- gcc/testsuite/go.test/test/fixedbugs/bug268.go	(revision 183280)
+++ gcc/testsuite/go.test/test/fixedbugs/bug268.go	(working copy)
@@ -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)
-	}
-}