]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/patches/patch-26-clang-r213790-type_traits-crash.diff
Upgrade our copy of clang and llvm to 3.5.1 release. This is a bugfix
[FreeBSD/FreeBSD.git] / contrib / llvm / patches / patch-26-clang-r213790-type_traits-crash.diff
1 Pull in r213790 from upstream clang trunk (by Richard Smith):
2
3   PR20228: don't retain a pointer to a vector element after the
4   container has been resized.
5
6 This fixes a possible crash when compiling certain parts of libc++'s
7 type_traits header.
8
9 Introduced here: http://svnweb.freebsd.org/changeset/base/276516
10
11 Index: tools/clang/lib/Sema/SemaExprCXX.cpp
12 ===================================================================
13 --- tools/clang/lib/Sema/SemaExprCXX.cpp
14 +++ tools/clang/lib/Sema/SemaExprCXX.cpp
15 @@ -3642,12 +3642,13 @@ static bool evaluateTypeTrait(Sema &S, TypeTrait K
16        if (T->isObjectType() || T->isFunctionType())
17          T = S.Context.getRValueReferenceType(T);
18        OpaqueArgExprs.push_back(
19 -        OpaqueValueExpr(Args[I]->getTypeLoc().getLocStart(), 
20 +        OpaqueValueExpr(Args[I]->getTypeLoc().getLocStart(),
21                          T.getNonLValueExprType(S.Context),
22                          Expr::getValueKindForType(T)));
23 -      ArgExprs.push_back(&OpaqueArgExprs.back());
24      }
25 -    
26 +    for (Expr &E : OpaqueArgExprs)
27 +      ArgExprs.push_back(&E);
28 +
29      // Perform the initialization in an unevaluated context within a SFINAE 
30      // trap at translation unit scope.
31      EnterExpressionEvaluationContext Unevaluated(S, Sema::Unevaluated);
32 Index: tools/clang/test/SemaCXX/type-traits.cpp
33 ===================================================================
34 --- tools/clang/test/SemaCXX/type-traits.cpp
35 +++ tools/clang/test/SemaCXX/type-traits.cpp
36 @@ -146,6 +146,10 @@ struct ThreeArgCtor {
37    ThreeArgCtor(int*, char*, int);
38  };
39  
40 +struct VariadicCtor {
41 +  template<typename...T> VariadicCtor(T...);
42 +};
43 +
44  void is_pod()
45  {
46    { int arr[T(__is_pod(int))]; }
47 @@ -1968,6 +1972,10 @@ void constructible_checks() {
48    // PR19178
49    { int arr[F(__is_constructible(Abstract))]; }
50    { int arr[F(__is_nothrow_constructible(Abstract))]; }
51 +
52 +  // PR20228
53 +  { int arr[T(__is_constructible(VariadicCtor,
54 +                                 int, int, int, int, int, int, int, int, int))]; }
55  }
56  
57  // Instantiation of __is_trivially_constructible