https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100388

            Bug ID: 100388
           Summary: import seems to define identifiers in package block
                    not file block
           Product: gcc
           Version: 10.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: go
          Assignee: ian at airs dot com
          Reporter: ben.hutchings at essensium dot com
                CC: cmang at google dot com
  Target Milestone: ---

Given a package made of these two files:

$ cat a.go
package main

import (
        copy "golang.org/x/sys/unix"
)

func Getuid() int {
        return copy.Getuid()
}
$ cat b.go
package main

func main() {
        foo := make([]string, 1)
        bar := make([]string, 1)
        copy(bar, foo)
}

gccgo seems to treat the imported "copy" as defined at package scope, shadowing
the global "copy":

$ go build .
# _/home/bwh/tmp/gotest
./b.go:6:2: error: ‘copy’ defined as both imported name and global name
    6 |  copy(bar, foo)
      |  ^
./a.go:4:2: note: ‘copy’ imported here
    4 |  copy "golang.org/x/sys/unix"
      |  ^

I'm seeing this with the Debian package of gccgo, version 10.2.1-6.

gc (again from a Debian package, version 1.15.9-1) does not report an error.

The Go Programming Language spec says that import declares names in the "file
block" which seems to mean it should not affect any other source file. But I am
a Go novice, so I might be misinterpreting this.

Reply via email to