aboutsummaryrefslogtreecommitdiff
path: root/module/c/preprocessor2.scm
diff options
context:
space:
mode:
Diffstat (limited to 'module/c/preprocessor2.scm')
-rw-r--r--module/c/preprocessor2.scm14
1 files changed, 11 insertions, 3 deletions
diff --git a/module/c/preprocessor2.scm b/module/c/preprocessor2.scm
index 3cb5913f..4678ded7 100644
--- a/module/c/preprocessor2.scm
+++ b/module/c/preprocessor2.scm
@@ -26,7 +26,8 @@
(define parameter-map? (of-type? (alist-of string? (list-of lexeme?))))
-(define (concat-token? token) (equal? "##" (punctuator-token? token)))
+(define (concat-token? token) (and (equal? "##" (punctuator-token? token))
+ (not (member "##" (lexeme-noexpand token)))))
(define (stringify-token? token) (equal? "#" (punctuator-token? token)))
(define (left-parenthesis-token? token) (equal? "(" (punctuator-token? token)))
(define (right-parenthesis-token? token) (equal? ")" (punctuator-token? token)))
@@ -90,8 +91,15 @@
(loop (cdr l) r))
((placemaker-token? (car r))
(loop (cdr l) (cons (car l) (cdr r))))
- (else (loop (cdr l) (cons (concatenate-tokens (car l) (car r))
- (cdr r)))))))
+ (else
+ ;; 6.10.3.3 p. 3
+ ;; I believe that ## is the only special case where the
+ ;; result of concatenation is differente from the token directly.
+ (let ((token (concatenate-tokens (car l) (car r))))
+ (let ((token (if (concat-token? token)
+ (modify token lexeme-noexpand xcons "##")
+ token)))
+ (loop (cdr l) (cons token (cdr r)))))))))
(else
(let ((pre post (break concat-token? right)))
(loop (append left (reverse pre)) post))))))