re PR c++/63849 ([c++11] ICE on variadic alias template with wrappers)
authorJason Merrill <jason@redhat.com>
Fri, 21 Nov 2014 21:35:00 +0000 (16:35 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 21 Nov 2014 21:35:00 +0000 (16:35 -0500)
PR c++/63849
* mangle.c (decl_mangling_context): Use template_type_parameter_p.

From-SVN: r217949

gcc/cp/ChangeLog
gcc/cp/mangle.c
gcc/testsuite/g++.dg/cpp0x/alias-decl-44.C [new file with mode: 0644]

index 89d4ade46f9cf0a17675286744a6fcb5dbd2c29b..652ec9ca63e7f3f409dea1ca06288fa6ff20f5b7 100644 (file)
@@ -1,5 +1,8 @@
 2014-11-21  Jason Merrill  <jason@redhat.com>
 
+       PR c++/63849
+       * mangle.c (decl_mangling_context): Use template_type_parameter_p.
+
        PR c++/63588
        * pt.c (uses_template_parms): Handle null argument.
 
index 4c63df042faf9391d702e2803cd9c825485d904c..9f0d9d8ed778c75feee697780bea0504c54ed221 100644 (file)
@@ -764,8 +764,7 @@ decl_mangling_context (tree decl)
       if (extra)
        return extra;
     }
-    else if (TREE_CODE (decl) == TYPE_DECL
-            && TREE_CODE (TREE_TYPE (decl)) == TEMPLATE_TYPE_PARM)
+  else if (template_type_parameter_p (decl))
      /* template type parms have no mangling context.  */
       return NULL_TREE;
   return CP_DECL_CONTEXT (decl);
diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-44.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-44.C
new file mode 100644 (file)
index 0000000..bd20b54
--- /dev/null
@@ -0,0 +1,43 @@
+// PR c++/63849
+// { dg-do compile { target c++11 } }
+
+template <class _T, class...>
+using First = _T;            // we should not use this
+                             // alias with only
+                             // one pack parameter (?)
+
+template <template <class...> class _Successor,
+          int,
+          class... _Xs>
+struct Overlay
+{
+    using O = _Successor<_Xs...>;
+};
+
+template <class... _Pack>
+struct List
+{
+    template <int _s>
+    using O = typename Overlay<List, _s, _Pack...>::O;
+
+    template <template <class...> class _S>
+    using Pass = _S<_Pack...>;
+
+    template <int _i>
+    using At = typename O<_i>
+    ::template Pass<First>;
+};
+
+template <int _i>
+using At = typename List<int, char>
+::template At<_i>;
+
+template <int _i>
+void func_crash(At<_i>&) {}
+
+int main(int argc, char *argv[])
+{
+    char ccc;
+    int iii;
+    func_crash<0>(iii);
+}