aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-11-21 16:35:00 -0500
committerJason Merrill <jason@gcc.gnu.org>2014-11-21 16:35:00 -0500
commit6602e1095db5259590fa8813f48a1404ba00cf10 (patch)
tree8193b578381ae2af6620492c8b7cf1e7a0556b17 /gcc
parent169fe7fa43bd721a26b59707b931e5799ead4e6a (diff)
downloadgcc-6602e1095db5259590fa8813f48a1404ba00cf10.zip
gcc-6602e1095db5259590fa8813f48a1404ba00cf10.tar.gz
gcc-6602e1095db5259590fa8813f48a1404ba00cf10.tar.bz2
re PR c++/63849 ([c++11] ICE on variadic alias template with wrappers)
PR c++/63849 * mangle.c (decl_mangling_context): Use template_type_parameter_p. From-SVN: r217949
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/mangle.c3
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/alias-decl-44.C43
3 files changed, 47 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 89d4ade..652ec9c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c
index 4c63df0..9f0d9d8 100644
--- a/gcc/cp/mangle.c
+++ b/gcc/cp/mangle.c
@@ -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
index 0000000..bd20b54
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-44.C
@@ -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);
+}