Add constexpr support for dynamic allocated cpp_int#654
Add constexpr support for dynamic allocated cpp_int#654marcoffee wants to merge 20 commits intoboostorg:developfrom
Conversation
66564be to
e6cb783
Compare
e6cb783 to
2c0d0cd
Compare
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## develop #654 +/- ##
=========================================
+ Coverage 96.2% 96.3% +0.1%
=========================================
Files 301 304 +3
Lines 29462 29484 +22
=========================================
+ Hits 28328 28366 +38
+ Misses 1134 1118 -16
... and 6 files with indirect coverage changes Continue to review full report in Codecov by Sentry.
🚀 New features to boost your workflow:
|
2c0d0cd to
dd3be65
Compare
|
Hi @marcoffee I'm sorry this took so long. Your PR was waiting in the queue for a while. I've just approved the CI/CD run on this PR. In Multiprecision, first-time contributors need approval to even run CI/CD, and this can be a bit of a point where we lose some time. Sorry for that. There is renewed interest in Of course, @jzmaddock will need to look at this, and I will also. But let's see how CI/CD runs with the full battery of compilers running it. Cc: @jzmaddock and @mborland and @eisenwave |
|
Hi @marcoffee and @jzmaddock CI has run green. One thing, however, that I did not test is a simple code verifying the @marcoffee could you work up an example (post-C++20) that exercises this? Then we can put the test into CI/CD. Cc: @mborland |
|
The added missing lines in code coverage seem to be lines that aare never expected to run, using |
|
I can't merge this thing until we get a consensus from @jzmaddock and @mborland |
It's not that they are never used, it's that they never used at run-time so codecov can't pick them up. I normally just |
|
@ckormanyos thanks for your reply!
Please correct me if I'm wrong, but some of the tests (e.g., here) can only run during constexpr evaluation since they are called in a If there is need for more tests I can add them. Also, if there is need for adding some |
I looked through the tests this morning and yes, it looks like you're already exercising these dynamic allocation paths.
If you would add if (BOOST_MP_IS_CONST_EVALUATED(n))
{
// LCOV_EXCL_START
...
// LCOV_EXCL_STOP
}Or Codecov will erroneously mark these paths as never taken, but it doesn't support coverage of constant evaluated paths. |
There is just the case for this check that may run at consteval time or not depending on the input types. In this case, should I:
|
In that case it looks like you could write tests that would cover both paths at runtime. One with same DestT and SrcT and one where they are different. |
I found out that this method is only called for copying limbs, so the types should always be the same. I just removed the possibility of passing two different types and ended up with just the |
…or BOOST_MP_NO_CXX20_DYNAMIC_ALLOC_CONSTEXPR
…type constructor overload
|
Just resolved the conflicts locally and started the tests. As soon as it is finished here I will push a new version with the changes. |
dd3be65 to
f1aeeb3
Compare
610f987 to
4e2a915
Compare
|
It seems like the Install Packages step is failing due to network errors. I'm trying to force push to the branch to trigger rerun. |
4e2a915 to
5957e7a
Compare
5957e7a to
d0b80d2
Compare
I could not cover this line. Since the previous and next line are covered, I'm assuming the compiler is optimizing out this assignment because it can prove that I can add |
Line 1908 unconditionally follows line 1907 (where 1907 is covered). This is, in my opinion, a clear false-negative. You can Coverage is challenging with optimized C++. Sometimes it's just not right in LCOV. In some other projects, we specifically reduce the optimization level on coverage runs. This is also not perfect. In the Multiprecision case, we collect coverage from relatively aggressively optimized runs. And it takes a keen eye to find false negatives. Good catch @marcoffee |
|
I don't think you need to mandate 100% coverage on the patch. Other opinions will vary. But the entire project is around 96% right now. So we are looking for , maybe, close to 100% patch coverage. The file you mention goes on to have entirely uncovered blocks. These might be more interesting. Or they simply might be out of the scope of your changes. |
@ckormanyos Thanks!
Those other blocks were already uncovered before the PR. I can try to cover them now, but it will add more information to review on the PR and I agree that it might be out of scope. Another option is opening a new PR after this one is merged to try to cover those lines, but the new one would focus entirely on tests (and some small refactoring). Curiously enough this very similar line is marked as covered. |
|
Marco (@marcoffee) I would recommend that you do NOT try to cover previously uncovered blocks within the scope of your PR. This is something we will work on in our team as we evolve. You concentrate on your scope of changes. |
Added constexpr support for dynamic allocated
cpp_ints as long as compiler implements features__cpp_constexpr_dynamic_allocand__cpp_lib_constexpr_dynamic_allocfrom P0784R7.If those features are disabled, it behaves as the current implementation. Note that those features require C++20, so they will only work when passing
-std=c++2a(or beyond) flag during compilation through a supported compiler (tested here ong++-11+ andclang++-16+ using libstdc++ withg++-10+ toolset on ubuntu noble).It might work on
g++-10, but for some reason the b2 check forif constexprkeep returning "no" for it.Also fixed constexpr construction from strings and added some tests for construction/operations on dynamic allocated
cpp_ints.Had to make small changes to existing code to tackle some warnings given when compiled without the feature's support (such as uninitialized variables not being supported in constexpr methods before C++20).