forked from OSchip/llvm-project
PR21536: Fix a corner case where we'd get confused by a pack expanding into the
penultimate parameter of a template parameter list, where the last parameter is itself a pack, and build a bogus empty final pack argument. llvm-svn: 221748
This commit is contained in:
parent
f44dbda542
commit
d8a52a7831
|
@ -3749,7 +3749,7 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,
|
|||
}
|
||||
|
||||
// Push the argument pack onto the list of converted arguments.
|
||||
if (InFinalParameterPack) {
|
||||
if (InFinalParameterPack && !ArgumentPack.empty()) {
|
||||
Converted.push_back(
|
||||
TemplateArgument::CreatePackCopy(Context,
|
||||
ArgumentPack.data(),
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11
|
||||
|
||||
// Template argument deduction with template template parameters.
|
||||
template<typename T, template<T> class A>
|
||||
|
@ -162,3 +162,19 @@ namespace test14 {
|
|||
foo(a);
|
||||
}
|
||||
}
|
||||
|
||||
namespace PR21536 {
|
||||
template<typename ...T> struct X;
|
||||
template<typename A, typename ...B> struct S {
|
||||
static_assert(sizeof...(B) == 1, "");
|
||||
void f() {
|
||||
using T = A;
|
||||
using T = int;
|
||||
|
||||
using U = X<B...>;
|
||||
using U = X<int>;
|
||||
}
|
||||
};
|
||||
template<typename ...T> void f(S<T...>);
|
||||
void g() { f(S<int, int>()); }
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue