internal/catmsg: pass language to nested compiles

Change-Id: I24b5b38cf70213c816053a783be3eae8ace596d0
Reviewed-on: https://go-review.googlesource.com/58910
Run-TryBot: Marcel van Lohuizen <mpvl@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Nigel Tao <nigeltao@golang.org>
diff --git a/internal/catmsg/catmsg_test.go b/internal/catmsg/catmsg_test.go
index d06502b..df913a1 100644
--- a/internal/catmsg/catmsg_test.go
+++ b/internal/catmsg/catmsg_test.go
@@ -111,6 +111,10 @@
 		},
 		tests: single("foo|BAZ", ""),
 	}, {
+		desc:  "nested value",
+		m:     nestedLang{nestedLang{empty{}}},
+		tests: single("nl|nl", ""),
+	}, {
 		desc: "not shadowed variable",
 		m: seq{
 			&Var{"bar", String("baz")},
@@ -207,8 +211,9 @@
 	dec := NewDecoder(language.Und, r, macros)
 	for _, tc := range testCases {
 		t.Run(tc.desc, func(t *testing.T) {
-
-			data, err := Compile(language.Und, macros, tc.m)
+			// Use a language other than Und so that we can test
+			// passing the language to nested values.
+			data, err := Compile(language.Dutch, macros, tc.m)
 			if failErr(err, tc.encErr) {
 				t.Errorf("encoding error: got %+q; want %+q", err, tc.encErr)
 			}
@@ -265,6 +270,23 @@
 	return ErrIncomplete
 }
 
+var msgNested = Register(
+	"golang.org/x/text/internal/catmsg.nested",
+	func(d *Decoder) bool {
+		d.Render(d.DecodeString())
+		d.ExecuteMessage()
+		return true
+	})
+
+type nestedLang struct{ Message }
+
+func (n nestedLang) Compile(e *Encoder) (err error) {
+	e.EncodeMessageType(msgNested)
+	e.EncodeString(e.Language().String())
+	e.EncodeMessage(n.Message)
+	return nil
+}
+
 type errorCompileMsg struct{}
 
 var errCompileTest = errors.New("catmsg: compile error test")
diff --git a/internal/catmsg/codec.go b/internal/catmsg/codec.go
index e959b08..ab587f8 100755
--- a/internal/catmsg/codec.go
+++ b/internal/catmsg/codec.go
@@ -99,7 +99,7 @@
 
 // EncodeMessage serializes the given message inline at the current position.
 func (e *Encoder) EncodeMessage(m Message) error {
-	e = &Encoder{root: e.root, parent: e}
+	e = &Encoder{root: e.root, parent: e, tag: e.tag}
 	err := m.Compile(e)
 	if _, ok := m.(*Var); !ok {
 		e.flushTo(e.parent)