diff --git a/misc/cgo/test/issue28545.go b/misc/cgo/test/issue28545.go index 0410a166226..8419b89c0af 100644 --- a/misc/cgo/test/issue28545.go +++ b/misc/cgo/test/issue28545.go @@ -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) } diff --git a/misc/cgo/test/issue28772.go b/misc/cgo/test/issue28772.go new file mode 100644 index 00000000000..bed786bf306 --- /dev/null +++ b/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 diff --git a/src/cmd/cgo/ast.go b/src/cmd/cgo/ast.go index c342a017833..06058cb570d 100644 --- a/src/cmd/cgo/ast.go +++ b/src/cmd/cgo/ast.go @@ -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 } } } diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index fdd34f560fd..56a4775746c 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -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: diff --git a/src/cmd/cgo/main.go b/src/cmd/cgo/main.go index a317a1494d7..e28a57b1481 100644 --- a/src/cmd/cgo/main.go +++ b/src/cmd/cgo/main.go @@ -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 }