Created attachment 32851 [details] reproducer gcc version 4.10.0 20140516 (experimental) (GCC) The program is attached. go build -compiler=gccgo main go1: internal compiler error: in check_bounds, at go/gofrontend/expressions.cc:480 0x5a3e71 Expression::check_bounds(Expression*, Location) ../../gcc/go/gofrontend/expressions.cc:480 0x5b89fd Array_index_expression::do_get_backend(Translate_context*) ../../gcc/go/gofrontend/expressions.cc:10263 0x5aeb06 Type_conversion_expression::do_get_backend(Translate_context*) ../../gcc/go/gofrontend/expressions.cc:3290 0x608076 Temporary_statement::do_get_backend(Translate_context*) ../../gcc/go/gofrontend/statements.cc:452 0x5db097 Block::get_backend(Translate_context*) ../../gcc/go/gofrontend/gogo.cc:5454 0x60741c Block_statement::do_get_backend(Translate_context*) ../../gcc/go/gofrontend/statements.cc:1811 0x5db097 Block::get_backend(Translate_context*) ../../gcc/go/gofrontend/gogo.cc:5454 0x5dc925 Function::build(Gogo*, Named_object*) ../../gcc/go/gofrontend/gogo.cc:5062 0x5ddc57 Named_object::get_backend(Gogo*, std::vector<Bexpression*, std::allocator<Bexpression*> >&, std::vector<Btype*, std::allocator<Btype*> >&, std::vector<Bfunction*, std::allocator<Bfunction*> >&) ../../gcc/go/gofrontend/gogo.cc:6753 0x5e2b5c Gogo::write_globals() ../../gcc/go/gofrontend/gogo.cc:1136
Author: ian Date: Tue Jul 8 21:28:17 2014 New Revision: 212372 URL: https://gcc.gnu.org/viewcvs?rev=212372&root=gcc&view=rev Log: PR go/61308 compiler: Convert array start index before bounds checking. Modified: trunk/gcc/go/gofrontend/expressions.cc
It would be great to accompany these fixes with regression tests. We have significant amount of Go code in std lib and tests, but still we discover new code patterns. Any new compiler functionality (like race detector or coverage analysis) would benefit from extensive tests. Does gccgo use tests from the main Go repo? The main repo looks like the best place for them.
Test committed to master repository as fixedbugs/bug489.go.
Author: ian Date: Tue Aug 5 02:58:15 2014 New Revision: 213616 URL: https://gcc.gnu.org/viewcvs?rev=213616&root=gcc&view=rev Log: PR go/61308 PR go/61866 compiler: Don't cast index expr to int before bounds check. This fixes http://gcc.gnu.org/PR61866 : on a 32-bit system, casting an int64 index to int drops the upper 32 bits of the value, and thus can cause an out-of-range index to appear to be in range. This undoes part of change 1318:fa6e0c716dba (https://codereview.appspot.com/104610044) and therefore breaks http://gcc.gnu.org/PR61308 again. I have a separate patch for that (http://codereview.appspot.com/122020043). In addition to undoing part of that change, this patch adds code to avoid a compiler crash. This changes PR61308 from a compiler crash to an incorrect error message. Modified: trunk/gcc/go/gofrontend/expressions.cc
Author: ian Date: Tue Aug 5 03:10:53 2014 New Revision: 213617 URL: https://gcc.gnu.org/viewcvs?rev=213617&root=gcc&view=rev Log: PR go/61308 compiler: Handle enclosing vars for function type in function lit. This fixes a dumb bug in which the enclosing vars were incorrectly cleared when a function literal contains a reference to a function type. The test for this will go into the master repository in the change at http://codereview.appspot.com/121200043 . Modified: branches/gcc-4_9-branch/gcc/go/gofrontend/parse.cc
Author: ian Date: Tue Aug 5 03:11:17 2014 New Revision: 213618 URL: https://gcc.gnu.org/viewcvs?rev=213618&root=gcc&view=rev Log: PR go/61308 compiler: Handle enclosing vars for function type in function lit. This fixes a dumb bug in which the enclosing vars were incorrectly cleared when a function literal contains a reference to a function type. The test for this will go into the master repository in the change at http://codereview.appspot.com/121200043 . Modified: trunk/gcc/go/gofrontend/parse.cc
Fixed.