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)