1 Pull in r213790 from upstream clang trunk (by Richard Smith):
3 PR20228: don't retain a pointer to a vector element after the
4 container has been resized.
6 This fixes a possible crash when compiling certain parts of libc++'s
9 Introduced here: http://svnweb.freebsd.org/changeset/base/276516
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());
26 + for (Expr &E : OpaqueArgExprs)
27 + ArgExprs.push_back(&E);
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);
40 +struct VariadicCtor {
41 + template<typename...T> VariadicCtor(T...);
46 { int arr[T(__is_pod(int))]; }
47 @@ -1968,6 +1972,10 @@ void constructible_checks() {
49 { int arr[F(__is_constructible(Abstract))]; }
50 { int arr[F(__is_nothrow_constructible(Abstract))]; }
53 + { int arr[T(__is_constructible(VariadicCtor,
54 + int, int, int, int, int, int, int, int, int))]; }
57 // Instantiation of __is_trivially_constructible