[cfe-commits] r155756 - in /cfe/trunk: include/clang/AST/Type.h lib/AST/Type.cpp lib/Sema/SemaExpr.cpp test/SemaCXX/type-traits.cpp

Douglas Gregor dgregor at apple.com
Sun Apr 29 08:13:52 PDT 2012


Has this issue manifested in some serious way? 

Sent from my iPhone

On Apr 29, 2012, at 12:08 AM, Richard Smith <richard at metafoo.co.uk> 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 <benny.kra at googlemail.com> 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
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120429/ec8788c2/attachment.html>


More information about the cfe-commits mailing list