]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: for godefs, don't let field prefix removal cause duplicates
authorIan Lance Taylor <iant@golang.org>
Wed, 15 Sep 2021 23:11:37 +0000 (16:11 -0700)
committerIan Lance Taylor <iant@golang.org>
Thu, 16 Sep 2021 23:56:28 +0000 (23:56 +0000)
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>
misc/cgo/testgodefs/testdata/issue48396.go [new file with mode: 0644]
misc/cgo/testgodefs/testdata/main.go
misc/cgo/testgodefs/testgodefs_test.go
src/cmd/cgo/gcc.go

diff --git a/misc/cgo/testgodefs/testdata/issue48396.go b/misc/cgo/testgodefs/testdata/issue48396.go
new file mode 100644 (file)
index 0000000..d4c1924
--- /dev/null
@@ -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
index 4a3f6a701cc0e7e1a6a348afdbf72407b64a8ca1..5c670f3d329c1acc2e2788c8024cd2233ec0aa62 100644 (file)
@@ -28,6 +28,9 @@ var v7 = S{}
 // Test that #define'd type is fully defined
 var _ = issue38649{X: 0}
 
+// Test that prefixes do not cause duplicate field names.
+var _ = Issue48396{Fd: 1, Bpf_fd: 2}
+
 func main() {
        pass := true
 
index aae34043605d340a64c6ede42b79ce1ca4575a6e..7628ffc595b7e261ad24e502d8257f1d7494f1f1 100644 (file)
@@ -25,6 +25,7 @@ var filePrefixes = []string{
        "issue37621",
        "issue38649",
        "issue39534",
+       "issue48396",
 }
 
 func TestGoDefs(t *testing.T) {
index 92adb1ed9cc60cda8eabcaeef2fa58d688cebd42..6b3112b41e889070feeb6286450cd658bf464d93 100644 (file)
@@ -3030,6 +3030,31 @@ func upper(s string) string {
 // so that all fields are exported.
 func godefsFields(fld []*ast.Field) {
        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
        for _, f := range fld {
                for _, n := range f.Names {