Skip to content

Conversation

@Enchufa2
Copy link
Member

Closes #1247. It turns out we are generating a call to Rf_error in RcppExports.cpp for C++ interfaces. I think that code path is obsolete, and it should never run with unwind-protect, but I prefer to keep this PR safe and simple. So to be able to undef, call Rf_error then define again, I put the definition into a separate file without guards, so that it can be included more than once. Please let me know if there's a better way and/or you'd like this definition in another place.

Checklist

  • Code compiles correctly
  • R CMD check still passes all tests
  • Preferably, new tests were added which fail without the change
  • Document the changes by file in ChangeLog

@eddelbuettel
Copy link
Member

Thanks for putting this together!

I can (and will) turn on the reverse-depends machinery but as that does not generally involve compilerAttributes() etc it will not be complete. But if we run locally with this any warts should become apparent before the January release.

Copy link
Member

@eddelbuettel eddelbuettel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks pretty good. I only have two "style" questions / comments. Maybe @kevinushey can be the referee :)

@Enchufa2
Copy link
Member Author

Ok, new solution with a bit of macro trickery.

@eddelbuettel
Copy link
Member

Wheeee ==:-) Almost worse 😜 That should work. 🤞

@Enchufa2
Copy link
Member Author

Mmmh, maybe I should put that into an ifdef...

@Enchufa2
Copy link
Member Author

Ok, it should be ready now.

Copy link
Member

@eddelbuettel eddelbuettel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me so far.

@Enchufa2
Copy link
Member Author

Thanks, let's wait for another pair of eyes and the revdep machine then. Meanwhile, I'll investigate how many packages need to be adapted to avoid this warning.

@Enchufa2
Copy link
Member Author

Should we include a reference to RCPP_NO_MASK_RF_ERROR in the warning message? There are probably (not many but) some fair use cases like this out there.

@eddelbuettel
Copy link
Member

eddelbuettel commented Oct 28, 2025

Thumbs up on more informative message. 'That file' is technically a policy violation anyway (via a trick borrowed, if memory serves, from another posit package) and not something I get paid to care about anymore.

@Enchufa2
Copy link
Member Author

Enchufa2 commented Oct 28, 2025

What about something like... "Use of Rf_error() replaced with Rcpp::stop(). Calls to Rf_error() in C++ contexts are unsafe: consider using Rcpp::stop() instead, or define RCPP_NO_MASK_RF_ERROR if this is a false positive." A bit long, but...

Copy link
Member

@eddelbuettel eddelbuettel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, thank you both

@eddelbuettel
Copy link
Member

Ok, some first results are in this log file. It looks worse than it likely is as a) there are the usual 'new' packages for which I have to add their dependencies in a follow-up run and b) the packages already on 'deadline' with known-to-CRAN issues not from us. And then there is the remainder. I will take a closer look at those but it may take me another day or so. I have logs here to follow-up with.

@eddelbuettel
Copy link
Member

eddelbuettel commented Nov 1, 2025

Hm. And I mean Hmm here. An incremental run (after adding all the packages listed as missing, and running against everything not passing in first one, i.e. those who were skipped, who failed, or are new) still has a lot of failures:

Test of Rcpp 1.1.0.5 had 29 successes, 38 failures, and 48 skipped packages.
Ran from 2025-11-01 10:05:16.62 to 2025-11-01 11:17:28.20 for 1.203 hours
Average of 37.666 secs relative to 203.614 secs using 6 runners

Failed packages:  bayesAB, BayesPower, BayesProject, benchr, BGVAR, coga, comat, cpr, dqrng, empichar, FIESTAutils, gapfill, GeneralizedWendland, ggiraph, gppm, IOHanalyzer, itp, locStra, LOMAR, mapi, meteoland\
, mmrm, mwcsr, o2plsda, ravetools, RcppSimdJson, rrum, RTMB, rucrdtw, s2, SAM, sf, simcdm, TDA, tidynorm, updog, VIC5, windfarmGA

Skipped packages:  abn, bayeslist, bigrquerystorage, blavaan, bmggum, bmstdr, cbq, chouca, clrng, Crossover, DataVisualizations, dipsaus, disk.frame, EcoEnsemble, FlexReg, geocodebr, gpuR, HiCociety, highs, joi\
nXL, KeyboardSimulator, MatchIt, mlpack, move, multinma, networkscaleup, OpenMx, pcFactorStan, pema, ProbBreed, ProFAST, profoc, psBayesborrow, RavenR, RcppPlanc, Rfast, Rlgt, rlibkriging, rliger, rmBayes, rsta\
narm, rts2, SelfControlledCaseSeries, sparkwarc, spatialGE, starvz, tiledb, warbleR

I looked at two: dqrng and my own RcppSimdJson die on 'Aborted'. That ... does not seem like what we want, is it?

dqrng

* checking tests ... [25s/39s] ERROR
  Running ‘testthat.R’ [25s/38s]
Running the tests in ‘tests/testthat.R’ failed.
Complete output:
  > library(testthat)
  > library(dqrng)
  >
  > test_check("dqrng")
  terminate called after throwing an instance of 'Rcpp::exception'
    what():  Error: 'min' must not be larger than 'max'!
  Aborted
* checking for unstated dependencies in vignettes ... OK
* checking package vignettes ... OK

RcppSimdJson

  test_fparse_fload.R...........    8 tests ^[[0;32mOK^[[0m
  test_fparse_fload.R...........    8 tests ^[[0;32mOK^[[0m terminate called after throwing an instance of 'Rcpp::exception'
    what():  TAPE_ERROR: The JSON document has an improper structure: missing or superfluous commas, braces, missing keys, etc.  This is a fatal and unrecoverable error.
  Aborted
* DONE
Status: 1 ERROR

Results table log is here.

@eddelbuettel
Copy link
Member

eddelbuettel commented Nov 1, 2025

Mind you maybe it is just like @Enchufa2 hinted: a simple compileAttributes() and we're good. That worked here:

edd@paul:~/git/rcppsimdjson(master)$ tt.r -f inst/tinytest/test_fparse_fload.R 
test_fparse_fload.R...........    8 tests OK terminate called after throwing an instance of 'Rcpp::exception'
  what():  TAPE_ERROR: The JSON document has an improper structure: missing or superfluous commas, braces, missing keys, etc.  This is a fatal and unrecoverable error.
Aborted (core dumped)
edd@paul:~/git/rcppsimdjson(master)$ compAttr.r 
edd@paul:~/git/rcppsimdjson(master)$ install.r
* installing *source* package found in current working directory ...
* installing *source* package ‘RcppSimdJson’ ...
** this is package ‘RcppSimdJson’ version ‘0.1.14’
** using staged installation
** libs
using C++ compiler: ‘g++-15 (Ubuntu 15-20250404-0ubuntu1) 15.0.1 20250404 (experimental) [master r15-9193-g08e803aa9be]’
using C++17
ccache g++-15  -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG  -I'/usr/local/lib/R/site-library/Rcpp/include'    -DSIMDJSON_NO_COMPUTED_GOTO -I../inst/include -fopenmp -fpic  -O3 -Wall -pipe -pedantic -Wno-parentheses -Wno-ignored-attributes -Wno-unused-function    -c RcppExports.cpp -o RcppExports.o
ccache g++-15 -std=gnu++17 -Wl,-S -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -Wl,-z,relro -o RcppSimdJson.so RcppExports.o deserialize.o exported-utils.o internal-utils.o rcppsimdjson_utils_check.o simdjson_example.o -fopenmp -L/usr/lib/R/lib -lR
installing to /usr/local/lib/R/site-library/00LOCK-rcppsimdjson/00new/RcppSimdJson/libs
** R
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** checking absolute paths in shared objects and dynamic libraries
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (RcppSimdJson)
edd@paul:~/git/rcppsimdjson(master)$ tt.r -f inst/tinytest/test_fparse_fload.R 
test_fparse_fload.R........... 2666 tests OK 4.2s
All ok, 2666 results (4.2s)
edd@paul:~/git/rcppsimdjson(master)$ 

PS And no side effects. After re-installing CRAN Rcpp, and reinstalling RcppSimdJson under it (and with its updated src/RcppExports.cpp) we still pass. Good!

@eddelbuettel eddelbuettel force-pushed the feature/mask_Rf_error branch from 9fee4c9 to a941564 Compare November 4, 2025 18:14
@eddelbuettel eddelbuettel force-pushed the feature/mask_Rf_error branch from a941564 to 40f2fca Compare November 4, 2025 19:10
@eddelbuettel
Copy link
Member

eddelbuettel commented Nov 4, 2025

Rebased, and ran another incremental run. Results summary in this commit: RcppCore/rcpp-logs@ef3a42f containing the summary file.

This is a bit more involved than usual:

  • a fair number clearly fall into the compileAttributes() re-run will fix this so simple PR needed bucket
  • several packages fail to compile RcppEigen headers (!!), this is new and maybe gcc 15 related (but likely local to the old / not overly resourced machine -- seems to work here locally under equivalent docker on newer hardware)
  • two or three actually trip over the macro here but I suspect a proper NO_REMAP / header reorder could fix, also PR candidates
  • one or two unclear ones remaining

We probably need a new issue to triage. May revisit tomorrow.

Copy link
Member

@eddelbuettel eddelbuettel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch on the newline

@eddelbuettel
Copy link
Member

eddelbuettel commented Nov 5, 2025

Ok -- we are in fact having issues here. The RcppEigen fail is not local to the machine, I just reproduced it in a container locally here for package BayesProject (first on the list above). Worse, even after a run of compileAttributes() we still have an error. So this needs more work, sadly.

Edit: Oh boy that one was work. I got BayesProject to build by adding inst/include/BayesProject.h containing

#include <RcppEigen.h>
using namespace Rcpp;
using namespace RcppEigen;
using namespace Eigen;

and re-running compileAttributes(), of course. Needless to say we are not exactly fans of flattened namespaces ...

See the next paragraph inside the 'details' though as running compileAttributes() is not needed / a more minimal patch can be had.

Edit 2: For completeness the very short diff for BayesProject is below.

This is an updated diff. As @Enchufa2 pointed out we really only need to remove the R.h include. My earlier diff also ran compileAttributes() which is not needed.

root@c95b60d71856:/tmp/checks/BayesProject# diff -ru 
data/        DESCRIPTION  man/         MD5          NAMESPACE    R/           src/         
root@c95b60d71856:/tmp/checks/BayesProject# cd ..
root@c95b60d71856:/tmp/checks# diff -ru BayesProject.orig/ BayesProject
diff -ru BayesProject.orig/src/bayes.cpp BayesProject/src/bayes.cpp
--- BayesProject.orig/src/bayes.cpp     2020-06-01 00:45:46.000000000 +0000
+++ BayesProject/src/bayes.cpp  2025-11-05 18:58:16.780202588 +0000
@@ -1,4 +1,3 @@
-#include <R.h>
 #include <Rcpp.h>
 using namespace Rcpp;
 #include <RcppEigen.h>
root@c95b60d71856:/tmp/checks# 

The older / longer diff follows.

root@c95b60d71856:/tmp/checks# diff -Nru BayesProject.orig/ BayesProject
diff -Nru BayesProject.orig/inst/include/BayesProject_types.h BayesProject/inst/include/BayesProject_types.h
--- BayesProject.orig/inst/include/BayesProject_types.h 1970-01-01 00:00:00.000000000 +0000
+++ BayesProject/inst/include/BayesProject_types.h      2025-11-05 12:51:23.874653154 +0000
@@ -0,0 +1,6 @@
+
+#include <RcppEigen.h>
+using namespace Rcpp;
+using namespace RcppEigen;
+using namespace Eigen;
+
diff -Nru BayesProject.orig/src/bayes.cpp BayesProject/src/bayes.cpp
--- BayesProject.orig/src/bayes.cpp     2020-06-01 00:45:46.000000000 +0000
+++ BayesProject/src/bayes.cpp  2025-11-05 12:40:49.344415413 +0000
@@ -1,4 +1,4 @@
-#include <R.h>
+/*#include <R.h>*/
 #include <Rcpp.h>
 using namespace Rcpp;
 #include <RcppEigen.h>
diff -Nru BayesProject.orig/src/Makevars BayesProject/src/Makevars
--- BayesProject.orig/src/Makevars      1970-01-01 00:00:00.000000000 +0000
+++ BayesProject/src/Makevars   2025-11-05 12:42:28.491159649 +0000
@@ -0,0 +1 @@
+PKG_CXXFLAGS += -Wno-ignored-attributes
diff -Nru BayesProject.orig/src/RcppExports.cpp BayesProject/src/RcppExports.cpp
--- BayesProject.orig/src/RcppExports.cpp       2020-09-27 00:05:44.000000000 +0000
+++ BayesProject/src/RcppExports.cpp    2025-11-05 12:45:33.389215971 +0000
@@ -1,11 +1,16 @@
 // Generated by using Rcpp::compileAttributes() -> do not edit by hand
 // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393
 
+#include "../inst/include/BayesProject_types.h"
 #include <RcppEigen.h>
 #include <Rcpp.h>
 
 using namespace Rcpp;
-using namespace Eigen;
+
+#ifdef RCPP_USE_GLOBAL_ROSTREAM
+Rcpp::Rostream<true>&  Rcpp::Rcout = Rcpp::Rcpp_cout_get();
+Rcpp::Rostream<false>& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get();
+#endif
 
 // bayes_vhat
 MatrixXd bayes_vhat(MatrixXd x, VectorXd timePoints, double K);
root@c95b60d71856:/tmp/checks#

The src/Makevars here can probably be removed. I just wanted to reduce some line noise from Eigen.

Edit 3: Similar for GeneralizedWendland. Just as above it needs a removal of #include <R.h> before our headers as the above creates trouble when other projects (like Eigen) define something called error().

root@c95b60d71856:/tmp/checks# diff -Nru GeneralizedWendland.orig/ GeneralizedWendland
diff -Nru GeneralizedWendland.orig/inst/doc/GeneralizedWendland.pdf.asis GeneralizedWendland/inst/doc/GeneralizedWendland.pdf.asis
--- GeneralizedWendland.orig/inst/doc/GeneralizedWendland.pdf.asis      2022-06-16 21:46:11.000000000 +0000
+++ GeneralizedWendland/inst/doc/GeneralizedWendland.pdf.asis   1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-%\VignetteIndexEntry{Generalized Wendland function}
-%\VignetteEngine{R.rsp::asis}
\ No newline at end of file
diff -Nru GeneralizedWendland.orig/src/Wendland.h GeneralizedWendland/src/Wendland.h
--- GeneralizedWendland.orig/src/Wendland.h     2025-10-15 19:02:57.000000000 +0000
+++ GeneralizedWendland/src/Wendland.h  2025-11-05 13:14:59.923085742 +0000
@@ -2,7 +2,7 @@
 #pragma once
 
 #include <limits>
-#include <R.h>
+//#include <R.h>
 #include <Rcpp.h>
 #include <RcppEigen.h>
 #include <boost/math/special_functions/beta.hpp>
root@c95b60d71856:/tmp/checks# 

The vignette business can probably be ignored, I am working in a container without texlive and just skip vignettes.

Edit 4: Same thing in locStra, we need to remove a #include <R.h> to not clash over error().

A more minimal diff is

root@c95b60d71856:/tmp/checks# diff -ru locStra.orig/ locStra
diff -ru locStra.orig/src/auxcode.cpp locStra/src/auxcode.cpp
--- locStra.orig/src/auxcode.cpp        2021-01-27 02:29:32.000000000 +0000
+++ locStra/src/auxcode.cpp     2025-11-05 19:04:15.956493072 +0000
@@ -1,4 +1,3 @@
-#include <R.h>
 #include <Rcpp.h>
 using namespace Rcpp;
 #include <RcppEigen.h>
root@c95b60d71856:/tmp/checks# 

The initial, longer one follows.

root@c95b60d71856:/tmp/checks# diff -Nru locStra.orig/ locStra
diff -Nru locStra.orig/inst/include/locStra_types.h locStra/inst/include/locStra_types.h
--- locStra.orig/inst/include/locStra_types.h   1970-01-01 00:00:00.000000000 +0000
+++ locStra/inst/include/locStra_types.h        2025-11-05 13:45:56.648854713 +0000
@@ -0,0 +1,3 @@
+
+#include <RcppEigen.h>
+using namespace Eigen;
diff -Nru locStra.orig/src/auxcode.cpp locStra/src/auxcode.cpp
--- locStra.orig/src/auxcode.cpp        2021-01-27 02:29:32.000000000 +0000
+++ locStra/src/auxcode.cpp     2025-11-05 13:44:20.429326159 +0000
@@ -1,4 +1,4 @@
-#include <R.h>
+//#include <R.h>
 #include <Rcpp.h>
 using namespace Rcpp;
 #include <RcppEigen.h>
diff -Nru locStra.orig/src/RcppExports.cpp locStra/src/RcppExports.cpp
--- locStra.orig/src/RcppExports.cpp    2021-01-27 02:46:27.000000000 +0000
+++ locStra/src/RcppExports.cpp 2025-11-05 13:43:34.431117382 +0000
@@ -1,11 +1,16 @@
 // Generated by using Rcpp::compileAttributes() -> do not edit by hand
 // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393
 
+#include "../inst/include/locStra_types.h"
 #include <RcppEigen.h>
 #include <Rcpp.h>
 
 using namespace Rcpp;
-using namespace Eigen;
+
+#ifdef RCPP_USE_GLOBAL_ROSTREAM
+Rcpp::Rostream<true>&  Rcpp::Rcout = Rcpp::Rcpp_cout_get();
+Rcpp::Rostream<false>& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get();
+#endif
 
 // powerMethodCpp
 VectorXd powerMethodCpp(MatrixXd& X, VectorXd& v, double eps, int maxiter);
root@c95b60d71856:/tmp/checks# 

Edit 5: Same for SAM

root@c95b60d71856:/tmp/checks# diff -ru SAM.orig/ SAM
diff -ru SAM.orig/src/c_api/grplasso.cpp SAM/src/c_api/grplasso.cpp
--- SAM.orig/src/c_api/grplasso.cpp     2021-06-30 14:16:42.000000000 +0000
+++ SAM/src/c_api/grplasso.cpp  2025-11-05 19:10:27.448205491 +0000
@@ -1,7 +1,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
-#include "R.h"
+//#include "R.h"
 #include "math.h"
 #include "R_ext/BLAS.h"
 #include "R_ext/Lapack.h"
diff -ru SAM.orig/src/c_api/grpLR.cpp SAM/src/c_api/grpLR.cpp
--- SAM.orig/src/c_api/grpLR.cpp        2021-06-30 14:16:42.000000000 +0000
+++ SAM/src/c_api/grpLR.cpp     2025-11-05 19:10:37.431467371 +0000
@@ -1,7 +1,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
-#include "R.h"
+//#include "R.h"
 #include "math.h"
 #include "R_ext/BLAS.h"
 #include "R_ext/Lapack.h"
diff -ru SAM.orig/src/c_api/grpPR.cpp SAM/src/c_api/grpPR.cpp
--- SAM.orig/src/c_api/grpPR.cpp        2021-06-30 14:16:42.000000000 +0000
+++ SAM/src/c_api/grpPR.cpp     2025-11-05 19:10:52.361859087 +0000
@@ -1,7 +1,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
-#include "R.h"
+//#include "R.h"
 #include "math.h"
 #include "R_ext/BLAS.h"
 #include "R_ext/Lapack.h"
diff -ru SAM.orig/src/c_api/grpSVM.cpp SAM/src/c_api/grpSVM.cpp
--- SAM.orig/src/c_api/grpSVM.cpp       2021-06-30 17:13:43.000000000 +0000
+++ SAM/src/c_api/grpSVM.cpp    2025-11-05 19:11:03.818159707 +0000
@@ -1,7 +1,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
-#include "R.h"
+//#include "R.h"
 #include "math.h"
 #include "R_ext/BLAS.h"
 #include "R_ext/Lapack.h"
root@c95b60d71856:/tmp/checks# 

Edit 6: Same for TDA

root@c95b60d71856:/tmp/checks# diff -ru TDA.orig/ TDA
Only in TDA.orig/build: vignette.rds
Only in TDA.orig/inst: doc
diff -ru TDA.orig/src/diag.cpp TDA/src/diag.cpp
--- TDA.orig/src/diag.cpp       2024-01-23 16:07:14.000000000 +0000
+++ TDA/src/diag.cpp    2025-11-05 19:16:24.525589991 +0000
@@ -1,6 +1,6 @@
 // for R
-#include <R.h>
-#include <R_ext/Print.h>
+//#include <R.h>
+//#include <R_ext/Print.h>
 
 // for Rcpp
 #include <Rcpp.h>
root@c95b60d71856:/tmp/checks# 

@Enchufa2
Copy link
Member Author

Enchufa2 commented Nov 5, 2025

I believe this is a bug in RcppEigen. I see:

In file included from /home/iucar/R/x86_64-redhat-linux-gnu-library/4.5/Rcpp/include/RcppCommon.h:194,
                 from /home/iucar/R/x86_64-redhat-linux-gnu-library/4.5/Rcpp/include/Rcpp.h:27,
                 from bayes.cpp:2:
/home/iucar/R/x86_64-redhat-linux-gnu-library/4.5/Rcpp/include/Rcpp/macros/mask.h:25:5: warning: Use of Rf_error() replaced with Rcpp::stop(). Calls to Rf_error() in C++ contexts are unsafe: consider using Rcpp::stop() instead, or define RCPP_NO_MASK_RF_ERROR if this is a false positive.
   25 |     _Pragma("GCC warning \"Use of Rf_error() replaced with Rcpp::stop(). Calls \
      |     ^~~~~~~
/usr/include/R/R_ext/Error.h:84:15: note: in expansion of macro ‘Rf_error’
   84 | #define error Rf_error
      |               ^~~~~~~~
/home/iucar/R/x86_64-redhat-linux-gnu-library/4.5/RcppEigen/include/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h:305:14: note: in expansion of macro ‘error’
  305 |   RealScalar error() const
      |              ^~~~~

If you protect that error definition with parentheses, as in (error), then BayesProject is fine. But it shouldn't be expanded into Rf_error in the first place (!). This is effectively changing Eigen's API.

@eddelbuettel
Copy link
Member

eddelbuettel commented Nov 5, 2025

I believe this is a bug in RcppEigen.

Yes/no/maybe/unsure/I don't care: It goes away if you do not include R.h and is ultimately caused by Eigen having a function called error(). Other projects and authors do too, I think it is our (and R's) duty to be minimal with global namespace issues. What it really is about is R's Rf_error() being prefered to R's error(). I fundamentally also prefer changesets that do not change the upstream as I do not want to inherit a task of having to change upstream for potentially a very long time. So I much rather re-arrange things in the client package.

A related issue is that we should probably warn when users include R.h. RcppArmadillo does, maybe RcppEigen should as well. Life is easiest if users just include the fewest headers (ie just RcppArmadillo.h or RcppEigen.h).

@Enchufa2
Copy link
Member Author

Enchufa2 commented Nov 5, 2025

Ah, ok, I thought it was RcppEigen who was including R.h. Then I agree RcppEigen should warn as RcppArmadillo does. And then it's enough to comment out that include in client packages, it is not necessary to create inst/include/BayesProject_types.h, etc., right?

@eddelbuettel
Copy link
Member

eddelbuettel commented Nov 5, 2025

I am very confused as to why I now need the inst/include/$PACKAGE_types.h when we did not before. Two of the patches I prepared above have it and need it.

It's the same as always: RcppExports.cpp, as created, may use types from included libraries. Here we need a using namespace Eigen; as well in both cases. I do not understand where that slipped in before. We never add it as we (like most programmers) prefer not to flatten namespaces.

Also, to be more precise: RcppArmadillo.h warns (maybe errors even...) when it sees Rcpp.h included (as that can mess with forward declarations). It does not warn about R.h. I am getting to the more radical view that maybe we should warn in Rcpp if R.h was already included?

@Enchufa2
Copy link
Member Author

Enchufa2 commented Nov 5, 2025

I am very confused as to why I now need the inst/include/$PACKAGE_types.h when we did not before. Two of the patches I prepared above have it and need it.

Ah, because your are running compileAttributes too, right?, which removes using namespace Eigen from RcppExports.cpp. So they edited that file by hand?

My point was that the package, as is, can be fixed for this PR just by removing the include:

diff --git a/src/bayes.cpp b/src/bayes.cpp
index c856b42..b9e5e65 100644
--- a/src/bayes.cpp
+++ b/src/bayes.cpp
@@ -1,4 +1,3 @@
-#include <R.h>
 #include <Rcpp.h>
 using namespace Rcpp;
 #include <RcppEigen.h>

How the client package deals with flatten namespaces or not it's their problem.

Also, to be more precise: RcppArmadillo.h warns (maybe errors even...) when it sees Rcpp.h included (as that can mess with forward declarations). It does not warn about R.h. I am getting to the more radical view that maybe we should warn in Rcpp if R.h was already included?

I think we should at least warn now and at some point throw an error.

@eddelbuettel
Copy link
Member

Thumbs up on more minimal diffs. That may affect more than one package. Needing an inst/include/*h is probably a tell. Will revisit before we file PRs.

Agreed on that adding a warning is probably a good.

@Enchufa2
Copy link
Member Author

Enchufa2 commented Nov 5, 2025

Also, to be more precise: RcppArmadillo.h warns (maybe errors even...) when it sees Rcpp.h included

Yes, it does error.

@eddelbuettel
Copy link
Member

eddelbuettel commented Nov 5, 2025

It's been a while. We needed it then for finetune wrappers and forwarding, it's been like this ever since. I think I should add a warning to RcppEigen.

Edit Issue opened at its repo.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Consider masking definition of Rf_error()?

4 participants