You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Jens Geyer (JIRA)" <ji...@apache.org> on 2014/10/28 21:54:34 UTC

[jira] [Comment Edited] (THRIFT-2793) Go compiler produces uncompilable code

    [ https://issues.apache.org/jira/browse/THRIFT-2793?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14187441#comment-14187441 ] 

Jens Geyer edited comment on THRIFT-2793 at 10/28/14 8:53 PM:
--------------------------------------------------------------

[Here's an IDL file|^Thrift2793.thrift] with all of your above mentioned test cases rolled into one file. I can confirm the problem using that file. 


was (Author: jensg):
[^Thrift2793.thrift|Here's an IDL file] with all of your above mentioned test cases rolled into one file. I can confirm the problem using that file. 

> 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
>         Attachments: Thrift2793.thrift
>
>
> 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)