r190482 - Fix is_trivially_constructible preconditions.

Jordan Rose jordan_rose at apple.com
Mon Sep 16 14:46:30 PDT 2013


Sorry for the late notice...this seems to have made the already-failing libc++ bot even worse. See http://lab.llvm.org:8013/builders/libcxx_clang-x86_64-darwin11-RA/builds/376.


On Sep 10, 2013, at 19:53 , Eli Friedman <eli.friedman at gmail.com> wrote:

> Author: efriedma
> Date: Tue Sep 10 21:53:02 2013
> New Revision: 190482
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=190482&view=rev
> Log:
> Fix is_trivially_constructible preconditions.
> 
> Fixes a crash in cases where the first argument was an incomplete type
> or an uninstantiated template type.
> 
> <rdar://problem/14938471>
> 
> Modified:
>    cfe/trunk/lib/Sema/SemaExprCXX.cpp
>    cfe/trunk/test/SemaCXX/type-traits.cpp
> 
> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=190482&r1=190481&r2=190482&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Sep 10 21:53:02 2013
> @@ -3522,24 +3522,24 @@ static bool evaluateTypeTrait(Sema &S, T
>         << 1 << 1 << 1 << (int)Args.size();
>       return false;
>     }
> -    
> -    bool SawVoid = false;
> +
> +    // Precondition: T and all types in the parameter pack Args shall be
> +    // complete types, (possibly cv-qualified) void, or arrays of
> +    // unknown bound.
>     for (unsigned I = 0, N = Args.size(); I != N; ++I) {
> -      if (Args[I]->getType()->isVoidType()) {
> -        SawVoid = true;
> +      QualType ArgTy = Args[I]->getType();
> +      if (ArgTy->isVoidType() || ArgTy->isIncompleteArrayType())
>         continue;
> -      }
> -      
> -      if (!Args[I]->getType()->isIncompleteType() &&
> -        S.RequireCompleteType(KWLoc, Args[I]->getType(), 
> +
> +      if (S.RequireCompleteType(KWLoc, ArgTy, 
>           diag::err_incomplete_type_used_in_type_trait_expr))
>         return false;
>     }
> -    
> -    // If any argument was 'void', of course it won't type-check.
> -    if (SawVoid)
> +
> +    // Make sure the first argument is a complete type.
> +    if (Args[0]->getType()->isIncompleteType())
>       return false;
> -    
> +
>     SmallVector<OpaqueValueExpr, 2> OpaqueArgExprs;
>     SmallVector<Expr *, 2> ArgExprs;
>     ArgExprs.reserve(Args.size() - 1);
> 
> Modified: cfe/trunk/test/SemaCXX/type-traits.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/type-traits.cpp?rev=190482&r1=190481&r2=190482&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/type-traits.cpp (original)
> +++ cfe/trunk/test/SemaCXX/type-traits.cpp Tue Sep 10 21:53:02 2013
> @@ -1571,7 +1571,7 @@ template<typename T> struct DerivedB : B
> template<typename T> struct CrazyDerived : T { };
> 
> 
> -class class_forward; // expected-note {{forward declaration of 'class_forward'}}
> +class class_forward; // expected-note 2 {{forward declaration of 'class_forward'}}
> 
> template <typename Base, typename Derived>
> void isBaseOfT() {
> @@ -1770,6 +1770,8 @@ void is_trivial()
>   { int arr[F(__is_trivial(cvoid))]; }
> }
> 
> +template<typename T> struct TriviallyConstructibleTemplate {};
> +
> void trivial_checks()
> {
>   { int arr[T(__is_trivially_copyable(int))]; }
> @@ -1848,6 +1850,11 @@ void trivial_checks()
>   { int arr[F((__is_trivially_constructible(ExtDefaulted,
>                                             ExtDefaulted &&)))]; }
> 
> +  { int arr[T((__is_trivially_constructible(TriviallyConstructibleTemplate<int>)))]; }
> +  { int arr[F((__is_trivially_constructible(class_forward)))]; } // expected-error {{incomplete type 'class_forward' used in type trait expression}}
> +  { int arr[F((__is_trivially_constructible(class_forward[])))]; }
> +  { int arr[F((__is_trivially_constructible(void)))]; }
> +
>   { int arr[T((__is_trivially_assignable(int&, int)))]; }
>   { int arr[T((__is_trivially_assignable(int&, int&)))]; }
>   { int arr[T((__is_trivially_assignable(int&, int&&)))]; }
> 
> 
> _______________________________________________
> 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