diff options
| author | Andrew Gerrand <adg@golang.org> | 2016-04-08 15:39:32 +1000 |
|---|---|---|
| committer | Andrew Gerrand <adg@golang.org> | 2016-04-10 23:29:29 +0000 |
| commit | 0fd270ab7abec08c050f29a3bbeb83d7740d0a47 (patch) | |
| tree | 8d2ea49e642531c814249dd6ad1f3d077f58fc5e /src/text/template/exec.go | |
| parent | 0004f34cefcdaad13a5131e3494fb2ff04877cd2 (diff) | |
| download | go-0fd270ab7abec08c050f29a3bbeb83d7740d0a47.tar.xz | |
text/template: emit field error over nil pointer error where appropriate
When evaluating "{{.MissingField}}" on a nil *T, Exec returns
"can't evaluate field MissingField in type *T" instead of
"nil pointer evaluating *T.MissingField".
Fixes golang/go#15125
Change-Id: I6e73f61b8a72c694179c1f8cdc808766c90b6f57
Reviewed-on: https://go-review.googlesource.com/21705
Reviewed-by: Rob Pike <r@golang.org>
Diffstat (limited to 'src/text/template/exec.go')
| -rw-r--r-- | src/text/template/exec.go | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/text/template/exec.go b/src/text/template/exec.go index a169e62ab0..22881c6852 100644 --- a/src/text/template/exec.go +++ b/src/text/template/exec.go @@ -538,14 +538,14 @@ func (s *state) evalField(dot reflect.Value, fieldName string, node parse.Node, return s.evalCall(dot, method, node, fieldName, args, final) } hasArgs := len(args) > 1 || final.IsValid() - // It's not a method; must be a field of a struct or an element of a map. The receiver must not be nil. - if isNil { - s.errorf("nil pointer evaluating %s.%s", typ, fieldName) - } + // It's not a method; must be a field of a struct or an element of a map. switch receiver.Kind() { case reflect.Struct: tField, ok := receiver.Type().FieldByName(fieldName) if ok { + if isNil { + s.errorf("nil pointer evaluating %s.%s", typ, fieldName) + } field := receiver.FieldByIndex(tField.Index) if tField.PkgPath != "" { // field is unexported s.errorf("%s is an unexported field of struct type %s", fieldName, typ) @@ -556,8 +556,10 @@ func (s *state) evalField(dot reflect.Value, fieldName string, node parse.Node, } return field } - s.errorf("%s is not a field of struct type %s", fieldName, typ) case reflect.Map: + if isNil { + s.errorf("nil pointer evaluating %s.%s", typ, fieldName) + } // If it's a map, attempt to use the field name as a key. nameVal := reflect.ValueOf(fieldName) if nameVal.Type().AssignableTo(receiver.Type().Key()) { |
