aboutsummaryrefslogtreecommitdiff
path: root/src/text/template/parse/parse_test.go
diff options
context:
space:
mode:
authorEli Bendersky <eliben@golang.org>2022-11-03 12:16:06 -0700
committerGopher Robot <gobot@golang.org>2022-11-04 12:56:08 +0000
commitd65c0593c4f1dd4a9b381cf654668aa27166b24e (patch)
tree3ba0cb0d0ad64441462a6c520aedac500558b283 /src/text/template/parse/parse_test.go
parent90b40c0496440fbd57538eb4ba303164ed923d93 (diff)
downloadgo-d65c0593c4f1dd4a9b381cf654668aa27166b24e.tar.xz
text/template/parse: fix interaction of break/continue keywords and functions
Fixes a bug that was introduced in CL 410414; in that CL, to avoid a race condition in the initialization of the lexer, the setting of the breakOK and continueOK options was moved to before Tree.funcs was populated from parameters. As a result, the parser missed the fact that 'break' and 'continue' were defined as functions. Following CL 421883 race conditions are no longer an issue, so the simplest fix is just to move the initialization where it was before - in startParse, after t.funcs has been set. Fixes #56538 Change-Id: I3b99fe9ad12255a4f6eb9a00eb3f64529ff055c0 Reviewed-on: https://go-review.googlesource.com/c/go/+/447775 Run-TryBot: Eli Bendersky‎ <eliben@golang.org> Auto-Submit: Eli Bendersky‎ <eliben@golang.org> Reviewed-by: Rob Pike <r@golang.org> Reviewed-by: Eli Bendersky <eliben@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@google.com>
Diffstat (limited to 'src/text/template/parse/parse_test.go')
-rw-r--r--src/text/template/parse/parse_test.go30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/text/template/parse/parse_test.go b/src/text/template/parse/parse_test.go
index f6a9fdd872..59e0a17412 100644
--- a/src/text/template/parse/parse_test.go
+++ b/src/text/template/parse/parse_test.go
@@ -391,6 +391,36 @@ func TestParseWithComments(t *testing.T) {
}
}
+func TestKeywordsAndFuncs(t *testing.T) {
+ // Check collisions between functions and new keywords like 'break'. When a
+ // break function is provided, the parser should treat 'break' as a function,
+ // not a keyword.
+ textFormat = "%q"
+ defer func() { textFormat = "%s" }()
+
+ inp := `{{range .X}}{{break 20}}{{end}}`
+ {
+ // 'break' is a defined function, don't treat it as a keyword: it should
+ // accept an argument successfully.
+ var funcsWithKeywordFunc = map[string]any{
+ "break": func(in any) any { return in },
+ }
+ tmpl, err := New("").Parse(inp, "", "", make(map[string]*Tree), funcsWithKeywordFunc)
+ if err != nil || tmpl == nil {
+ t.Errorf("with break func: unexpected error: %v", err)
+ }
+ }
+
+ {
+ // No function called 'break'; treat it as a keyword. Results in a parse
+ // error.
+ tmpl, err := New("").Parse(inp, "", "", make(map[string]*Tree), make(map[string]any))
+ if err == nil || tmpl != nil {
+ t.Errorf("without break func: expected error; got none")
+ }
+ }
+}
+
func TestSkipFuncCheck(t *testing.T) {
oldTextFormat := textFormat
textFormat = "%q"