Skip to content

Commit

Permalink
cmd/cgo: update to handle ast.IndexListExpr
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
mdempsky committed Oct 7, 2021
1 parent be571a3 commit 019ad98
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 4 deletions.
17 changes: 17 additions & 0 deletions misc/cgo/test/typeparam.go
Original file line number Diff line number Diff line change
@@ -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)
}
2 changes: 1 addition & 1 deletion misc/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
// directory.)
module misc

go 1.12
go 1.18
3 changes: 1 addition & 2 deletions src/cmd/cgo/ast.go
Original file line number Diff line number Diff line change
Expand Up @@ -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:

Expand Down
17 changes: 17 additions & 0 deletions src/cmd/cgo/ast_go1.go
Original file line number Diff line number Diff line change
@@ -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 changes: 25 additions & 0 deletions src/cmd/cgo/ast_go118.go
Original file line number Diff line number Diff line change
@@ -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)
}
}
2 changes: 1 addition & 1 deletion src/cmd/cgo/gcc.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down

0 comments on commit 019ad98

Please sign in to comment.