diff --git a/unmarshaler.go b/unmarshaler.go index 7383afe..5c19845 100644 --- a/unmarshaler.go +++ b/unmarshaler.go @@ -1039,15 +1039,9 @@ func (d *decoder) handleKeyValuePart(key unstable.Iterator, value *unstable.Node mv := v.MapIndex(mk) set := false - if !mv.IsValid() { + if !mv.IsValid() || key.IsLast() { set = true mv = reflect.New(v.Type().Elem()).Elem() - } else { - if key.IsLast() { - var x interface{} - mv = reflect.ValueOf(&x).Elem() - set = true - } } nv, err := d.handleKeyValueInner(key, value, mv) diff --git a/unmarshaler_test.go b/unmarshaler_test.go index f7ccc59..3c34425 100644 --- a/unmarshaler_test.go +++ b/unmarshaler_test.go @@ -2472,6 +2472,21 @@ func TestIssue850(t *testing.T) { require.Error(t, err) } +func TestIssue851(t *testing.T) { + type Target struct { + Params map[string]string `toml:"params"` + } + + content := "params = {a=\"1\",b=\"2\"}" + var target Target + err := toml.Unmarshal([]byte(content), &target) + require.NoError(t, err) + require.Equal(t, map[string]string{"a": "1", "b": "2"}, target.Params) + err = toml.Unmarshal([]byte(content), &target) + require.NoError(t, err) + require.Equal(t, map[string]string{"a": "1", "b": "2"}, target.Params) +} + func TestUnmarshalDecodeErrors(t *testing.T) { examples := []struct { desc string