runtime: slightly better error message for assertion panics with identical looking types

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>
This commit is contained in:
Robert Griesemer 2018-06-04 16:32:07 -07:00
parent b219a68ad9
commit 75c1aed345
4 changed files with 41 additions and 1 deletions

View 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

View file

@ -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 }{}

View file

@ -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 })
}

View file

@ -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