branch: elpa/rust-mode
commit bec3d0c9b7e26016ea1b8c25616783955903aaf1
Author: mrBliss <[email protected]>
Commit: mrBliss <[email protected]>
Test #169
Before applying #169 the new test fails with a stack overflow, with #169
it passes.
---
rust-mode-tests.el | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/rust-mode-tests.el b/rust-mode-tests.el
index 3c3ba03..35a1cbd 100644
--- a/rust-mode-tests.el
+++ b/rust-mode-tests.el
@@ -1162,6 +1162,23 @@ All positions are position symbols found in
`rust-test-positions-alist'."
'nonblank-line-indented-already-middle-target
#'indent-for-tab-command))
+(ert-deftest no-stack-overflow-in-rust-rewind-irrelevant ()
+ (with-temp-buffer
+ (rust-mode)
+ (insert "fn main() {\n let x = 1;")
+ ;; Insert 150 separate comments on the same line
+ (dotimes (i 150)
+ (insert "/* foo */ "))
+ ;; Rewinding from the last commment to the end of the let needs at least
+ ;; 150 iterations, but if we limit the stack depth to 100 (this appears to
+ ;; be some minimum), a recursive function would overflow, throwing an
+ ;; error.
+ (let ((max-lisp-eval-depth 100))
+ (rust-rewind-irrelevant)
+ ;; Only a non-stack overflowing function would make it this far. Also
+ ;; check that we rewound till after the ;
+ (should (= (char-before) ?\;)))))
+
(defun rust-test-fontify-string (str)
(with-temp-buffer
(rust-mode)