Compiler + stopifnot bug

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

Compiler + stopifnot bug

Iñaki Ucar
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ñaki Úcar

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Reply | Threaded
Open this post in threaded view
|

Re: Compiler + stopifnot bug

Duncan Murdoch-2
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,
>

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Reply | Threaded
Open this post in threaded view
|

Re: Compiler + stopifnot bug

Duncan Murdoch-2
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,
>>
>

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Reply | Threaded
Open this post in threaded view
|

Re: Compiler + stopifnot bug

Martin Morgan-4
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" <[hidden email] on behalf of [hidden email]> 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,
    >>
    >
   
    ______________________________________________
    [hidden email] mailing list
    https://stat.ethz.ch/mailman/listinfo/r-devel
   
______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Reply | Threaded
Open this post in threaded view
|

Re: Compiler + stopifnot bug

Tierney, Luke
Thanks for the reports. Will look into it soon and report back.

Luke

Sent from my iPhone

> On Jan 3, 2019, at 2:15 PM, Martin Morgan <[hidden email]> wrote:
>
> 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" <[hidden email] on behalf of [hidden email]> 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,
>>>
>>
>
>    ______________________________________________
>    [hidden email] mailing list
>    https://stat.ethz.ch/mailman/listinfo/r-devel
>
> ______________________________________________
> [hidden email] mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Reply | Threaded
Open this post in threaded view
|

Re: Compiler + stopifnot bug

Tierney, Luke
Should be fixed in r75946.

Best,

luke

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

> Thanks for the reports. Will look into it soon and report back.
>
> Luke
>
> Sent from my iPhone
>
>> On Jan 3, 2019, at 2:15 PM, Martin Morgan <[hidden email]> wrote:
>>
>> 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" <[hidden email] on behalf of [hidden email]> 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,
>>>>
>>>
>>
>>    ______________________________________________
>>    [hidden email] mailing list
>>    https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>> ______________________________________________
>> [hidden email] mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
> ______________________________________________
> [hidden email] mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

--
Luke Tierney
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa                  Phone:             319-335-3386
Department of Statistics and        Fax:               319-335-3017
    Actuarial Science
241 Schaeffer Hall                  email:   [hidden email]
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu
______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Reply | Threaded
Open this post in threaded view
|

Re: Compiler + stopifnot bug

Iñaki Ucar
I confirm it is fixed in r75946. Thanks.

Iñaki

On Fri, 4 Jan 2019 at 09:27, Tierney, Luke <[hidden email]> wrote:

>
> Should be fixed in r75946.
>
> Best,
>
> luke
>
> On Fri, 4 Jan 2019, Tierney, Luke wrote:
>
> > Thanks for the reports. Will look into it soon and report back.
> >
> > Luke
> >
> > Sent from my iPhone
> >
> >> On Jan 3, 2019, at 2:15 PM, Martin Morgan <[hidden email]> wrote:
> >>
> >> 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" <[hidden email] on behalf of [hidden email]> 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,
> >>>>
> >>>
> >>
> >>    ______________________________________________
> >>    [hidden email] mailing list
> >>    https://stat.ethz.ch/mailman/listinfo/r-devel
> >>
> >> ______________________________________________
> >> [hidden email] mailing list
> >> https://stat.ethz.ch/mailman/listinfo/r-devel
> > ______________________________________________
> > [hidden email] mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
>
> --
> Luke Tierney
> Ralph E. Wareham Professor of Mathematical Sciences
> University of Iowa                  Phone:             319-335-3386
> Department of Statistics and        Fax:               319-335-3017
>     Actuarial Science
> 241 Schaeffer Hall                  email:   [hidden email]
> Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu
> ______________________________________________
> [hidden email] mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



--
Iñaki Úcar

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel