[clang] 009c9b8 - Fix multilevel deduction where an outer pack is used in the type of an

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Mon Jun 22 16:48:04 PDT 2020


Author: Richard Smith
Date: 2020-06-22T16:47:51-07:00
New Revision: 009c9b83acfc8bb863894e349bccc2473c685dbc

URL: https://github.com/llvm/llvm-project/commit/009c9b83acfc8bb863894e349bccc2473c685dbc
DIFF: https://github.com/llvm/llvm-project/commit/009c9b83acfc8bb863894e349bccc2473c685dbc.diff

LOG: Fix multilevel deduction where an outer pack is used in the type of an
inner non-type pack at a different index.

We previously considered the index of the outer pack (which would refer
to an unrelated template parameter) to be deduced by deducing the inner
pack, because we inspected the (largely meaningless) type of an expanded
non-type template parameter pack.

Added: 
    

Modified: 
    clang/lib/Sema/SemaTemplateDeduction.cpp
    clang/test/SemaTemplate/deduction-guide.cpp

Removed: 
    


################################################################################
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 @@ class PackDeductionScope {
       // type, so we need to collect the pending deduced values for those packs.
       if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(
               TemplateParams->getParam(Index))) {
-        if (auto *Expansion = dyn_cast<PackExpansionType>(NTTP->getType()))
-          ExtraDeductions.push_back(Expansion->getPattern());
+        if (!NTTP->isExpandedParameterPack())
+          if (auto *Expansion = dyn_cast<PackExpansionType>(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<auto ...> struct X {};
 
-template<typename T, typename ...Ts> struct A { // expected-note 2{{candidate}}
-  template<Ts ...Ns, T *...Ps> A(X<Ps...>, Ts (*...qs)[Ns]); // expected-note {{candidate}}
+template<typename T, typename ...Ts> struct A {
+  template<Ts ...Ns, T *...Ps> A(X<Ps...>, 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<int[3], int, int, short>;
 


        


More information about the cfe-commits mailing list