* Go patch committed: Do not allow slice of array literal
@ 2012-01-24 22:34 Ian Lance Taylor
0 siblings, 0 replies; only message in thread
From: Ian Lance Taylor @ 2012-01-24 22:34 UTC (permalink / raw)
To: gcc-patches, gofrontend-dev
[-- Attachment #1: Type: text/plain, Size: 285 bytes --]
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
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: patch --]
[-- Type: text/x-diff, Size: 2458 bytes --]
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)
- }
-}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2012-01-24 22:34 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-01-24 22:34 Go patch committed: Do not allow slice of array literal Ian Lance Taylor
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).