Re: r328680 - [ObjC] Make C++ triviality type traits available to non-trivial C

2018-04-13 Thread John McCall via cfe-commits
> On Apr 9, 2018, at 3:47 PM, Akira Hatanaka  wrote:
> 
> 
>> On Apr 5, 2018, at 1:25 PM, John McCall > > wrote:
>> 
>> 
>> 
>>> On Apr 5, 2018, at 3:54 PM, Akira Hatanaka >> > wrote:
>>> 
>>> 
 On Apr 5, 2018, at 12:39 PM, John McCall >>> > wrote:
 
 
 
> On Apr 4, 2018, at 7:37 PM, Akira Hatanaka  > wrote:
> 
> 
> 
>> On Apr 4, 2018, at 4:24 PM, Akira Hatanaka via cfe-commits 
>> mailto:cfe-commits@lists.llvm.org>> wrote:
>> 
>>> 
>>> On Apr 4, 2018, at 3:38 PM, Richard Smith >> > wrote:
>>> 
>>> Hi Akira,
>>> 
>>> This change has broken the C++ versions of these type traits for 
>>> classes with volatile members. Such classes are required to claim to be 
>>> trivial per C++ DR 2094 
>>> (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2094 
>>> ) 
>>> but return false from isNonTrivialToPrimitiveCopy().
>>> 
>> 
>> Oh that’s right. The function returns false when 
>> isNonTrivialToPrimitiveCopy() returns PCK_VolatileTrivial. That is wrong.
>> 
>>> Also, exposing these __has_* traits more widely seems like a backwards 
>>> step to me: these traits are deprecated, near-useless, and we're trying 
>>> to remove them. No code should be using them under any circumstances; 
>>> the __is_* traits should be used instead.
>>> 
>> 
>> The __is_* traits (is_trivially_copy_constructible, etc.) are templates 
>> defined in libcxx, so it seems that we can’t use them when compiling in 
>> C mode. Is it OK to add their definitions to TokenKinds.def as non-C++ 
>> keywords?
>> 
> 
> Or perhaps redefine the six __has_* traits used here as non-C++ (KEYNOCXX 
> or ‘KEYC99 | KEYC11') keywords?
 
 I think Richard is talking about e.g. the __is_trivially_destructible 
 intrinsic type trait function rather than std::is_trivially_destructible.
 
 Do we have a concrete need to expose these type traits to C?
 
>>> 
>>> No, no one has asked any of these type traits to be exposed to C yet. Do 
>>> you think we should just revert the patch and wait until someone asks for 
>>> those type traits to be available in C?
>> 
>> I think that would be fine.  Although it would be nice if we could save the 
>> part of the patch that makes the trait logic sensitive to the type queries 
>> instead of needing to include duplicated checks for __strong, __weak, and 
>> whatever other non-trivial C features we eventually add.
>> 
> 
> Reverted r329289 in r329608. I wasn’t sure which part of the patch should be 
> saved. I don’t think we need to check the properties of the types calling the 
> QualType::isNonTrivialTo* functions since we aren’t exposing the type traits 
> to C anymore?

I mean that it would be nice if the queries could just consider the primitive 
type properties in the non-record case instead of having explicit extra checks 
for __strong/__weak and so on.

John.

> 
>> John.
>> 
>>> 
 John.
 
> 
>>> On 27 March 2018 at 17:12, Akira Hatanaka via cfe-commits 
>>> mailto:cfe-commits@lists.llvm.org>> wrote:
>>> Author: ahatanak
>>> Date: Tue Mar 27 17:12:08 2018
>>> New Revision: 328680
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=328680&view=rev 
>>> 
>>> Log:
>>> [ObjC] Make C++ triviality type traits available to non-trivial C
>>> structs.
>>> 
>>> r326307 and r327870 made changes that allowed using non-trivial C
>>> structs with fields qualified with __strong or __weak. This commit makes
>>> the following C++ triviality type traits available to non-trivial C
>>> structs:
>>> 
>>> __has_trivial_assign
>>> __has_trivial_move_assign
>>> __has_trivial_copy
>>> __has_trivial_move_constructor
>>> __has_trivial_constructor
>>> __has_trivial_destructor
>>> 
>>> rdar://problem/33599681 
>>> 
>>> Differential Revision: https://reviews.llvm.org/D44913 
>>> 
>>> 
>>> Added:
>>> cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m
>>> Modified:
>>> cfe/trunk/include/clang/Basic/TokenKinds.def
>>> cfe/trunk/lib/Sema/SemaExprCXX.cpp
>>> 
>>> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TokenKinds.def?rev=328680&r1=328679&r2=328680&view=diff
>>>  
>>> 
>>> ==
>>> --- cfe/t

Re: r328680 - [ObjC] Make C++ triviality type traits available to non-trivial C

2018-04-09 Thread Akira Hatanaka via cfe-commits

> On Apr 5, 2018, at 1:25 PM, John McCall  wrote:
> 
> 
> 
>> On Apr 5, 2018, at 3:54 PM, Akira Hatanaka > > wrote:
>> 
>> 
>>> On Apr 5, 2018, at 12:39 PM, John McCall >> > wrote:
>>> 
>>> 
>>> 
 On Apr 4, 2018, at 7:37 PM, Akira Hatanaka >>> > wrote:
 
 
 
> On Apr 4, 2018, at 4:24 PM, Akira Hatanaka via cfe-commits 
> mailto:cfe-commits@lists.llvm.org>> wrote:
> 
>> 
>> On Apr 4, 2018, at 3:38 PM, Richard Smith > > wrote:
>> 
>> Hi Akira,
>> 
>> This change has broken the C++ versions of these type traits for classes 
>> with volatile members. Such classes are required to claim to be trivial 
>> per C++ DR 2094 
>> (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2094 
>> ) but 
>> return false from isNonTrivialToPrimitiveCopy().
>> 
> 
> Oh that’s right. The function returns false when 
> isNonTrivialToPrimitiveCopy() returns PCK_VolatileTrivial. That is wrong.
> 
>> Also, exposing these __has_* traits more widely seems like a backwards 
>> step to me: these traits are deprecated, near-useless, and we're trying 
>> to remove them. No code should be using them under any circumstances; 
>> the __is_* traits should be used instead.
>> 
> 
> The __is_* traits (is_trivially_copy_constructible, etc.) are templates 
> defined in libcxx, so it seems that we can’t use them when compiling in C 
> mode. Is it OK to add their definitions to TokenKinds.def as non-C++ 
> keywords?
> 
 
 Or perhaps redefine the six __has_* traits used here as non-C++ (KEYNOCXX 
 or ‘KEYC99 | KEYC11') keywords?
>>> 
>>> I think Richard is talking about e.g. the __is_trivially_destructible 
>>> intrinsic type trait function rather than std::is_trivially_destructible.
>>> 
>>> Do we have a concrete need to expose these type traits to C?
>>> 
>> 
>> No, no one has asked any of these type traits to be exposed to C yet. Do you 
>> think we should just revert the patch and wait until someone asks for those 
>> type traits to be available in C?
> 
> I think that would be fine.  Although it would be nice if we could save the 
> part of the patch that makes the trait logic sensitive to the type queries 
> instead of needing to include duplicated checks for __strong, __weak, and 
> whatever other non-trivial C features we eventually add.
> 

Reverted r329289 in r329608. I wasn’t sure which part of the patch should be 
saved. I don’t think we need to check the properties of the types calling the 
QualType::isNonTrivialTo* functions since we aren’t exposing the type traits to 
C anymore?

> John.
> 
>> 
>>> John.
>>> 
 
>> On 27 March 2018 at 17:12, Akira Hatanaka via cfe-commits 
>> mailto:cfe-commits@lists.llvm.org>> wrote:
>> Author: ahatanak
>> Date: Tue Mar 27 17:12:08 2018
>> New Revision: 328680
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=328680&view=rev 
>> 
>> Log:
>> [ObjC] Make C++ triviality type traits available to non-trivial C
>> structs.
>> 
>> r326307 and r327870 made changes that allowed using non-trivial C
>> structs with fields qualified with __strong or __weak. This commit makes
>> the following C++ triviality type traits available to non-trivial C
>> structs:
>> 
>> __has_trivial_assign
>> __has_trivial_move_assign
>> __has_trivial_copy
>> __has_trivial_move_constructor
>> __has_trivial_constructor
>> __has_trivial_destructor
>> 
>> rdar://problem/33599681 
>> 
>> Differential Revision: https://reviews.llvm.org/D44913 
>> 
>> 
>> Added:
>> cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m
>> Modified:
>> cfe/trunk/include/clang/Basic/TokenKinds.def
>> cfe/trunk/lib/Sema/SemaExprCXX.cpp
>> 
>> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TokenKinds.def?rev=328680&r1=328679&r2=328680&view=diff
>>  
>> 
>> ==
>> --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
>> +++ cfe/trunk/include/clang/Basic/TokenKinds.def Tue Mar 27 17:12:08 2018
>> @@ -433,12 +433,12 @@ TYPE_TRAIT_1(__has_nothrow_assign, HasNo
>>  TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX)
>>  TYPE_TRAIT_1(__has_nothrow_copy, HasNothrowCopy, KEYCXX)
>>  TYPE_TRAIT_1(__has_nothrow_constructor, HasNothrowConstructor,

Re: r328680 - [ObjC] Make C++ triviality type traits available to non-trivial C

2018-04-05 Thread John McCall via cfe-commits


> On Apr 5, 2018, at 3:54 PM, Akira Hatanaka  wrote:
> 
> 
>> On Apr 5, 2018, at 12:39 PM, John McCall > > wrote:
>> 
>> 
>> 
>>> On Apr 4, 2018, at 7:37 PM, Akira Hatanaka >> > wrote:
>>> 
>>> 
>>> 
 On Apr 4, 2018, at 4:24 PM, Akira Hatanaka via cfe-commits 
 mailto:cfe-commits@lists.llvm.org>> wrote:
 
> 
> On Apr 4, 2018, at 3:38 PM, Richard Smith  > wrote:
> 
> Hi Akira,
> 
> This change has broken the C++ versions of these type traits for classes 
> with volatile members. Such classes are required to claim to be trivial 
> per C++ DR 2094 
> (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2094 
> ) but 
> return false from isNonTrivialToPrimitiveCopy().
> 
 
 Oh that’s right. The function returns false when 
 isNonTrivialToPrimitiveCopy() returns PCK_VolatileTrivial. That is wrong.
 
> Also, exposing these __has_* traits more widely seems like a backwards 
> step to me: these traits are deprecated, near-useless, and we're trying 
> to remove them. No code should be using them under any circumstances; the 
> __is_* traits should be used instead.
> 
 
 The __is_* traits (is_trivially_copy_constructible, etc.) are templates 
 defined in libcxx, so it seems that we can’t use them when compiling in C 
 mode. Is it OK to add their definitions to TokenKinds.def as non-C++ 
 keywords?
 
>>> 
>>> Or perhaps redefine the six __has_* traits used here as non-C++ (KEYNOCXX 
>>> or ‘KEYC99 | KEYC11') keywords?
>> 
>> I think Richard is talking about e.g. the __is_trivially_destructible 
>> intrinsic type trait function rather than std::is_trivially_destructible.
>> 
>> Do we have a concrete need to expose these type traits to C?
>> 
> 
> No, no one has asked any of these type traits to be exposed to C yet. Do you 
> think we should just revert the patch and wait until someone asks for those 
> type traits to be available in C?

I think that would be fine.  Although it would be nice if we could save the 
part of the patch that makes the trait logic sensitive to the type queries 
instead of needing to include duplicated checks for __strong, __weak, and 
whatever other non-trivial C features we eventually add.

John.

> 
>> John.
>> 
>>> 
> On 27 March 2018 at 17:12, Akira Hatanaka via cfe-commits 
> mailto:cfe-commits@lists.llvm.org>> wrote:
> Author: ahatanak
> Date: Tue Mar 27 17:12:08 2018
> New Revision: 328680
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=328680&view=rev 
> 
> Log:
> [ObjC] Make C++ triviality type traits available to non-trivial C
> structs.
> 
> r326307 and r327870 made changes that allowed using non-trivial C
> structs with fields qualified with __strong or __weak. This commit makes
> the following C++ triviality type traits available to non-trivial C
> structs:
> 
> __has_trivial_assign
> __has_trivial_move_assign
> __has_trivial_copy
> __has_trivial_move_constructor
> __has_trivial_constructor
> __has_trivial_destructor
> 
> rdar://problem/33599681 
> 
> Differential Revision: https://reviews.llvm.org/D44913 
> 
> 
> Added:
> cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m
> Modified:
> cfe/trunk/include/clang/Basic/TokenKinds.def
> cfe/trunk/lib/Sema/SemaExprCXX.cpp
> 
> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TokenKinds.def?rev=328680&r1=328679&r2=328680&view=diff
>  
> 
> ==
> --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
> +++ cfe/trunk/include/clang/Basic/TokenKinds.def Tue Mar 27 17:12:08 2018
> @@ -433,12 +433,12 @@ TYPE_TRAIT_1(__has_nothrow_assign, HasNo
>  TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX)
>  TYPE_TRAIT_1(__has_nothrow_copy, HasNothrowCopy, KEYCXX)
>  TYPE_TRAIT_1(__has_nothrow_constructor, HasNothrowConstructor, KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, 
> KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, 
> KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDest

Re: r328680 - [ObjC] Make C++ triviality type traits available to non-trivial C

2018-04-05 Thread Akira Hatanaka via cfe-commits

> On Apr 5, 2018, at 12:39 PM, John McCall  wrote:
> 
> 
> 
>> On Apr 4, 2018, at 7:37 PM, Akira Hatanaka > > wrote:
>> 
>> 
>> 
>>> On Apr 4, 2018, at 4:24 PM, Akira Hatanaka via cfe-commits 
>>> mailto:cfe-commits@lists.llvm.org>> wrote:
>>> 
 
 On Apr 4, 2018, at 3:38 PM, Richard Smith >>> > wrote:
 
 Hi Akira,
 
 This change has broken the C++ versions of these type traits for classes 
 with volatile members. Such classes are required to claim to be trivial 
 per C++ DR 2094 
 (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2094 
 ) but 
 return false from isNonTrivialToPrimitiveCopy().
 
>>> 
>>> Oh that’s right. The function returns false when 
>>> isNonTrivialToPrimitiveCopy() returns PCK_VolatileTrivial. That is wrong.
>>> 
 Also, exposing these __has_* traits more widely seems like a backwards 
 step to me: these traits are deprecated, near-useless, and we're trying to 
 remove them. No code should be using them under any circumstances; the 
 __is_* traits should be used instead.
 
>>> 
>>> The __is_* traits (is_trivially_copy_constructible, etc.) are templates 
>>> defined in libcxx, so it seems that we can’t use them when compiling in C 
>>> mode. Is it OK to add their definitions to TokenKinds.def as non-C++ 
>>> keywords?
>>> 
>> 
>> Or perhaps redefine the six __has_* traits used here as non-C++ (KEYNOCXX or 
>> ‘KEYC99 | KEYC11') keywords?
> 
> I think Richard is talking about e.g. the __is_trivially_destructible 
> intrinsic type trait function rather than std::is_trivially_destructible.
> 
> Do we have a concrete need to expose these type traits to C?
> 

No, no one has asked any of these type traits to be exposed to C yet. Do you 
think we should just revert the patch and wait until someone asks for those 
type traits to be available in C?

> John.
> 
>> 
 On 27 March 2018 at 17:12, Akira Hatanaka via cfe-commits 
 mailto:cfe-commits@lists.llvm.org>> wrote:
 Author: ahatanak
 Date: Tue Mar 27 17:12:08 2018
 New Revision: 328680
 
 URL: http://llvm.org/viewvc/llvm-project?rev=328680&view=rev 
 
 Log:
 [ObjC] Make C++ triviality type traits available to non-trivial C
 structs.
 
 r326307 and r327870 made changes that allowed using non-trivial C
 structs with fields qualified with __strong or __weak. This commit makes
 the following C++ triviality type traits available to non-trivial C
 structs:
 
 __has_trivial_assign
 __has_trivial_move_assign
 __has_trivial_copy
 __has_trivial_move_constructor
 __has_trivial_constructor
 __has_trivial_destructor
 
 rdar://problem/33599681 
 
 Differential Revision: https://reviews.llvm.org/D44913 
 
 
 Added:
 cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m
 Modified:
 cfe/trunk/include/clang/Basic/TokenKinds.def
 cfe/trunk/lib/Sema/SemaExprCXX.cpp
 
 Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
 URL: 
 http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TokenKinds.def?rev=328680&r1=328679&r2=328680&view=diff
  
 
 ==
 --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
 +++ cfe/trunk/include/clang/Basic/TokenKinds.def Tue Mar 27 17:12:08 2018
 @@ -433,12 +433,12 @@ TYPE_TRAIT_1(__has_nothrow_assign, HasNo
  TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX)
  TYPE_TRAIT_1(__has_nothrow_copy, HasNothrowCopy, KEYCXX)
  TYPE_TRAIT_1(__has_nothrow_constructor, HasNothrowConstructor, KEYCXX)
 -TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYCXX)
 -TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYCXX)
 -TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYCXX)
 -TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, 
 KEYCXX)
 -TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, 
 KEYCXX)
 -TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYCXX)
 +TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYALL)
 +TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYALL)
 +TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYALL)
 +TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, 
 KEYALL)
 +TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, 
 KEYALL)
 +TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYALL)
  TYPE_TRAIT_1(__h

Re: r328680 - [ObjC] Make C++ triviality type traits available to non-trivial C

2018-04-05 Thread John McCall via cfe-commits


> On Apr 4, 2018, at 7:37 PM, Akira Hatanaka  wrote:
> 
> 
> 
>> On Apr 4, 2018, at 4:24 PM, Akira Hatanaka via cfe-commits 
>> mailto:cfe-commits@lists.llvm.org>> wrote:
>> 
>>> 
>>> On Apr 4, 2018, at 3:38 PM, Richard Smith >> > wrote:
>>> 
>>> Hi Akira,
>>> 
>>> This change has broken the C++ versions of these type traits for classes 
>>> with volatile members. Such classes are required to claim to be trivial per 
>>> C++ DR 2094 
>>> (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2094 
>>> ) but 
>>> return false from isNonTrivialToPrimitiveCopy().
>>> 
>> 
>> Oh that’s right. The function returns false when 
>> isNonTrivialToPrimitiveCopy() returns PCK_VolatileTrivial. That is wrong.
>> 
>>> Also, exposing these __has_* traits more widely seems like a backwards step 
>>> to me: these traits are deprecated, near-useless, and we're trying to 
>>> remove them. No code should be using them under any circumstances; the 
>>> __is_* traits should be used instead.
>>> 
>> 
>> The __is_* traits (is_trivially_copy_constructible, etc.) are templates 
>> defined in libcxx, so it seems that we can’t use them when compiling in C 
>> mode. Is it OK to add their definitions to TokenKinds.def as non-C++ 
>> keywords?
>> 
> 
> Or perhaps redefine the six __has_* traits used here as non-C++ (KEYNOCXX or 
> ‘KEYC99 | KEYC11') keywords?

I think Richard is talking about e.g. the __is_trivially_destructible intrinsic 
type trait function rather than std::is_trivially_destructible.

Do we have a concrete need to expose these type traits to C?

John.

> 
>>> On 27 March 2018 at 17:12, Akira Hatanaka via cfe-commits 
>>> mailto:cfe-commits@lists.llvm.org>> wrote:
>>> Author: ahatanak
>>> Date: Tue Mar 27 17:12:08 2018
>>> New Revision: 328680
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=328680&view=rev 
>>> 
>>> Log:
>>> [ObjC] Make C++ triviality type traits available to non-trivial C
>>> structs.
>>> 
>>> r326307 and r327870 made changes that allowed using non-trivial C
>>> structs with fields qualified with __strong or __weak. This commit makes
>>> the following C++ triviality type traits available to non-trivial C
>>> structs:
>>> 
>>> __has_trivial_assign
>>> __has_trivial_move_assign
>>> __has_trivial_copy
>>> __has_trivial_move_constructor
>>> __has_trivial_constructor
>>> __has_trivial_destructor
>>> 
>>> rdar://problem/33599681 
>>> 
>>> Differential Revision: https://reviews.llvm.org/D44913 
>>> 
>>> 
>>> Added:
>>> cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m
>>> Modified:
>>> cfe/trunk/include/clang/Basic/TokenKinds.def
>>> cfe/trunk/lib/Sema/SemaExprCXX.cpp
>>> 
>>> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TokenKinds.def?rev=328680&r1=328679&r2=328680&view=diff
>>>  
>>> 
>>> ==
>>> --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
>>> +++ cfe/trunk/include/clang/Basic/TokenKinds.def Tue Mar 27 17:12:08 2018
>>> @@ -433,12 +433,12 @@ TYPE_TRAIT_1(__has_nothrow_assign, HasNo
>>>  TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX)
>>>  TYPE_TRAIT_1(__has_nothrow_copy, HasNothrowCopy, KEYCXX)
>>>  TYPE_TRAIT_1(__has_nothrow_constructor, HasNothrowConstructor, KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, 
>>> KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, 
>>> KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYCXX)
>>> +TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYALL)
>>> +TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYALL)
>>> +TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYALL)
>>> +TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, 
>>> KEYALL)
>>> +TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, 
>>> KEYALL)
>>> +TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYALL)
>>>  TYPE_TRAIT_1(__has_virtual_destructor, HasVirtualDestructor, KEYCXX)
>>>  TYPE_TRAIT_1(__is_abstract, IsAbstract, KEYCXX)
>>>  TYPE_TRAIT_1(__is_aggregate, IsAggregate, KEYCXX)
>>> 
>>> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=328680&r1=328679&r2=328680&view=diff
>>>  
>>> 

Re: r328680 - [ObjC] Make C++ triviality type traits available to non-trivial C

2018-04-05 Thread Akira Hatanaka via cfe-commits


> On Apr 4, 2018, at 5:38 PM, Richard Smith  wrote:
> 
> On 4 April 2018 at 16:57, Akira Hatanaka via cfe-commits 
> mailto:cfe-commits@lists.llvm.org>> wrote:
> 
>> On Apr 4, 2018, at 4:47 PM, Richard Smith > > wrote:
>> 
>> On 4 April 2018 at 16:24, Akira Hatanaka via cfe-commits 
>> mailto:cfe-commits@lists.llvm.org>> wrote:
>> 
>>> On Apr 4, 2018, at 3:38 PM, Richard Smith >> > wrote:
>>> 
>>> Hi Akira,
>>> 
>>> This change has broken the C++ versions of these type traits for classes 
>>> with volatile members. Such classes are required to claim to be trivial per 
>>> C++ DR 2094 
>>> (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2094 
>>> ) but 
>>> return false from isNonTrivialToPrimitiveCopy().
>>> 
>> 
>> Oh that’s right. The function returns false when 
>> isNonTrivialToPrimitiveCopy() returns PCK_VolatileTrivial. That is wrong.
>> 
>> Do you have a fix that's going to land soon? This has caused a regression 
>> for us, so I'd like to revert if it's not going to be fixed imminently.
> 
> Yes, I plan to fix this soon, but feel free to revert it if you need to.
> 
>  Reverted in r329247 for now.

Sorry, I wasn’t able to fix it soon enough, I reapplied the patch with a fix in 
r329289. Let me know if it’s still causing a regression.

>>> Also, exposing these __has_* traits more widely seems like a backwards step 
>>> to me: these traits are deprecated, near-useless, and we're trying to 
>>> remove them. No code should be using them under any circumstances; the 
>>> __is_* traits should be used instead.
>>> 
>> 
>> The __is_* traits (is_trivially_copy_constructible, etc.) are templates 
>> defined in libcxx, so it seems that we can’t use them when compiling in C 
>> mode. Is it OK to add their definitions to TokenKinds.def as non-C++ 
>> keywords?
>> 
>>> On 27 March 2018 at 17:12, Akira Hatanaka via cfe-commits 
>>> mailto:cfe-commits@lists.llvm.org>> wrote:
>>> Author: ahatanak
>>> Date: Tue Mar 27 17:12:08 2018
>>> New Revision: 328680
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=328680&view=rev 
>>> 
>>> Log:
>>> [ObjC] Make C++ triviality type traits available to non-trivial C
>>> structs.
>>> 
>>> r326307 and r327870 made changes that allowed using non-trivial C
>>> structs with fields qualified with __strong or __weak. This commit makes
>>> the following C++ triviality type traits available to non-trivial C
>>> structs:
>>> 
>>> __has_trivial_assign
>>> __has_trivial_move_assign
>>> __has_trivial_copy
>>> __has_trivial_move_constructor
>>> __has_trivial_constructor
>>> __has_trivial_destructor
>>> 
>>> rdar://problem/33599681 <>
>>> 
>>> Differential Revision: https://reviews.llvm.org/D44913 
>>> 
>>> 
>>> Added:
>>> cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m
>>> Modified:
>>> cfe/trunk/include/clang/Basic/TokenKinds.def
>>> cfe/trunk/lib/Sema/SemaExprCXX.cpp
>>> 
>>> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TokenKinds.def?rev=328680&r1=328679&r2=328680&view=diff
>>>  
>>> 
>>> ==
>>> --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
>>> +++ cfe/trunk/include/clang/Basic/TokenKinds.def Tue Mar 27 17:12:08 2018
>>> @@ -433,12 +433,12 @@ TYPE_TRAIT_1(__has_nothrow_assign, HasNo
>>>  TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX)
>>>  TYPE_TRAIT_1(__has_nothrow_copy, HasNothrowCopy, KEYCXX)
>>>  TYPE_TRAIT_1(__has_nothrow_constructor, HasNothrowConstructor, KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, 
>>> KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, 
>>> KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYCXX)
>>> +TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYALL)
>>> +TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYALL)
>>> +TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYALL)
>>> +TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, 
>>> KEYALL)
>>> +TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, 
>>> KEYALL)
>>> +TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYALL)
>>>  TYPE_TRAIT_1(__has_virtual_destructor, HasVirtualDestructor, KEYCXX)
>>>  TYPE_TRAIT_1(__is_abstract, IsAbstract, KEYCXX)
>>>  TYPE_TRAIT_1(__is_aggregate, I

Re: r328680 - [ObjC] Make C++ triviality type traits available to non-trivial C

2018-04-04 Thread Richard Smith via cfe-commits
On 4 April 2018 at 16:57, Akira Hatanaka via cfe-commits <
cfe-commits@lists.llvm.org> wrote:

>
> On Apr 4, 2018, at 4:47 PM, Richard Smith  wrote:
>
> On 4 April 2018 at 16:24, Akira Hatanaka via cfe-commits  lists.llvm.org> wrote:
>
>>
>> On Apr 4, 2018, at 3:38 PM, Richard Smith  wrote:
>>
>> Hi Akira,
>>
>> This change has broken the C++ versions of these type traits for classes
>> with volatile members. Such classes are required to claim to be trivial per
>> C++ DR 2094 (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.htm
>> l#2094) but return false from isNonTrivialToPrimitiveCopy().
>>
>>
>> Oh that’s right. The function returns false when
>> isNonTrivialToPrimitiveCopy() returns PCK_VolatileTrivial. That is wrong.
>>
>
> Do you have a fix that's going to land soon? This has caused a regression
> for us, so I'd like to revert if it's not going to be fixed imminently.
>
>
> Yes, I plan to fix this soon, but feel free to revert it if you need to.
>

 Reverted in r329247 for now.

> Also, exposing these __has_* traits more widely seems like a backwards
>> step to me: these traits are deprecated, near-useless, and we're trying to
>> remove them. No code should be using them under any circumstances; the
>> __is_* traits should be used instead.
>>
>>
>> The __is_* traits (is_trivially_copy_constructible, etc.) are templates
>> defined in libcxx, so it seems that we can’t use them when compiling in C
>> mode. Is it OK to add their definitions to TokenKinds.def as non-C++
>> keywords?
>>
>> On 27 March 2018 at 17:12, Akira Hatanaka via cfe-commits > lists.llvm.org> wrote:
>>
>>> Author: ahatanak
>>> Date: Tue Mar 27 17:12:08 2018
>>> New Revision: 328680
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=328680&view=rev
>>> Log:
>>> [ObjC] Make C++ triviality type traits available to non-trivial C
>>> structs.
>>>
>>> r326307 and r327870 made changes that allowed using non-trivial C
>>> structs with fields qualified with __strong or __weak. This commit makes
>>> the following C++ triviality type traits available to non-trivial C
>>> structs:
>>>
>>> __has_trivial_assign
>>> __has_trivial_move_assign
>>> __has_trivial_copy
>>> __has_trivial_move_constructor
>>> __has_trivial_constructor
>>> __has_trivial_destructor
>>>
>>> rdar://problem/33599681
>>>
>>> Differential Revision: https://reviews.llvm.org/D44913
>>>
>>> Added:
>>> cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m
>>> Modified:
>>> cfe/trunk/include/clang/Basic/TokenKinds.def
>>> cfe/trunk/lib/Sema/SemaExprCXX.cpp
>>>
>>> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/
>>> TokenKinds.def?rev=328680&r1=328679&r2=328680&view=diff
>>> 
>>> ==
>>> --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
>>> +++ cfe/trunk/include/clang/Basic/TokenKinds.def Tue Mar 27 17:12:08
>>> 2018
>>> @@ -433,12 +433,12 @@ TYPE_TRAIT_1(__has_nothrow_assign, HasNo
>>>  TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX)
>>>  TYPE_TRAIT_1(__has_nothrow_copy, HasNothrowCopy, KEYCXX)
>>>  TYPE_TRAIT_1(__has_nothrow_constructor, HasNothrowConstructor, KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor,
>>> KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_move_constructor,
>>> HasTrivialMoveConstructor, KEYCXX)
>>> -TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYCXX)
>>> +TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYALL)
>>> +TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYALL)
>>> +TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYALL)
>>> +TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor,
>>> KEYALL)
>>> +TYPE_TRAIT_1(__has_trivial_move_constructor,
>>> HasTrivialMoveConstructor, KEYALL)
>>> +TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYALL)
>>>  TYPE_TRAIT_1(__has_virtual_destructor, HasVirtualDestructor, KEYCXX)
>>>  TYPE_TRAIT_1(__is_abstract, IsAbstract, KEYCXX)
>>>  TYPE_TRAIT_1(__is_aggregate, IsAggregate, KEYCXX)
>>>
>>> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/
>>> Sema/SemaExprCXX.cpp?rev=328680&r1=328679&r2=328680&view=diff
>>> 
>>> ==
>>> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
>>> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Mar 27 17:12:08 2018
>>> @@ -4513,6 +4513,8 @@ static bool EvaluateUnaryTypeTrait(Sema
>>>  // does not correctly compute triviality in the presence of
>>> multiple special
>>>  // members of the same kind. Revisit this once the g++ bug is fixed.
>>>case UTT_HasTrivialDefau

r329247 - Revert r328680 ("[ObjC] Make C++ triviality type traits available to non-trivial C structs.")

2018-04-04 Thread Richard Smith via cfe-commits
Author: rsmith
Date: Wed Apr  4 17:34:54 2018
New Revision: 329247

URL: http://llvm.org/viewvc/llvm-project?rev=329247&view=rev
Log:
Revert r328680 ("[ObjC] Make C++ triviality type traits available to 
non-trivial C structs.")

It unintentionally caused the values of the __has_* type traits to change in
C++ for trivially-copyable classes with volatile members.

Removed:
cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m
Modified:
cfe/trunk/include/clang/Basic/TokenKinds.def
cfe/trunk/lib/Sema/SemaExprCXX.cpp

Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TokenKinds.def?rev=329247&r1=329246&r2=329247&view=diff
==
--- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
+++ cfe/trunk/include/clang/Basic/TokenKinds.def Wed Apr  4 17:34:54 2018
@@ -433,12 +433,12 @@ TYPE_TRAIT_1(__has_nothrow_assign, HasNo
 TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX)
 TYPE_TRAIT_1(__has_nothrow_copy, HasNothrowCopy, KEYCXX)
 TYPE_TRAIT_1(__has_nothrow_constructor, HasNothrowConstructor, KEYCXX)
-TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYALL)
-TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYALL)
-TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYALL)
-TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, KEYALL)
-TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, KEYALL)
-TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYALL)
+TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYCXX)
+TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYCXX)
+TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYCXX)
+TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, KEYCXX)
+TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, KEYCXX)
+TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYCXX)
 TYPE_TRAIT_1(__has_virtual_destructor, HasVirtualDestructor, KEYCXX)
 TYPE_TRAIT_1(__is_abstract, IsAbstract, KEYCXX)
 TYPE_TRAIT_1(__is_aggregate, IsAggregate, KEYCXX)

Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=329247&r1=329246&r2=329247&view=diff
==
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Wed Apr  4 17:34:54 2018
@@ -4521,8 +4521,6 @@ static bool EvaluateUnaryTypeTrait(Sema
 // does not correctly compute triviality in the presence of multiple 
special
 // members of the same kind. Revisit this once the g++ bug is fixed.
   case UTT_HasTrivialDefaultConstructor:
-if (T.isNonTrivialToPrimitiveDefaultInitialize())
-  return false;
 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
 //   If __is_pod (type) is true then the trait is true, else if type is
 //   a cv class or union type (or array thereof) with a trivial default
@@ -4534,8 +4532,6 @@ static bool EvaluateUnaryTypeTrait(Sema
  !RD->hasNonTrivialDefaultConstructor();
 return false;
   case UTT_HasTrivialMoveConstructor:
-if (T.isNonTrivialToPrimitiveDestructiveMove())
-  return false;
 //  This trait is implemented by MSVC 2012 and needed to parse the
 //  standard library headers. Specifically this is used as the logic
 //  behind std::is_trivially_move_constructible (20.9.4.3).
@@ -4545,8 +4541,6 @@ static bool EvaluateUnaryTypeTrait(Sema
   return RD->hasTrivialMoveConstructor() && 
!RD->hasNonTrivialMoveConstructor();
 return false;
   case UTT_HasTrivialCopy:
-if (T.isNonTrivialToPrimitiveCopy())
-  return false;
 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
 //   If __is_pod (type) is true or type is a reference type then
 //   the trait is true, else if type is a cv class or union type
@@ -4559,8 +4553,6 @@ static bool EvaluateUnaryTypeTrait(Sema
  !RD->hasNonTrivialCopyConstructor();
 return false;
   case UTT_HasTrivialMoveAssign:
-if (T.isNonTrivialToPrimitiveDestructiveMove())
-  return false;
 //  This trait is implemented by MSVC 2012 and needed to parse the
 //  standard library headers. Specifically it is used as the logic
 //  behind std::is_trivially_move_assignable (20.9.4.3)
@@ -4570,8 +4562,6 @@ static bool EvaluateUnaryTypeTrait(Sema
   return RD->hasTrivialMoveAssignment() && 
!RD->hasNonTrivialMoveAssignment();
 return false;
   case UTT_HasTrivialAssign:
-if (T.isNonTrivialToPrimitiveCopy())
-  return false;
 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
 //   If type is const qualified or is a reference type then the
 //   trait is false. Otherwise if __is_pod (type) is tru

Re: r328680 - [ObjC] Make C++ triviality type traits available to non-trivial C

2018-04-04 Thread Akira Hatanaka via cfe-commits

> On Apr 4, 2018, at 4:47 PM, Richard Smith  wrote:
> 
> On 4 April 2018 at 16:24, Akira Hatanaka via cfe-commits 
> mailto:cfe-commits@lists.llvm.org>> wrote:
> 
>> On Apr 4, 2018, at 3:38 PM, Richard Smith > > wrote:
>> 
>> Hi Akira,
>> 
>> This change has broken the C++ versions of these type traits for classes 
>> with volatile members. Such classes are required to claim to be trivial per 
>> C++ DR 2094 
>> (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2094 
>> ) but 
>> return false from isNonTrivialToPrimitiveCopy().
>> 
> 
> Oh that’s right. The function returns false when 
> isNonTrivialToPrimitiveCopy() returns PCK_VolatileTrivial. That is wrong.
> 
> Do you have a fix that's going to land soon? This has caused a regression for 
> us, so I'd like to revert if it's not going to be fixed imminently.

Yes, I plan to fix this soon, but feel free to revert it if you need to.

>> Also, exposing these __has_* traits more widely seems like a backwards step 
>> to me: these traits are deprecated, near-useless, and we're trying to remove 
>> them. No code should be using them under any circumstances; the __is_* 
>> traits should be used instead.
>> 
> 
> The __is_* traits (is_trivially_copy_constructible, etc.) are templates 
> defined in libcxx, so it seems that we can’t use them when compiling in C 
> mode. Is it OK to add their definitions to TokenKinds.def as non-C++ keywords?
> 
>> On 27 March 2018 at 17:12, Akira Hatanaka via cfe-commits 
>> mailto:cfe-commits@lists.llvm.org>> wrote:
>> Author: ahatanak
>> Date: Tue Mar 27 17:12:08 2018
>> New Revision: 328680
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=328680&view=rev 
>> 
>> Log:
>> [ObjC] Make C++ triviality type traits available to non-trivial C
>> structs.
>> 
>> r326307 and r327870 made changes that allowed using non-trivial C
>> structs with fields qualified with __strong or __weak. This commit makes
>> the following C++ triviality type traits available to non-trivial C
>> structs:
>> 
>> __has_trivial_assign
>> __has_trivial_move_assign
>> __has_trivial_copy
>> __has_trivial_move_constructor
>> __has_trivial_constructor
>> __has_trivial_destructor
>> 
>> rdar://problem/33599681 <>
>> 
>> Differential Revision: https://reviews.llvm.org/D44913 
>> 
>> 
>> Added:
>> cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m
>> Modified:
>> cfe/trunk/include/clang/Basic/TokenKinds.def
>> cfe/trunk/lib/Sema/SemaExprCXX.cpp
>> 
>> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TokenKinds.def?rev=328680&r1=328679&r2=328680&view=diff
>>  
>> 
>> ==
>> --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
>> +++ cfe/trunk/include/clang/Basic/TokenKinds.def Tue Mar 27 17:12:08 2018
>> @@ -433,12 +433,12 @@ TYPE_TRAIT_1(__has_nothrow_assign, HasNo
>>  TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX)
>>  TYPE_TRAIT_1(__has_nothrow_copy, HasNothrowCopy, KEYCXX)
>>  TYPE_TRAIT_1(__has_nothrow_constructor, HasNothrowConstructor, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, 
>> KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, 
>> KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYCXX)
>> +TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, 
>> KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, 
>> KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYALL)
>>  TYPE_TRAIT_1(__has_virtual_destructor, HasVirtualDestructor, KEYCXX)
>>  TYPE_TRAIT_1(__is_abstract, IsAbstract, KEYCXX)
>>  TYPE_TRAIT_1(__is_aggregate, IsAggregate, KEYCXX)
>> 
>> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=328680&r1=328679&r2=328680&view=diff
>>  
>> 
>> ==
>> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
>> +++ cfe/trunk/lib/Sema

Re: r328680 - [ObjC] Make C++ triviality type traits available to non-trivial C

2018-04-04 Thread Richard Smith via cfe-commits
On 4 April 2018 at 16:24, Akira Hatanaka via cfe-commits <
cfe-commits@lists.llvm.org> wrote:

>
> On Apr 4, 2018, at 3:38 PM, Richard Smith  wrote:
>
> Hi Akira,
>
> This change has broken the C++ versions of these type traits for classes
> with volatile members. Such classes are required to claim to be trivial per
> C++ DR 2094 (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.
> html#2094) but return false from isNonTrivialToPrimitiveCopy().
>
>
> Oh that’s right. The function returns false when
> isNonTrivialToPrimitiveCopy() returns PCK_VolatileTrivial. That is wrong.
>

Do you have a fix that's going to land soon? This has caused a regression
for us, so I'd like to revert if it's not going to be fixed imminently.

> Also, exposing these __has_* traits more widely seems like a backwards
> step to me: these traits are deprecated, near-useless, and we're trying to
> remove them. No code should be using them under any circumstances; the
> __is_* traits should be used instead.
>
>
> The __is_* traits (is_trivially_copy_constructible, etc.) are templates
> defined in libcxx, so it seems that we can’t use them when compiling in C
> mode. Is it OK to add their definitions to TokenKinds.def as non-C++
> keywords?
>
> On 27 March 2018 at 17:12, Akira Hatanaka via cfe-commits <
> cfe-commits@lists.llvm.org> wrote:
>
>> Author: ahatanak
>> Date: Tue Mar 27 17:12:08 2018
>> New Revision: 328680
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=328680&view=rev
>> Log:
>> [ObjC] Make C++ triviality type traits available to non-trivial C
>> structs.
>>
>> r326307 and r327870 made changes that allowed using non-trivial C
>> structs with fields qualified with __strong or __weak. This commit makes
>> the following C++ triviality type traits available to non-trivial C
>> structs:
>>
>> __has_trivial_assign
>> __has_trivial_move_assign
>> __has_trivial_copy
>> __has_trivial_move_constructor
>> __has_trivial_constructor
>> __has_trivial_destructor
>>
>> rdar://problem/33599681
>>
>> Differential Revision: https://reviews.llvm.org/D44913
>>
>> Added:
>> cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m
>> Modified:
>> cfe/trunk/include/clang/Basic/TokenKinds.def
>> cfe/trunk/lib/Sema/SemaExprCXX.cpp
>>
>> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/
>> Basic/TokenKinds.def?rev=328680&r1=328679&r2=328680&view=diff
>> 
>> ==
>> --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
>> +++ cfe/trunk/include/clang/Basic/TokenKinds.def Tue Mar 27 17:12:08 2018
>> @@ -433,12 +433,12 @@ TYPE_TRAIT_1(__has_nothrow_assign, HasNo
>>  TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX)
>>  TYPE_TRAIT_1(__has_nothrow_copy, HasNothrowCopy, KEYCXX)
>>  TYPE_TRAIT_1(__has_nothrow_constructor, HasNothrowConstructor, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor,
>> KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor,
>> KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYCXX)
>> +TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor,
>> KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor,
>> KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYALL)
>>  TYPE_TRAIT_1(__has_virtual_destructor, HasVirtualDestructor, KEYCXX)
>>  TYPE_TRAIT_1(__is_abstract, IsAbstract, KEYCXX)
>>  TYPE_TRAIT_1(__is_aggregate, IsAggregate, KEYCXX)
>>
>> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaE
>> xprCXX.cpp?rev=328680&r1=328679&r2=328680&view=diff
>> 
>> ==
>> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Mar 27 17:12:08 2018
>> @@ -4513,6 +4513,8 @@ static bool EvaluateUnaryTypeTrait(Sema
>>  // does not correctly compute triviality in the presence of multiple
>> special
>>  // members of the same kind. Revisit this once the g++ bug is fixed.
>>case UTT_HasTrivialDefaultConstructor:
>> +if (T.isNonTrivialToPrimitiveDefaultInitialize())
>> +  return false;
>>  // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
>>  //   If __is_pod (type) is true then the trait is true, else if type
>> is
>>  //   a cv class or union type (or array thereof) with a trivial
>> default
>> @@ -4524,6 +4526,8 

Re: r328680 - [ObjC] Make C++ triviality type traits available to non-trivial C

2018-04-04 Thread Richard Smith via cfe-commits
On 4 April 2018 at 16:37, Akira Hatanaka via cfe-commits <
cfe-commits@lists.llvm.org> wrote:

>
>
> On Apr 4, 2018, at 4:24 PM, Akira Hatanaka via cfe-commits <
> cfe-commits@lists.llvm.org> wrote:
>
>
> On Apr 4, 2018, at 3:38 PM, Richard Smith  wrote:
>
> Hi Akira,
>
> This change has broken the C++ versions of these type traits for classes
> with volatile members. Such classes are required to claim to be trivial per
> C++ DR 2094 (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.
> html#2094) but return false from isNonTrivialToPrimitiveCopy().
>
>
> Oh that’s right. The function returns false when
> isNonTrivialToPrimitiveCopy() returns PCK_VolatileTrivial. That is wrong.
>
> Also, exposing these __has_* traits more widely seems like a backwards
> step to me: these traits are deprecated, near-useless, and we're trying to
> remove them. No code should be using them under any circumstances; the
> __is_* traits should be used instead.
>
>
> The __is_* traits (is_trivially_copy_constructible, etc.) are templates
> defined in libcxx, so it seems that we can’t use them when compiling in C
> mode. Is it OK to add their definitions to TokenKinds.def as non-C++
> keywords?
>
>
> Or perhaps redefine the six __has_* traits used here as non-C++ (KEYNOCXX
> or ‘KEYC99 | KEYC11') keywords?
>

I think __is_trivially_copy_constructible is a better name than
__has_trivial_copy_constructor in C, since C doesn't have constructors :)
I'd also like to avoid there being confusion about what the right trait to
use is in C and in C++ if possible.

> On 27 March 2018 at 17:12, Akira Hatanaka via cfe-commits  lists.llvm.org> wrote:
>
>> Author: ahatanak
>> Date: Tue Mar 27 17:12:08 2018
>> New Revision: 328680
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=328680&view=rev
>> Log:
>> [ObjC] Make C++ triviality type traits available to non-trivial C
>> structs.
>>
>> r326307 and r327870 made changes that allowed using non-trivial C
>> structs with fields qualified with __strong or __weak. This commit makes
>> the following C++ triviality type traits available to non-trivial C
>> structs:
>>
>> __has_trivial_assign
>> __has_trivial_move_assign
>> __has_trivial_copy
>> __has_trivial_move_constructor
>> __has_trivial_constructor
>> __has_trivial_destructor
>>
>> rdar://problem/33599681
>>
>> Differential Revision: https://reviews.llvm.org/D44913
>>
>> Added:
>> cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m
>> Modified:
>> cfe/trunk/include/clang/Basic/TokenKinds.def
>> cfe/trunk/lib/Sema/SemaExprCXX.cpp
>>
>> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/
>> TokenKinds.def?rev=328680&r1=328679&r2=328680&view=diff
>> 
>> ==
>> --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
>> +++ cfe/trunk/include/clang/Basic/TokenKinds.def Tue Mar 27 17:12:08 2018
>> @@ -433,12 +433,12 @@ TYPE_TRAIT_1(__has_nothrow_assign, HasNo
>>  TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX)
>>  TYPE_TRAIT_1(__has_nothrow_copy, HasNothrowCopy, KEYCXX)
>>  TYPE_TRAIT_1(__has_nothrow_constructor, HasNothrowConstructor, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor,
>> KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor,
>> KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYCXX)
>> +TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor,
>> KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor,
>> KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYALL)
>>  TYPE_TRAIT_1(__has_virtual_destructor, HasVirtualDestructor, KEYCXX)
>>  TYPE_TRAIT_1(__is_abstract, IsAbstract, KEYCXX)
>>  TYPE_TRAIT_1(__is_aggregate, IsAggregate, KEYCXX)
>>
>> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/
>> Sema/SemaExprCXX.cpp?rev=328680&r1=328679&r2=328680&view=diff
>> 
>> ==
>> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Mar 27 17:12:08 2018
>> @@ -4513,6 +4513,8 @@ static bool EvaluateUnaryTypeTrait(Sema
>>  // does not correctly compute triviality in the presence of multiple
>> special
>>  // members of the same kind. Revisit this once the g++ bug is fixed.
>>case UTT_HasTrivialDefaultConstructor:
>> +if (T.isNonTrivia

Re: r328680 - [ObjC] Make C++ triviality type traits available to non-trivial C

2018-04-04 Thread Richard Smith via cfe-commits
On 4 April 2018 at 16:24, Akira Hatanaka via cfe-commits <
cfe-commits@lists.llvm.org> wrote:

>
> On Apr 4, 2018, at 3:38 PM, Richard Smith  wrote:
>
> Hi Akira,
>
> This change has broken the C++ versions of these type traits for classes
> with volatile members. Such classes are required to claim to be trivial per
> C++ DR 2094 (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.
> html#2094) but return false from isNonTrivialToPrimitiveCopy().
>
>
> Oh that’s right. The function returns false when
> isNonTrivialToPrimitiveCopy() returns PCK_VolatileTrivial. That is wrong.
>
> Also, exposing these __has_* traits more widely seems like a backwards
> step to me: these traits are deprecated, near-useless, and we're trying to
> remove them. No code should be using them under any circumstances; the
> __is_* traits should be used instead.
>
>
> The __is_* traits (is_trivially_copy_constructible, etc.) are templates
> defined in libcxx, so it seems that we can’t use them when compiling in C
> mode. Is it OK to add their definitions to TokenKinds.def as non-C++
> keywords?
>

is_trivially_copy_constructible(T) is just __is_trivially_constructible(T,
const T&). Hmm. But the lack of reference types in C seems like a problem
here...

I'd be fine with adding __is_trivially_* traits that are equivalent to
__is_trivially_constructible(T, const T&) etc (but without requiring
parsing of reference types), if that's useful to C (or particularly ObjC)
compilation.

> On 27 March 2018 at 17:12, Akira Hatanaka via cfe-commits <
> cfe-commits@lists.llvm.org> wrote:
>
>> Author: ahatanak
>> Date: Tue Mar 27 17:12:08 2018
>> New Revision: 328680
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=328680&view=rev
>> Log:
>> [ObjC] Make C++ triviality type traits available to non-trivial C
>> structs.
>>
>> r326307 and r327870 made changes that allowed using non-trivial C
>> structs with fields qualified with __strong or __weak. This commit makes
>> the following C++ triviality type traits available to non-trivial C
>> structs:
>>
>> __has_trivial_assign
>> __has_trivial_move_assign
>> __has_trivial_copy
>> __has_trivial_move_constructor
>> __has_trivial_constructor
>> __has_trivial_destructor
>>
>> rdar://problem/33599681
>>
>> Differential Revision: https://reviews.llvm.org/D44913
>>
>> Added:
>> cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m
>> Modified:
>> cfe/trunk/include/clang/Basic/TokenKinds.def
>> cfe/trunk/lib/Sema/SemaExprCXX.cpp
>>
>> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/
>> Basic/TokenKinds.def?rev=328680&r1=328679&r2=328680&view=diff
>> 
>> ==
>> --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
>> +++ cfe/trunk/include/clang/Basic/TokenKinds.def Tue Mar 27 17:12:08 2018
>> @@ -433,12 +433,12 @@ TYPE_TRAIT_1(__has_nothrow_assign, HasNo
>>  TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX)
>>  TYPE_TRAIT_1(__has_nothrow_copy, HasNothrowCopy, KEYCXX)
>>  TYPE_TRAIT_1(__has_nothrow_constructor, HasNothrowConstructor, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor,
>> KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor,
>> KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYCXX)
>> +TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor,
>> KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor,
>> KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYALL)
>>  TYPE_TRAIT_1(__has_virtual_destructor, HasVirtualDestructor, KEYCXX)
>>  TYPE_TRAIT_1(__is_abstract, IsAbstract, KEYCXX)
>>  TYPE_TRAIT_1(__is_aggregate, IsAggregate, KEYCXX)
>>
>> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaE
>> xprCXX.cpp?rev=328680&r1=328679&r2=328680&view=diff
>> 
>> ==
>> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Mar 27 17:12:08 2018
>> @@ -4513,6 +4513,8 @@ static bool EvaluateUnaryTypeTrait(Sema
>>  // does not correctly compute triviality in the presence of multiple
>> special
>>  // members of the same kind. Revisit this once the g++ bug is fixed.
>>case UTT_HasTrivialDefaultConstructor:
>> +if (T.isNonTrivialToPrimitiveDefaultInitialize())
>> +  return false;
>>  // h

Re: r328680 - [ObjC] Make C++ triviality type traits available to non-trivial C

2018-04-04 Thread Akira Hatanaka via cfe-commits


> On Apr 4, 2018, at 4:24 PM, Akira Hatanaka via cfe-commits 
>  wrote:
> 
>> 
>> On Apr 4, 2018, at 3:38 PM, Richard Smith > > wrote:
>> 
>> Hi Akira,
>> 
>> This change has broken the C++ versions of these type traits for classes 
>> with volatile members. Such classes are required to claim to be trivial per 
>> C++ DR 2094 
>> (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2094 
>> ) but 
>> return false from isNonTrivialToPrimitiveCopy().
>> 
> 
> Oh that’s right. The function returns false when 
> isNonTrivialToPrimitiveCopy() returns PCK_VolatileTrivial. That is wrong.
> 
>> Also, exposing these __has_* traits more widely seems like a backwards step 
>> to me: these traits are deprecated, near-useless, and we're trying to remove 
>> them. No code should be using them under any circumstances; the __is_* 
>> traits should be used instead.
>> 
> 
> The __is_* traits (is_trivially_copy_constructible, etc.) are templates 
> defined in libcxx, so it seems that we can’t use them when compiling in C 
> mode. Is it OK to add their definitions to TokenKinds.def as non-C++ keywords?
> 

Or perhaps redefine the six __has_* traits used here as non-C++ (KEYNOCXX or 
‘KEYC99 | KEYC11') keywords?

>> On 27 March 2018 at 17:12, Akira Hatanaka via cfe-commits 
>> mailto:cfe-commits@lists.llvm.org>> wrote:
>> Author: ahatanak
>> Date: Tue Mar 27 17:12:08 2018
>> New Revision: 328680
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=328680&view=rev 
>> 
>> Log:
>> [ObjC] Make C++ triviality type traits available to non-trivial C
>> structs.
>> 
>> r326307 and r327870 made changes that allowed using non-trivial C
>> structs with fields qualified with __strong or __weak. This commit makes
>> the following C++ triviality type traits available to non-trivial C
>> structs:
>> 
>> __has_trivial_assign
>> __has_trivial_move_assign
>> __has_trivial_copy
>> __has_trivial_move_constructor
>> __has_trivial_constructor
>> __has_trivial_destructor
>> 
>> rdar://problem/33599681 
>> 
>> Differential Revision: https://reviews.llvm.org/D44913 
>> 
>> 
>> Added:
>> cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m
>> Modified:
>> cfe/trunk/include/clang/Basic/TokenKinds.def
>> cfe/trunk/lib/Sema/SemaExprCXX.cpp
>> 
>> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TokenKinds.def?rev=328680&r1=328679&r2=328680&view=diff
>>  
>> 
>> ==
>> --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
>> +++ cfe/trunk/include/clang/Basic/TokenKinds.def Tue Mar 27 17:12:08 2018
>> @@ -433,12 +433,12 @@ TYPE_TRAIT_1(__has_nothrow_assign, HasNo
>>  TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX)
>>  TYPE_TRAIT_1(__has_nothrow_copy, HasNothrowCopy, KEYCXX)
>>  TYPE_TRAIT_1(__has_nothrow_constructor, HasNothrowConstructor, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, 
>> KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, 
>> KEYCXX)
>> -TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYCXX)
>> +TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, 
>> KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, 
>> KEYALL)
>> +TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYALL)
>>  TYPE_TRAIT_1(__has_virtual_destructor, HasVirtualDestructor, KEYCXX)
>>  TYPE_TRAIT_1(__is_abstract, IsAbstract, KEYCXX)
>>  TYPE_TRAIT_1(__is_aggregate, IsAggregate, KEYCXX)
>> 
>> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=328680&r1=328679&r2=328680&view=diff
>>  
>> 
>> ==
>> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Mar 27 17:12:08 2018
>> @@ -4513,6 +4513,8 @@ static bool EvaluateUnaryTypeTrait(Sema
>>  // does not correctly compute triviality in the presence of multiple 
>> special
>>

Re: r328680 - [ObjC] Make C++ triviality type traits available to non-trivial C

2018-04-04 Thread Akira Hatanaka via cfe-commits

> On Apr 4, 2018, at 3:38 PM, Richard Smith  wrote:
> 
> Hi Akira,
> 
> This change has broken the C++ versions of these type traits for classes with 
> volatile members. Such classes are required to claim to be trivial per C++ DR 
> 2094 (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2094 
> ) but 
> return false from isNonTrivialToPrimitiveCopy().
> 

Oh that’s right. The function returns false when isNonTrivialToPrimitiveCopy() 
returns PCK_VolatileTrivial. That is wrong.

> Also, exposing these __has_* traits more widely seems like a backwards step 
> to me: these traits are deprecated, near-useless, and we're trying to remove 
> them. No code should be using them under any circumstances; the __is_* traits 
> should be used instead.
> 

The __is_* traits (is_trivially_copy_constructible, etc.) are templates defined 
in libcxx, so it seems that we can’t use them when compiling in C mode. Is it 
OK to add their definitions to TokenKinds.def as non-C++ keywords?

> On 27 March 2018 at 17:12, Akira Hatanaka via cfe-commits 
> mailto:cfe-commits@lists.llvm.org>> wrote:
> Author: ahatanak
> Date: Tue Mar 27 17:12:08 2018
> New Revision: 328680
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=328680&view=rev 
> 
> Log:
> [ObjC] Make C++ triviality type traits available to non-trivial C
> structs.
> 
> r326307 and r327870 made changes that allowed using non-trivial C
> structs with fields qualified with __strong or __weak. This commit makes
> the following C++ triviality type traits available to non-trivial C
> structs:
> 
> __has_trivial_assign
> __has_trivial_move_assign
> __has_trivial_copy
> __has_trivial_move_constructor
> __has_trivial_constructor
> __has_trivial_destructor
> 
> rdar://problem/33599681
> 
> Differential Revision: https://reviews.llvm.org/D44913 
> 
> 
> Added:
> cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m
> Modified:
> cfe/trunk/include/clang/Basic/TokenKinds.def
> cfe/trunk/lib/Sema/SemaExprCXX.cpp
> 
> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TokenKinds.def?rev=328680&r1=328679&r2=328680&view=diff
>  
> 
> ==
> --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
> +++ cfe/trunk/include/clang/Basic/TokenKinds.def Tue Mar 27 17:12:08 2018
> @@ -433,12 +433,12 @@ TYPE_TRAIT_1(__has_nothrow_assign, HasNo
>  TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX)
>  TYPE_TRAIT_1(__has_nothrow_copy, HasNothrowCopy, KEYCXX)
>  TYPE_TRAIT_1(__has_nothrow_constructor, HasNothrowConstructor, KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, 
> KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYCXX)
> +TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYALL)
> +TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYALL)
> +TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYALL)
> +TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, KEYALL)
> +TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, 
> KEYALL)
> +TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYALL)
>  TYPE_TRAIT_1(__has_virtual_destructor, HasVirtualDestructor, KEYCXX)
>  TYPE_TRAIT_1(__is_abstract, IsAbstract, KEYCXX)
>  TYPE_TRAIT_1(__is_aggregate, IsAggregate, KEYCXX)
> 
> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=328680&r1=328679&r2=328680&view=diff
>  
> 
> ==
> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Mar 27 17:12:08 2018
> @@ -4513,6 +4513,8 @@ static bool EvaluateUnaryTypeTrait(Sema
>  // does not correctly compute triviality in the presence of multiple 
> special
>  // members of the same kind. Revisit this once the g++ bug is fixed.
>case UTT_HasTrivialDefaultConstructor:
> +if (T.isNonTrivialToPrimitiveDefaultInitialize())
> +  return false;
>  // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html 
> :
>  //   If __is_pod (type) i

Re: r328680 - [ObjC] Make C++ triviality type traits available to non-trivial C

2018-04-04 Thread Richard Smith via cfe-commits
Hi Akira,

This change has broken the C++ versions of these type traits for classes
with volatile members. Such classes are required to claim to be trivial per
C++ DR 2094 (
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2094) but
return false from isNonTrivialToPrimitiveCopy().

Also, exposing these __has_* traits more widely seems like a backwards step
to me: these traits are deprecated, near-useless, and we're trying to
remove them. No code should be using them under any circumstances; the
__is_* traits should be used instead.

On 27 March 2018 at 17:12, Akira Hatanaka via cfe-commits <
cfe-commits@lists.llvm.org> wrote:

> Author: ahatanak
> Date: Tue Mar 27 17:12:08 2018
> New Revision: 328680
>
> URL: http://llvm.org/viewvc/llvm-project?rev=328680&view=rev
> Log:
> [ObjC] Make C++ triviality type traits available to non-trivial C
> structs.
>
> r326307 and r327870 made changes that allowed using non-trivial C
> structs with fields qualified with __strong or __weak. This commit makes
> the following C++ triviality type traits available to non-trivial C
> structs:
>
> __has_trivial_assign
> __has_trivial_move_assign
> __has_trivial_copy
> __has_trivial_move_constructor
> __has_trivial_constructor
> __has_trivial_destructor
>
> rdar://problem/33599681
>
> Differential Revision: https://reviews.llvm.org/D44913
>
> Added:
> cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m
> Modified:
> cfe/trunk/include/clang/Basic/TokenKinds.def
> cfe/trunk/lib/Sema/SemaExprCXX.cpp
>
> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Basic/TokenKinds.def?rev=328680&r1=328679&r2=328680&view=diff
> 
> ==
> --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
> +++ cfe/trunk/include/clang/Basic/TokenKinds.def Tue Mar 27 17:12:08 2018
> @@ -433,12 +433,12 @@ TYPE_TRAIT_1(__has_nothrow_assign, HasNo
>  TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX)
>  TYPE_TRAIT_1(__has_nothrow_copy, HasNothrowCopy, KEYCXX)
>  TYPE_TRAIT_1(__has_nothrow_constructor, HasNothrowConstructor, KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor,
> KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor,
> KEYCXX)
> -TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYCXX)
> +TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYALL)
> +TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYALL)
> +TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYALL)
> +TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor,
> KEYALL)
> +TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor,
> KEYALL)
> +TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYALL)
>  TYPE_TRAIT_1(__has_virtual_destructor, HasVirtualDestructor, KEYCXX)
>  TYPE_TRAIT_1(__is_abstract, IsAbstract, KEYCXX)
>  TYPE_TRAIT_1(__is_aggregate, IsAggregate, KEYCXX)
>
> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> SemaExprCXX.cpp?rev=328680&r1=328679&r2=328680&view=diff
> 
> ==
> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Mar 27 17:12:08 2018
> @@ -4513,6 +4513,8 @@ static bool EvaluateUnaryTypeTrait(Sema
>  // does not correctly compute triviality in the presence of multiple
> special
>  // members of the same kind. Revisit this once the g++ bug is fixed.
>case UTT_HasTrivialDefaultConstructor:
> +if (T.isNonTrivialToPrimitiveDefaultInitialize())
> +  return false;
>  // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
>  //   If __is_pod (type) is true then the trait is true, else if type
> is
>  //   a cv class or union type (or array thereof) with a trivial
> default
> @@ -4524,6 +4526,8 @@ static bool EvaluateUnaryTypeTrait(Sema
>   !RD->hasNonTrivialDefaultConstructor();
>  return false;
>case UTT_HasTrivialMoveConstructor:
> +if (T.isNonTrivialToPrimitiveDestructiveMove())
> +  return false;
>  //  This trait is implemented by MSVC 2012 and needed to parse the
>  //  standard library headers. Specifically this is used as the logic
>  //  behind std::is_trivially_move_constructible (20.9.4.3).
> @@ -4533,6 +4537,8 @@ static bool EvaluateUnaryTypeTrait(Sema
>return RD->hasTrivialMoveConstructor() && !RD->
> hasNonTrivialMoveConstructor();
>  return false;
>case UTT_HasTrivialCopy:
> +if (T.isNonTrivialToPrimitiveCopy())
> +  return false;
>  // http://gcc.gnu.org/onlinedocs/gcc/Ty

r328680 - [ObjC] Make C++ triviality type traits available to non-trivial C

2018-03-27 Thread Akira Hatanaka via cfe-commits
Author: ahatanak
Date: Tue Mar 27 17:12:08 2018
New Revision: 328680

URL: http://llvm.org/viewvc/llvm-project?rev=328680&view=rev
Log:
[ObjC] Make C++ triviality type traits available to non-trivial C
structs.

r326307 and r327870 made changes that allowed using non-trivial C
structs with fields qualified with __strong or __weak. This commit makes
the following C++ triviality type traits available to non-trivial C
structs:

__has_trivial_assign
__has_trivial_move_assign
__has_trivial_copy
__has_trivial_move_constructor
__has_trivial_constructor
__has_trivial_destructor

rdar://problem/33599681

Differential Revision: https://reviews.llvm.org/D44913

Added:
cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m
Modified:
cfe/trunk/include/clang/Basic/TokenKinds.def
cfe/trunk/lib/Sema/SemaExprCXX.cpp

Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TokenKinds.def?rev=328680&r1=328679&r2=328680&view=diff
==
--- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
+++ cfe/trunk/include/clang/Basic/TokenKinds.def Tue Mar 27 17:12:08 2018
@@ -433,12 +433,12 @@ TYPE_TRAIT_1(__has_nothrow_assign, HasNo
 TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX)
 TYPE_TRAIT_1(__has_nothrow_copy, HasNothrowCopy, KEYCXX)
 TYPE_TRAIT_1(__has_nothrow_constructor, HasNothrowConstructor, KEYCXX)
-TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYCXX)
-TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYCXX)
-TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYCXX)
-TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, KEYCXX)
-TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, KEYCXX)
-TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYCXX)
+TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYALL)
+TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYALL)
+TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYALL)
+TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, KEYALL)
+TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, KEYALL)
+TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYALL)
 TYPE_TRAIT_1(__has_virtual_destructor, HasVirtualDestructor, KEYCXX)
 TYPE_TRAIT_1(__is_abstract, IsAbstract, KEYCXX)
 TYPE_TRAIT_1(__is_aggregate, IsAggregate, KEYCXX)

Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=328680&r1=328679&r2=328680&view=diff
==
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Mar 27 17:12:08 2018
@@ -4513,6 +4513,8 @@ static bool EvaluateUnaryTypeTrait(Sema
 // does not correctly compute triviality in the presence of multiple 
special
 // members of the same kind. Revisit this once the g++ bug is fixed.
   case UTT_HasTrivialDefaultConstructor:
+if (T.isNonTrivialToPrimitiveDefaultInitialize())
+  return false;
 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
 //   If __is_pod (type) is true then the trait is true, else if type is
 //   a cv class or union type (or array thereof) with a trivial default
@@ -4524,6 +4526,8 @@ static bool EvaluateUnaryTypeTrait(Sema
  !RD->hasNonTrivialDefaultConstructor();
 return false;
   case UTT_HasTrivialMoveConstructor:
+if (T.isNonTrivialToPrimitiveDestructiveMove())
+  return false;
 //  This trait is implemented by MSVC 2012 and needed to parse the
 //  standard library headers. Specifically this is used as the logic
 //  behind std::is_trivially_move_constructible (20.9.4.3).
@@ -4533,6 +4537,8 @@ static bool EvaluateUnaryTypeTrait(Sema
   return RD->hasTrivialMoveConstructor() && 
!RD->hasNonTrivialMoveConstructor();
 return false;
   case UTT_HasTrivialCopy:
+if (T.isNonTrivialToPrimitiveCopy())
+  return false;
 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
 //   If __is_pod (type) is true or type is a reference type then
 //   the trait is true, else if type is a cv class or union type
@@ -4545,6 +4551,8 @@ static bool EvaluateUnaryTypeTrait(Sema
  !RD->hasNonTrivialCopyConstructor();
 return false;
   case UTT_HasTrivialMoveAssign:
+if (T.isNonTrivialToPrimitiveDestructiveMove())
+  return false;
 //  This trait is implemented by MSVC 2012 and needed to parse the
 //  standard library headers. Specifically it is used as the logic
 //  behind std::is_trivially_move_assignable (20.9.4.3)
@@ -4554,6 +4562,8 @@ static bool EvaluateUnaryTypeTrait(Sema
   return RD->hasTrivialMoveAssignment() && 
!RD->hasNonTrivialMoveAssignment();
 return false;
   case UTT_HasTrivialAssign:
+if (T.isNonTrivialToPrimitiveCopy(