Hi!

If the gfc_match_omp_variable_list calls fail, they don't modify head,
so *head means referencing NULL.  In that case we don't really need to
free anything, nothing has been allocated, just need to emit a syntax error.

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

2018-01-31  Jakub Jelinek  <ja...@redhat.com>

        PR fortran/84116
        * openmp.c (gfc_match_omp_clauses): If all the linear
        gfc_match_omp_variable_list calls failed, don't gfc_free_omp_namelist
        nor set *head = NULL.  Formatting fixes.

        * gfortran.dg/gomp/pr84116.f90: New test.

--- gcc/fortran/openmp.c.jj     2018-01-03 10:20:22.629538350 +0100
+++ gcc/fortran/openmp.c        2018-01-31 18:10:35.455624605 +0100
@@ -1318,23 +1318,21 @@ gfc_match_omp_clauses (gfc_omp_clauses *
              else if (gfc_match_omp_variable_list (" val (",
                                                    &c->lists[OMP_LIST_LINEAR],
                                                    false, NULL, &head)
-                 == MATCH_YES)
+                      == MATCH_YES)
                linear_op = OMP_LINEAR_VAL;
              else if (gfc_match_omp_variable_list (" uval (",
                                                    &c->lists[OMP_LIST_LINEAR],
                                                    false, NULL, &head)
-                 == MATCH_YES)
+                      == MATCH_YES)
                linear_op = OMP_LINEAR_UVAL;
              else if (gfc_match_omp_variable_list ("",
                                                    &c->lists[OMP_LIST_LINEAR],
                                                    false, &end_colon, &head)
-                 == MATCH_YES)
+                      == MATCH_YES)
                linear_op = OMP_LINEAR_DEFAULT;
              else
                {
-                 gfc_free_omp_namelist (*head);
                  gfc_current_locus = old_loc;
-                 *head = NULL;
                  break;
                }
              if (linear_op != OMP_LINEAR_DEFAULT)
--- gcc/testsuite/gfortran.dg/gomp/pr84116.f90.jj       2018-01-31 
18:12:21.345637463 +0100
+++ gcc/testsuite/gfortran.dg/gomp/pr84116.f90  2018-01-31 18:11:59.401634803 
+0100
@@ -0,0 +1,12 @@
+! PR fortran/84116
+! { dg-do compile }
+
+program pr84116
+   integer :: i, j
+   !$omp simd linear ((i))     ! { dg-error "Syntax error" }
+   do i = 1, 2
+   end do
+   !$omp simd linear ()                ! { dg-error "Syntax error" }
+   do j = 1, 2
+   end do
+end

        Jakub

Reply via email to