[ 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)