compiler: Do not allow slice of array literal.
From-SVN: r183499
This commit is contained in:
parent
42cf06094d
commit
5fca1e3f90
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue