#lang racket/base

(require tests/eli-tester (for-syntax racket/base))

;; All current uses of the errortrace collection (there are currently 4:
;; in the sandbox, drracket, and in htdp and deinprogramm) rely on
;; making "self-modifying" code by using a single mpair in source code.
;; This is a fragile hole, and it might be plugged at some point in the
;; future.  (Another alternative is to inject a closure as a value into
;; the syntax, which is similarly hackish.)  The purpose of this test is
;; to fail when that happens, so we remember to deal with it in these
;; uses.  A convenient commit to refer to is 2189957 -- it touches all
;; four places.  (BTW, note that this file cannot be compiled because of
;; this.)

(define-syntax m
  (let ([b (mcons 0 0)])
    (lambda (stx)
      (with-syntax ([b b])
        #'(lambda () (set-mcar! b (add1 (mcar b))) (mcar b))))))
(let ([f m])
  (test (list (f) (f) (f)) => '(1 2 3)))
