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
This commit is contained in:
Ian Lance Taylor 2016-10-13 16:21:28 +00:00
parent 5117a23e9f
commit 65205e30c4
2 changed files with 9 additions and 1 deletions

View File

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

View File

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