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

Benjamin Kramer benny.kra at googlemail.com
Sat Apr 28 03:15:08 PDT 2012


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





More information about the cfe-commits mailing list