Closed
Description
The following program crashes with a panic:
package main
import (
"errors"
"text/template"
"io/ioutil"
)
func main() {
data := "{{0i|printf}}"
t, err := template.New("foo").Funcs(funcs).Parse(string(data))
if err != nil {
if t != nil {
panic("non nil template on error")
}
return
}
d := &Data{
A: 42,
B: "foo",
C: []int{1, 2, 3},
D: map[int]string{1: "foo", 2: "bar"},
E: Data1{42, "foo"},
}
t.Execute(ioutil.Discard, d)
return
}
type Data struct {
A int
B string
C []int
D map[int]string
E Data1
}
type Data1 struct {
A int
B string
}
func (Data1) Q() string {
return "foo"
}
func (Data1) W() (string, error) {
return "foo", nil
}
func (Data1) E() (string, error) {
return "foo", errors.New("Data.E error")
}
func (Data1) R(v int) (string, error) {
return "foo", nil
}
func (Data1) T(s string) (string, error) {
return s, nil
}
var funcs = map[string]interface{}{
"Q": func1,
"W": func2,
"E": func3,
"R": func4,
"T": func5,
"Y": func6,
"U": func7,
"I": func8,
}
func func1(s string) string {
return s
}
func func2(s string) (string, error) {
return s, nil
}
func func3(s string) (string, error) {
return s, errors.New("func3 error")
}
func func4(v int) int {
return v
}
func func5(v int) (int, error) {
return v, nil
}
func func6() int {
return 42
}
func func7() (int, error) {
return 42, nil
}
func func8() (int, error) {
return 42, errors.New("func8 error")
}
panic: reflect: Call using complex128 as type string [recovered]
panic: reflect: Call using complex128 as type string
goroutine 1 [running]:
text/template.errRecover(0xc208041ee8)
src/text/template/exec.go:104 +0x146
reflect.Value.call(0x52db60, 0x5bbe98, 0x13, 0x56c8f0, 0x4, 0xc20800e440, 0x1, 0x1, 0x0, 0x0, ...)
src/reflect/value.go:369 +0x74d
reflect.Value.Call(0x52db60, 0x5bbe98, 0x13, 0xc20800e440, 0x1, 0x1, 0x0, 0x0, 0x0)
src/reflect/value.go:300 +0xb4
text/template.(*state).evalCall(0xc208041e78, 0x4f8500, 0xc208012230, 0x16, 0x52db60, 0x5bbe98, 0x13, 0x7f702f59a350, 0xc2080145a0, 0x5828d5, ...)
src/text/template/exec.go:592 +0xb04
text/template.(*state).evalFunction(0xc208041e78, 0x4f8500, 0xc208012230, 0x16, 0xc2080145d0, 0x7f702f59a350, 0xc2080145a0, 0xc20800a500, 0x1, 0x1, ...)
src/text/template/exec.go:473 +0x340
text/template.(*state).evalCommand(0xc208041e78, 0x4f8500, 0xc208012230, 0x16, 0xc2080145a0, 0x505840, 0xc20800a520, 0x50, 0x0, 0x0, ...)
src/text/template/exec.go:370 +0x1ec
text/template.(*state).evalPipeline(0xc208041e78, 0x4f8500, 0xc208012230, 0x16, 0xc2080121e0, 0x505840, 0xc20800a520, 0x50)
src/text/template/exec.go:343 +0x183
text/template.(*state).walk(0xc208041e78, 0x4f8500, 0xc208012230, 0x16, 0x7f702f59a278, 0xc208014600)
src/text/template/exec.go:178 +0x138
text/template.(*state).walk(0xc208041e78, 0x4f8500, 0xc208012230, 0x16, 0x7f702f59a2c0, 0xc208014540)
src/text/template/exec.go:186 +0x779
text/template.(*Template).Execute(0xc208010440, 0x7f702f59a1c0, 0xc20800a490, 0x4f8500, 0xc208012230, 0x0, 0x0)
src/text/template/exec.go:141 +0x406
main.main()
template.go:25 +0x35d
on commit 8017ace