diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 877020ed4dcf..e6569d4a784f 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -738,8 +738,9 @@ private: // type, so we need to collect the pending deduced values for those packs. if (auto *NTTP = dyn_cast( TemplateParams->getParam(Index))) { - if (auto *Expansion = dyn_cast(NTTP->getType())) - ExtraDeductions.push_back(Expansion->getPattern()); + if (!NTTP->isExpandedParameterPack()) + if (auto *Expansion = dyn_cast(NTTP->getType())) + ExtraDeductions.push_back(Expansion->getPattern()); } // FIXME: Also collect the unexpanded packs in any type and template // parameter packs that are pack expansions. diff --git a/clang/test/SemaTemplate/deduction-guide.cpp b/clang/test/SemaTemplate/deduction-guide.cpp index c1ce62594fa6..3ac37ac44a1f 100644 --- a/clang/test/SemaTemplate/deduction-guide.cpp +++ b/clang/test/SemaTemplate/deduction-guide.cpp @@ -1,14 +1,14 @@ // RUN: %clang_cc1 -std=c++2a -verify -ast-dump -ast-dump-decl-types -ast-dump-filter "deduction guide" %s | FileCheck %s +// expected-no-diagnostics template struct X {}; -template struct A { // expected-note 2{{candidate}} - template A(X, Ts (*...qs)[Ns]); // expected-note {{candidate}} +template struct A { + template A(X, Ts (*...qs)[Ns]); }; int arr1[3], arr2[3]; short arr3[4]; -// FIXME: The CTAD deduction here succeeds, but the initialization deduction spuriously fails. -A a(X<&arr1, &arr2>{}, &arr1, &arr2, &arr3); // FIXME: expected-error {{no matching constructor}} +A a(X<&arr1, &arr2>{}, &arr1, &arr2, &arr3); using AT = decltype(a); using AT = A;