aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2016-10-13 16:21:28 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2016-10-13 16:21:28 +0000
commit65205e30c40701fcf161484e98d631fa36b5298d (patch)
tree403169efef8464ce3d59a9035abc31e34b98bd29
parent5117a23e9fe6e91179ec8c3487da50c3b35a7958 (diff)
downloadgcc-65205e30c40701fcf161484e98d631fa36b5298d.zip
gcc-65205e30c40701fcf161484e98d631fa36b5298d.tar.gz
gcc-65205e30c40701fcf161484e98d631fa36b5298d.tar.bz2
compiler: don't try to get backend representation of redefinition
Trying to get the backend representation of a redefined name can cause a compiler crash as the compiler can walk over the same statements a second time. It's also quite unlikely to produce any additional useful error messages for the user. Test case follows. I'm not going to bother adding this test case to the testsuite--crash-on-invalid cases are worth fixing but not worth continually retesting. package p type A []int func (a A) Sum() (sum int) { for _, v := range a { sum += v } return sum } type A []int func (a A) Sum() (sum int) { for _, v := range a { sum += v } return sum } Reviewed-on: https://go-review.googlesource.com/30976 From-SVN: r241127
-rw-r--r--gcc/go/gofrontend/MERGE2
-rw-r--r--gcc/go/gofrontend/gogo.cc8
2 files changed, 9 insertions, 1 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index 0a116a8..6e689f4 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -1,4 +1,4 @@
-681580a3afc687ba3ff9ef240c67e8630e4306e6
+e3913d96fb024b916c87a4dc01f413523467ead9
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/gogo.cc b/gcc/go/gofrontend/gogo.cc
index 30392f7..9491e51 100644
--- a/gcc/go/gofrontend/gogo.cc
+++ b/gcc/go/gofrontend/gogo.cc
@@ -7214,6 +7214,14 @@ Named_object::get_backend(Gogo* gogo, std::vector<Bexpression*>& const_decls,
std::vector<Btype*>& type_decls,
std::vector<Bfunction*>& func_decls)
{
+ // If this is a definition, avoid trying to get the backend
+ // representation, as that can crash.
+ if (this->is_redefinition_)
+ {
+ go_assert(saw_errors());
+ return;
+ }
+
switch (this->classification_)
{
case NAMED_OBJECT_CONST: