rjmccall added a comment.

In D116203#3434515 <https://reviews.llvm.org/D116203#3434515>, @cjdb wrote:

> In D116203#3431612 <https://reviews.llvm.org/D116203#3431612>, @rjmccall 
> wrote:
>
>> In D116203#3430332 <https://reviews.llvm.org/D116203#3430332>, 
>> @aaron.ballman wrote:
>>
>>> In D116203#3425512 <https://reviews.llvm.org/D116203#3425512>, @cjdb wrote:
>>>
>>>> I've noticed that libstdc++ has `using __remove_cv = typename 
>>>> remove_cv<T>::type`, which causes Clang to chuck a wobbly. Changing from 
>>>> `KEYWORD` to `TYPE_TRAIT_1` didn't seem to fix anything.
>>>> Is there a way we can work around this, or should we just rename 
>>>> `__remove_cv` and friends to something else?
>>>
>>> You could work around it by taking note that you're in a libstdc++ system 
>>> header and do a special dance, but because these are in the 
>>> implementation's namespace, I think it's probably kinder for everyone to 
>>> just pick a different name.
>
> I was hoping we could do something similar to `struct __remove_cv` which 
> would issue a warning?
>
>>> If you wanted to be especially mean, you could go with `__remove_cvr`, but 
>>> I'd suggest `__remove_cv_qualifiers` instead. However, what about 
>>> `restrict` qualifiers? We support them in C++: 
>>> https://godbolt.org/z/11EPefhjf
>>
>> Along with a fair number of other vendor qualifiers, yeah.  I think you have 
>> to make a policy decision about whether the intent of `std::remove_cv` is 
>> really to just remove CV qualifiers or to produce an unqualified type (at 
>> the outermost level).  The former is probably more defensible, even if it 
>> makes the transform less useful in the presence of extended qualifiers.
>
> I'm partial to `std::remove_cv` being faithful to its name, unless existing 
> implementations do something else already. I don't mind adding support for 
> the other stuff, but if there's more than just add/remove `restrict`, we're 
> going to have a combinatorial explosion for removes. Is there an alternate 
> way we can approach this?
> Possibly:
>
>   template<class T>
>   using remove_const_t = __remove_qualifiers(T, const);
>   
>   
>   template<class T>
>   using remove_reference_t = __remove_qualifiers(T, &, &&);
>   
>   template<class T>
>   using remove_rcvref_t = __remove_qualifiers(T, const, volatile, restrict, 
> &, &&); // rcv instead of cvr to prevent a typo with remove_cvref_t

I don't think it's worth adding that parsing complexity for a builtin that we 
expect to only be used in system headers.  Let's just remove `const` and 
`volatile` and leave other qualifiers in place.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D116203

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

Reply via email to