Use tag types to generate attribute specific internals and avoid ODR violations - #493
Merged
Merged
Conversation
Member
Author
Member
Author
|
@jimhester - @jennybc and I thought you'd enjoy the resolution to this gnarly issue that has caused |
krlmlr
added a commit
to krlmlr/cpp11
that referenced
this pull request
Sep 12, 2026
Upstream fixed the root cause in r-lib#493, so this patch has nothing left to do and the conflict resolves to removing the feature. This branch worked around r-lib#295 -- `cpp11::warning(const char*)` crashed where `cpp11::warning(const std::string&)` did not -- by deleting the `const char*` overloads and taking the format argument by value, routing every caller through the path that did not crash. r-lib#493 removes the cause rather than the symptom: `Rf_errorcall()` and `Rf_warningcall()` share a function type, so `stop()` and `warning()` collapsed into one `detail::closure` / `detail::apply()` instantiation, and the `[[noreturn]]` flavour could render `warning()`'s return path unreachable. Upstream now tags the templates with `detail::return_tag` and `detail::no_return_tag`, and ships a regression test that calls `cpp11::warning("%s", "warning")` -- the `const char*` overload -- from a translation unit separate from one calling `cpp11::stop()`, which is exactly the r-lib#295 scenario. Its NEWS bullet cites r-lib#295 by number. Keeping the workaround would now cost something for nothing: it removes public `const char*` overloads from the header and constructs a `std::string` on every warning call. The upstream pull request carrying this patch, r-lib#422, was closed unmerged on the day r-lib#493 landed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K8MneV8KqHYUuC8fWV3X5Q
krlmlr
added a commit
to krlmlr/cpp11
that referenced
this pull request
Sep 12, 2026
Upstream implemented the feature itself in r-lib#493's sibling r-lib#492, so the conflict resolves to removing this patch. This branch vectorized `cpp_source()`'s `file` argument: `all(file.exists(file))` instead of `file.exists(file)`, `vapply(file, generate_cpp_name, ...)` instead of one name, and a shared-library name derived from the first file rather than the last. r-lib#492 teaches `cpp_source()` to source multiple files outright, and covers each of those points: it checks `all(file.exists(file))` and reports the first missing path, maps `generate_cpp_name()` over `file` with `vcapply()`, and derives the library name from `generate_package_name()`, which sidesteps the naming problem this patch worked around. It also adds fixtures and a test, which this patch never had. Davis Vaughan closed the upstream pull request carrying this patch, r-lib#337, with "Closed via r-lib#492 for a similar debugging use case". Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K8MneV8KqHYUuC8fWV3X5Q
krlmlr
added a commit
to krlmlr/cpp11
that referenced
this pull request
Sep 12, 2026
Three files conflicted, and only one of them belongs to this branch. `R/source.R` and `inst/include/cpp11/protect.hpp` conflicted because this branch was cut from an older integration branch and carries five squash commits belonging to other patches. Those are resolved to upstream's version: they are not this patch's to carry, and both of the patches behind them are themselves superseded (r-lib#492 and r-lib#493). `R/vendor.R` is the real conflict. Upstream reformatted `cpp_vendor()` with Air, so the `date` and `overwrite` arguments are re-applied on top of that new shape rather than reverting it. `man/cpp_vendor.Rd` and the roxygen block gain the two `@param` entries the original patch never wrote. Without them `R CMD check` reports undocumented arguments, so the branch could not have passed a check as it stood. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K8MneV8KqHYUuC8fWV3X5Q
Member
|
Wonderful, thanks for looking into this, Davis! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #491
Closes #422 (because all this did was change the
warning()signature to something that no longer conflicted withstop(), so it didn't fix the underlying problem)This was the actual solution for #295
My inline documentation fully describes the problem, so I will regurgitate it here