Skip to content

cpp_source fails to compile indented void-returning function #455

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
plietar opened this issue May 6, 2025 · 1 comment
Open

cpp_source fails to compile indented void-returning function #455

plietar opened this issue May 6, 2025 · 1 comment

Comments

@plietar
Copy link

plietar commented May 6, 2025

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’
@pachadotdev
Copy link
Contributor

hi @plietar
I use cpp11 in my lab
I proposed a fix to decor such that signature becomes "void foo()" (not " void foo()"), and the C parser shall see the void return type and generate the correct (void‐returning) wrapper
r-lib/decor@main...pachadotdev:decor:patch-1

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

No branches or pull requests

2 participants