diff options
author | synergydev <synergye@codefi.re> | 2013-10-17 18:16:42 -0700 |
---|---|---|
committer | synergydev <synergye@codefi.re> | 2013-10-17 18:16:42 -0700 |
commit | 61c0330cc243abf13fdd01f377a7f80bd3989eb1 (patch) | |
tree | 119b08ae76294f23e2b1b7e72ff9a06afa9e8509 /gcc-4.8/libgo/go/text | |
parent | 1c712bf7621f3859c33fd3afaa61fdcaf3fdfd76 (diff) | |
download | toolchain_gcc-61c0330cc243abf13fdd01f377a7f80bd3989eb1.tar.gz toolchain_gcc-61c0330cc243abf13fdd01f377a7f80bd3989eb1.tar.bz2 toolchain_gcc-61c0330cc243abf13fdd01f377a7f80bd3989eb1.zip |
[4.8] Merge GCC 4.8.2
Change-Id: I0f1fcf69c5076d8534c5c45562745e1a37adb197
Diffstat (limited to 'gcc-4.8/libgo/go/text')
-rw-r--r-- | gcc-4.8/libgo/go/text/template/exec.go | 20 | ||||
-rw-r--r-- | gcc-4.8/libgo/go/text/template/exec_test.go | 64 | ||||
-rw-r--r-- | gcc-4.8/libgo/go/text/template/funcs.go | 2 | ||||
-rw-r--r-- | gcc-4.8/libgo/go/text/template/parse/parse.go | 2 |
4 files changed, 74 insertions, 14 deletions
diff --git a/gcc-4.8/libgo/go/text/template/exec.go b/gcc-4.8/libgo/go/text/template/exec.go index b9c03d8f0..8ec8174a1 100644 --- a/gcc-4.8/libgo/go/text/template/exec.go +++ b/gcc-4.8/libgo/go/text/template/exec.go @@ -5,6 +5,7 @@ package template import ( + "bytes" "fmt" "io" "reflect" @@ -125,8 +126,23 @@ func (t *Template) Execute(wr io.Writer, data interface{}) (err error) { wr: wr, vars: []variable{{"$", value}}, } + t.init() if t.Tree == nil || t.Root == nil { - state.errorf("%q is an incomplete or empty template", t.name) + var b bytes.Buffer + for name, tmpl := range t.tmpl { + if tmpl.Tree == nil || tmpl.Root == nil { + continue + } + if b.Len() > 0 { + b.WriteString(", ") + } + fmt.Fprintf(&b, "%q", name) + } + var s string + if b.Len() > 0 { + s = "; defined templates are: " + b.String() + } + state.errorf("%q is an incomplete or empty template%s", t.Name(), s) } state.walk(value, t.Root) return @@ -603,6 +619,8 @@ func (s *state) evalArg(dot reflect.Value, typ reflect.Type, n parse.Node) refle return s.validateType(s.evalVariableNode(dot, arg, nil, zero), typ) case *parse.PipeNode: return s.validateType(s.evalPipeline(dot, arg), typ) + case *parse.IdentifierNode: + return s.evalFunction(dot, arg, arg, nil, zero) } switch typ.Kind() { case reflect.Bool: diff --git a/gcc-4.8/libgo/go/text/template/exec_test.go b/gcc-4.8/libgo/go/text/template/exec_test.go index 683e9ac76..0ab20acc9 100644 --- a/gcc-4.8/libgo/go/text/template/exec_test.go +++ b/gcc-4.8/libgo/go/text/template/exec_test.go @@ -499,6 +499,8 @@ var execTests = []execTest{ {"bug8b", "{{4|dddArg 3}}", "", tVal, false}, // A bug was introduced that broke map lookups for lower-case names. {"bug9", "{{.cause}}", "neglect", map[string]string{"cause": "neglect"}, true}, + // Field chain starting with function did not work. + {"bug10", "{{mapOfThree.three}}-{{(mapOfThree).three}}", "3-3", 0, true}, } func zeroArgs() string { @@ -560,19 +562,24 @@ func stringer(s fmt.Stringer) string { return s.String() } +func mapOfThree() interface{} { + return map[string]int{"three": 3} +} + func testExecute(execTests []execTest, template *Template, t *testing.T) { b := new(bytes.Buffer) funcs := FuncMap{ - "add": add, - "count": count, - "dddArg": dddArg, - "echo": echo, - "makemap": makemap, - "oneArg": oneArg, - "typeOf": typeOf, - "vfunc": vfunc, - "zeroArgs": zeroArgs, - "stringer": stringer, + "add": add, + "count": count, + "dddArg": dddArg, + "echo": echo, + "makemap": makemap, + "mapOfThree": mapOfThree, + "oneArg": oneArg, + "stringer": stringer, + "typeOf": typeOf, + "vfunc": vfunc, + "zeroArgs": zeroArgs, } for _, test := range execTests { var tmpl *Template @@ -816,3 +823,40 @@ func TestExecuteOnNewTemplate(t *testing.T) { // This is issue 3872. _ = New("Name").Templates() } + +const testTemplates = `{{define "one"}}one{{end}}{{define "two"}}two{{end}}` + +func TestMessageForExecuteEmpty(t *testing.T) { + // Test a truly empty template. + tmpl := New("empty") + var b bytes.Buffer + err := tmpl.Execute(&b, 0) + if err == nil { + t.Fatal("expected initial error") + } + got := err.Error() + want := `template: empty: "empty" is an incomplete or empty template` + if got != want { + t.Errorf("expected error %s got %s", want, got) + } + // Add a non-empty template to check that the error is helpful. + tests, err := New("").Parse(testTemplates) + if err != nil { + t.Fatal(err) + } + tmpl.AddParseTree("secondary", tests.Tree) + err = tmpl.Execute(&b, 0) + if err == nil { + t.Fatal("expected second error") + } + got = err.Error() + want = `template: empty: "empty" is an incomplete or empty template; defined templates are: "secondary"` + if got != want { + t.Errorf("expected error %s got %s", want, got) + } + // Make sure we can execute the secondary. + err = tmpl.ExecuteTemplate(&b, "secondary", 0) + if err != nil { + t.Fatal(err) + } +} diff --git a/gcc-4.8/libgo/go/text/template/funcs.go b/gcc-4.8/libgo/go/text/template/funcs.go index 31549dc45..818766364 100644 --- a/gcc-4.8/libgo/go/text/template/funcs.go +++ b/gcc-4.8/libgo/go/text/template/funcs.go @@ -18,7 +18,7 @@ import ( // FuncMap is the type of the map defining the mapping from names to functions. // Each function must have either a single return value, or two return values of // which the second has type error. In that case, if the second (error) -// argument evaluates to non-nil during execution, execution terminates and +// return value evaluates to non-nil during execution, execution terminates and // Execute returns that error. type FuncMap map[string]interface{} diff --git a/gcc-4.8/libgo/go/text/template/parse/parse.go b/gcc-4.8/libgo/go/text/template/parse/parse.go index c0fb9274a..802e298c2 100644 --- a/gcc-4.8/libgo/go/text/template/parse/parse.go +++ b/gcc-4.8/libgo/go/text/template/parse/parse.go @@ -429,7 +429,6 @@ func (t *Tree) pipeline(context string) (pipe *PipeNode) { t.unexpected(token, context) } } - return } func (t *Tree) parseControl(context string) (pos Pos, line int, pipe *PipeNode, list, elseList *ListNode) { @@ -445,7 +444,6 @@ func (t *Tree) parseControl(context string) (pos Pos, line int, pipe *PipeNode, if next.Type() != nodeEnd { t.errorf("expected end; found %s", next) } - elseList = elseList } return pipe.Position(), line, pipe, list, elseList } |