Fix crash on init-capture packs where the type of the initializer is non-dependent.

This commit is contained in:
Richard Smith 2019-12-19 15:18:59 -08:00
parent b284005072
commit f4a45c2ce4
4 changed files with 15 additions and 3 deletions

View File

@ -507,7 +507,8 @@ static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts,
if (LangOpts.CPlusPlus14) {
Builder.defineMacro("__cpp_binary_literals", "201304L");
Builder.defineMacro("__cpp_digit_separators", "201309L");
Builder.defineMacro("__cpp_init_captures", "201304L"); // (not latest)
Builder.defineMacro("__cpp_init_captures",
LangOpts.CPlusPlus2a ? "201803L" : "201304L");
Builder.defineMacro("__cpp_generic_lambdas",
LangOpts.CPlusPlus2a ? "201707L" : "201304L");
Builder.defineMacro("__cpp_decltype_auto", "201304L");

View File

@ -4453,7 +4453,8 @@ Sema::DeduceAutoType(TypeLoc Type, Expr *&Init, QualType &Result,
/*.IsPack = */ (bool)Type.getAs<PackExpansionTypeLoc>()};
if (!DependentDeductionDepth &&
(Type.getType()->isDependentType() || Init->isTypeDependent())) {
(Type.getType()->isDependentType() || Init->isTypeDependent() ||
Init->containsUnexpandedParameterPack())) {
Result = SubstituteDeducedTypeTransform(*this, DependentResult).Apply(Type);
assert(!Result.isNull() && "substituting DependentTy can't fail");
return DAR_Succeeded;

View File

@ -37,3 +37,11 @@ template<typename ...T> void f(T ...t) {
}... // expected-error {{does not contain any unexpanded}}
);
}
template<int ...a> constexpr auto x = [...z = a] (auto F) { return F(z...); };
static_assert(x<1,2,3>([](int a, int b, int c) { return 100 * a + 10 * b + c; }) == 123);
static_assert(x<1,2,3>([](int a, int b, int c) { return 100 * a + 10 * b + c; }) == 124); // expected-error {{failed}}
template<int ...a> constexpr auto y = [z = a...] (auto F) { return F(z...); }; // expected-error {{must appear before the name of the capture}}
static_assert(y<1,2,3>([](int a, int b, int c) { return 100 * a + 10 * b + c; }) == 123);
static_assert(y<1,2,3>([](int a, int b, int c) { return 100 * a + 10 * b + c; }) == 124); // expected-error {{failed}}

View File

@ -66,6 +66,8 @@
#error "wrong value for __cpp_impl_three_way_comparison"
#endif
// init_captures checked below
// --- C++17 features ---
#if check(hex_float, 0, 0, 0, 201603, 201603)
@ -170,7 +172,7 @@
#error "wrong value for __cpp_digit_separators"
#endif
#if check(init_captures, 0, 0, 201304, 201304, 201304)
#if check(init_captures, 0, 0, 201304, 201304, 201803)
#error "wrong value for __cpp_init_captures"
#endif