compiler: better error messages for missing interface method
authorIan Lance Taylor <iant@golang.org>
Sat, 28 Nov 2020 20:41:06 +0000 (12:41 -0800)
committerIan Lance Taylor <iant@golang.org>
Mon, 30 Nov 2020 20:03:25 +0000 (12:03 -0800)
For golang/go#10700

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/273886

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/types.cc
gcc/testsuite/go.test/test/fixedbugs/bug340.go

index c14a10f1265411bd2ce83f51d5ebc1d01133224b..af4d0526b2f67e8cf97cf3dbee374ba6f76ccdce 100644 (file)
@@ -1,4 +1,4 @@
-534fb907c821b052dc430330708d7fa555b91fe3
+68b1c7659a6b25d537a4ff3365ab070fa6215b0b
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 286ecc16366f29bf22797943ffe4934adfecc89c..23d1647c1fadafc21b7b5d72d383fe71e4aa5b66 100644 (file)
@@ -12052,6 +12052,15 @@ Type::bind_field_or_method(Gogo* gogo, const Type* type, Expression* expr,
                    ambig2.c_str());
       else if (found_pointer_method)
        go_error_at(location, "method requires a pointer receiver");
+      else if (it != NULL && it->is_empty())
+       go_error_at(location,
+                   "reference to method %qs in interface with no methods",
+                   Gogo::message_name(name).c_str());
+      else if (it == NULL && type->deref()->interface_type() != NULL)
+       go_error_at(location,
+                   ("reference to method %qs in type that is "
+                    "pointer to interface, not interface"),
+                   Gogo::message_name(name).c_str());
       else if (nt == NULL && st == NULL && it == NULL)
        go_error_at(location,
                    ("reference to field %qs in object which "
index d996ab64cd4fcfa73e944f7d9c4cd3170033437b..8c543c98d97e3b5299e1747a96b6a8f6de4880ef 100644 (file)
@@ -1,6 +1,6 @@
 // errorcheck
 
-// Copyright 2011 The Go Authors.  All rights reserved.
+// Copyright 2011 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.
 
@@ -12,6 +12,6 @@ func main() {
        var x interface{}
        switch t := x.(type) {
        case 0:         // ERROR "type"
-               t.x = 1 // ERROR "type interface \{\}|reference to undefined field or method"
+               t.x = 1 // ERROR "type interface \{\}|reference to undefined field or method|interface with no methods"
        }
 }