blob: 2ff1c7d7785c32eca314ee13de32b414f0634353 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
From 40b0b29c05d521cd8901988fa2bc71547f917f48 Mon Sep 17 00:00:00 2001
From: Maxime Devos <maximedevos@telenet.be>
Date: Sun, 18 Jul 2021 19:59:32 +0200
Subject: [PATCH] ice-9/read: Parse #{}}# properly.
This is a regression since Guile 3.0.2 and breaks compilation
of a Guile library.
* module/ice-9/read.scm
(%read)[read-parenthesized]: When SAW-BRACE? is #t but CH isn't
#\#, don't eat CH.
* test-suite/tests/reader.test
("#{}#): Add four test cases.
---
module/ice-9/read.scm | 7 +++++--
test-suite/tests/reader.test | 5 +++++
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/module/ice-9/read.scm b/module/ice-9/read.scm
index ac407739f..283933064 100644
--- a/module/ice-9/read.scm
+++ b/module/ice-9/read.scm
@@ -556,12 +556,15 @@
(string->symbol
(list->string
(let lp ((saw-brace? #f))
- (let ((ch (next-not-eof)))
+ (let lp/inner ((ch (next-not-eof))
+ (saw-brace? saw-brace?))
(cond
(saw-brace?
(if (eqv? ch #\#)
'()
- (cons #\} (lp #f))))
+ ;; Don't eat CH, see
+ ;; <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=49623>.
+ (cons #\} (lp/inner ch #f))))
((eqv? ch #\})
(lp #t))
((eqv? ch #\\)
diff --git a/test-suite/tests/reader.test b/test-suite/tests/reader.test
index 1481a0a5d..ad7c6d575 100644
--- a/test-suite/tests/reader.test
+++ b/test-suite/tests/reader.test
@@ -536,6 +536,11 @@
(with-test-prefix "#{}#"
(pass-if (equal? (read-string "#{}#") '#{}#))
+ ;; See <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=49623>
+ (pass-if (equal? (read-string "#{}}#") (string->symbol "}")))
+ (pass-if (equal? (read-string "#{}}}#") (string->symbol "}}")))
+ (pass-if (equal? (read-string "#{{}}#") (string->symbol "{}")))
+ (pass-if (equal? (read-string "#{{}b}#") (string->symbol "{}b")))
(pass-if (not (equal? (read-string "(a #{.}# b)") '(a . b))))
(pass-if (equal? (read-string "#{a}#") 'a))
(pass-if (equal? (read-string "#{a b}#") '#{a b}#))
--
2.32.0
|