1
0
mirror of https://github.com/golang/go synced 2024-11-18 22:34:45 -07:00
go/misc/cgo/test/issue8148.go

25 lines
526 B
Go
Raw Normal View History

// 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.
// Issue 8148. A typedef of an unnamed struct didn't work when used
// with an exported Go function. No runtime test; just make sure it
// compiles.
package cgotest
/*
typedef struct { int i; } T;
misc/cgo/test: do not redeclare exported Go functions An exported Go function like //export F func F() {} gets declared in _cgo_export.h as something like extern void F(void); The exact declaration varies by operating system. In particular, Windows adds __declspec(dllimport). Clang on Windows/ARM64 rejects code that contains conflicting declarations for F, like: extern void F(void); extern void __declspec(dllimport) F(void); This means that F must not be declared separately from _cgo_export.h: any code that wants to refer to F must use #include "_cgo_export.h". Unfortunately, the cgo prologue itself (the commented code before import "C") cannot include "_cgo_export.h", because that file is itself produced from the cgo Go sources and therefore cannot be a dependency of the cgo Go sources. This CL rewrites misc/cgo/test to avoid redeclaring exported functions. Most of the time, this is not a significant problem: just move the code that needs the header into a .c file, perhaps with a wrapper exposed to the cgo Go sources. The one case that is potentially problematic is f7665, which is part of the test for golang.org/issue/7665. That bug report explicitly identified a bug in referring to the C name for an exported function in the same Go source file as it was exported function. That is now impossible, at least on Windows/ARM64, so the test is modified a bit and possibly does not test what the original bug was. But the original bug should be long gone: that part of the compiler has been rewritten. Change-Id: I0d14d9336632f0e5e3db4273d9d32ef2cca0298d Reviewed-on: https://go-review.googlesource.com/c/go/+/312029 Trust: Russ Cox <rsc@golang.org> Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
2021-04-20 11:30:50 -06:00
int get8148(void);
*/
import "C"
//export issue8148Callback
func issue8148Callback(t *C.T) C.int {
return t.i
}
func Issue8148() int {
misc/cgo/test: do not redeclare exported Go functions An exported Go function like //export F func F() {} gets declared in _cgo_export.h as something like extern void F(void); The exact declaration varies by operating system. In particular, Windows adds __declspec(dllimport). Clang on Windows/ARM64 rejects code that contains conflicting declarations for F, like: extern void F(void); extern void __declspec(dllimport) F(void); This means that F must not be declared separately from _cgo_export.h: any code that wants to refer to F must use #include "_cgo_export.h". Unfortunately, the cgo prologue itself (the commented code before import "C") cannot include "_cgo_export.h", because that file is itself produced from the cgo Go sources and therefore cannot be a dependency of the cgo Go sources. This CL rewrites misc/cgo/test to avoid redeclaring exported functions. Most of the time, this is not a significant problem: just move the code that needs the header into a .c file, perhaps with a wrapper exposed to the cgo Go sources. The one case that is potentially problematic is f7665, which is part of the test for golang.org/issue/7665. That bug report explicitly identified a bug in referring to the C name for an exported function in the same Go source file as it was exported function. That is now impossible, at least on Windows/ARM64, so the test is modified a bit and possibly does not test what the original bug was. But the original bug should be long gone: that part of the compiler has been rewritten. Change-Id: I0d14d9336632f0e5e3db4273d9d32ef2cca0298d Reviewed-on: https://go-review.googlesource.com/c/go/+/312029 Trust: Russ Cox <rsc@golang.org> Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
2021-04-20 11:30:50 -06:00
return int(C.get8148())
}