aboutsummaryrefslogtreecommitdiff
path: root/src/text/template
diff options
context:
space:
mode:
Diffstat (limited to 'src/text/template')
-rw-r--r--src/text/template/exec.go11
-rw-r--r--src/text/template/exec_test.go6
2 files changed, 16 insertions, 1 deletions
diff --git a/src/text/template/exec.go b/src/text/template/exec.go
index 97c9d1f574..f9bc5d980c 100644
--- a/src/text/template/exec.go
+++ b/src/text/template/exec.go
@@ -496,20 +496,29 @@ func (s *state) idealConstant(constant *parse.NumberNode) reflect.Value {
switch {
case constant.IsComplex:
return reflect.ValueOf(constant.Complex128) // incontrovertible.
- case constant.IsFloat && !isHexInt(constant.Text) && strings.ContainsAny(constant.Text, ".eEpP"):
+
+ case constant.IsFloat &&
+ !isHexInt(constant.Text) && !isRuneInt(constant.Text) &&
+ strings.ContainsAny(constant.Text, ".eEpP"):
return reflect.ValueOf(constant.Float64)
+
case constant.IsInt:
n := int(constant.Int64)
if int64(n) != constant.Int64 {
s.errorf("%s overflows int", constant.Text)
}
return reflect.ValueOf(n)
+
case constant.IsUint:
s.errorf("%s overflows int", constant.Text)
}
return zero
}
+func isRuneInt(s string) bool {
+ return len(s) > 0 && s[0] == '\''
+}
+
func isHexInt(s string) bool {
return len(s) > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X') && !strings.ContainsAny(s, "pP")
}
diff --git a/src/text/template/exec_test.go b/src/text/template/exec_test.go
index 7f2305ace0..f24a59e549 100644
--- a/src/text/template/exec_test.go
+++ b/src/text/template/exec_test.go
@@ -663,6 +663,12 @@ var execTests = []execTest{
{"bug17c", "{{len .NonEmptyInterfacePtS}}", "2", tVal, true},
{"bug17d", "{{index .NonEmptyInterfacePtS 0}}", "a", tVal, true},
{"bug17e", "{{range .NonEmptyInterfacePtS}}-{{.}}-{{end}}", "-a--b-", tVal, true},
+
+ // More variadic function corner cases. Some runes would get evaluated
+ // as constant floats instead of ints. Issue 34483.
+ {"bug18a", "{{eq . '.'}}", "true", '.', true},
+ {"bug18b", "{{eq . 'e'}}", "true", 'e', true},
+ {"bug18c", "{{eq . 'P'}}", "true", 'P', true},
}
func zeroArgs() string {