mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/cgo: enforce typing of 0-sized types
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
This commit is contained in:
parent
444dd26bf4
commit
0f82cfd3f0
3 changed files with 24 additions and 2 deletions
18
misc/cgo/errors/err3.go
Normal file
18
misc/cgo/errors/err3.go
Normal file
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -26,6 +26,7 @@ check() {
|
||||||
|
|
||||||
check err1.go
|
check err1.go
|
||||||
check err2.go
|
check err2.go
|
||||||
|
check err3.go
|
||||||
|
|
||||||
rm -rf errs _obj
|
rm -rf errs _obj
|
||||||
exit 0
|
exit 0
|
||||||
|
|
|
||||||
|
|
@ -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.
|
// be correct, so calling dtype.Size again will produce the correct value.
|
||||||
t.Size = dtype.Size()
|
t.Size = dtype.Size()
|
||||||
if t.Size < 0 {
|
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.Size = 0
|
||||||
t.Go = c.Opaque(0)
|
if _, ok := dtype.(*dwarf.TypedefType); !ok {
|
||||||
|
t.Go = c.Opaque(0)
|
||||||
|
}
|
||||||
if t.C.Empty() {
|
if t.C.Empty() {
|
||||||
t.C.Set("void")
|
t.C.Set("void")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue