Fix column information for omp_clauses in Fortran code

Message ID 0624ce85-2ee7-38eb-d115-509d600d3f20@codesourcery.com
State New
Headers show
Series
  • Fix column information for omp_clauses in Fortran code
Related show

Commit Message

Frederik Harwath Dec. 9, 2019, 3:58 p.m.
Hi,
Tobias has recently fixed a problem with the column information in gfortran locations
("PR 92793 - fix column used for error diagnostic"). Diagnostic messages for OpenMP/OpenACC
clauses do not contain the right column information yet. The reason is that the location
information of the first clause is used for all clauses on a line and hence the columns
are wrong for all but the first clause. The attached patch fixes this problem.

I have tested the patch manually by adapting the validity check for nested OpenACC reductions (see omp-low.c)
to include the location of clauses in warnings instead of the location of the loop to which the clause belongs.
I can add a regression test based on this later on after adapting the code in omp-low.c.

Is it ok to include the patch in trunk?

Best regards,
Frederik


On 04.12.19 14:37, Tobias Burnus wrote:
> As reported internally by Frederik, gfortran currently passes LOCATION_COLUMN == 0 to the middle end. The reason for that is how parsing works – gfortran reads the input line by line.

> 

> For internal error diagnostic (fortran/error.c), the column location was corrected –  but not for locations passed to the middle end. Hence, the diagnostic there wasn't optimal.

> 

> Fixed by introducing a new function; now one only needs to make sure that no new code will re-introduce "lb->location" :-)

> 

> Build and regtested on x86-64-gnu-linux.

> OK for the trunk?

> 

> Tobias

Comments

Tobias Burnus Dec. 9, 2019, 4:02 p.m. | #1
LGTM. Thanks for the patch!

Tobias

On 12/9/19 4:58 PM, Harwath, Frederik wrote:
> Hi,

> Tobias has recently fixed a problem with the column information in gfortran locations

> ("PR 92793 - fix column used for error diagnostic"). Diagnostic messages for OpenMP/OpenACC

> clauses do not contain the right column information yet. The reason is that the location

> information of the first clause is used for all clauses on a line and hence the columns

> are wrong for all but the first clause. The attached patch fixes this problem.

>

> I have tested the patch manually by adapting the validity check for nested OpenACC reductions (see omp-low.c)

> to include the location of clauses in warnings instead of the location of the loop to which the clause belongs.

> I can add a regression test based on this later on after adapting the code in omp-low.c.

>

> Is it ok to include the patch in trunk?

>

> Best regards,

> Frederik

>

>

> On 04.12.19 14:37, Tobias Burnus wrote:

>> As reported internally by Frederik, gfortran currently passes LOCATION_COLUMN == 0 to the middle end. The reason for that is how parsing works – gfortran reads the input line by line.

>>

>> For internal error diagnostic (fortran/error.c), the column location was corrected –  but not for locations passed to the middle end. Hence, the diagnostic there wasn't optimal.

>>

>> Fixed by introducing a new function; now one only needs to make sure that no new code will re-introduce "lb->location" :-)

>>

>> Build and regtested on x86-64-gnu-linux.

>> OK for the trunk?

>>

>> Tobias
Thomas Schwinge Nov. 3, 2020, 8:26 a.m. | #2
Hi!

On 2019-12-09T16:58:44+0100, "Harwath, Frederik" <frederik@codesourcery.com> wrote:
> Tobias has recently fixed a problem with the column information in gfortran locations

> ("PR 92793 - fix column used for error diagnostic").



In context of:

> [use] the location of clauses in warnings instead of the location of the loop to which the clause belongs.


..., Frederik then did:

> Subject: [PATCH] Fix column information for omp_clauses in Fortran code

>

> The location of all OpenMP/OpenACC clauses on any given line in Fortran code

> always points to the first clause on that line. Hence, the column information

> is wrong for all clauses but the first one.

>

> Use the correct location for each clause instead.


Actually, that was specific for 'reduction' clauses:

> --- a/gcc/fortran/trans-openmp.c

> +++ b/gcc/fortran/trans-openmp.c

> @@ -1982,7 +1982,7 @@ gfc_trans_omp_reduction_list (gfc_omp_namelist *namelist, tree list,

>       tree t = gfc_trans_omp_variable (namelist->sym, false);

>       if (t != error_mark_node)

>         {

> -         tree node = build_omp_clause (gfc_get_location (&where),

> +         tree node = build_omp_clause (gfc_get_location (&namelist->where),

>                                         OMP_CLAUSE_REDUCTION);


Similar changes are desirable for other directives/clauses, too.

I've just pushed "[Fortran] More precise location information for OpenACC
'gang', 'worker', 'vector' clauses with argument [PR92793]" to master
branch in commit 41f7f6178e2d35288273656dc55dae8fcf3edeb5, and backported
to releases/gcc-10 in commit 5ceaf8a54abb3f9bd3c268fe420999a7962b2a15,
see attached.


Grüße
 Thomas


-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander Walter
From 41f7f6178e2d35288273656dc55dae8fcf3edeb5 Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <thomas@codesourcery.com>

Date: Tue, 27 Oct 2020 17:14:10 +0100
Subject: [PATCH] [Fortran] More precise location information for OpenACC
 'gang', 'worker', 'vector' clauses with argument [PR92793]

	gcc/fortran/
	PR fortran/92793
	* trans-openmp.c (gfc_trans_omp_clauses): More precise location
	information for OpenACC 'gang', 'worker', 'vector' clauses with
	argument.
	gcc/testsuite/
	PR fortran/92793
	* gfortran.dg/goacc/pr92793-1.f90: Adjust.
---
 gcc/fortran/trans-openmp.c                    | 40 ++++++++++++-------
 gcc/testsuite/gfortran.dg/goacc/pr92793-1.f90 | 29 +++++---------
 2 files changed, 36 insertions(+), 33 deletions(-)

diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c
index d02949ecbe4a..1d652a09f9d2 100644
--- a/gcc/fortran/trans-openmp.c
+++ b/gcc/fortran/trans-openmp.c
@@ -3771,34 +3771,38 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
     }
   if (clauses->vector)
     {
+      c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_VECTOR);
+      omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+
       if (clauses->vector_expr)
 	{
 	  tree vector_var
 	    = gfc_convert_expr_to_tree (block, clauses->vector_expr);
-	  c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_VECTOR);
 	  OMP_CLAUSE_VECTOR_EXPR (c) = vector_var;
-	  omp_clauses = gfc_trans_add_clause (c, omp_clauses);
-	}
-      else
-	{
-	  c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_VECTOR);
-	  omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+
+	  /* TODO: We're not capturing location information for individual
+	     clauses.  However, if we have an expression attached to the
+	     clause, that one provides better location information.  */
+	  OMP_CLAUSE_LOCATION (c)
+	    = gfc_get_location (&clauses->vector_expr->where);
 	}
     }
   if (clauses->worker)
     {
+      c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_WORKER);
+      omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+
       if (clauses->worker_expr)
 	{
 	  tree worker_var
 	    = gfc_convert_expr_to_tree (block, clauses->worker_expr);
-	  c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_WORKER);
 	  OMP_CLAUSE_WORKER_EXPR (c) = worker_var;
-	  omp_clauses = gfc_trans_add_clause (c, omp_clauses);
-	}
-      else
-	{
-	  c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_WORKER);
-	  omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+
+	  /* TODO: We're not capturing location information for individual
+	     clauses.  However, if we have an expression attached to the
+	     clause, that one provides better location information.  */
+	  OMP_CLAUSE_LOCATION (c)
+	    = gfc_get_location (&clauses->worker_expr->where);
 	}
     }
   if (clauses->gang)
@@ -3806,11 +3810,19 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
       tree arg;
       c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_GANG);
       omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+
       if (clauses->gang_num_expr)
 	{
 	  arg = gfc_convert_expr_to_tree (block, clauses->gang_num_expr);
 	  OMP_CLAUSE_GANG_EXPR (c) = arg;
+
+	  /* TODO: We're not capturing location information for individual
+	     clauses.  However, if we have an expression attached to the
+	     clause, that one provides better location information.  */
+	  OMP_CLAUSE_LOCATION (c)
+	    = gfc_get_location (&clauses->gang_num_expr->where);
 	}
+
       if (clauses->gang_static)
 	{
 	  arg = clauses->gang_static_expr
diff --git a/gcc/testsuite/gfortran.dg/goacc/pr92793-1.f90 b/gcc/testsuite/gfortran.dg/goacc/pr92793-1.f90
index 23d6886580a1..4651ccffaa1f 100644
--- a/gcc/testsuite/gfortran.dg/goacc/pr92793-1.f90
+++ b/gcc/testsuite/gfortran.dg/goacc/pr92793-1.f90
@@ -52,13 +52,10 @@ subroutine gwv_sl ()
   integer :: i
 
   !$acc serial loop &
-  !$acc &       gang(num:5) & ! { dg-error "argument not permitted on 'gang' clause" "TODO" { xfail *-*-* } }
-  !$acc & & ! { dg-bogus "14: argument not permitted on 'gang' clause" "TODO" { xfail *-*-* } .+6 }
-  !$acc &    worker(num:5) & ! { dg-error "argument not permitted on 'worker' clause" "TODO" { xfail *-*-* } }
-  !$acc & & ! { dg-bogus "14: argument not permitted on 'worker' clause" "TODO" { xfail *-*-* } .+4 }
-  !$acc &     vector(length:5) & ! { dg-error "argument not permitted on 'vector' clause" "TODO" { xfail *-*-* } }
-  !$acc & ! { dg-bogus "14: argument not permitted on 'vector' clause" "TODO" { xfail *-*-* } .+2 }
-  ! { dg-message "99: enclosing parent compute construct" "" { target *-*-* } .-1 }
+  !$acc &       gang(num:5) & ! { dg-error "25: argument not permitted on 'gang' clause" }
+  !$acc &    worker(num:5) & ! { dg-error "24: argument not permitted on 'worker' clause" }
+  !$acc &     vector(length:5) ! { dg-error "28: argument not permitted on 'vector' clause" }
+  ! { dg-message "93: enclosing parent compute construct" "" { target *-*-* } .-1 }
   do i = 0, 10
   end do
   !$acc end serial loop
@@ -70,12 +67,9 @@ subroutine gwv_s_l ()
 
   !$acc serial ! { dg-message "72: enclosing parent compute construct" }
   !$acc loop &
-  !$acc &         gang(num:5) & ! { dg-error "argument not permitted on 'gang' clause" "TODO" { xfail *-*-* } }
-  !$acc & & ! { dg-bogus "14: argument not permitted on 'gang' clause" "TODO" { xfail *-*-* } .+5 }
-  !$acc &   worker(num:5) & ! { dg-error "argument not permitted on 'worker' clause" "TODO" { xfail *-*-* } }
-  !$acc & & ! { dg-bogus "14: argument not permitted on 'worker' clause" "TODO" { xfail *-*-* } .+3 }
-  !$acc &      vector(length:5) & ! { dg-error "argument not permitted on 'vector' clause" "TODO" { xfail *-*-* } }
-  !$acc & ! { dg-bogus "14: argument not permitted on 'vector' clause" "TODO" { xfail *-*-* } .+1 }
+  !$acc &         gang(num:5) & ! { dg-error "27: argument not permitted on 'gang' clause" }
+  !$acc &   worker(num:5) & ! { dg-error "23: argument not permitted on 'worker' clause" }
+  !$acc &      vector(length:5) ! { dg-error "29: argument not permitted on 'vector' clause" }
   do i = 0, 10
   end do
   !$acc end serial
@@ -88,12 +82,9 @@ subroutine gwv_r () ! { dg-message "16: enclosing routine" }
   !$acc routine(gwv_r)
 
   !$acc loop &
-  !$acc &     gang(num:5) & ! { dg-error "argument not permitted on 'gang' clause" "TODO" { xfail *-*-* } }
-  !$acc & & ! { dg-bogus "14: argument not permitted on 'gang' clause" "TODO" { xfail *-*-* } .+5 }
-  !$acc &      worker(num:5) & ! { dg-error "argument not permitted on 'worker' clause" "TODO" { xfail *-*-* } }
-  !$acc & & ! { dg-bogus "14: argument not permitted on 'worker' clause" "TODO" { xfail *-*-* } .+3 }
-  !$acc &    vector(length:5) & ! { dg-error "argument not permitted on 'vector' clause" "TODO" { xfail *-*-* } }
-  !$acc & ! { dg-bogus "14: argument not permitted on 'vector' clause" "TODO" { xfail *-*-* } .+1 }
+  !$acc &     gang(num:5) & ! { dg-error "23: argument not permitted on 'gang' clause" }
+  !$acc &      worker(num:5) & ! { dg-error "26: argument not permitted on 'worker' clause" }
+  !$acc &    vector(length:5) ! { dg-error "27: argument not permitted on 'vector' clause" }
   do i = 0, 10
   end do
 end subroutine gwv_r
-- 
2.17.1
From 5ceaf8a54abb3f9bd3c268fe420999a7962b2a15 Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <thomas@codesourcery.com>

Date: Tue, 27 Oct 2020 17:14:10 +0100
Subject: [PATCH] [Fortran] More precise location information for OpenACC
 'gang', 'worker', 'vector' clauses with argument [PR92793]

	gcc/fortran/
	PR fortran/92793
	* trans-openmp.c (gfc_trans_omp_clauses): More precise location
	information for OpenACC 'gang', 'worker', 'vector' clauses with
	argument.
	gcc/testsuite/
	PR fortran/92793
	* gfortran.dg/goacc/pr92793-1.f90: Adjust.

(cherry picked from commit 41f7f6178e2d35288273656dc55dae8fcf3edeb5)
---
 gcc/fortran/trans-openmp.c                    | 40 ++++++++++++-------
 gcc/testsuite/gfortran.dg/goacc/pr92793-1.f90 | 29 +++++---------
 2 files changed, 36 insertions(+), 33 deletions(-)

diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c
index c01c4d792195..b3d31c560435 100644
--- a/gcc/fortran/trans-openmp.c
+++ b/gcc/fortran/trans-openmp.c
@@ -3523,34 +3523,38 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
     }
   if (clauses->vector)
     {
+      c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_VECTOR);
+      omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+
       if (clauses->vector_expr)
 	{
 	  tree vector_var
 	    = gfc_convert_expr_to_tree (block, clauses->vector_expr);
-	  c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_VECTOR);
 	  OMP_CLAUSE_VECTOR_EXPR (c) = vector_var;
-	  omp_clauses = gfc_trans_add_clause (c, omp_clauses);
-	}
-      else
-	{
-	  c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_VECTOR);
-	  omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+
+	  /* TODO: We're not capturing location information for individual
+	     clauses.  However, if we have an expression attached to the
+	     clause, that one provides better location information.  */
+	  OMP_CLAUSE_LOCATION (c)
+	    = gfc_get_location (&clauses->vector_expr->where);
 	}
     }
   if (clauses->worker)
     {
+      c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_WORKER);
+      omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+
       if (clauses->worker_expr)
 	{
 	  tree worker_var
 	    = gfc_convert_expr_to_tree (block, clauses->worker_expr);
-	  c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_WORKER);
 	  OMP_CLAUSE_WORKER_EXPR (c) = worker_var;
-	  omp_clauses = gfc_trans_add_clause (c, omp_clauses);
-	}
-      else
-	{
-	  c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_WORKER);
-	  omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+
+	  /* TODO: We're not capturing location information for individual
+	     clauses.  However, if we have an expression attached to the
+	     clause, that one provides better location information.  */
+	  OMP_CLAUSE_LOCATION (c)
+	    = gfc_get_location (&clauses->worker_expr->where);
 	}
     }
   if (clauses->gang)
@@ -3558,11 +3562,19 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
       tree arg;
       c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_GANG);
       omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+
       if (clauses->gang_num_expr)
 	{
 	  arg = gfc_convert_expr_to_tree (block, clauses->gang_num_expr);
 	  OMP_CLAUSE_GANG_EXPR (c) = arg;
+
+	  /* TODO: We're not capturing location information for individual
+	     clauses.  However, if we have an expression attached to the
+	     clause, that one provides better location information.  */
+	  OMP_CLAUSE_LOCATION (c)
+	    = gfc_get_location (&clauses->gang_num_expr->where);
 	}
+
       if (clauses->gang_static)
 	{
 	  arg = clauses->gang_static_expr
diff --git a/gcc/testsuite/gfortran.dg/goacc/pr92793-1.f90 b/gcc/testsuite/gfortran.dg/goacc/pr92793-1.f90
index 23d6886580a1..4651ccffaa1f 100644
--- a/gcc/testsuite/gfortran.dg/goacc/pr92793-1.f90
+++ b/gcc/testsuite/gfortran.dg/goacc/pr92793-1.f90
@@ -52,13 +52,10 @@ subroutine gwv_sl ()
   integer :: i
 
   !$acc serial loop &
-  !$acc &       gang(num:5) & ! { dg-error "argument not permitted on 'gang' clause" "TODO" { xfail *-*-* } }
-  !$acc & & ! { dg-bogus "14: argument not permitted on 'gang' clause" "TODO" { xfail *-*-* } .+6 }
-  !$acc &    worker(num:5) & ! { dg-error "argument not permitted on 'worker' clause" "TODO" { xfail *-*-* } }
-  !$acc & & ! { dg-bogus "14: argument not permitted on 'worker' clause" "TODO" { xfail *-*-* } .+4 }
-  !$acc &     vector(length:5) & ! { dg-error "argument not permitted on 'vector' clause" "TODO" { xfail *-*-* } }
-  !$acc & ! { dg-bogus "14: argument not permitted on 'vector' clause" "TODO" { xfail *-*-* } .+2 }
-  ! { dg-message "99: enclosing parent compute construct" "" { target *-*-* } .-1 }
+  !$acc &       gang(num:5) & ! { dg-error "25: argument not permitted on 'gang' clause" }
+  !$acc &    worker(num:5) & ! { dg-error "24: argument not permitted on 'worker' clause" }
+  !$acc &     vector(length:5) ! { dg-error "28: argument not permitted on 'vector' clause" }
+  ! { dg-message "93: enclosing parent compute construct" "" { target *-*-* } .-1 }
   do i = 0, 10
   end do
   !$acc end serial loop
@@ -70,12 +67,9 @@ subroutine gwv_s_l ()
 
   !$acc serial ! { dg-message "72: enclosing parent compute construct" }
   !$acc loop &
-  !$acc &         gang(num:5) & ! { dg-error "argument not permitted on 'gang' clause" "TODO" { xfail *-*-* } }
-  !$acc & & ! { dg-bogus "14: argument not permitted on 'gang' clause" "TODO" { xfail *-*-* } .+5 }
-  !$acc &   worker(num:5) & ! { dg-error "argument not permitted on 'worker' clause" "TODO" { xfail *-*-* } }
-  !$acc & & ! { dg-bogus "14: argument not permitted on 'worker' clause" "TODO" { xfail *-*-* } .+3 }
-  !$acc &      vector(length:5) & ! { dg-error "argument not permitted on 'vector' clause" "TODO" { xfail *-*-* } }
-  !$acc & ! { dg-bogus "14: argument not permitted on 'vector' clause" "TODO" { xfail *-*-* } .+1 }
+  !$acc &         gang(num:5) & ! { dg-error "27: argument not permitted on 'gang' clause" }
+  !$acc &   worker(num:5) & ! { dg-error "23: argument not permitted on 'worker' clause" }
+  !$acc &      vector(length:5) ! { dg-error "29: argument not permitted on 'vector' clause" }
   do i = 0, 10
   end do
   !$acc end serial
@@ -88,12 +82,9 @@ subroutine gwv_r () ! { dg-message "16: enclosing routine" }
   !$acc routine(gwv_r)
 
   !$acc loop &
-  !$acc &     gang(num:5) & ! { dg-error "argument not permitted on 'gang' clause" "TODO" { xfail *-*-* } }
-  !$acc & & ! { dg-bogus "14: argument not permitted on 'gang' clause" "TODO" { xfail *-*-* } .+5 }
-  !$acc &      worker(num:5) & ! { dg-error "argument not permitted on 'worker' clause" "TODO" { xfail *-*-* } }
-  !$acc & & ! { dg-bogus "14: argument not permitted on 'worker' clause" "TODO" { xfail *-*-* } .+3 }
-  !$acc &    vector(length:5) & ! { dg-error "argument not permitted on 'vector' clause" "TODO" { xfail *-*-* } }
-  !$acc & ! { dg-bogus "14: argument not permitted on 'vector' clause" "TODO" { xfail *-*-* } .+1 }
+  !$acc &     gang(num:5) & ! { dg-error "23: argument not permitted on 'gang' clause" }
+  !$acc &      worker(num:5) & ! { dg-error "26: argument not permitted on 'worker' clause" }
+  !$acc &    vector(length:5) ! { dg-error "27: argument not permitted on 'vector' clause" }
   do i = 0, 10
   end do
 end subroutine gwv_r
-- 
2.17.1

Patch

From af3a63b64f38d522b0091a123a919d1f20f5a8b1 Mon Sep 17 00:00:00 2001
From: Frederik Harwath <frederik@codesourcery.com>
Date: Mon, 9 Dec 2019 15:07:53 +0100
Subject: [PATCH] Fix column information for omp_clauses in Fortran code

The location of all OpenMP/OpenACC clauses on any given line in Fortran code
always points to the first clause on that line. Hence, the column information
is wrong for all clauses but the first one.

Use the correct location for each clause instead.

2019-12-09  Frederik Harwath  <frederik@codesourcery.com>

/gcc/fortran/
	* trans-openmp (gfc_trans_omp_reduction_list): Pass correct location for each
	clause to build_omp_clause.
---
 gcc/fortran/trans-openmp.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c
index d07ff86fc0b..356fd04e6c3 100644
--- a/gcc/fortran/trans-openmp.c
+++ b/gcc/fortran/trans-openmp.c
@@ -1982,7 +1982,7 @@  gfc_trans_omp_reduction_list (gfc_omp_namelist *namelist, tree list,
 	tree t = gfc_trans_omp_variable (namelist->sym, false);
 	if (t != error_mark_node)
 	  {
-	    tree node = build_omp_clause (gfc_get_location (&where),
+	    tree node = build_omp_clause (gfc_get_location (&namelist->where),
 					  OMP_CLAUSE_REDUCTION);
 	    OMP_CLAUSE_DECL (node) = t;
 	    if (mark_addressable)
-- 
2.17.1