decl.c (grokdeclarator): For an erroneous template parameter propagate error_mark_nod...
authorPaolo Carlini <paolo.carlini@oracle.com>
Tue, 21 Jul 2015 20:51:28 +0000 (20:51 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 21 Jul 2015 20:51:28 +0000 (20:51 +0000)
/cp
2015-07-21  Paolo Carlini  <paolo.carlini@oracle.com>

* decl.c (grokdeclarator): For an erroneous template parameter
propagate error_mark_node as type.

/testsuite
2015-07-21  Paolo Carlini  <paolo.carlini@oracle.com>

* g++.dg/template/crash81.C: Update.

From-SVN: r226054

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/crash81.C

index b72b22f5ef8d13becd270b7693144aae8707a5aa..bb0385d8b1715542ad3956bdd57923f65e80f38e 100644 (file)
@@ -1,3 +1,8 @@
+2015-07-21  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * decl.c (grokdeclarator): For an erroneous template parameter
+       propagate error_mark_node as type.
+
 2015-07-20  Marek Polacek  <polacek@redhat.com>
 
        PR c++/55095
index db8b1aa17cab622d1a85ae59b845df01e57ad227..01b81200596db6161d635b86f31449f1b3f7f1ed 100644 (file)
@@ -9315,7 +9315,12 @@ grokdeclarator (const cp_declarator *declarator,
        warning (OPT_Wreturn_type,
                  "ISO C++ forbids declaration of %qs with no type", name);
 
-      type = integer_type_node;
+      if (type_was_error_mark_node && template_parm_flag)
+       /* FIXME we should be able to propagate the error_mark_node as is
+          for other contexts too.  */
+       type = error_mark_node;
+      else
+       type = integer_type_node;
     }
 
   ctype = NULL_TREE;
index 16d1caf0638469a879172097ed9ad0a1381f6d75..749b04fa3bd61c1a45f2cbbf8a94c1f4e4773c95 100644 (file)
@@ -1,3 +1,7 @@
+2015-07-21  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * g++.dg/template/crash81.C: Update.
+
 2015-07-21  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR ipa/66424.
index 54efba65aa993c43971c26e1ad6642712f7019c4..c0ea37f1c62be1e9868c16206141d7f6072825ff 100644 (file)
@@ -2,6 +2,5 @@
 
 struct A
 {
-  template<T::X> struct X; // { dg-error "'T' has not been declared" "T" }
-  // { dg-bogus "declaration" "" { xfail *-*-* } 5 }
+  template<T::X> struct X; // { dg-error "'T' has not been declared" }
 };