diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2012-01-24 22:33:43 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2012-01-24 22:33:43 +0000 |
commit | 5fca1e3f90ddcafc38ec98c3bf5cf78ab91ee7ca (patch) | |
tree | 2aea8aa2949cf55833a16d86f7b43d27720e8f7f | |
parent | 42cf06094db7547fa4ec123f144180882b5a9f5b (diff) | |
download | gcc-5fca1e3f90ddcafc38ec98c3bf5cf78ab91ee7ca.zip gcc-5fca1e3f90ddcafc38ec98c3bf5cf78ab91ee7ca.tar.gz gcc-5fca1e3f90ddcafc38ec98c3bf5cf78ab91ee7ca.tar.bz2 |
compiler: Do not allow slice of array literal.
From-SVN: r183499
-rw-r--r-- | gcc/go/gofrontend/expressions.cc | 17 | ||||
-rw-r--r-- | gcc/testsuite/go.test/test/fixedbugs/bug268.go | 53 |
2 files changed, 1 insertions, 69 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 423df9c..5563dde 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -10593,7 +10593,7 @@ Array_index_expression::do_check_types(Gogo*) 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 : public Expression 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; diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug268.go b/gcc/testsuite/go.test/test/fixedbugs/bug268.go deleted file mode 100644 index a38d054..0000000 --- a/gcc/testsuite/go.test/test/fixedbugs/bug268.go +++ /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) - } -} |