[ https://issues.apache.org/jira/browse/THRIFT-2793?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14187425#comment-14187425 ]
Frank Schroeder commented on THRIFT-2793: ----------------------------------------- It looks like the compiler does not recognize that the second struct is a struct and treats it as an enum since not only the reader function is affected. This code {code} struct B { 1: i64 id } struct A { 1: list<B> b, 2: list<C> c } struct C { 1: i64 id } {code} generates this definition for A {code} type A struct { B []*B `thrift:"b,1" json:"b"` C []C `thrift:"c,2" json:"c"` } {code} > 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)