[llvm-branch-commits] [cfe-branch] r223719 - Merging r221832:
Tom Stellard
thomas.stellard at amd.com
Mon Dec 8 15:38:47 PST 2014
Author: tstellar
Date: Mon Dec 8 17:38:47 2014
New Revision: 223719
URL: http://llvm.org/viewvc/llvm-project?rev=223719&view=rev
Log:
Merging r221832:
------------------------------------------------------------------------
r221832 | richard-llvm | 2014-11-12 18:38:38 -0500 (Wed, 12 Nov 2014) | 5 lines
PR19372: Keep checking template arguments after we see an argument pack
expansion into a parameter pack; we know that we're still filling in that
parameter's arguments. Previously, if we hit this case for an alias template,
we'd try to substitute using non-canonical template arguments.
------------------------------------------------------------------------
Modified:
cfe/branches/release_35/lib/Sema/SemaTemplate.cpp
cfe/branches/release_35/test/SemaTemplate/deduction.cpp
Modified: cfe/branches/release_35/lib/Sema/SemaTemplate.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_35/lib/Sema/SemaTemplate.cpp?rev=223719&r1=223718&r2=223719&view=diff
==============================================================================
--- cfe/branches/release_35/lib/Sema/SemaTemplate.cpp (original)
+++ cfe/branches/release_35/lib/Sema/SemaTemplate.cpp Mon Dec 8 17:38:47 2014
@@ -3692,12 +3692,12 @@ bool Sema::CheckTemplateArgumentList(Tem
ArgumentPack.size(), Converted))
return true;
- if (TemplateArgs[ArgIdx].getArgument().isPackExpansion() &&
- isa<TypeAliasTemplateDecl>(Template) &&
- !(Param + 1 == ParamEnd && (*Param)->isTemplateParameterPack() &&
- !getExpandedPackSize(*Param))) {
+ bool PackExpansionIntoNonPack =
+ TemplateArgs[ArgIdx].getArgument().isPackExpansion() &&
+ (!(*Param)->isTemplateParameterPack() || getExpandedPackSize(*Param));
+ if (PackExpansionIntoNonPack && isa<TypeAliasTemplateDecl>(Template)) {
// Core issue 1430: we have a pack expansion as an argument to an
- // alias template, and it's not part of a final parameter pack. This
+ // alias template, and it's not part of a parameter pack. This
// can't be canonicalized, so reject it now.
Diag(TemplateArgs[ArgIdx].getLocation(),
diag::err_alias_template_expansion_into_fixed_list)
@@ -3720,16 +3720,11 @@ bool Sema::CheckTemplateArgumentList(Tem
++Param;
}
- // If we just saw a pack expansion, then directly convert the remaining
- // arguments, because we don't know what parameters they'll match up
- // with.
- if (TemplateArgs[ArgIdx-1].getArgument().isPackExpansion()) {
- bool InFinalParameterPack = Param != ParamEnd &&
- Param + 1 == ParamEnd &&
- (*Param)->isTemplateParameterPack() &&
- !getExpandedPackSize(*Param);
-
- if (!InFinalParameterPack && !ArgumentPack.empty()) {
+ // If we just saw a pack expansion into a non-pack, then directly convert
+ // the remaining arguments, because we don't know what parameters they'll
+ // match up with.
+ if (PackExpansionIntoNonPack) {
+ if (!ArgumentPack.empty()) {
// If we were part way through filling in an expanded parameter pack,
// fall back to just producing individual arguments.
Converted.insert(Converted.end(),
@@ -3738,22 +3733,10 @@ bool Sema::CheckTemplateArgumentList(Tem
}
while (ArgIdx < NumArgs) {
- if (InFinalParameterPack)
- ArgumentPack.push_back(TemplateArgs[ArgIdx].getArgument());
- else
- Converted.push_back(TemplateArgs[ArgIdx].getArgument());
+ Converted.push_back(TemplateArgs[ArgIdx].getArgument());
++ArgIdx;
}
- // Push the argument pack onto the list of converted arguments.
- if (InFinalParameterPack && !ArgumentPack.empty()) {
- Converted.push_back(
- TemplateArgument::CreatePackCopy(Context,
- ArgumentPack.data(),
- ArgumentPack.size()));
- ArgumentPack.clear();
- }
-
return false;
}
Modified: cfe/branches/release_35/test/SemaTemplate/deduction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_35/test/SemaTemplate/deduction.cpp?rev=223719&r1=223718&r2=223719&view=diff
==============================================================================
--- cfe/branches/release_35/test/SemaTemplate/deduction.cpp (original)
+++ cfe/branches/release_35/test/SemaTemplate/deduction.cpp Mon Dec 8 17:38:47 2014
@@ -178,3 +178,17 @@ namespace PR21536 {
template<typename ...T> void f(S<T...>);
void g() { f(S<int, int>()); }
}
+
+namespace PR19372 {
+ template <template<typename...> class C, typename ...Us> struct BindBack {
+ template <typename ...Ts> using apply = C<Ts..., Us...>;
+ };
+ template <typename, typename...> struct Y;
+ template <typename ...Ts> using Z = Y<Ts...>;
+
+ using T = BindBack<Z, int>::apply<>;
+ using T = Z<int>;
+
+ using U = BindBack<Z, int, int>::apply<char>;
+ using U = Z<char, int, int>;
+}
More information about the llvm-branch-commits
mailing list