diff --git a/src/fmt/fmt_test.go b/src/fmt/fmt_test.go index 96505b82716..c06f9a1fcfc 100644 --- a/src/fmt/fmt_test.go +++ b/src/fmt/fmt_test.go @@ -686,6 +686,14 @@ var fmtTests = []struct { // Issue 8965. {"%v", reflect.ValueOf(A{}).Field(0).String(), ""}, // Equivalent to the old way. {"%v", reflect.ValueOf(A{}).Field(0), "0"}, // Sees inside the field. + + // verbs apply to the extracted value too. + {"%s", reflect.ValueOf("hello"), "hello"}, + {"%q", reflect.ValueOf("hello"), `"hello"`}, + {"%#04x", reflect.ValueOf(256), "0x0100"}, + + // invalid reflect.Value doesn't crash. + {"%v", reflect.Value{}, ""}, } // zeroFill generates zero-filled strings of the specified width. The length diff --git a/src/fmt/print.go b/src/fmt/print.go index c8038f09a88..8e35a890ec9 100644 --- a/src/fmt/print.go +++ b/src/fmt/print.go @@ -847,6 +847,8 @@ func (p *pp) printReflectValue(value reflect.Value, verb rune, depth int) (wasSt p.value = value BigSwitch: switch f := value; f.Kind() { + case reflect.Invalid: + p.buf.WriteString("") case reflect.Bool: p.fmtBool(f.Bool(), verb) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: