Skip to content

Compiler + stopifnot bug

7 messages · Iñaki Ucar, Duncan Murdoch, Martin Morgan +1 more

#
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,
#
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:
#
On 03/01/2019 3:37 p.m., Duncan Murdoch wrote:
Sorry, that was a typo.  I meant r75943.

Duncan Murdoch
#
For what it's worth this also introduced

    > df = data.frame(v = package_version("1.2"))
    > rbind(df, df)$v
     [[1]]
     [1] 1 2

     [[2]]
     [1] 1 2

instead of

    > rbind(df, df)$v
    [1] '1.2' '1.2'

which shows up in Travis builds of Bioconductor packages

  https://stat.ethz.ch/pipermail/bioc-devel/2019-January/014506.html

and elsewhere

Martin Morgan

?On 1/3/19, 7:05 PM, "R-devel on behalf of Duncan Murdoch" <r-devel-bounces at r-project.org on behalf of murdoch.duncan at gmail.com> wrote:
On 03/01/2019 3:37 p.m., Duncan Murdoch wrote:
> I see this too; by bisection, it seems to have first appeared in r72943.
    
    Sorry, that was a typo.  I meant r75943.
    
    Duncan Murdoch
    
    > 
    > 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,
    >>
    >
    
    ______________________________________________
    R-devel at r-project.org mailing list
    https://stat.ethz.ch/mailman/listinfo/r-devel
#
Thanks for the reports. Will look into it soon and report back.

Luke

Sent from my iPhone
#
Should be fixed in r75946.

Best,

luke
On Fri, 4 Jan 2019, Tierney, Luke wrote:

            

  
    
#
I confirm it is fixed in r75946. Thanks.

I?aki
On Fri, 4 Jan 2019 at 09:27, Tierney, Luke <luke-tierney at uiowa.edu> wrote: