compiler: Do not allow slice of array literal.

From-SVN: r183499
This commit is contained in:
Ian Lance Taylor 2012-01-24 22:33:43 +00:00
parent 42cf06094d
commit 5fca1e3f90
2 changed files with 1 additions and 69 deletions

View File

@ -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;

View File

@ -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)
}
}