mirror of
https://github.com/golang/go
synced 2024-11-17 17:44:46 -07:00
cmd/cgo: for godefs, don't let field prefix removal cause duplicates
Fixes #48396 Change-Id: Idd7cb66536ef513806c472d394a929bc271fc26b Reviewed-on: https://go-review.googlesource.com/c/go/+/350159 Trust: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com> Reviewed-by: Matt Layher <mdlayher@gmail.com>
This commit is contained in:
parent
4efdaa7bc7
commit
265b59aefd
18
misc/cgo/testgodefs/testdata/issue48396.go
vendored
Normal file
18
misc/cgo/testgodefs/testdata/issue48396.go
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
// Copyright 2021 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
//
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
/*
|
||||||
|
// from <linux/kcm.h>
|
||||||
|
struct issue48396 {
|
||||||
|
int fd;
|
||||||
|
int bpf_fd;
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
type Issue48396 C.struct_issue48396
|
3
misc/cgo/testgodefs/testdata/main.go
vendored
3
misc/cgo/testgodefs/testdata/main.go
vendored
@ -28,6 +28,9 @@ var v7 = S{}
|
|||||||
// Test that #define'd type is fully defined
|
// Test that #define'd type is fully defined
|
||||||
var _ = issue38649{X: 0}
|
var _ = issue38649{X: 0}
|
||||||
|
|
||||||
|
// Test that prefixes do not cause duplicate field names.
|
||||||
|
var _ = Issue48396{Fd: 1, Bpf_fd: 2}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
pass := true
|
pass := true
|
||||||
|
|
||||||
|
@ -25,6 +25,7 @@ var filePrefixes = []string{
|
|||||||
"issue37621",
|
"issue37621",
|
||||||
"issue38649",
|
"issue38649",
|
||||||
"issue39534",
|
"issue39534",
|
||||||
|
"issue48396",
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGoDefs(t *testing.T) {
|
func TestGoDefs(t *testing.T) {
|
||||||
|
@ -3030,6 +3030,31 @@ func upper(s string) string {
|
|||||||
// so that all fields are exported.
|
// so that all fields are exported.
|
||||||
func godefsFields(fld []*ast.Field) {
|
func godefsFields(fld []*ast.Field) {
|
||||||
prefix := fieldPrefix(fld)
|
prefix := fieldPrefix(fld)
|
||||||
|
|
||||||
|
// Issue 48396: check for duplicate field names.
|
||||||
|
if prefix != "" {
|
||||||
|
names := make(map[string]bool)
|
||||||
|
fldLoop:
|
||||||
|
for _, f := range fld {
|
||||||
|
for _, n := range f.Names {
|
||||||
|
name := n.Name
|
||||||
|
if name == "_" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if name != prefix {
|
||||||
|
name = strings.TrimPrefix(n.Name, prefix)
|
||||||
|
}
|
||||||
|
name = upper(name)
|
||||||
|
if names[name] {
|
||||||
|
// Field name conflict: don't remove prefix.
|
||||||
|
prefix = ""
|
||||||
|
break fldLoop
|
||||||
|
}
|
||||||
|
names[name] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
npad := 0
|
npad := 0
|
||||||
for _, f := range fld {
|
for _, f := range fld {
|
||||||
for _, n := range f.Names {
|
for _, n := range f.Names {
|
||||||
|
Loading…
Reference in New Issue
Block a user