Bug 61308 - gccgo: ICE in Expression::check_bounds [GoSmith]
Summary: gccgo: ICE in Expression::check_bounds [GoSmith]
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: go (show other bugs)
Version: 5.0
: P3 normal
Target Milestone: ---
Assignee: Ian Lance Taylor
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2014-05-25 07:20 UTC by Dmitry Vyukov
Modified: 2014-08-05 03:21 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments
reproducer (2.38 KB, application/x-gzip)
2014-05-25 07:20 UTC, Dmitry Vyukov
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Dmitry Vyukov 2014-05-25 07:20:55 UTC
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
Comment 1 ian@gcc.gnu.org 2014-07-08 21:28:51 UTC
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
Comment 2 Dmitry Vyukov 2014-07-08 21:39:18 UTC
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.
Comment 3 Ian Lance Taylor 2014-08-05 02:51:43 UTC
Test committed to master repository as fixedbugs/bug489.go.
Comment 4 ian@gcc.gnu.org 2014-08-05 02:58:48 UTC
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
Comment 5 ian@gcc.gnu.org 2014-08-05 03:11:25 UTC
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
Comment 6 ian@gcc.gnu.org 2014-08-05 03:11:49 UTC
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
Comment 7 Ian Lance Taylor 2014-08-05 03:21:33 UTC
Fixed.