mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/cgo: recognize untyped constants defined in different files
An untyped constant can be defined in any input file, we shouldn't segregate them by file. Updates #28772 Change-Id: I0347f15236833bb511eb49f86c449ee9241b0a25 Reviewed-on: https://go-review.googlesource.com/c/151600 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Andrew Bonventre <andybons@golang.org>
This commit is contained in:
parent
048580d341
commit
4f26f24d2a
5 changed files with 18 additions and 5 deletions
|
|
@ -22,5 +22,5 @@ const issue28772Constant = C.issue28772Constant
|
|||
func issue28545G(p **C.char) {
|
||||
C.issue28545F(p, -1, (0))
|
||||
C.issue28545F(p, 2+3, complex(1, 1))
|
||||
C.issue28545F(p, issue28772Constant, (0))
|
||||
C.issue28545F(p, issue28772Constant, issue28772Constant2)
|
||||
}
|
||||
|
|
|
|||
12
misc/cgo/test/issue28772.go
Normal file
12
misc/cgo/test/issue28772.go
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
// Copyright 2018 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
|
||||
|
||||
// Constants didn't work if defined in different source file.
|
||||
|
||||
// #define issue28772Constant2 2
|
||||
import "C"
|
||||
|
||||
const issue28772Constant2 = C.issue28772Constant2
|
||||
|
|
@ -66,7 +66,6 @@ func (f *File) ParseGo(name string, src []byte) {
|
|||
f.Package = ast1.Name.Name
|
||||
f.Name = make(map[string]*Name)
|
||||
f.NamePos = make(map[*Name]token.Pos)
|
||||
f.Consts = make(map[string]bool)
|
||||
|
||||
// In ast1, find the import "C" line and get any extra C preamble.
|
||||
sawC := false
|
||||
|
|
@ -198,7 +197,7 @@ func (f *File) saveExprs(x interface{}, context astContext) {
|
|||
vs := spec.(*ast.ValueSpec)
|
||||
if vs.Type == nil {
|
||||
for _, name := range spec.(*ast.ValueSpec).Names {
|
||||
f.Consts[name.Name] = true
|
||||
consts[name.Name] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1233,7 +1233,7 @@ func (p *Package) isConst(f *File, x ast.Expr) bool {
|
|||
strings.HasPrefix(x.Name, "_Ciconst_") ||
|
||||
strings.HasPrefix(x.Name, "_Cfconst_") ||
|
||||
strings.HasPrefix(x.Name, "_Csconst_") ||
|
||||
f.Consts[x.Name]
|
||||
consts[x.Name]
|
||||
case *ast.UnaryExpr:
|
||||
return p.isConst(f, x.X)
|
||||
case *ast.BinaryExpr:
|
||||
|
|
|
|||
|
|
@ -62,9 +62,11 @@ type File struct {
|
|||
Name map[string]*Name // map from Go name to Name
|
||||
NamePos map[*Name]token.Pos // map from Name to position of the first reference
|
||||
Edit *edit.Buffer
|
||||
Consts map[string]bool // untyped constants
|
||||
}
|
||||
|
||||
// Untyped constants in the current package.
|
||||
var consts = make(map[string]bool)
|
||||
|
||||
func (f *File) offset(p token.Pos) int {
|
||||
return fset.Position(p).Offset
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue