]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/58567 (ICE with invalid loop variable in template using openmp)
authorTobias Burnus <burnus@net-b.de>
Fri, 3 Jan 2014 20:24:50 +0000 (21:24 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Fri, 3 Jan 2014 20:24:50 +0000 (21:24 +0100)
2014-01-03  Tobias Burnus  <burnus@net-b.de>

        PR c++/58567
        * pt.c (tsubst_omp_for_iterator): Early return for
        * error_mark_node.

2014-01-03  Tobias Burnus  <burnus@net-b.de>

        PR c++/58567
        * g++.dg/gomp/pr58567.C: New.

From-SVN: r206322

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/gomp/pr58567.C [new file with mode: 0644]

index e89bc50baa8139d40dffd26ec744025118a53537..70211081dbf13a54ac20f0b2122708903c63baec 100644 (file)
@@ -1,3 +1,8 @@
+2014-01-03  Tobias Burnus  <burnus@net-b.de>
+
+       PR c++/58567
+       * pt.c (tsubst_omp_for_iterator): Early return for error_mark_node.
+
 2014-01-03  Paolo Carlini  <paolo.carlini@oracle.com>
 
        Core DR 1442
index 3b8f83a596c0b7a91bfda141d031b2e91e180e57..98d7365a7cca7600ef2154662d2706b76816f092 100644 (file)
@@ -13035,6 +13035,10 @@ tsubst_omp_for_iterator (tree t, int i, tree declv, tree initv,
   init_decl = (init && TREE_CODE (init) == DECL_EXPR);
   init = RECUR (init);
   decl = RECUR (decl);
+
+  if (decl == error_mark_node || init == error_mark_node)
+    return;
+
   if (init_decl)
     {
       gcc_assert (!processing_template_decl);
index b7639618d1923b5e984647892278ddab98178639..ebf40341ef5f4b79219555d42d25f0a745f3136f 100644 (file)
@@ -1,3 +1,8 @@
+2014-01-03  Tobias Burnus  <burnus@net-b.de>
+
+       PR c++/58567
+       * g++.dg/gomp/pr58567.C: New.
+
 2014-01-03  Bingfeng Mei  <bmei@broadcom.com>
 
        PR tree-optimization/59651
diff --git a/gcc/testsuite/g++.dg/gomp/pr58567.C b/gcc/testsuite/g++.dg/gomp/pr58567.C
new file mode 100644 (file)
index 0000000..35a5bb0
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+
+/* PR c++/58567 - was ICEing before */
+
+template<typename T> void foo()
+{
+  #pragma omp parallel for
+  for (typename T::X i = 0; i < 100; ++i)  /* { dg-error "'int' is not a class, struct, or union type|expected iteration declaration or initialization" } */
+    ;
+}
+
+void bar()
+{
+  foo<int>();
+}