[Rcpp-devel] strange bool conversion?

Daniel Sabanés Bové daniel.sabanesbove at ifspm.uzh.ch
Mon Jan 10 12:06:01 CET 2011


Hi,

I have to report another serious bug in argument extraction, now with
integers.
(It seems to me that the fix by Romain could have been causing this
behaviour?)
Moreover, the problem does not depend on a "const" modifier:

-- snip --

library(Rcpp)
library(inline)

## this compiles and loads fine, but is wrong:
wrong <- cxxfunction(signature(x="list") , '
         List input(x);
         int a = input[0];
         return wrap(a);
         ' , plugin = "Rcpp")

## still OK:
wrong(list(1))

## all 1:
wrong(list(4))
wrong(list(4L))
wrong(list(-4L))


## this is correct:
correct <- cxxfunction(signature(x="list") , '
         List input(x);
         int a = as<int>(input[0]);
         return wrap(a);
         ' , plugin = "Rcpp")

correct(list(1))
wrong(list(4))
wrong(list(4L))
wrong(list(-4L))

-- snap --



The sessionInfo():


R version 2.12.1 (2010-12-16)
Platform: i686-pc-linux-gnu (32-bit)

locale:
 [1] LC_CTYPE=de_CH.utf8       LC_NUMERIC=C            
 [3] LC_TIME=de_CH.utf8        LC_COLLATE=de_CH.utf8   
 [5] LC_MONETARY=C             LC_MESSAGES=de_CH.utf8  
 [7] LC_PAPER=de_CH.utf8       LC_NAME=C               
 [9] LC_ADDRESS=C              LC_TELEPHONE=C          
[11] LC_MEASUREMENT=de_CH.utf8 LC_IDENTIFICATION=C     

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base    

other attached packages:
[1] inline_0.3.8 Rcpp_0.9.0 

loaded via a namespace (and not attached):
[1] tools_2.12.1


Kind regards,
Daniel

> This is fixed now (rev 2789). For the curious, it seems that the
> generic_proxy template made the wrong choice between these conversion
> operators: operator SEXP() const { return get() ; } template <typename
> U> operator U() const { return ::Rcpp::as<U>(get()) ; } I resolved
> this by forcing the conversion to bool with this: operator bool()
> const { return ::Rcpp::as<bool>(get()) ; } Thanks again for the
> report. Romain Le 13/12/10 17:30, Daniel Saban?s Bov? a ?crit :
>> > Hi,
>> >
>> > I have just discovered an extremely strange behaviour in conversion of
>> > an R logical to a C++ bool. Consider the minimal example:
>> >
>> > --- snip ---
>> >
>> > library(Rcpp)
>> > library(inline)
>> >
>> > ## this compiles and loads fine, but is wrong:
>> > wrong<- cxxfunction(signature(x="list") , '
>> >          List input(x);
>> >          const bool a = input[0];
>> >          return wrap(a);
>> >          ' , plugin = "Rcpp")
>> >
>> > wrong(list(TRUE))
>> > wrong(list(FALSE))
>> >
>> > ## this is correct:
>> > correct<- cxxfunction(signature(x="list") , '
>> >          List input(x);
>> >          const bool a = as<bool>(input[0]);
>> >          return wrap(a);
>> >          ' , plugin = "Rcpp")
>> >
>> > correct(list(TRUE))
>> > correct(list(FALSE))
>> >
>> > --- snap ----
>> >
>> > In Rcpp 0.8.9 wrong(list(FALSE)) == TRUE, which is quite surprising to
>> > the user...
>> > Sorry if this already a known feature, but then I would be curious if
>> > this behaviour is really wished?
>> >
>> > Thanks in advance,
>> > best regards
>> >
>> > Daniel
> -- Romain Francois Professional R Enthusiast +33(0) 6 28 91 30 30
> http://romainfrancois.blog.free.fr |- http://bit.ly/fT2rZM : highlight
> 0.2-5 |- http://bit.ly/gpCSpH : Evolution of Rcpp code size `-
> http://bit.ly/hovakS : RcppGSL initial release 



More information about the Rcpp-devel mailing list