Hi!

Similarly to how we handle erroneous operands to e.g. allocate clause,
this change just removes those clauses instead of accessing TYPE_MAIN_VARIANT
of its type, which doesn't work on error_mark_node.  Also, just for good
measure, bails out if TYPE_NAME is NULL.

Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk.

2021-01-20  Jakub Jelinek  <ja...@redhat.com>

        PR c++/98742
        * semantics.c (finish_omp_clauses) <case OMP_CLAUSE_DETACH>: If
        error_operand_p, remove clause without further checking.  Check
        for non-NULL TYPE_NAME.

        * c-c++-common/gomp/task-detach-2.c: New test.

--- gcc/cp/semantics.c.jj       2021-01-16 22:52:33.608413922 +0100
+++ gcc/cp/semantics.c  2021-01-19 10:53:07.979801786 +0100
@@ -7430,12 +7430,18 @@ finish_omp_clauses (tree clauses, enum c
              remove = true;
              break;
            }
+         else if (error_operand_p (t))
+           {
+             remove = true;
+             break;
+           }
          else
            {
              tree type = TYPE_MAIN_VARIANT (TREE_TYPE (t));
              if (!type_dependent_expression_p (t)
                  && (!INTEGRAL_TYPE_P (type)
                      || TREE_CODE (type) != ENUMERAL_TYPE
+                     || TYPE_NAME (type) == NULL_TREE
                      || (DECL_NAME (TYPE_NAME (type))
                          != get_identifier ("omp_event_handle_t"))))
                {
--- gcc/testsuite/c-c++-common/gomp/task-detach-2.c.jj  2021-01-19 
11:07:29.345948289 +0100
+++ gcc/testsuite/c-c++-common/gomp/task-detach-2.c     2021-01-19 
11:06:57.090317518 +0100
@@ -0,0 +1,9 @@
+/* PR c++/98742 */
+/* { dg-do compile } */
+
+void
+foo ()
+{
+#pragma omp task detach(0)     /* { dg-error "before numeric constant" } */
+  ;
+}


        Jakub

Reply via email to