http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60288

            Bug ID: 60288
           Summary: gccgo crashes compiling '*func_ptr(0)'
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: go
          Assignee: ian at airs dot com
          Reporter: vogt at linux dot vnet.ibm.com

Created attachment 32179
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=32179&action=edit
test program

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@207936
138bc75d-0d04-0410-961f-82ee72b054a4

This program crashes gcc:

-- BEGIN
package main
func f(i int) int { return i }
func main() {
    g := f
    println(*&g(0))  // <-- compiles (see below)
    pg := &g
    println(*pg(0))  // <-- crash
}
-- END

Instead of producing an error message, gccgo crashes in line 7:

-- snip --
foo.go:7:11: error: expected function
  println(*pg(0))
           ^
go1: internal compiler error: in do_flatten, at
go/gofrontend/expressions.cc:3835
0x80151dc9 Unary_expression::do_flatten(Gogo*, Named_object*,
Statement_inserter*)
    ../../gcc/go/gofrontend/expressions.cc:3835
0x80196583 Expression::flatten(Gogo*, Named_object*, Statement_inserter*)
    ../../gcc/go/gofrontend/expressions.h:635
0x80196583 Flatten::expression(Expression**)
    ../../gcc/go/gofrontend/gogo.cc:2841
0x80152a75 Expression::traverse(Expression**, Traverse*)
    ../../gcc/go/gofrontend/expressions.cc:54
0x80152a75 Expression_list::traverse(Traverse*)
    ../../gcc/go/gofrontend/expressions.cc:15187
0x80152a75 Call_expression::do_traverse(Traverse*)
    ../../gcc/go/gofrontend/expressions.cc:9124
0x80152a75 Call_expression::do_traverse(Traverse*)
    ../../gcc/go/gofrontend/expressions.cc:9118
0x801965a3 Flatten::expression(Expression**)
    ../../gcc/go/gofrontend/gogo.cc:2837
0x80154d67 Expression::traverse(Expression**, Traverse*)
    ../../gcc/go/gofrontend/expressions.cc:54
0x80198ddf Flatten::statement(Block*, unsigned long*, Statement*)
    ../../gcc/go/gofrontend/gogo.cc:2797
0x801da0b3 Statement::traverse(Block*, unsigned long*, Traverse*)
    ../../gcc/go/gofrontend/statements.cc:43
0x8019c791 Block::traverse(Traverse*)
    ../../gcc/go/gofrontend/gogo.cc:4279
0x8019cca3 Function::traverse(Traverse*)
    ../../gcc/go/gofrontend/gogo.cc:3805
0x8019cca3 Flatten::function(Named_object*)
    ../../gcc/go/gofrontend/gogo.cc:2774
0x8019d071 Bindings::traverse(Traverse*, bool)
    ../../gcc/go/gofrontend/gogo.cc:5877
0x8019d81d Gogo::traverse(Traverse*)
    ../../gcc/go/gofrontend/gogo.cc:1466
0x8019d81d Gogo::flatten()
    ../../gcc/go/gofrontend/gogo.cc:2875
0x8018bb8d go_parse_input_files(char const**, unsigned int, bool, bool)
    ../../gcc/go/gofrontend/go.cc:126
-- snip --

As a side note, gccgo compiles line 5 without even as much as a
warning while golang treats this as an error:

  (golang) ./foo.go:5: cannot take the address of g(0)

So it looks like gccgo reads the expression as

  (*pg)(0)

while golang reads it as

  *(pg(0))

Not sure whether this is a bug in gccgo.

Reply via email to