PR c++/51194 - ICE with invalid alias template
authordodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 20 Nov 2011 07:10:24 +0000 (07:10 +0000)
committerdodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 20 Nov 2011 07:10:24 +0000 (07:10 +0000)
gcc/cp/

PR c++/51194
* pt.c (lookup_template_class_1): Go out early if the type of the
template is error_mark_node.

gcc/testsuite/

PR c++/51194
* g++.dg/cpp0x/alias-decl-15.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181523 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 3d0f356..96e4d20 100644 (file)
@@ -1,3 +1,9 @@
+2011-11-20  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/51194
+       * pt.c (lookup_template_class_1): Go out early if the type of the
+       template is error_mark_node.
+
 2011-11-19  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/51216
index 987b70b..2b02fa4 100644 (file)
@@ -7270,6 +7270,12 @@ lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context,
       int is_dependent_type;
       int use_partial_inst_tmpl = false;
 
+      if (template_type == error_mark_node)
+       /* An error occured while building the template TEMPL, and a
+          diagnostic has most certainly been emitted for that
+          already.  Let's propagate that error.  */
+       return error_mark_node;
+
       gen_tmpl = most_general_template (templ);
       parmlist = DECL_TEMPLATE_PARMS (gen_tmpl);
       parm_depth = TMPL_PARMS_DEPTH (parmlist);
index 861f36c..c5f33a6 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-20  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/51194
+       * g++.dg/cpp0x/alias-decl-15.C: New test.
+
 2011-11-19  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/51216
diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-15.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-15.C
new file mode 100644 (file)
index 0000000..2bc9b11
--- /dev/null
@@ -0,0 +1,17 @@
+// Origin PR c++/51194
+// { dg-options "-std=c++0x" }
+
+template<class U, class V> //#1
+struct foo {}; // { dg-error "provided for|foo" }
+
+template<class U, class V=char>
+struct P {};
+
+template<template<class... U> class... TT>
+struct bar {
+    template<class... Args>
+    using mem = P<TT<Args...>...>;//#2 { dg-error "wrong number of|arguments" }
+};
+
+bar<foo>::mem<int, char> b;//#3 { dg-error "invalid type" }
+