rjmccall added a comment.

In https://reviews.llvm.org/D50119#1303423, @Quuxplusone wrote:

> In the `unordered_set [[maybe_trivially_relocatable]]` patch, I must wrap the 
> attribute in a macro `_LIBCPP_MAYBE_TRIVIALLY_RELOCATABLE_UNLESS_DEBUG`. 
> Without this caveat, I would have ended up with //unsafe behavior// in debug 
> mode. The `unordered_set [[trivially_relocatable]]` patch does not have this 
> danger; the fact that we break the Rule of Zero in debug mode is sufficient 
> to disable trivial relocatability.


Can you elaborate?  Providing a non-defaulted copy/move constructor or 
destructor should make an unannotated class non-trivially-relocatable under 
both rules.

> In the `unordered_set [[maybe_trivially_relocatable]]` patch, I must either 
> pipe the attribute down through `unique_ptr`, or else give up using 
> `unique_ptr` in `__hash_table`. I chose to modify `unique_ptr`; but note that 
> many working programmers wouldn't have this luxury. In the `unordered_set 
> [[trivially_relocatable]]` patch, I don't need to modify `unique_ptr`; I just 
> use the "triviality-forcing wrapper" pattern.

Sure, this is an acknowledged downside of `[[maybe_trivially_relocatable]]` for 
third-party programmers.

> I still believe it is impossible to implement `std::optional` with only 
> `[[maybe_trivially_relocatable]]`.

This might also need elaboration.


Repository:
  rC Clang

https://reviews.llvm.org/D50119



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to