]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: better error for embedded field referring to missing import
authorRobert Griesemer <gri@golang.org>
Tue, 23 Oct 2018 23:01:43 +0000 (16:01 -0700)
committerRobert Griesemer <gri@golang.org>
Wed, 24 Oct 2018 20:08:18 +0000 (20:08 +0000)
Fixes #27938.

Change-Id: I16263ac6c0b8903b8a16f02e8db0e1a16d1c95b4
Reviewed-on: https://go-review.googlesource.com/c/144261
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/noder.go
test/fixedbugs/issue27938.go [new file with mode: 0644]

index 8a42fcefd1f2e548b110847ee03924993e087bfb..135377c9e23ac1bca698998ee427cb910a368509 100644 (file)
@@ -819,13 +819,18 @@ func (p *noder) packname(expr syntax.Expr) *types.Sym {
                return name
        case *syntax.SelectorExpr:
                name := p.name(expr.X.(*syntax.Name))
+               def := asNode(name.Def)
+               if def == nil {
+                       yyerror("undefined: %v", name)
+                       return name
+               }
                var pkg *types.Pkg
-               if asNode(name.Def) == nil || asNode(name.Def).Op != OPACK {
+               if def.Op != OPACK {
                        yyerror("%v is not a package", name)
                        pkg = localpkg
                } else {
-                       asNode(name.Def).Name.SetUsed(true)
-                       pkg = asNode(name.Def).Name.Pkg
+                       def.Name.SetUsed(true)
+                       pkg = def.Name.Pkg
                }
                return restrictlookup(expr.Sel.Value, pkg)
        }
diff --git a/test/fixedbugs/issue27938.go b/test/fixedbugs/issue27938.go
new file mode 100644 (file)
index 0000000..b0007be
--- /dev/null
@@ -0,0 +1,23 @@
+// errorcheck
+
+// 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.
+
+// Verify that we get a single non-confusing error
+// message for embedded fields/interfaces that use
+// a qualified identifier with non-existing package.
+
+package p
+
+type _ struct {
+       F sync.Mutex // ERROR "undefined: sync"
+}
+
+type _ struct {
+       sync.Mutex // ERROR "undefined: sync"
+}
+
+type _ interface {
+       sync.Mutex // ERROR "undefined: sync"
+}