cgo: add C._Bool type
This fixes https://github.com/tinygo-org/tinygo/issues/3926. While working on this I've found another bug: if C.bool is referenced from within Go, it isn't available anymore on the C side. This is an existing bug that also applies to float and double, but may be less likely to be triggered there. This bug is something to be fixed at a later time (it has something to do with preprocessor defines).
Этот коммит содержится в:
родитель
a896f7f218
коммит
6ef8fcd537
2 изменённых файлов: 8 добавлений и 2 удалений
|
@ -88,6 +88,7 @@ var cgoAliases = map[string]string{
|
||||||
"C.uintptr_t": "uintptr",
|
"C.uintptr_t": "uintptr",
|
||||||
"C.float": "float32",
|
"C.float": "float32",
|
||||||
"C.double": "float64",
|
"C.double": "float64",
|
||||||
|
"C._Bool": "bool",
|
||||||
}
|
}
|
||||||
|
|
||||||
// builtinAliases are handled specially because they only exist on the Go side
|
// builtinAliases are handled specially because they only exist on the Go side
|
||||||
|
@ -311,10 +312,11 @@ func Process(files []*ast.File, dir, importPath string, fset *token.FileSet, cfl
|
||||||
// Process CGo imports for each file.
|
// Process CGo imports for each file.
|
||||||
for i, f := range files {
|
for i, f := range files {
|
||||||
cf := p.newCGoFile(f, i)
|
cf := p.newCGoFile(f, i)
|
||||||
// Float and double are aliased, meaning that C.float is the same thing
|
// These types are aliased with the corresponding types in C. For
|
||||||
// as float32 in Go.
|
// example, float in C is always float32 in Go.
|
||||||
cf.names["float"] = clangCursor{}
|
cf.names["float"] = clangCursor{}
|
||||||
cf.names["double"] = clangCursor{}
|
cf.names["double"] = clangCursor{}
|
||||||
|
cf.names["_Bool"] = clangCursor{}
|
||||||
// Now read all the names (identifies) that C defines in the header
|
// Now read all the names (identifies) that C defines in the header
|
||||||
// snippet.
|
// snippet.
|
||||||
cf.readNames(p.cgoHeaders[i], cflagsForCGo, filepath.Base(fset.File(f.Pos()).Name()), func(names map[string]clangCursor) {
|
cf.readNames(p.cgoHeaders[i], cflagsForCGo, filepath.Base(fset.File(f.Pos()).Name()), func(names map[string]clangCursor) {
|
||||||
|
|
4
testdata/cgo/main.go
предоставленный
4
testdata/cgo/main.go
предоставленный
|
@ -9,6 +9,7 @@ int mul(int, int);
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#cgo CFLAGS: -DSOME_CONSTANT=17
|
#cgo CFLAGS: -DSOME_CONSTANT=17
|
||||||
#define someDefine -5 + 2 * 7
|
#define someDefine -5 + 2 * 7
|
||||||
|
bool someBool;
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
|
@ -56,6 +57,9 @@ func main() {
|
||||||
var goInt8 int8 = 5
|
var goInt8 int8 = 5
|
||||||
var _ C.int8_t = goInt8
|
var _ C.int8_t = goInt8
|
||||||
|
|
||||||
|
var _ bool = C.someBool
|
||||||
|
var _ C._Bool = C.someBool
|
||||||
|
|
||||||
// more globals
|
// more globals
|
||||||
println("bool:", C.globalBool, C.globalBool2 == true)
|
println("bool:", C.globalBool, C.globalBool2 == true)
|
||||||
println("float:", C.globalFloat)
|
println("float:", C.globalFloat)
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче