From murdoch@dunc@n @ending from gm@il@com  Thu Jan  3 21:37:17 2019
From: murdoch@dunc@n @ending from gm@il@com (Duncan Murdoch)
Date: Thu, 3 Jan 2019 15:37:17 -0500
Subject: [Rd] Compiler + stopifnot bug
In-Reply-To: <CALEXWq2CneLqRqaD5H4_-qQEzB3LjhSwoqc=Mg3f9WeHAirmXg@mail.gmail.com>
References: <CALEXWq2CneLqRqaD5H4_-qQEzB3LjhSwoqc=Mg3f9WeHAirmXg@mail.gmail.com>
Message-ID: <ffedc6fa-2f6c-21f3-b29a-8e1f0e3fac89@gmail.com>

I see this too; by bisection, it seems to have first appeared in r72943.

Duncan Murdoch

On 03/01/2019 2:18 p.m., I?aki Ucar wrote:
> Hi,
> 
> I found the following issue in r-devel (2019-01-02 r75945):
> 
> `foo<-` <- function(x, value) {
>    bar(x) <- value * x
>    x
> }
> 
> `bar<-` <- function(x, value) {
>    stopifnot(all(value / x == 1))
>    x + value
> }
> 
> `foo<-` <- compiler::cmpfun(`foo<-`)
> `bar<-` <- compiler::cmpfun(`bar<-`)
> 
> x <- c(2, 2)
> foo(x) <- 1
> x # should be c(4, 4)
> #> [1] 3 3
> 
> If the functions are not compiled or the stopifnot call is removed,
> the snippet works correctly. So it seems that something is messing
> around with the references to "value" when the call to stopifnot gets
> compiled, and the wrong "value" is modified. Note also that if "x <-
> 2", then the result is correct, 4.
> 
> Regards,
>



[Rd] Compiler + stopifnot bug
Duncan Murdoch