[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