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 <rich...@metafoo.co.uk> wrote: > > 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 <rich...@metafoo.co.uk> 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 <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/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()) >>> + 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 true then the >>> @@ -4624,6 +4634,8 @@ static bool EvaluateUnaryTypeTrait(Sema >>> return true; >>> >>> case UTT_HasTrivialDestructor: >>> + if (T.isDestructedType() == QualType::DK_nontrivial_c_struct) >>> + 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 >>> >>> Added: cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m >>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ >>> SemaObjC/non-trivial-struct-traits.m?rev=328680&view=auto >>> ============================================================ >>> ================== >>> --- cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m (added) >>> +++ cfe/trunk/test/SemaObjC/non-trivial-struct-traits.m Tue Mar 27 >>> 17:12:08 2018 >>> @@ -0,0 +1,25 @@ >>> +// RUN: %clang_cc1 -fsyntax-only -fobjc-arc -verify %s >>> + >>> +// expected-no-diagnostics >>> + >>> +struct Trivial { >>> + int x; >>> +}; >>> + >>> +struct NonTrivial { >>> + id x; >>> +}; >>> + >>> +int trivial_assign[__has_trivial_assign(struct Trivial) ? 1 : -1]; >>> +int trivial_move_assign[__has_trivial_move_assign(struct Trivial) ? 1 >>> : -1]; >>> +int trivial_copy_constructor[__has_trivial_copy(struct Trivial) ? 1 : >>> -1]; >>> +int trivial_move_constructor[__has_trivial_move_constructor(struct >>> Trivial) ? 1 : -1]; >>> +int trivial_constructor[__has_trivial_constructor(struct Trivial) ? 1 >>> : -1]; >>> +int trivial_destructor[__has_trivial_destructor(struct Trivial) ? 1 : >>> -1]; >>> + >>> +int non_trivial_assign[__has_trivial_assign(struct NonTrivial) ? -1 : >>> 1]; >>> +int non_trivial_move_assign[__has_trivial_move_assign(struct >>> NonTrivial) ? -1 : 1]; >>> +int non_trivial_copy_constructor[__has_trivial_copy(struct NonTrivial) >>> ? -1 : 1]; >>> +int non_trivial_move_constructor[__has_trivial_move_constructor(struct >>> NonTrivial) ? -1 : 1]; >>> +int non_trivial_constructor[__has_trivial_constructor(struct >>> NonTrivial) ? -1 : 1]; >>> +int non_trivial_destructor[__has_trivial_destructor(struct NonTrivial) >>> ? -1 : 1]; >>> >>> >>> _______________________________________________ >>> cfe-commits mailing list >>> cfe-commits@lists.llvm.org >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>> >> >> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits