cjdb added a comment.

In D129951#4179481 <https://reviews.llvm.org/D129951#4179481>, @ldionne wrote:

> In D129951#4179467 <https://reviews.llvm.org/D129951#4179467>, @cjdb wrote:
>
>> I'm deeply disappointed that libc++ moved away from using `__function_like`: 
>> that was an important part of preventing niebloid misuse. It isn't 
>> conforming to treat niebloids as function objects, which is what 
>> `__function_like` prevented (I just checked `std::ranges::next` and it seems 
>> that `__function_like` was completely removed).
>
> Oops, it seems like my reply got into a race condition with yours. I am 
> curious though, why is it non-conforming to treat niebloids as function 
> objects? It is certainly more lax than required by the Standard, however we 
> are allowed to make those copyable, aren't we? Does the Standard say that we 
> *have* to make them non-usable as objects? That would change things for sure 
> (not with this patch, but we'd probably want to try re-introducing 
> `__function_like`, and we'd file a bug report against libstdc++ to do the 
> same).

"isn't conforming" is a bit too harsh in retrospect (this applies to //every// 
conversation I've brought this up in, although I meant that it allows users to 
write "non-conforming code"). A more accurate way to put this is: it is 
conforming on a per-implementation basis, but is //non-portable// due to 
namespace.std/p6 <http://eel.is/c++draft/library#namespace.std-6>. For example, 
a user who wants to use Microsoft/STL won't ever be able to take advantage of 
using `std::ranges::next` as a higher-order function (and could potentially 
have migration issues if they're porting to Windows), because their niebloids 
<https://github.com/microsoft/STL/blob/main/stl/inc/xutility#L3228> are derived 
from _Not_quite_object 
<https://github.com/microsoft/STL/blob/main/stl/inc/xutility#L3045-L3049>. 
`_Not_quite_object`'s predecessor in cmcstl2 was the inspiration for 
`__function_like`.

As for a refresher on why this is the reason, it's because the functions in 
`std::ranges` //should// be functions, but we lack the technology to make them 
functions.

In D129951#4179474 <https://reviews.llvm.org/D129951#4179474>, @ldionne wrote:

> This is a really neat attribute! FWIW, I think we would most likely have used 
> it in `<ranges>` if it were available back then. Assuming that GCC 
> implemented it, I think we could consider changing to use this attribute. 
> However:

Thanks, glad you like it :-)
(I think the "however" bit got addressed above.)

> FWIW, my main thought is that I would like to see this proposed as a WG21 
> proposal. This might end up an attribute or something else, I'm not sure. But 
> it would address the issue of not all implementations providing the 
> functionality. IMO this patch and the data gathered in it would be a great 
> motivation for WG21 to do something (I also know there are other proposals in 
> this domain).

I don't attend WG21 anymore, but could probably work with someone who is 
motivated enough to see it from Evolution through plenary. My preference is a 
specifier, rather than an attribute. For better, or for worse, most attributes 
are ignorable; this is certainly a property that should never be ignored.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D129951/new/

https://reviews.llvm.org/D129951

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

Reply via email to