Commit 0f82cfd3 authored by Daniel Morsing's avatar Daniel Morsing

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
parent 444dd26b
// 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 err2.go
check err3.go
rm -rf errs _obj
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.
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")
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment