diff options
-rw-r--r-- | module/language/tree-il/analyze.scm | 13 | ||||
-rw-r--r-- | test-suite/tests/tree-il.test | 29 |
2 files changed, 37 insertions, 5 deletions
diff --git a/module/language/tree-il/analyze.scm b/module/language/tree-il/analyze.scm index 88f81f3d5..badce9f77 100644 --- a/module/language/tree-il/analyze.scm +++ b/module/language/tree-il/analyze.scm @@ -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))))) diff --git a/test-suite/tests/tree-il.test b/test-suite/tests/tree-il.test index 68dfc32c7..2217ffcf2 100644 --- a/test-suite/tests/tree-il.test +++ b/test-suite/tests/tree-il.test @@ -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 () |