On 25 September 2018 at 09:16, Joshua N Pritikin wrote: | We finally figured out why our binaries were failing to build on OS/X, | after more than a year of misery. | | We use C++ exceptions and try/catch blocks like this, | | try { | // stuff here | } catch (const std::exception& e) { | | This works great with gcc, but whatever version of clang used by CRAN | doesn't like this code. The exception is not caught. So, instead, we have | to write | | try { | // stuff here | } catch (const std::exception& e) { | // gcc gets here | } catch (...) { | // clang gets here | | which works on both compilers. I don't know why clang skips the first | catch clause.
I am not one to quote the C++ standard but for what it is worth, the second form is that what we have always done in Rcpp land. Witness eg the macro below inserted by Rcpp Attributes at the end of every function (following on what we did with inline before Rcpp Attributes), and note the catch-all block. Dirk // There is no return in case of a longjump exception #ifndef END_RCPP_RETURN_ERROR #define END_RCPP_RETURN_ERROR \ } \ catch (Rcpp::internal::InterruptedException &__ex__) { \ return Rcpp::internal::interruptedError(); \ } \ catch (Rcpp::LongjumpException& __ex__) { \ return Rcpp::internal::longjumpSentinel(__ex__.token); \ } \ catch (std::exception &__ex__) { \ return exception_to_try_error(__ex__); \ } \ catch (...) { \ return string_to_try_error("c++ exception (unknown reason)"); \ } \ return R_NilValue; #endif -- http://dirk.eddelbuettel.com | @eddelbuettel | e...@debian.org ______________________________________________ R-package-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel