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

Yuxuan Wang updated THRIFT-5389:
--------------------------------
    Description: 
This is essentially the same issue as THRIFT-4253, just the fix of THRIFT-4253 
was not complete.

THRIFT-4253 fixed the primitive types, but does not work for enums. Here's a 
minimal reproducible thrift file:

{code}
namespace go foo

enum Foo {
  One = 1,
  Two = 2,
}

struct Bar {
  1: optional Foo foo,
}

const list<Bar> CONSTANTS = [
  {
    "foo": Foo.One,
  },
]
{code}

thrift compiler generated go code:

{code}
$ cat gen-go/foo/foo-consts.go 
// Code generated by Thrift Compiler (0.14.1). DO NOT EDIT.

package foo

import(
        "bytes"
        "context"
        "fmt"
        "time"
        "github.com/apache/thrift/lib/go/thrift"
)

// (needed to ensure safety because of naive import list construction.)
var _ = thrift.ZERO
var _ = fmt.Printf
var _ = context.Background
var _ = time.Now
var _ = bytes.Equal

var CONSTANTS []*Bar

func init() {
CONSTANTS = []*Bar{
  &Bar{
    Foo:     1,
}, }

}
{code}

While Bar.Foo is supposed to be a pointer (as it's optional).

This bug also applies to typedef'd types as well:

{code}
namespace go typedefstring

typedef string Foo

struct Struct {
  1: optional Foo foo,
}

const list<Struct> CONSTANTS = [
  {
    "foo": "hello",
  },
]
{code}

{code}
$ cat gen-go/typedefstring/typedefstring-consts.go 
// Code generated by Thrift Compiler (0.14.1). DO NOT EDIT.

package typedefstring

import(
        "bytes"
        "context"
        "fmt"
        "time"
        "github.com/apache/thrift/lib/go/thrift"
)

// (needed to ensure safety because of naive import list construction.)
var _ = thrift.ZERO
var _ = fmt.Printf
var _ = context.Background
var _ = time.Now
var _ = bytes.Equal

var CONSTANTS []*Struct

func init() {
CONSTANTS = []*Struct{
  &Struct{
    Foo: &(&struct{x string}{"hello"}).x,
}, }

}
{code}

In const code we try to assign a *string into *Foo field.

  was:
This is essentially the same issue as THRIFT-4253, just the fix of THRIFT-4253 
was not complete.

THRIFT-4253 fixed the primitive types, but does not work for enums. Here's a 
minimal reproducible thrift file:

{code}
namespace go foo

enum Foo {
  One = 1,
  Two = 2,
}

struct Bar {
  1: optional Foo foo,
}

const list<Bar> CONSTANTS = [
  {
    "foo": Foo.One,
  },
]
{code}

thrift compiler generated go code:

{code}
$ cat gen-go/foo/foo-consts.go 
// Code generated by Thrift Compiler (0.14.1). DO NOT EDIT.

package foo

import(
        "bytes"
        "context"
        "fmt"
        "time"
        "github.com/apache/thrift/lib/go/thrift"
)

// (needed to ensure safety because of naive import list construction.)
var _ = thrift.ZERO
var _ = fmt.Printf
var _ = context.Background
var _ = time.Now
var _ = bytes.Equal

var CONSTANTS []*Bar

func init() {
CONSTANTS = []*Bar{
  &Bar{
    Foo:     1,
}, }

}
{code}

While Bar.Foo is supposed to be a pointer (as it's optional).

This bug likely also applies to typedef'd types as well.


> Thrift compiler generates uncompilable go code around optional constants
> ------------------------------------------------------------------------
>
>                 Key: THRIFT-5389
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5389
>             Project: Thrift
>          Issue Type: Bug
>          Components: Go - Compiler
>    Affects Versions: 0.14.1
>            Reporter: Yuxuan Wang
>            Priority: Major
>
> This is essentially the same issue as THRIFT-4253, just the fix of 
> THRIFT-4253 was not complete.
> THRIFT-4253 fixed the primitive types, but does not work for enums. Here's a 
> minimal reproducible thrift file:
> {code}
> namespace go foo
> enum Foo {
>   One = 1,
>   Two = 2,
> }
> struct Bar {
>   1: optional Foo foo,
> }
> const list<Bar> CONSTANTS = [
>   {
>     "foo": Foo.One,
>   },
> ]
> {code}
> thrift compiler generated go code:
> {code}
> $ cat gen-go/foo/foo-consts.go 
> // Code generated by Thrift Compiler (0.14.1). DO NOT EDIT.
> package foo
> import(
>         "bytes"
>         "context"
>         "fmt"
>         "time"
>         "github.com/apache/thrift/lib/go/thrift"
> )
> // (needed to ensure safety because of naive import list construction.)
> var _ = thrift.ZERO
> var _ = fmt.Printf
> var _ = context.Background
> var _ = time.Now
> var _ = bytes.Equal
> var CONSTANTS []*Bar
> func init() {
> CONSTANTS = []*Bar{
>   &Bar{
>     Foo:     1,
> }, }
> }
> {code}
> While Bar.Foo is supposed to be a pointer (as it's optional).
> This bug also applies to typedef'd types as well:
> {code}
> namespace go typedefstring
> typedef string Foo
> struct Struct {
>   1: optional Foo foo,
> }
> const list<Struct> CONSTANTS = [
>   {
>     "foo": "hello",
>   },
> ]
> {code}
> {code}
> $ cat gen-go/typedefstring/typedefstring-consts.go 
> // Code generated by Thrift Compiler (0.14.1). DO NOT EDIT.
> package typedefstring
> import(
>         "bytes"
>         "context"
>         "fmt"
>         "time"
>         "github.com/apache/thrift/lib/go/thrift"
> )
> // (needed to ensure safety because of naive import list construction.)
> var _ = thrift.ZERO
> var _ = fmt.Printf
> var _ = context.Background
> var _ = time.Now
> var _ = bytes.Equal
> var CONSTANTS []*Struct
> func init() {
> CONSTANTS = []*Struct{
>   &Struct{
>     Foo: &(&struct{x string}{"hello"}).x,
> }, }
> }
> {code}
> In const code we try to assign a *string into *Foo field.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to