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 2017/03/04 13:14:46 UTC

[jira] [Resolved] (THRIFT-4031) Go plugin generates invalid code for lists of typedef'ed built-in types

     [ https://issues.apache.org/jira/browse/THRIFT-4031?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jens Geyer resolved THRIFT-4031.
--------------------------------
       Resolution: Fixed
         Assignee: Can Celasun
    Fix Version/s: 0.11.0

Committed.

> Go plugin generates invalid code for lists of typedef'ed built-in types
> -----------------------------------------------------------------------
>
>                 Key: THRIFT-4031
>                 URL: https://issues.apache.org/jira/browse/THRIFT-4031
>             Project: Thrift
>          Issue Type: Bug
>          Components: Go - Compiler
>    Affects Versions: 0.10.0
>         Environment: Thrift version 0.10.0
> go version go1.7.4 linux/386
>            Reporter: Benoit Sigoure
>            Assignee: Can Celasun
>            Priority: Critical
>             Fix For: 0.11.0
>
>
> Reproduction:
> {code}
> mkdir /tmp/bug
> cd /tmp/bug
> cat >test.thrift <<EOF
> typedef i32 foo
> struct s {
>  1:list<foo> a
> }
> EOF
> mkdir _build
> thrift -out _build --gen go:package=pkg -r test.thrift
> {code}
> Then try to compile the resulting {{go build _build/pkg/test.go}} and you'll get:
> {code}
> _build/pkg/test.go:81: cannot use _elem0 (type int32) as type Foo in append
> {code}
> Here's the generated code with line numbers and a couple comments I added:
> {code}
>      67 func (p *S)  ReadField1(iprot thrift.TProtocol) error {
>      68   _, size, err := iprot.ReadListBegin()
>      69   if err != nil {
>      70     return thrift.PrependError("error reading list begin: ", err)
>      71   }
>      72   tSlice := make([]Foo, 0, size)  // The slice contain Foo values
>      73   p.A =  tSlice
>      74   for i := 0; i < size; i ++ {
>      75 var _elem0 int32
>      76     if v, err := iprot.ReadI32(); err != nil {
>      77     return thrift.PrependError("error reading field 0: ", err)
>      78 } else {
>      79     _elem0 = v
>      80 }
>      81     p.A = append(p.A, _elem0)  // Here the code should do append(p.A, Foo(_elem0))
>      82   }
>      83   if err := iprot.ReadListEnd(); err != nil {
>      84     return thrift.PrependError("error reading list end: ", err)
>      85   }
>      86   return nil
>      87 }
> {code}
> This was working fine with 0.9.3 so this is a regression in 0.10.0.  With 0.9.3 the slice {{tSlice}} is a {{[]int32}}, as opposed to a {{[]Foo}}.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)