From: Ian Lance Taylor Date: Tue, 5 Oct 2021 18:41:40 +0000 (-0700) Subject: text/template: only unwrap final and/or value X-Git-Tag: go1.18beta1~1037 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=8444a545e3d38c2e470df5035ef4b5a9365aaefc;p=gostls13.git text/template: only unwrap final and/or value In the last CL I missed the fact that except for the final value the code already unwraps the argument. For #31103 Change-Id: Ic9099aeb50c6b3322fc14a90ac8026c1d8cb1698 Reviewed-on: https://go-review.googlesource.com/c/go/+/354091 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Reviewed-by: Bryan C. Mills --- diff --git a/src/text/template/exec.go b/src/text/template/exec.go index 9a4c9e29dd..9ae6fdc3cc 100644 --- a/src/text/template/exec.go +++ b/src/text/template/exec.go @@ -728,13 +728,21 @@ func (s *state) evalCall(dot, fun reflect.Value, isBuiltin bool, node parse.Node for _, arg := range args { v = s.evalArg(dot, argType, arg).Interface().(reflect.Value) if truth(v) == (name == "or") { - return unwrap(v) + // This value was already unwrapped + // by the .Interface().(reflect.Value). + return v } } if final != missingVal { - v = s.validateType(final, argType) + // The last argument to and/or is coming from + // the pipeline. We didn't short circuit on an earlier + // argument, so we are going to return this one. + // We don't have to evaluate final, but we do + // have to check its type. Then, since we are + // going to return it, we have to unwrap it. + v = unwrap(s.validateType(final, argType)) } - return unwrap(v) + return v } // Build the arg list. diff --git a/src/text/template/exec_test.go b/src/text/template/exec_test.go index 1a839a641b..9c0772945e 100644 --- a/src/text/template/exec_test.go +++ b/src/text/template/exec_test.go @@ -489,6 +489,8 @@ var execTests = []execTest{ {"and pipe-false", "{{0 | and 1}}", "0", nil, true}, {"or pipe-true", "{{1 | or 0}}", "1", nil, true}, {"or pipe-false", "{{0 | or 0}}", "0", nil, true}, + {"and undef", "{{and 1 .Unknown}}", "", nil, true}, + {"or undef", "{{or 0 .Unknown}}", "", nil, true}, {"boolean if", "{{if and true 1 `hi`}}TRUE{{else}}FALSE{{end}}", "TRUE", tVal, true}, {"boolean if not", "{{if and true 1 `hi` | not}}TRUE{{else}}FALSE{{end}}", "FALSE", nil, true}, {"boolean if pipe", "{{if true | not | and 1}}TRUE{{else}}FALSE{{end}}", "FALSE", nil, true},