]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: enforce typing of 0-sized types
authorDaniel Morsing <daniel.morsing@gmail.com>
Thu, 27 Mar 2014 20:23:16 +0000 (20:23 +0000)
committerDaniel Morsing <daniel.morsing@gmail.com>
Thu, 27 Mar 2014 20:23:16 +0000 (20:23 +0000)
cgo represents all 0-sized and unsized types internally as [0]byte. This means that pointers to incomplete types would be interchangable, even if given a name by typedef.

Fixes #7409.

LGTM=iant
R=golang-codereviews, bradfitz, iant
CC=golang-codereviews
https://golang.org/cl/76450043

misc/cgo/errors/err3.go [new file with mode: 0644]
misc/cgo/errors/test.bash
src/cmd/cgo/gcc.go

diff --git a/misc/cgo/errors/err3.go b/misc/cgo/errors/err3.go
new file mode 100644 (file)
index 0000000..3680a4a
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright 2014 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.
+
+package main
+
+/*
+typedef struct foo foo_t;
+typedef struct bar bar_t;
+
+foo_t *foop;
+*/
+import "C"
+
+func main() {
+       x := (*C.bar_t)(nil)
+       C.foop = x // ERROR HERE
+}
index 697ae2fed20b55f4322b2322dd2807ee4c9df5c0..f0f60c84458b39907b7521301b8edc456e25789e 100755 (executable)
@@ -26,6 +26,7 @@ check() {
 
 check err1.go
 check err2.go
+check err3.go
 
 rm -rf errs _obj
 exit 0
index 3e1837ebf99da75afe2bc8f5e45605b89c50b43a..b8b783051da82eb2ca3e46e8409752f428d69729 100644 (file)
@@ -1327,9 +1327,12 @@ func (c *typeConv) Type(dtype dwarf.Type, pos token.Pos) *Type {
                // be correct, so calling dtype.Size again will produce the correct value.
                t.Size = dtype.Size()
                if t.Size < 0 {
-                       // Unsized types are [0]byte
+                       // Unsized types are [0]byte, unless they're typedefs of other types.
+                       // if so, use the name of the typedef for the go name.
                        t.Size = 0
-                       t.Go = c.Opaque(0)
+                       if _, ok := dtype.(*dwarf.TypedefType); !ok {
+                               t.Go = c.Opaque(0)
+                       }
                        if t.C.Empty() {
                                t.C.Set("void")
                        }