Hi!

Calling cp_fully_fold (which has been introduced with C++ late folding)
before actually diagnosing invalid arguments of the comparison is
problematic, because as the testcase shows the folding can then ICE before
the invalid code is reported.

Removing the cp_fully_fold call doesn't regress anything, so I've removed
it after doing bootstrap/regtest on x86_64-linux and i686-linux and committed
to trunk.

2019-11-19  Jakub Jelinek  <ja...@redhat.com>

        PR c++/92504
        * semantics.c (handle_omp_for_class_iterator): Don't call
        cp_fully_fold on cond.

        * g++.dg/gomp/pr92504.C: New test.

--- gcc/cp/semantics.c.jj       2019-11-11 21:04:24.837962966 +0100
+++ gcc/cp/semantics.c  2019-11-18 19:19:36.921680774 +0100
@@ -8434,7 +8434,6 @@ handle_omp_for_class_iterator (int i, lo
   if (init && EXPR_HAS_LOCATION (init))
     elocus = EXPR_LOCATION (init);
 
-  cond = cp_fully_fold (cond);
   switch (TREE_CODE (cond))
     {
     case GT_EXPR:
--- gcc/testsuite/g++.dg/gomp/pr92504.C.jj      2019-11-18 19:18:45.211452647 
+0100
+++ gcc/testsuite/g++.dg/gomp/pr92504.C 2019-11-18 19:19:19.660938426 +0100
@@ -0,0 +1,29 @@
+// PR c++/92504
+// { dg-do compile { target c++11 } }
+// { dg-additional-options "-O2" }
+
+namespace std {
+  typedef __SIZE_TYPE__ size_t;
+  typedef __PTRDIFF_TYPE__ ptrdiff_t;
+}
+
+struct A {
+  A ();
+  A (const A &);
+  A & operator++ ();
+  bool operator != (const A &) const;
+  std::ptrdiff_t operator - (const A &);
+  A & operator += (std::size_t);
+  int a;
+  A & begin ();
+  A & end ();                          // { dg-message "declared here" }
+};
+
+void
+bar ()
+{
+  A a;
+  #pragma omp for
+  for (auto b = a; b != a.end; ++b)    // { dg-error "invalid use of 
non-static member function" }
+    ;
+}

        Jakub

Reply via email to