<functional>: unwrap move_only_function with abominable and noexcept types
#5917
+60
−7
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.
Towards #5504.
Follow up on #5808.
📦 Newly unwrapped cases
move_only_function<R(Args...) cv1-ref1-noex1>(move_only_function<R(Args...) cv2-ref2-noex2>(callable));wherenoexceptandconstmay be present in only inner, and&or&&may be present in only outermove_only_function<R(Args...) cv-ref>(function<R(Args...)>(callable))where cv-ref can haveconst,&, and&&.In the tests make sure the type system is not broken, and the cases which are not supposed to compile, still do not compile.
🐿️ Squirrelly case
Inner
noexcept, outer non-noexceptcase is squirrelly.If we keep conditional
noexcepton the structure, it would violate strict aliasing: the inner one would have a different_Function_baseand thus_Function_base::_Impl_t.Alternatives:
_Noexceptparameter from_Function_base, and pass that as template parameter on function construction, also dress it onto_Invokepointer withreinterpret_castwhen needed. This is doable, but makes the current change more complicated.noexceptvarying case unwrapped.noexceptfunction pointer (bad, missed optimization we're asked to do)._Impl_t(need to get that working in clang-cl somehow, as it can't assign function pointer tovoid*)