]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: slightly better error message for assertion panics with identical looking...
authorRobert Griesemer <gri@golang.org>
Mon, 4 Jun 2018 23:32:07 +0000 (16:32 -0700)
committerRobert Griesemer <gri@golang.org>
Tue, 5 Jun 2018 00:29:50 +0000 (00:29 +0000)
Fixes #18911.

Change-Id: Ice10f37460a4f0a66cddeacfe26c28045f5e60fe
Reviewed-on: https://go-review.googlesource.com/116255
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/runtime/error.go
test/fixedbugs/issue18911.dir/a.go [new file with mode: 0644]
test/fixedbugs/issue18911.dir/b.go [new file with mode: 0644]
test/fixedbugs/issue18911.go [new file with mode: 0644]

index 4b6fb32b78f5b26295ed75bfb37ea454e52da4f3..1f77c0a0b56855b2561971148e2f6d2c4022a282 100644 (file)
@@ -36,8 +36,13 @@ func (e *TypeAssertionError) Error() string {
                return "interface conversion: " + inter + " is nil, not " + e.assertedString
        }
        if e.missingMethod == "" {
-               return "interface conversion: " + inter + " is " + e.concreteString +
+               msg := "interface conversion: " + inter + " is " + e.concreteString +
                        ", not " + e.assertedString
+               if e.concreteString == e.assertedString {
+                       // provide slightly clearer error message
+                       msg += " (types from different packages)"
+               }
+               return msg
        }
        return "interface conversion: " + e.concreteString + " is not " + e.assertedString +
                ": missing method " + e.missingMethod
diff --git a/test/fixedbugs/issue18911.dir/a.go b/test/fixedbugs/issue18911.dir/a.go
new file mode 100644 (file)
index 0000000..d2221e7
--- /dev/null
@@ -0,0 +1,7 @@
+// 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 a
+
+var X interface{} = struct{ x int }{}
diff --git a/test/fixedbugs/issue18911.dir/b.go b/test/fixedbugs/issue18911.dir/b.go
new file mode 100644 (file)
index 0000000..da2388b
--- /dev/null
@@ -0,0 +1,21 @@
+// 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 main
+
+import "./a"
+import "strings"
+
+func main() {
+       defer func() {
+               p, ok := recover().(error)
+               if ok && strings.Contains(p.Error(), "different packages") {
+                       return
+               }
+               panic(p)
+       }()
+
+       // expected to fail and report two identical looking (but different) types
+       _ = a.X.(struct{ x int })
+}
diff --git a/test/fixedbugs/issue18911.go b/test/fixedbugs/issue18911.go
new file mode 100644 (file)
index 0000000..8bf34a3
--- /dev/null
@@ -0,0 +1,7 @@
+// rundir
+
+// 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 ignore