golang / go

The Go programming language
https://go.dev
BSD 3-Clause "New" or "Revised" License
123.62k stars 17.61k forks source link

gccgo: internal compiler error with go/defer of builtin-functions #4463

Closed griesemer closed 9 years ago

griesemer commented 11 years ago
gccgo x.go

with x.go: http://play.golang.org/p/M56xbpgyJq

The compiler produces a series of (correct) error messages and then reports an internal
error:

gccgo x.go
x.go:14:2: error: expected call expression
  go complex(1, 2)
  ^
x.go:15:2: error: expected call expression
  go imag(1i)
  ^
x.go:17:2: error: expected call expression
  go make([]int, 10)
  ^
x.go:18:2: error: expected call expression
  go new(int)
  ^
x.go:19:2: error: expected call expression
  go real(1i)
  ^
x.go:20:2: error: expected call expression
  go unsafe.Alignof(a)
  ^
x.go:21:2: error: expected call expression
  go unsafe.Offsetof(s.f)
  ^
x.go:22:2: error: expected call expression
  go unsafe.Sizeof(a)
  ^
x.go:37:2: error: expected call expression
  defer complex(1, 2)
  ^
x.go:38:2: error: expected call expression
  defer imag(1i)
  ^
x.go:40:2: error: expected call expression
  defer make([]int, 10)
  ^
x.go:41:2: error: expected call expression
  defer new(int)
  ^
x.go:42:2: error: expected call expression
  defer real(1i)
  ^
x.go:43:2: error: expected call expression
  defer unsafe.Alignof(a)
  ^
x.go:44:2: error: expected call expression
  defer unsafe.Offsetof(s.f)
  ^
x.go:45:2: error: expected call expression
  defer unsafe.Sizeof(a)
  ^
x.go:12:2: error: argument 2 has incompatible type
  go append(a, 0)
  ^
x.go:35:2: error: argument 2 has incompatible type
  defer append(a, 0)
  ^
go1: internal compiler error: in build_thunk, at go/gofrontend/statements.cc:2474
0x590743 Thunk_statement::build_thunk(Gogo*, std::basic_string<char,
std::char_traits<char>, std::allocator<char> > const&)
    /tmp/go-build-release/gccgo-srcdir/gcc/go/gofrontend/statements.cc:2474
0x590df3 Thunk_statement::simplify_statement(Gogo*, Named_object*, Block*)
    /tmp/go-build-release/gccgo-srcdir/gcc/go/gofrontend/statements.cc:2149
0x5911ef Simplify_thunk_traverse::block(Block*)
    /tmp/go-build-release/gccgo-srcdir/gcc/go/gofrontend/statements.cc:2067
0x55843b Block::traverse(Traverse*)
    /tmp/go-build-release/gccgo-srcdir/gcc/go/gofrontend/gogo.cc:3620
0x558405 Block::traverse(Traverse*)
    /tmp/go-build-release/gccgo-srcdir/gcc/go/gofrontend/gogo.cc:3720
0x5586dd Function::traverse(Traverse*)
    /tmp/go-build-release/gccgo-srcdir/gcc/go/gofrontend/gogo.cc:3341
0x5871a0 Simplify_thunk_traverse::function(Named_object*)
    /tmp/go-build-release/gccgo-srcdir/gcc/go/gofrontend/statements.cc:2048
0x55afdb Bindings::traverse(Traverse*, bool)
    /tmp/go-build-release/gccgo-srcdir/gcc/go/gofrontend/gogo.cc:5191
0x55b0e1 Gogo::traverse(Traverse*)
    /tmp/go-build-release/gccgo-srcdir/gcc/go/gofrontend/gogo.cc:1398
0x58ac9b Gogo::simplify_thunk_statements()
    /tmp/go-build-release/gccgo-srcdir/gcc/go/gofrontend/statements.cc:2078
0x54c74e go_parse_input_files(char const**, unsigned int, bool, bool)
    /tmp/go-build-release/gccgo-srcdir/gcc/go/gofrontend/go.cc:124
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://go.ext.google.com/go/>; for instructions.

Some additional observations (unrelated to the internal error):

- The error message "expected call expression" is somewhat misleading: The
expressions are calls, they are just not permitted in the go/defer context.
- The error message "x.go:12:2: error: argument 2 has incompatible type" seems
wrong. The 2nd argument for append is correct for the specific append. If the error
message refers to the go/defer statement, it's also wrong: there's no "2nd
argument".
ianlancetaylor commented 11 years ago

Comment 1:

Fixed on tip.

Status changed to Fixed.