Subject: bug#19415: Compiler shares storage for assoc-lists even if some of them are mutated

From: Mark H Weaver <[email-masked]>
Date: Mon, 22 Dec 2014 02:08:31 -0500

tags 19415 + notabug
close 19415
merge 19415 19417
thanks

Panicz Maciej Godek <[email-masked]> writes:

> This bug was traced by Matt Wette and described here:
>
> http://lists.gnu.org/archive/html/guile-user/2014-12/msg00023.html
>
> In short, the bug manifests itself when at least two consecutive let
> forms are used with an assoc list argument which starts with identical
> elements, and the first appearance gets mutated before the second:
>
> (begin
> (let ((l '((a . X)(b . Y)(c . 7))))
> (assoc-set! l 'b 'Z))
> (let ((l '((a . X)(b . Y))))
> l))
> ===> ((a . X) (b . Z))
>
> The issue is known to appear in guile 2.0.11 and 2.0.5

As later explained on guile-user, mutating literal data is not permitted
in scheme and leads to unspecified behavior.  Our compiler aggressively
shares data between literals in the same compilation unit.

See <http://bugs.gnu.org/16060> for a related wishlist item.

     Thanks,
       Mark