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
-681580a3afc687ba3ff9ef240c67e8630e4306e6
+e3913d96fb024b916c87a4dc01f413523467ead9
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
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: