Skip to content

Commit

Permalink
cmd/compile/internal/types2: tweaks to ArgumentError to be more idiom…
Browse files Browse the repository at this point in the history
…atic

This CL is a clean port of CL 351335 from go/types to types2.

Updates #47916

Change-Id: Idc377fb71d480a51d5e93a348f3a880346011974
Reviewed-on: https://go-review.googlesource.com/c/go/+/364535
Trust: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
  • Loading branch information
griesemer committed Nov 17, 2021
1 parent 3d7cb23 commit f384c70
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 14 deletions.
13 changes: 5 additions & 8 deletions src/cmd/compile/internal/types2/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,17 +55,14 @@ func (err Error) FullError() string {
return fmt.Sprintf("%s: %s", err.Pos, err.Full)
}

// An ArgumentError holds an error that is associated with an argument.
// An ArgumentError holds an error associated with an argument index.
type ArgumentError struct {
index int
error
Index int
Err error
}

// Index returns the positional index of the argument associated with the
// error.
func (e ArgumentError) Index() int {
return e.index
}
func (e *ArgumentError) Error() string { return e.Err.Error() }
func (e *ArgumentError) Unwrap() error { return e.Err }

// An Importer resolves import paths to Packages.
//
Expand Down
11 changes: 8 additions & 3 deletions src/cmd/compile/internal/types2/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package types2_test
import (
"bytes"
"cmd/compile/internal/syntax"
"errors"
"fmt"
"internal/testenv"
"reflect"
Expand Down Expand Up @@ -2002,9 +2003,13 @@ func TestInstantiateErrors(t *testing.T) {
t.Fatalf("Instantiate(%v, %v) returned nil error, want non-nil", T, test.targs)
}

gotAt := err.(ArgumentError).Index()
if gotAt != test.wantAt {
t.Errorf("Instantate(%v, %v): error at index %d, want index %d", T, test.targs, gotAt, test.wantAt)
var argErr *ArgumentError
if !errors.As(err, &argErr) {
t.Fatalf("Instantiate(%v, %v): error is not an *ArgumentError", T, test.targs)
}

if argErr.Index != test.wantAt {
t.Errorf("Instantate(%v, %v): error at index %d, want index %d", T, test.targs, argErr.Index, test.wantAt)
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions src/cmd/compile/internal/types2/instantiate.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ import (
// instances with the same identity.
//
// If verify is set and constraint satisfaction fails, the returned error may
// be of dynamic type ArgumentError indicating which type argument did not
// satisfy its corresponding type parameter constraint, and why.
// wrap an *ArgumentError indicating which type argument did not satisfy its
// corresponding type parameter constraint, and why.
//
// TODO(rfindley): change this function to also return an error if lengths of
// tparams and targs do not match.
Expand All @@ -42,7 +42,7 @@ func Instantiate(ctxt *Context, typ Type, targs []Type, validate bool) (Type, er
tparams = t.TypeParams().list()
}
if i, err := (*Checker)(nil).verify(nopos, tparams, targs); err != nil {
return inst, ArgumentError{i, err}
return inst, &ArgumentError{i, err}
}
}

Expand Down

0 comments on commit f384c70

Please sign in to comment.