Skip to content

Commit

Permalink
cmd/cgo: recognize untyped constants defined in different files
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
ianlancetaylor committed Nov 29, 2018
1 parent 048580d commit 4f26f24
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 5 deletions.
2 changes: 1 addition & 1 deletion misc/cgo/test/issue28545.go
Expand Up @@ -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 changes: 12 additions & 0 deletions misc/cgo/test/issue28772.go
@@ -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
3 changes: 1 addition & 2 deletions src/cmd/cgo/ast.go
Expand Up @@ -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
Expand Down Expand Up @@ -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
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/cmd/cgo/gcc.go
Expand Up @@ -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:
Expand Down
4 changes: 3 additions & 1 deletion src/cmd/cgo/main.go
Expand Up @@ -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
}
Expand Down

0 comments on commit 4f26f24

Please sign in to comment.