[PATCH] PR12262 - assertion when substituting explicit template arguments does not substitute a sizeof-pack expression.
Richard Smith
richard at metafoo.co.uk
Mon Jul 8 15:09:31 PDT 2013
================
Comment at: test/CXX/temp/temp.decls/temp.variadic/sizeofpack.cpp:4
@@ +3,3 @@
+
+// PR12262
+
----------------
This bug now has a rather large pile of duplicates. Can you check whether this change fixes them all, and maybe extract some more testcases from them?
================
Comment at: lib/Sema/SemaTemplateDeduction.cpp:3155
@@ +3154,3 @@
+ Param != ParamEnd; ++Param) {
+ if (TemplateTypeParmDecl *D = dyn_cast<TemplateTypeParmDecl>(*Param)) {
+ if (D->isParameterPack()) {
----------------
It seems to me that this should also be necessary for non-type template parameters and for template template parameters.
================
Comment at: lib/Sema/SemaTemplateDeduction.cpp:3157-3161
@@ +3156,7 @@
+ if (D->isParameterPack()) {
+ TemplateTypeParmDecl *Inst = D->Clone(Context, 0, 0);
+ Inst->setAccess(AS_public);
+ // Introduce this template parameter's instantiation into the
+ // instantiation scope.
+ CurrentInstantiationScope->InstantiatedLocal(D, Inst);
+ }
----------------
Can you use SubstDecl here instead? I think you'll need something more general than this for cases such as:
template<typename T, T ...> struct seq {};
template<typename T, T ...U> seq<int, sizeof...(U)> f(seq<T, U...>);
auto x = f<int>(seq<int, 1, 2, 3>());
================
Comment at: lib/Sema/SemaTemplateDeduction.cpp:3157
@@ +3156,3 @@
+ if (D->isParameterPack()) {
+ TemplateTypeParmDecl *Inst = D->Clone(Context, 0, 0);
+ Inst->setAccess(AS_public);
----------------
Richard Smith wrote:
> Can you use SubstDecl here instead? I think you'll need something more general than this for cases such as:
>
> template<typename T, T ...> struct seq {};
> template<typename T, T ...U> seq<int, sizeof...(U)> f(seq<T, U...>);
> auto x = f<int>(seq<int, 1, 2, 3>());
Do you really need a clone here, or can you just say that the template parameter maps to itself?
http://llvm-reviews.chandlerc.com/D869
More information about the cfe-commits
mailing list