aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2020-04-13 17:47:47 -0700
committerIan Lance Taylor <iant@golang.org>2020-04-14 22:36:35 +0000
commit768e5d1e4d079e1c941c154ae0397369567a5190 (patch)
tree18cab55a53d104a8306f1a920753d4aa32539851
parent96745b980cfde139e8611772e2bc0c59a8e6cdf7 (diff)
downloadgo-768e5d1e4d079e1c941c154ae0397369567a5190.tar.gz
go-768e5d1e4d079e1c941c154ae0397369567a5190.zip
[release-branch.go1.14] cmd/cgo: use consistent tag for a particular struct
For #31891 For #38408 Fixes #38426 Change-Id: Ie7498c2cab728ae798e66e7168425e16b063520e Reviewed-on: https://go-review.googlesource.com/c/go/+/228102 Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com> (cherry picked from commit 33ff63da4ec9cd456cab65b034b80a2fde4ebdea) Reviewed-on: https://go-review.googlesource.com/c/go/+/228107 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
-rw-r--r--misc/cgo/test/testx.go10
-rw-r--r--src/cmd/cgo/gcc.go12
2 files changed, 20 insertions, 2 deletions
diff --git a/misc/cgo/test/testx.go b/misc/cgo/test/testx.go
index 42979b5f4d..eb9d7fa47d 100644
--- a/misc/cgo/test/testx.go
+++ b/misc/cgo/test/testx.go
@@ -124,6 +124,11 @@ typedef struct {
} Issue31891B;
void callIssue31891(void);
+
+typedef struct {
+ int i;
+} Issue38408, *PIssue38408;
+
*/
import "C"
@@ -552,3 +557,8 @@ func useIssue31891B(c *C.Issue31891B) {}
func test31891(t *testing.T) {
C.callIssue31891()
}
+
+// issue 38408
+// A typedef pointer can be used as the element type.
+// No runtime test; just make sure it compiles.
+var _ C.PIssue38408 = &C.Issue38408{i: 1}
diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go
index c4128e9502..7f99057a49 100644
--- a/src/cmd/cgo/gcc.go
+++ b/src/cmd/cgo/gcc.go
@@ -2060,6 +2060,10 @@ var goIdent = make(map[string]*ast.Ident)
// that may contain a pointer. This is used for cgo pointer checking.
var unionWithPointer = make(map[ast.Expr]bool)
+// anonymousStructTag provides a consistent tag for an anonymous struct.
+// The same dwarf.StructType pointer will always get the same tag.
+var anonymousStructTag = make(map[*dwarf.StructType]string)
+
func (c *typeConv) Init(ptrSize, intSize int64) {
c.ptrSize = ptrSize
c.intSize = intSize
@@ -2408,8 +2412,12 @@ func (c *typeConv) loadType(dtype dwarf.Type, pos token.Pos, parent string) *Typ
break
}
if tag == "" {
- tag = "__" + strconv.Itoa(tagGen)
- tagGen++
+ tag = anonymousStructTag[dt]
+ if tag == "" {
+ tag = "__" + strconv.Itoa(tagGen)
+ tagGen++
+ anonymousStructTag[dt] = tag
+ }
} else if t.C.Empty() {
t.C.Set(dt.Kind + " " + tag)
}