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.