If a void-returning function marked with cpp11::register is indented, cpp11 fails to recognize the void return type and will try to use its result in the wrapper it generates.
# This works
cpp11::cpp_source(code = "[[cpp11::register]]\nvoid foo() {}")
# This fails to compile. Note the extra space character between the newline and void
cpp11::cpp_source(code = "[[cpp11::register]]\n void foo() {}")
using C++ compiler: ‘g++ (GCC) 14.2.1 20241116’
using C++11
/tmp/nix-shell.Cz8fPO/RtmpadKzBh/code_16bff7617b36f0.cpp:2:11: warning: ‘cpp11::register’ scoped attribute directive ignored [-Wattributes]
2 | void foo() {}
| ^
/tmp/nix-shell.Cz8fPO/RtmpadKzBh/file16bff7121f1a99/src/cpp11.cpp: In function ‘SEXPREC* _code_16bff7617b36f0_foo()’:
/tmp/nix-shell.Cz8fPO/RtmpadKzBh/file16bff7121f1a99/src/cpp11.cpp:7:30: error: invalid use of void expression
7 | return cpp11::as_sexp(foo());
| ~~~^~
make: *** [/nix/store/bb3gfb6b740ha50bbwvbgslybnqm0vgf-R-4.4.3/lib/R/etc/Makeconf:204: /tmp/nix-shell.Cz8fPO/RtmpadKzBh/file16bff7121f1a99/src/cpp11.o] Error 1
Error: Compilation failed.
The same behaviour happens when using an external file instead of an inline code = argument.
packageVersion("cpp11")
#> [1] ‘0.5.2’
If a void-returning function marked with
cpp11::registeris indented, cpp11 fails to recognize the void return type and will try to use its result in the wrapper it generates.The same behaviour happens when using an external file instead of an inline
code =argument.