]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.regabi] go/types: must not import a package called "init"
authorRob Findley <rfindley@google.com>
Mon, 8 Feb 2021 23:24:13 +0000 (18:24 -0500)
committerRobert Findley <rfindley@google.com>
Tue, 9 Feb 2021 14:00:14 +0000 (14:00 +0000)
This is a port of CL 287494 to go/types. The additional checks in
test/fixedbugs are included, though they won't be executed by go/types.
Support for errorcheckdir checks will be added to go/types in a later
CL.

Change-Id: I37e202ea5daf7d7b8fc6ae93a4c4dbd11762480f
Reviewed-on: https://go-review.googlesource.com/c/go/+/290570
Reviewed-by: Robert Griesemer <gri@golang.org>
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Go Bot <gobot@golang.org>

src/go/types/resolver.go
src/go/types/testdata/importdecl0/importdecl0a.src
test/fixedbugs/issue43962.dir/a.go [new file with mode: 0644]
test/fixedbugs/issue43962.dir/b.go [new file with mode: 0644]
test/fixedbugs/issue43962.go [new file with mode: 0644]

index cb66871883d907f4c9bcaa117a28e1b47f75f186..47e165db368a14d14cfbe77f6094c7a7e9b48dc9 100644 (file)
@@ -252,14 +252,6 @@ func (check *Checker) collectObjects() {
                                        return
                                }
 
-                               // add package to list of explicit imports
-                               // (this functionality is provided as a convenience
-                               // for clients; it is not needed for type-checking)
-                               if !pkgImports[imp] {
-                                       pkgImports[imp] = true
-                                       pkg.imports = append(pkg.imports, imp)
-                               }
-
                                // local name overrides imported package name
                                name := imp.name
                                if d.spec.Name != nil {
@@ -269,10 +261,19 @@ func (check *Checker) collectObjects() {
                                                check.errorf(d.spec.Name, _ImportCRenamed, `cannot rename import "C"`)
                                                return
                                        }
-                                       if name == "init" {
-                                               check.errorf(d.spec.Name, _InvalidInitDecl, "cannot declare init - must be func")
-                                               return
-                                       }
+                               }
+
+                               if name == "init" {
+                                       check.errorf(d.spec.Name, _InvalidInitDecl, "cannot import package as init - init must be a func")
+                                       return
+                               }
+
+                               // add package to list of explicit imports
+                               // (this functionality is provided as a convenience
+                               // for clients; it is not needed for type-checking)
+                               if !pkgImports[imp] {
+                                       pkgImports[imp] = true
+                                       pkg.imports = append(pkg.imports, imp)
                                }
 
                                pkgName := NewPkgName(d.spec.Pos(), pkg, name, imp)
index e96fca3cdd56fa86cb284276e78412b3c5f296a8..5ceb96e1fada684387f20c56894810a772875de2 100644 (file)
@@ -10,7 +10,7 @@ import (
        // we can have multiple blank imports (was bug)
        _ "math"
        _ "net/rpc"
-       init /* ERROR "cannot declare init" */ "fmt"
+       init /* ERROR "cannot import package as init" */ "fmt"
        // reflect defines a type "flag" which shows up in the gc export data
        "reflect"
        . /* ERROR "imported but not used" */ "reflect"
diff --git a/test/fixedbugs/issue43962.dir/a.go b/test/fixedbugs/issue43962.dir/a.go
new file mode 100644 (file)
index 0000000..168b206
--- /dev/null
@@ -0,0 +1,5 @@
+// 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 init
diff --git a/test/fixedbugs/issue43962.dir/b.go b/test/fixedbugs/issue43962.dir/b.go
new file mode 100644 (file)
index 0000000..f55fea1
--- /dev/null
@@ -0,0 +1,7 @@
+// 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 b
+
+import "./a" // ERROR "cannot import package as init"
diff --git a/test/fixedbugs/issue43962.go b/test/fixedbugs/issue43962.go
new file mode 100644 (file)
index 0000000..dca4d07
--- /dev/null
@@ -0,0 +1,9 @@
+// errorcheckdir
+
+// 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.
+
+// Issue 43962: Importing a package called "init" is an error.
+
+package ignored