aboutsummaryrefslogtreecommitdiff
path: root/src/text
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2021-10-05 11:41:40 -0700
committerIan Lance Taylor <iant@golang.org>2021-10-05 21:22:16 +0000
commit8444a545e3d38c2e470df5035ef4b5a9365aaefc (patch)
treec2bc6a8dbca193af6b2327829116da9a963f426c /src/text
parent55e7f7e12d46292e130a3b48c86bac2a6e5a1739 (diff)
downloadgo-8444a545e3d38c2e470df5035ef4b5a9365aaefc.tar.gz
go-8444a545e3d38c2e470df5035ef4b5a9365aaefc.zip
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 <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Bryan C. Mills <bcmills@google.com>
Diffstat (limited to 'src/text')
-rw-r--r--src/text/template/exec.go14
-rw-r--r--src/text/template/exec_test.go2
2 files changed, 13 insertions, 3 deletions
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}}", "<no value>", nil, true},
+ {"or undef", "{{or 0 .Unknown}}", "<no value>", 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},