]> Cypherpunks.ru repositories - gostls13.git/commitdiff
text/template: check final value for short-circuit and/or
authorIan Lance Taylor <iant@golang.org>
Wed, 29 Sep 2021 17:50:18 +0000 (10:50 -0700)
committerIan Lance Taylor <iant@golang.org>
Wed, 29 Sep 2021 18:38:00 +0000 (18:38 +0000)
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 <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Go Bot <gobot@golang.org>

src/text/template/exec.go
src/text/template/exec_test.go

index e03920964e607a99914292c4ea70dd1ab9e9f6b5..fce3b0abbf7d50eaf9fe4b6d394d6e3b55bc6a46 100644 (file)
@@ -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
        }
 
index 93fd54e84dae7fe86c83ff660dfa2f972377c25f..a0432a588d08915163484d53d2413265ad756e68 100644 (file)
@@ -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},