]> Cypherpunks repositories - gostls13.git/commitdiff
text/template: type-check chained node as argument
authorRob Pike <r@golang.org>
Tue, 23 Sep 2014 00:48:13 +0000 (17:48 -0700)
committerRob Pike <r@golang.org>
Tue, 23 Sep 2014 00:48:13 +0000 (17:48 -0700)
Was just a missing case (literally) in the type checker.

Fixes #8473.

LGTM=adg
R=golang-codereviews, adg
CC=golang-codereviews
https://golang.org/cl/142460043

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

index 8e155d478ecd17c91a5eb94213b46c68e8a12ed1..f6eed662b7c807b34fd10476a89fc8a0a70c6ad7 100644 (file)
@@ -636,6 +636,8 @@ func (s *state) evalArg(dot reflect.Value, typ reflect.Type, n parse.Node) refle
                return s.validateType(s.evalPipeline(dot, arg), typ)
        case *parse.IdentifierNode:
                return s.evalFunction(dot, arg, arg, nil, zero)
+       case *parse.ChainNode:
+               return s.validateType(s.evalChainNode(dot, arg, nil, zero), typ)
        }
        switch typ.Kind() {
        case reflect.Bool:
index 3bffcc1599a2cb70cdb5e6b600c5b8322b89d6a4..e2cf2d370574c3829670ca0b4b371f8cfe4c9632 100644 (file)
@@ -176,6 +176,12 @@ func (t *T) Method3(v interface{}) string {
        return fmt.Sprintf("Method3: %v", v)
 }
 
+func (t *T) Copy() *T {
+       n := new(T)
+       *n = *t
+       return n
+}
+
 func (t *T) MAdd(a int, b []int) []int {
        v := make([]int, len(b))
        for i, x := range b {
@@ -519,6 +525,8 @@ var execTests = []execTest{
        {"bug12xE", "{{printf `%T` 0xEE}}", "int", T{}, true},
        {"bug12Xe", "{{printf `%T` 0Xef}}", "int", T{}, true},
        {"bug12XE", "{{printf `%T` 0XEE}}", "int", T{}, true},
+       // Chained nodes did not work as arguments. Issue 8473.
+       {"bug13", "{{print (.Copy).I}}", "17", tVal, true},
 }
 
 func zeroArgs() string {