[Rcpp-devel] strange bool conversion?

Dirk Eddelbuettel edd at debian.org
Mon Jan 10 13:26:05 CET 2011


On 10 January 2011 at 12:06, Daniel Sabanés Bové wrote:
| 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 --

So where is the bug?  

R> correct(list(a=42))
[1] 42
R> correct(list(a=42L))
[1] 42
R> correct(list(a=-42L))
[1] -42
R>  

There is nothing wrong with helping the compiler via explicit template use as
in 

	int a = as<int>(input[0]);

Dirk

 
| 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 
| 
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

-- 
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com


More information about the Rcpp-devel mailing list