https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65755
Bug ID: 65755 Summary: incorrect reflection of struct fields with gccgo Product: gcc Version: 5.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: go Assignee: ian at airs dot com Reporter: boger at us dot ibm.com CC: cmang at google dot com Target: ppc64le, ppc64, x86_64 packer testcase fails due to incorrect reflected struct field when test is built with gccgo. Failure occurs with gccgo on ppc64le and x86_64 but works when built with gc for both. I've tried to reproduce this in a smaller testcase but have not been able to. I'm not 100% sure the code is correct go code but I couldn't find anything to tell me otherwise, and since it works with gc and works in my smaller testcase with gccgo it seems like it must be correct. To build the app and the testsuite follow the directions here https://github.com/mitchellh/packer#developing-packer When doing 'make' the testsuite is run, and there are two failures. The failure documented in this bugzilla is: FAIL github.com/mitchellh/packer/fix In github.com/mitchellh/packer/fix there are several files which declare the template struct within a function as follows: // Our template type we'll use for this fixer only type template struct { Builders []map[string]interface{} } However in fixer_pp_vagrant_override.go the template struct is declared like this: type template struct { PostProcessors []interface{} `mapstructure:"post-processors"` } In all cases, the template struct is passed to another function which uses the reflect package to look at the fields of the struct. The field obtained using these functions is inccorect and causes the test to fail because of unexpected results. It should see PostProcessors as the field but instead it sees the field as Builders. I added the following print statements to display the field before the call which demonstrate the incorrect fields. This is in fixer_pp_vagrant_override.go: func (FixerVagrantPPOverride) Fix(input map[string]interface{}) (map[string]interface{}, error) { // Our template type we'll use for this fixer only type template struct { PostProcessors []interface{} `mapstructure:"post-processors"` } // Decode the input into our structure, if we can var tpl template val := reflect.ValueOf(tpl) field := val.Type().Field(0) fmt.Printf("### field: %s ###\n", field) And the output looks like this: ### field: {Builders []map[string]interface {} %!s(uintptr=0) [%!s(int=0)] %!s(bool=false)} ### --- FAIL: TestFixerVagrantPPOverride_Fix (0.00s) testing.go:278: unexpected: map[string]interface {}{"post-processors":[]interface {}(nil)} expected: map[string]interface {}{"post-processors":[]interface {}{"foo", map[string]interface {}{"override":map[string]interface {}{"aws":map[string]interface {}{"foo":"bar"}}, "type":"vagrant"}, map[string]interface {}{"type":"vsphere"}, []interface {}{map[string]interface {}{"override":map[string]interface {}{"vmware":map[string]interface {}{"foo":"bar"}}, "type":"vagrant"}}}} FAIL