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

Jake Farrell commented on THRIFT-2793:
--------------------------------------

missed in changelog script due to being in resolved state and not closed, will 
add api calls to ensure all resolved tickets have approperate flags on them and 
then automatically close before generating the list. this is the only ticket in 
this case that was impacted

> 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
>            Assignee: Jens Geyer
>             Fix For: 0.9.2
>
>         Attachments: THRIFT-2793.patch, 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)

Reply via email to