mirror of
https://github.com/golang/go
synced 2024-11-11 19:41:36 -07:00
cmd/cgo: update to handle ast.IndexListExpr
Allows cgo to work with generics. Updates #47781. Change-Id: Id1a5d1a0a8193c5b157e3e671b1490d687d10384 Reviewed-on: https://go-review.googlesource.com/c/go/+/353882 Trust: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
be571a36c7
commit
019ad98b53
17
misc/cgo/test/typeparam.go
Normal file
17
misc/cgo/test/typeparam.go
Normal file
@ -0,0 +1,17 @@
|
||||
// Copyright 2021 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 cgotest
|
||||
|
||||
// #include <stddef.h>
|
||||
import "C"
|
||||
|
||||
func generic[T, U any](t T, u U) {}
|
||||
|
||||
func useGeneric() {
|
||||
const zero C.size_t = 0
|
||||
|
||||
generic(zero, zero)
|
||||
generic[C.size_t, C.size_t](0, 0)
|
||||
}
|
@ -8,4 +8,4 @@
|
||||
// directory.)
|
||||
module misc
|
||||
|
||||
go 1.12
|
||||
go 1.18
|
||||
|
@ -338,8 +338,7 @@ func (f *File) walk(x interface{}, context astContext, visit func(*File, interfa
|
||||
|
||||
// everything else just recurs
|
||||
default:
|
||||
error_(token.NoPos, "unexpected type %T in walk", x)
|
||||
panic("unexpected type")
|
||||
f.walkUnexpected(x, context, visit)
|
||||
|
||||
case nil:
|
||||
|
||||
|
17
src/cmd/cgo/ast_go1.go
Normal file
17
src/cmd/cgo/ast_go1.go
Normal file
@ -0,0 +1,17 @@
|
||||
// Copyright 2021 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.
|
||||
|
||||
//go:build !go1.18
|
||||
// +build !go1.18
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"go/token"
|
||||
)
|
||||
|
||||
func (f *File) walkUnexpected(x interface{}, context astContext, visit func(*File, interface{}, astContext)) {
|
||||
error_(token.NoPos, "unexpected type %T in walk", x)
|
||||
panic("unexpected type")
|
||||
}
|
25
src/cmd/cgo/ast_go118.go
Normal file
25
src/cmd/cgo/ast_go118.go
Normal file
@ -0,0 +1,25 @@
|
||||
// Copyright 2021 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.
|
||||
|
||||
//go:build go1.18
|
||||
// +build go1.18
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"go/ast"
|
||||
"go/token"
|
||||
)
|
||||
|
||||
func (f *File) walkUnexpected(x interface{}, context astContext, visit func(*File, interface{}, astContext)) {
|
||||
switch n := x.(type) {
|
||||
default:
|
||||
error_(token.NoPos, "unexpected type %T in walk", x)
|
||||
panic("unexpected type")
|
||||
|
||||
case *ast.IndexListExpr:
|
||||
f.walk(&n.X, ctxExpr, visit)
|
||||
f.walk(n.Indices, ctxExpr, visit)
|
||||
}
|
||||
}
|
@ -1506,7 +1506,7 @@ func (p *Package) rewriteName(f *File, r *Ref, addPosition bool) ast.Expr {
|
||||
Args: []ast.Expr{getNewIdent(name.Mangle)},
|
||||
}
|
||||
case "type":
|
||||
// Okay - might be new(T)
|
||||
// Okay - might be new(T), T(x), Generic[T], etc.
|
||||
if r.Name.Type == nil {
|
||||
error_(r.Pos(), "expression C.%s: undefined C type '%s'", fixGo(r.Name.Go), r.Name.C)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user