aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2017-12-22 16:43:28 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2017-12-22 16:43:28 +0000
commitd7b24d5556b2dae71e1ed3c907d33db21cd2ce72 (patch)
tree6aafaec025a855ec9fa8bb9a0cce3a4fa9dcbb14 /gcc
parentbb14e19c2be54dd10f40d705364e08524ec8310c (diff)
downloadgcc-d7b24d5556b2dae71e1ed3c907d33db21cd2ce72.zip
gcc-d7b24d5556b2dae71e1ed3c907d33db21cd2ce72.tar.gz
gcc-d7b24d5556b2dae71e1ed3c907d33db21cd2ce72.tar.bz2
compiler: do not propagate address-taken of a slice element to the slice
Array_index_expression may be used for indexing/slicing array or slice. If a slice element is address taken, the slice itself is not necessarily address taken. Only propagate address-taken for arrays. Reviewed-on: https://go-review.googlesource.com/83877 From-SVN: r255977
Diffstat (limited to 'gcc')
-rw-r--r--gcc/go/gofrontend/MERGE2
-rw-r--r--gcc/go/gofrontend/expressions.cc8
-rw-r--r--gcc/go/gofrontend/expressions.h3
3 files changed, 10 insertions, 3 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index b81922e..3ba3462 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -1,4 +1,4 @@
-83fc0e440b8c151edc5b1c67006257aad522ca04
+9b9bece388d1bacdc9d1d0024e722ffe449d221d
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index 8ae1013..f5adc18 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -10871,6 +10871,14 @@ Array_index_expression::do_is_addressable() const
return this->array_->is_addressable();
}
+void
+Array_index_expression::do_address_taken(bool escapes)
+{
+ // In &x[0], if x is a slice, then x's address is not taken.
+ if (!this->array_->type()->is_slice_type())
+ this->array_->address_taken(escapes);
+}
+
// Get the backend representation for an array index.
Bexpression*
diff --git a/gcc/go/gofrontend/expressions.h b/gcc/go/gofrontend/expressions.h
index a4f6558..cb60890 100644
--- a/gcc/go/gofrontend/expressions.h
+++ b/gcc/go/gofrontend/expressions.h
@@ -2896,8 +2896,7 @@ class Array_index_expression : public Expression
do_is_addressable() const;
void
- do_address_taken(bool escapes)
- { this->array_->address_taken(escapes); }
+ do_address_taken(bool escapes);
void
do_issue_nil_check()