diff --git a/src/text/template/exec.go b/src/text/template/exec.go index 37984cf91a0..66cb535c47f 100644 --- a/src/text/template/exec.go +++ b/src/text/template/exec.go @@ -94,6 +94,12 @@ type missingValType struct{} var missingVal = reflect.ValueOf(missingValType{}) +var missingValReflectType = reflect.TypeOf(missingValType{}) + +func isMissing(v reflect.Value) bool { + return v.IsValid() && v.Type() == missingValReflectType +} + // at marks the state to be on node n, for error reporting. func (s *state) at(node parse.Node) { s.node = node @@ -471,7 +477,7 @@ func (s *state) evalPipeline(dot reflect.Value, pipe *parse.PipeNode) (value ref } func (s *state) notAFunction(args []parse.Node, final reflect.Value) { - if len(args) > 1 || final != missingVal { + if len(args) > 1 || !isMissing(final) { s.errorf("can't give argument to non-function %s", args[0]) } } @@ -629,7 +635,7 @@ func (s *state) evalField(dot reflect.Value, fieldName string, node parse.Node, if method := ptr.MethodByName(fieldName); method.IsValid() { return s.evalCall(dot, method, false, node, fieldName, args, final) } - hasArgs := len(args) > 1 || final != missingVal + hasArgs := len(args) > 1 || !isMissing(final) // It's not a method; must be a field of a struct or an element of a map. switch receiver.Kind() { case reflect.Struct: @@ -700,7 +706,7 @@ func (s *state) evalCall(dot, fun reflect.Value, isBuiltin bool, node parse.Node } typ := fun.Type() numIn := len(args) - if final != missingVal { + if !isMissing(final) { numIn++ } numFixed := len(args) @@ -763,7 +769,7 @@ func (s *state) evalCall(dot, fun reflect.Value, isBuiltin bool, node parse.Node } } // Add final value if necessary. - if final != missingVal { + if !isMissing(final) { t := typ.In(typ.NumIn() - 1) if typ.IsVariadic() { if numIn-1 < numFixed { diff --git a/src/text/template/funcs.go b/src/text/template/funcs.go index 390d47ebbb6..42bb529e509 100644 --- a/src/text/template/funcs.go +++ b/src/text/template/funcs.go @@ -438,7 +438,7 @@ func basicKind(v reflect.Value) (kind, error) { // isNil returns true if v is the zero reflect.Value, or nil of its type. func isNil(v reflect.Value) bool { - if v == zero { + if !v.IsValid() { return true } switch v.Kind() {