You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Frank Schroeder (JIRA)" <ji...@apache.org> on 2014/10/28 21:26:34 UTC
[jira] [Created] (THRIFT-2793) Go compiler produces uncompilable
code
Frank Schroeder created THRIFT-2793:
---------------------------------------
Summary: Go compiler produces uncompilable code
Key: THRIFT-2793
URL: https://issues.apache.org/jira/browse/THRIFT-2793
Project: Thrift
Issue Type: Bug
Components: Go - Compiler
Affects Versions: 0.9.2
Environment: OSX 10.10
Reporter: Frank Schroeder
The Thrift Go compiler produces wrong code for the following code:
{code}
struct A { 1: list<B> b }
struct B { 1: i64 id }
{code}
The abbreviated reader method creates a []B instead of a []*B but still tries to add a &B{}.
{code}
func (p *A) ReadField1(iprot thrift.TProtocol) error {
...
tSlice := make([]B, 0, size)
...
for i := 0; i < size; i++ {
_elem0 := &B{}
...
p.B = append(p.B, _elem0)
}
...
}
{code}
The Go compiler message is:
{code}
$ go version
go version go1.3.3 darwin/amd64
$ go build
./ttypes.go:74: cannot use _elem0 (type *B) as type B in append
{code}
Moving struct B *above* struct A produces correct code:
{code}
struct B { 1: i64 id }
struct A { 1: list<B> b }
{code}
The abbreviated reader method:
{code}
func (p *A) ReadField1(iprot thrift.TProtocol) error {
...
tSlice := make([]*B, 0, size)
...
for i := 0; i < size; i++ {
_elem0 := &B{}
...
p.B = append(p.B, _elem0)
}
...
}
{code}
This problem does not occurr with enums since they are aliases for int64. So both versions generate correct code:
{code}
struct A { 1: list<B> b }
enum B { X }
{code}
and
{code}
enum B { X }
struct A { 1: list<B> b }
{code}
Tested with version 902b7af4c84b8f716668d4d4f10612c16109c09a from https://git-wip-us.apache.org/repos/asf/thrift.git.
I've built the thrift compiler with the following flags:
{code}
PATH=/opt/boxen/homebrew/Cellar/bison27/2.7.1/bin:$PATH ./configure \
--without-cpp \
--without-qt4 \
--without-c_glib \
--without-csharp \
--without-java \
--without-erlang \
--without-nodejs \
--without-lua \
--without-python \
--without-perl \
--without-php \
--without-php_extension \
--without-ruby \
--without-haskell \
--with-go
{code}
and generate the thrift stubs as follows:
{code}
../compiler/cpp/thrift --gen go -out . model.thrift
{code}
I'll try to dig a bit through the source of the generator to see whether I can produce a patch.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)