mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-20 11:40:18 +02:00
Fix argument count for various format string escape sequences.
* module/language/tree-il/analyze.scm (format-string-argument-count): Handle ~t and ~k options case-insensitively. ~! ~| ~/ ~q and ~Q should not update the min-count or max-count. ~^ returns the min-count and 'any + - # and ' should not increase the argument count. * test-suite/tests/tree-il.test (*): Tests for new parameters.
This commit is contained in:
parent
a14b6e1825
commit
90baf8cdfe
2 changed files with 37 additions and 5 deletions
|
@ -1259,11 +1259,11 @@ accurate information is missing from a given `tree-il' element."
|
|||
(case state
|
||||
((tilde)
|
||||
(case (car chars)
|
||||
((#\~ #\% #\& #\t #\_ #\newline #\( #\))
|
||||
((#\~ #\% #\& #\t #\T #\_ #\newline #\( #\) #\! #\| #\/ #\q #\Q)
|
||||
(loop (cdr chars) 'literal '()
|
||||
conditions end-group
|
||||
min-count max-count))
|
||||
((#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 #\, #\: #\@)
|
||||
((#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 #\, #\: #\@ #\+ #\- #\#)
|
||||
(loop (cdr chars)
|
||||
'tilde (cons (car chars) params)
|
||||
conditions end-group
|
||||
|
@ -1330,16 +1330,23 @@ accurate information is missing from a given `tree-il' element."
|
|||
min-count)
|
||||
(+ (or (previous-number params) 1)
|
||||
max-count))))
|
||||
((#\? #\k)
|
||||
((#\? #\k #\K)
|
||||
;; We don't have enough info to determine the exact number
|
||||
;; of args, but we could determine a lower bound (TODO).
|
||||
(values 'any 'any))
|
||||
((#\^)
|
||||
(values min-count 'any))
|
||||
((#\h #\H)
|
||||
(let ((argc (if (memq #\: params) 2 1)))
|
||||
(loop (cdr chars) 'literal '()
|
||||
conditions end-group
|
||||
(+ argc min-count)
|
||||
(+ argc max-count))))
|
||||
((#\')
|
||||
(if (null? (cdr chars))
|
||||
(throw &syntax-error 'unexpected-termination)
|
||||
(loop (cddr chars) 'tilde (cons (cadr chars) params)
|
||||
conditions end-group min-count max-count)))
|
||||
(else (loop (cdr chars) 'literal '()
|
||||
conditions end-group
|
||||
(+ 1 min-count) (+ 1 max-count)))))
|
||||
|
|
|
@ -1415,11 +1415,11 @@
|
|||
(number? (string-contains (car w)
|
||||
"wrong number of arguments")))))
|
||||
|
||||
(pass-if "~%, ~~, ~&, ~t, ~_, and ~\\n"
|
||||
(pass-if "~%, ~~, ~&, ~t, ~_, ~!, ~|, ~/, ~q and ~\\n"
|
||||
(null? (call-with-warnings
|
||||
(lambda ()
|
||||
(compile '((@ (ice-9 format) format) some-port
|
||||
"~&~3_~~ ~\n~12they~%")
|
||||
"~&~3_~~ ~\n~12they~% ~!~|~/~q")
|
||||
#:opts %opts-w-format
|
||||
#:to 'assembly)))))
|
||||
|
||||
|
@ -1687,6 +1687,31 @@
|
|||
#:opts %opts-w-format
|
||||
#:to 'assembly)))))
|
||||
|
||||
(pass-if "~^"
|
||||
(null? (call-with-warnings
|
||||
(lambda ()
|
||||
(compile '((@ (ice-9 format) format) #f "~a ~^ ~a" 0 1)
|
||||
#:opts %opts-w-format
|
||||
#:to 'assembly)))))
|
||||
|
||||
(pass-if "~^, too few args"
|
||||
(let ((w (call-with-warnings
|
||||
(lambda ()
|
||||
(compile '((@ (ice-9 format) format) #f "~a ~^ ~a")
|
||||
#:opts %opts-w-format
|
||||
#:to 'assembly)))))
|
||||
(and (= (length w) 1)
|
||||
(number? (string-contains (car w)
|
||||
"expected at least 1, got 0")))))
|
||||
|
||||
(pass-if "parameters: +,-,#, and '"
|
||||
(null? (call-with-warnings
|
||||
(lambda ()
|
||||
(compile '((@ (ice-9 format) format) some-port
|
||||
"~#~ ~,,-2f ~,,+2f ~'A~" 1234 1234)
|
||||
#:opts %opts-w-format
|
||||
#:to 'assembly)))))
|
||||
|
||||
(pass-if "complex 1"
|
||||
(let ((w (call-with-warnings
|
||||
(lambda ()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue