On 29.04.2012, at 17:13, Douglas Gregor wrote: > Has this issue manifested in some serious way?
Not so far, got a report of std::is_pod being wrong. - Ben > > Sent from my iPhone > > On Apr 29, 2012, at 12:08 AM, Richard Smith <[email protected]> wrote: > >> This is probably not as major as it seems -- PODness doesn't affect C++11 >> language semantics at all (but does affect some parts of the library, >> notably std::is_pod). I suspect (but haven't checked!) that many of our uses >> of isPODType really do want the C++98 definition, even in C++11 mode, or >> shouldn't be checking for POD at all. Even with this change, >> CXXRecordDecl::isPOD is using the C++98 definition. >> >> On Sat, Apr 28, 2012 at 3:15 AM, Benjamin Kramer <[email protected]> >> wrote: >> >> On 28.04.2012, at 12:00, Benjamin Kramer wrote: >> >> > Author: d0k >> > Date: Sat Apr 28 05:00:42 2012 >> > New Revision: 155756 >> > >> > URL: http://llvm.org/viewvc/llvm-project?rev=155756&view=rev >> > Log: >> > Rename isPODType (using the C++98 rules) into isCXX98PODType and make >> > isPODType decide which one to use based on LangOptions. >> > >> > - -Wc++98-compat depends on the c++98 definition >> > - Now __is_pod returns the right thing in c++11 and c++98 mode >> > - All changes to the type traits test are validated against g++ 4.7 >> >> Doug, can you review/approve this for 3.1? It looks like a pretty major bug. >> >> - Ben >> >> > Modified: >> > cfe/trunk/include/clang/AST/Type.h >> > cfe/trunk/lib/AST/Type.cpp >> > cfe/trunk/lib/Sema/SemaExpr.cpp >> > cfe/trunk/test/SemaCXX/type-traits.cpp >> > >> > Modified: cfe/trunk/include/clang/AST/Type.h >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=155756&r1=155755&r2=155756&view=diff >> > ============================================================================== >> > --- cfe/trunk/include/clang/AST/Type.h (original) >> > +++ cfe/trunk/include/clang/AST/Type.h Sat Apr 28 05:00:42 2012 >> > @@ -634,6 +634,11 @@ >> > /// \brief Determine whether this is a Plain Old Data (POD) type (C++ >> > 3.9p10). >> > bool isPODType(ASTContext &Context) const; >> > >> > + /// isCXX98PODType() - Return true if this is a POD type according to >> > the >> > + /// rules of the C++98 standard, regardless of the current compilation's >> > + /// language. >> > + bool isCXX98PODType(ASTContext &Context) const; >> > + >> > /// isCXX11PODType() - Return true if this is a POD type according to the >> > /// more relaxed rules of the C++11 standard, regardless of the current >> > /// compilation's language. >> > >> > Modified: cfe/trunk/lib/AST/Type.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=155756&r1=155755&r2=155756&view=diff >> > ============================================================================== >> > --- cfe/trunk/lib/AST/Type.cpp (original) >> > +++ cfe/trunk/lib/AST/Type.cpp Sat Apr 28 05:00:42 2012 >> > @@ -895,6 +895,14 @@ >> > } >> > >> > bool QualType::isPODType(ASTContext &Context) const { >> > + // C++11 has a more relaxed definition of POD. >> > + if (Context.getLangOpts().CPlusPlus0x) >> > + return isCXX11PODType(Context); >> > + >> > + return isCXX98PODType(Context); >> > +} >> > + >> > +bool QualType::isCXX98PODType(ASTContext &Context) const { >> > // The compiler shouldn't query this for incomplete types, but the user >> > might. >> > // We return false for that case. Except for incomplete arrays of PODs, >> > which >> > // are PODs according to the standard. >> > >> > Modified: cfe/trunk/lib/Sema/SemaExpr.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=155756&r1=155755&r2=155756&view=diff >> > ============================================================================== >> > --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) >> > +++ cfe/trunk/lib/Sema/SemaExpr.cpp Sat Apr 28 05:00:42 2012 >> > @@ -560,7 +560,8 @@ >> > // Complain about passing non-POD types through varargs. However, don't >> > // perform this check for incomplete types, which we can get here when >> > we're >> > // in an unevaluated context. >> > - if (!E->getType()->isIncompleteType() && >> > !E->getType().isPODType(Context)) { >> > + if (!E->getType()->isIncompleteType() && >> > + !E->getType().isCXX98PODType(Context)) { >> > // C++0x [expr.call]p7: >> > // Passing a potentially-evaluated argument of class type (Clause 9) >> > // having a non-trivial copy constructor, a non-trivial move >> > constructor, >> > >> > Modified: cfe/trunk/test/SemaCXX/type-traits.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/type-traits.cpp?rev=155756&r1=155755&r2=155756&view=diff >> > ============================================================================== >> > --- cfe/trunk/test/SemaCXX/type-traits.cpp (original) >> > +++ cfe/trunk/test/SemaCXX/type-traits.cpp Sat Apr 28 05:00:42 2012 >> > @@ -131,25 +131,25 @@ >> > { int arr[T(__is_pod(HasAnonymousUnion))]; } >> > { int arr[T(__is_pod(Vector))]; } >> > { int arr[T(__is_pod(VectorExt))]; } >> > + { int arr[T(__is_pod(Derives))]; } >> > + { int arr[T(__is_pod(DerivesAr))]; } >> > + { int arr[T(__is_pod(DerivesArNB))]; } >> > + { int arr[T(__is_pod(DerivesEmpty))]; } >> > + { int arr[T(__is_pod(HasPriv))]; } >> > + { int arr[T(__is_pod(HasProt))]; } >> > + { int arr[T(__is_pod(DerivesHasPriv))]; } >> > + { int arr[T(__is_pod(DerivesHasProt))]; } >> > >> > - { int arr[F(__is_pod(Derives))]; } >> > - { int arr[F(__is_pod(DerivesAr))]; } >> > - { int arr[F(__is_pod(DerivesArNB))]; } >> > - { int arr[F(__is_pod(DerivesEmpty))]; } >> > { int arr[F(__is_pod(HasCons))]; } >> > { int arr[F(__is_pod(HasCopyAssign))]; } >> > { int arr[F(__is_pod(HasMoveAssign))]; } >> > { int arr[F(__is_pod(HasDest))]; } >> > - { int arr[F(__is_pod(HasPriv))]; } >> > - { int arr[F(__is_pod(HasProt))]; } >> > { int arr[F(__is_pod(HasRef))]; } >> > { int arr[F(__is_pod(HasVirt))]; } >> > { int arr[F(__is_pod(DerivesHasCons))]; } >> > { int arr[F(__is_pod(DerivesHasCopyAssign))]; } >> > { int arr[F(__is_pod(DerivesHasMoveAssign))]; } >> > { int arr[F(__is_pod(DerivesHasDest))]; } >> > - { int arr[F(__is_pod(DerivesHasPriv))]; } >> > - { int arr[F(__is_pod(DerivesHasProt))]; } >> > { int arr[F(__is_pod(DerivesHasRef))]; } >> > { int arr[F(__is_pod(DerivesHasVirt))]; } >> > { int arr[F(__is_pod(NonPOD))]; } >> > @@ -1223,10 +1223,10 @@ >> > { int arr[T(__has_trivial_copy(const Int))]; } >> > { int arr[T(__has_trivial_copy(AllDefaulted))]; } >> > { int arr[T(__has_trivial_copy(AllDeleted))]; } >> > + { int arr[T(__has_trivial_copy(DerivesAr))]; } >> > >> > { int arr[F(__has_trivial_copy(HasCopy))]; } >> > { int arr[F(__has_trivial_copy(HasTemplateCons))]; } >> > - { int arr[F(__has_trivial_copy(DerivesAr))]; } >> > { int arr[F(__has_trivial_copy(VirtAr))]; } >> > { int arr[F(__has_trivial_copy(void))]; } >> > { int arr[F(__has_trivial_copy(cvoid))]; } >> > @@ -1250,13 +1250,13 @@ >> > { int arr[T(__has_trivial_assign(HasMoveAssign))]; } >> > { int arr[T(__has_trivial_assign(AllDefaulted))]; } >> > { int arr[T(__has_trivial_assign(AllDeleted))]; } >> > + { int arr[T(__has_trivial_assign(DerivesAr))]; } >> > >> > { int arr[F(__has_trivial_assign(IntRef))]; } >> > { int arr[F(__has_trivial_assign(HasCopyAssign))]; } >> > { int arr[F(__has_trivial_assign(const Int))]; } >> > { int arr[F(__has_trivial_assign(ConstIntAr))]; } >> > { int arr[F(__has_trivial_assign(ConstIntArAr))]; } >> > - { int arr[F(__has_trivial_assign(DerivesAr))]; } >> > { int arr[F(__has_trivial_assign(VirtAr))]; } >> > { int arr[F(__has_trivial_assign(void))]; } >> > { int arr[F(__has_trivial_assign(cvoid))]; } >> > @@ -1338,6 +1338,7 @@ >> > { int arr[T(__has_nothrow_assign(HasVirtDest))]; } >> > { int arr[T(__has_nothrow_assign(AllPrivate))]; } >> > { int arr[T(__has_nothrow_assign(UsingAssign))]; } >> > + { int arr[T(__has_nothrow_assign(DerivesAr))]; } >> > >> > { int arr[F(__has_nothrow_assign(IntRef))]; } >> > { int arr[F(__has_nothrow_assign(HasCopyAssign))]; } >> > @@ -1345,7 +1346,6 @@ >> > { int arr[F(__has_nothrow_assign(const Int))]; } >> > { int arr[F(__has_nothrow_assign(ConstIntAr))]; } >> > { int arr[F(__has_nothrow_assign(ConstIntArAr))]; } >> > - { int arr[F(__has_nothrow_assign(DerivesAr))]; } >> > { int arr[F(__has_nothrow_assign(VirtAr))]; } >> > { int arr[F(__has_nothrow_assign(void))]; } >> > { int arr[F(__has_nothrow_assign(cvoid))]; } >> > @@ -1375,10 +1375,10 @@ >> > { int arr[T(__has_nothrow_copy(HasVirtDest))]; } >> > { int arr[T(__has_nothrow_copy(HasTemplateCons))]; } >> > { int arr[T(__has_nothrow_copy(AllPrivate))]; } >> > + { int arr[T(__has_nothrow_copy(DerivesAr))]; } >> > >> > { int arr[F(__has_nothrow_copy(HasCopy))]; } >> > { int arr[F(__has_nothrow_copy(HasMultipleCopy))]; } >> > - { int arr[F(__has_nothrow_copy(DerivesAr))]; } >> > { int arr[F(__has_nothrow_copy(VirtAr))]; } >> > { int arr[F(__has_nothrow_copy(void))]; } >> > { int arr[F(__has_nothrow_copy(cvoid))]; } >> > >> > >> > _______________________________________________ >> > cfe-commits mailing list >> > [email protected] >> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
