@@ -265,7 +265,7 @@ func guessType(scanner *sc.Scanner, raw string, allowSlice bool) *Argument {
265265 maybeItem := guessType (scanner , raw , false )
266266
267267 subRaw := raw [scanner .Pos ().Offset :]
268- subScanner := parserScanner (subRaw , scanner . Error )
268+ subScanner := parserScanner (subRaw , func ( * sc. Scanner , string ) {} )
269269
270270 var tok rune
271271 for {
@@ -291,7 +291,8 @@ func guessType(scanner *sc.Scanner, raw string, allowSlice bool) *Argument {
291291 // (so we don't consume our scanner tokens until we actually
292292 // go to use this -- Go doesn't like scanners that can be rewound).
293293 subRaw := raw [scanner .Pos ().Offset :]
294- subScanner := parserScanner (subRaw , scanner .Error )
294+ var hadScanError bool
295+ subScanner := parserScanner (subRaw , func (* sc.Scanner , string ) { hadScanError = true })
295296
296297 // skip whitespace
297298 hint := peekNoSpace (subScanner )
@@ -361,11 +362,17 @@ func guessType(scanner *sc.Scanner, raw string, allowSlice bool) *Argument {
361362 nextTok = subScanner .Scan ()
362363 }
363364
364- if nextTok == sc .Int {
365- return & Argument {Type : IntType }
366- }
367- if nextTok == sc .Float {
368- return & Argument {Type : NumberType }
365+ // Only treat as a numeric type if the scanner did not emit errors while
366+ // tokenising (e.g. invalid octal "087bdd" produces sc.Int but also
367+ // triggers an error). In that case fall through to the bare-string
368+ // path so the value is treated as a string.
369+ if ! hadScanError {
370+ if nextTok == sc .Int {
371+ return & Argument {Type : IntType }
372+ }
373+ if nextTok == sc .Float {
374+ return & Argument {Type : NumberType }
375+ }
369376 }
370377 }
371378
0 commit comments