From 82ac9ab83a47468046bda9bf6c4676a9695fae24 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 29 Sep 2021 10:50:18 -0700 Subject: [PATCH] text/template: check final value for short-circuit and/or There was a bug in the short-circuit code for and/or added in CL 321490: it ignored the value passed in by an earlier pipeline. For #31103 Change-Id: Ic31f4d7cedfe563ef968cbb712ecfb2413c42eb5 Reviewed-on: https://go-review.googlesource.com/c/go/+/353130 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Reviewed-by: Bryan C. Mills TryBot-Result: Go Bot --- src/text/template/exec.go | 5 ++++- src/text/template/exec_test.go | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/text/template/exec.go b/src/text/template/exec.go index e03920964e607..fce3b0abbf7d5 100644 --- a/src/text/template/exec.go +++ b/src/text/template/exec.go @@ -721,9 +721,12 @@ 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") { - break + return v } } + if final != missingVal { + v = s.validateType(final, argType) + } return v } diff --git a/src/text/template/exec_test.go b/src/text/template/exec_test.go index 93fd54e84dae7..a0432a588d089 100644 --- a/src/text/template/exec_test.go +++ b/src/text/template/exec_test.go @@ -485,6 +485,10 @@ var execTests = []execTest{ {"and short-circuit", "{{and 1 0 (die)}}", "0", nil, true}, {"or short-circuit2", "{{or 0 0 (die)}}", "", nil, false}, {"and short-circuit2", "{{and 1 1 (die)}}", "", nil, false}, + {"and pipe-true", "{{1 | and 1}}", "1", nil, true}, + {"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}, {"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},