diff mbox

[03/10] Fix g++.dg/gomp/loop-1.C

Message ID 1449154548-43964-4-git-send-email-dmalcolm@redhat.com
State New
Headers show

Commit Message

David Malcolm Dec. 3, 2015, 2:55 p.m. UTC
The patch kit affects the locations of the errors reported by
g++.dg/gomp/loop-1.C.

I reviewed the new locations, and they seemed sane.

This patch updates the locations of omp_for_cond to use the location of
the cond if available, falling back to the existing behavior of using
input_location otherwise.  This improves the reported locations.

The patch also updates the testcase to reflect the various changes
to the locations.

For reference, here's the updated output from the testcase (with
caret-printing enabled):

g++.dg/gomp/loop-1.C: In function ‘void f1(int)’:
g++.dg/gomp/loop-1.C:21:3: error: initializer expression refers to iteration variable ‘i’
   for (i = i; i < 16; i++) /* { dg-error "initializer expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:24:14: error: initializer expression refers to iteration variable ‘i’
   for (i = 2 * (i & x); i < 16; i++) /* { dg-error "initializer expression refers to iteration variable" } */
            ~~^~~~~~~~~

g++.dg/gomp/loop-1.C:27:3: error: initializer expression refers to iteration variable ‘i’
   for (i = bar (i); i < 16; i++) /* { dg-error "initializer expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:30:3: error: initializer expression refers to iteration variable ‘i’
   for (i = baz (&i); i < 16; i++) /* { dg-error "initializer expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:33:17: error: condition expression refers to iteration variable ‘i’
   for (i = 5; i < 2 * i + 17; i++) /* { dg-error "condition expression refers to iteration variable" } */
               ~~^~~~~~~~~~~~

g++.dg/gomp/loop-1.C:36:26: error: condition expression refers to iteration variable ‘i’
   for (i = 5; 2 * i + 17 > i; i++) /* { dg-error "condition expression refers to iteration variable" } */
               ~~~~~~~~~~~^~~

g++.dg/gomp/loop-1.C:39:23: error: condition expression refers to iteration variable ‘i’
   for (i = 5; bar (i) > i; i++) /* { dg-error "condition expression refers to iteration variable" } */
               ~~~~~~~~^~~

g++.dg/gomp/loop-1.C:42:17: error: condition expression refers to iteration variable ‘i’
   for (i = 5; i <= baz (&i); i++) /* { dg-error "condition expression refers to iteration variable" } */
               ~~^~~~~~~~~~~

g++.dg/gomp/loop-1.C:45:17: error: condition expression refers to iteration variable ‘i’
   for (i = 5; i <= i; i++) /* { dg-error "invalid controlling predicate|condition expression refers to iteration variable" } */
               ~~^~~~

g++.dg/gomp/loop-1.C:48:3: error: increment expression refers to iteration variable ‘i’
   for (i = 5; i < 16; i += i) /* { dg-error "increment expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:51:33: error: increment expression refers to iteration variable ‘i’
   for (i = 5; i < 16; i = i + 2 * i) /* { dg-error "invalid increment expression|increment expression refers to iteration variable" } */
                               ~~^~~

g++.dg/gomp/loop-1.C:54:3: error: increment expression refers to iteration variable ‘i’
   for (i = 5; i < 16; i = i + i) /* { dg-error "increment expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:57:35: error: increment expression refers to iteration variable ‘i’
   for (i = 5; i < 16; i = i + bar (i)) /* { dg-error "increment expression refers to iteration variable" } */
                               ~~~~^~~

g++.dg/gomp/loop-1.C:60:31: error: increment expression refers to iteration variable ‘i’
   for (i = 5; i < 16; i = baz (&i) + i) /* { dg-error "increment expression refers to iteration variable" } */
                           ~~~~^~~~

g++.dg/gomp/loop-1.C:63:32: error: increment expression refers to iteration variable ‘i’
   for (i = 5; i < 16; i += bar (i)) /* { dg-error "increment expression refers to iteration variable" } */
                            ~~~~^~~

g++.dg/gomp/loop-1.C:66:32: error: increment expression refers to iteration variable ‘i’
   for (i = 5; i < 16; i += baz (&i)) /* { dg-error "increment expression refers to iteration variable" } */
                            ~~~~^~~~

g++.dg/gomp/loop-1.C:73:3: error: initializer expression refers to iteration variable ‘j’
   for (i = j; i < 16; i = i + 2) /* { dg-error "initializer expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:77:3: error: initializer expression refers to iteration variable ‘i’
   for (i = 0; i < 16; i = i + 2) /* { dg-error "initializer expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:82:16: error: initializer expression refers to iteration variable ‘i’
     for (j = i + 3; j < 16; j += 2) /* { dg-error "initializer expression refers to iteration variable" } */
              ~~^~~

g++.dg/gomp/loop-1.C:85:3: error: initializer expression refers to iteration variable ‘i’
   for (i = 0; i < 16; i++) /* { dg-error "initializer expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:90:20: error: condition expression refers to iteration variable ‘i’
     for (j = 16; j > (i & x); j--) /* { dg-error "condition expression refers to iteration variable" } */
                  ~~^~~~~~~~~

g++.dg/gomp/loop-1.C:94:19: error: condition expression refers to iteration variable ‘i’
     for (j = 0; j < i; j++) /* { dg-error "condition expression refers to iteration variable" } */
                 ~~^~~

g++.dg/gomp/loop-1.C:98:19: error: condition expression refers to iteration variable ‘i’
     for (j = 0; j < i + 4; j++) /* { dg-error "condition expression refers to iteration variable" } */
                 ~~^~~~~~~

g++.dg/gomp/loop-1.C:101:17: error: condition expression refers to iteration variable ‘j’
   for (i = 0; i < j + 4; i++) /* { dg-error "condition expression refers to iteration variable" } */
               ~~^~~~~~~

g++.dg/gomp/loop-1.C:105:17: error: condition expression refers to iteration variable ‘j’
   for (i = 0; i < j; i++) /* { dg-error "condition expression refers to iteration variable" } */
               ~~^~~

g++.dg/gomp/loop-1.C:109:17: error: condition expression refers to iteration variable ‘j’
   for (i = 0; i < bar (j); i++) /* { dg-error "condition expression refers to iteration variable" } */
               ~~^~~~~~~~~

g++.dg/gomp/loop-1.C:114:19: error: condition expression refers to iteration variable ‘i’
     for (j = 0; j < baz (&i); j++) /* { dg-error "condition expression refers to iteration variable" } */
                 ~~^~~~~~~~~~

g++.dg/gomp/loop-1.C:117:3: error: increment expression refers to iteration variable ‘j’
   for (i = 0; i < 16; i += j) /* { dg-error "increment expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:121:3: error: increment expression refers to iteration variable ‘i’
   for (i = 0; i < 16; i++) /* { dg-error "increment expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:125:3: error: increment expression refers to iteration variable ‘j’
   for (i = 0; i < 16; i = j + i) /* { dg-error "increment expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:129:3: error: increment expression refers to iteration variable ‘i’
   for (i = 0; i < 16; i++) /* { dg-error "increment expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:133:31: error: increment expression refers to iteration variable ‘j’
   for (i = 0; i < 16; i = bar (j) + i) /* { dg-error "increment expression refers to iteration variable" } */
                           ~~~~^~~

g++.dg/gomp/loop-1.C:138:37: error: increment expression refers to iteration variable ‘i’
     for (j = 0; j < 16; j = j + baz (&i)) /* { dg-error "increment expression refers to iteration variable" } */
                                 ~~~~^~~~

g++.dg/gomp/loop-1.C: In function ‘void f2(int)’:
g++.dg/gomp/loop-1.C:158:3: error: initializer expression refers to iteration variable ‘i’
   for (int i = i; i < 16; i++) /* { dg-error "initializer expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:161:18: error: initializer expression refers to iteration variable ‘i’
   for (int i = 2 * (i & x); i < 16; i++) /* { dg-error "initializer expression refers to iteration variable" } */
                ~~^~~~~~~~~

g++.dg/gomp/loop-1.C:164:3: error: initializer expression refers to iteration variable ‘i’
   for (int i = bar (i); i < 16; i++) /* { dg-error "initializer expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:167:3: error: initializer expression refers to iteration variable ‘i’
   for (int i = baz (&i); i < 16; i++) /* { dg-error "initializer expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:170:21: error: condition expression refers to iteration variable ‘i’
   for (int i = 5; i < 2 * i + 17; i++) /* { dg-error "condition expression refers to iteration variable" } */
                   ~~^~~~~~~~~~~~

g++.dg/gomp/loop-1.C:173:30: error: condition expression refers to iteration variable ‘i’
   for (int i = 5; 2 * i + 17 > i; i++) /* { dg-error "condition expression refers to iteration variable" } */
                   ~~~~~~~~~~~^~~

g++.dg/gomp/loop-1.C:176:27: error: condition expression refers to iteration variable ‘i’
   for (int i = 5; bar (i) > i; i++) /* { dg-error "condition expression refers to iteration variable" } */
                   ~~~~~~~~^~~

g++.dg/gomp/loop-1.C:179:21: error: condition expression refers to iteration variable ‘i’
   for (int i = 5; i <= baz (&i); i++) /* { dg-error "condition expression refers to iteration variable" } */
                   ~~^~~~~~~~~~~

g++.dg/gomp/loop-1.C:182:21: error: condition expression refers to iteration variable ‘i’
   for (int i = 5; i <= i; i++) /* { dg-error "invalid controlling predicate|condition expression refers to iteration variable" } */
                   ~~^~~~

g++.dg/gomp/loop-1.C:185:3: error: increment expression refers to iteration variable ‘i’
   for (int i = 5; i < 16; i += i) /* { dg-error "increment expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:188:37: error: increment expression refers to iteration variable ‘i’
   for (int i = 5; i < 16; i = i + 2 * i) /* { dg-error "invalid increment expression|increment expression refers to iteration variable" } */
                                   ~~^~~

g++.dg/gomp/loop-1.C:191:3: error: increment expression refers to iteration variable ‘i’
   for (int i = 5; i < 16; i = i + i) /* { dg-error "increment expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:194:39: error: increment expression refers to iteration variable ‘i’
   for (int i = 5; i < 16; i = i + bar (i)) /* { dg-error "increment expression refers to iteration variable" } */
                                   ~~~~^~~

g++.dg/gomp/loop-1.C:197:35: error: increment expression refers to iteration variable ‘i’
   for (int i = 5; i < 16; i = baz (&i) + i) /* { dg-error "increment expression refers to iteration variable" } */
                               ~~~~^~~~

g++.dg/gomp/loop-1.C:200:36: error: increment expression refers to iteration variable ‘i’
   for (int i = 5; i < 16; i += bar (i)) /* { dg-error "increment expression refers to iteration variable" } */
                                ~~~~^~~

g++.dg/gomp/loop-1.C:203:36: error: increment expression refers to iteration variable ‘i’
   for (int i = 5; i < 16; i += baz (&i)) /* { dg-error "increment expression refers to iteration variable" } */
                                ~~~~^~~~

g++.dg/gomp/loop-1.C:210:3: error: initializer expression refers to iteration variable ‘i’
   for (int i = 0; i < 16; i = i + 2) /* { dg-error "initializer expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:215:20: error: initializer expression refers to iteration variable ‘i’
     for (int j = i + 3; j < 16; j += 2) /* { dg-error "initializer expression refers to iteration variable" } */
                  ~~^~~

g++.dg/gomp/loop-1.C:218:3: error: initializer expression refers to iteration variable ‘i’
   for (int i = 0; i < 16; i++) /* { dg-error "initializer expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:223:24: error: condition expression refers to iteration variable ‘i’
     for (int j = 16; j > (i & x); j--) /* { dg-error "condition expression refers to iteration variable" } */
                      ~~^~~~~~~~~

g++.dg/gomp/loop-1.C:227:23: error: condition expression refers to iteration variable ‘i’
     for (int j = 0; j < i; j++) /* { dg-error "condition expression refers to iteration variable" } */
                     ~~^~~

g++.dg/gomp/loop-1.C:231:23: error: condition expression refers to iteration variable ‘i’
     for (int j = 0; j < i + 4; j++) /* { dg-error "condition expression refers to iteration variable" } */
                     ~~^~~~~~~

g++.dg/gomp/loop-1.C:235:23: error: condition expression refers to iteration variable ‘i’
     for (int j = 0; j < baz (&i); j++) /* { dg-error "condition expression refers to iteration variable" } */
                     ~~^~~~~~~~~~

g++.dg/gomp/loop-1.C:238:3: error: increment expression refers to iteration variable ‘i’
   for (int i = 0; i < 16; i++) /* { dg-error "increment expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:242:3: error: increment expression refers to iteration variable ‘i’
   for (int i = 0; i < 16; i++) /* { dg-error "increment expression refers to iteration variable" } */
   ^~~

g++.dg/gomp/loop-1.C:247:41: error: increment expression refers to iteration variable ‘i’
     for (int j = 0; j < 16; j = j + baz (&i)) /* { dg-error "increment expression refers to iteration variable" } */
                                     ~~~~^~~~

gcc/cp/ChangeLog:
	* parser.c (cp_parser_omp_for_cond): Attempt to use the location
	of "cond" for the binary op.

gcc/testsuite/ChangeLog:
	* g++.dg/gomp/loop-1.C: Update dg-error locations.
---
 gcc/cp/parser.c                    |  3 ++-
 gcc/testsuite/g++.dg/gomp/loop-1.C | 32 ++++++++++++++++----------------
 2 files changed, 18 insertions(+), 17 deletions(-)
diff mbox

Patch

diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index f3d406e..284dadd0 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -32843,7 +32843,8 @@  cp_parser_omp_for_cond (cp_parser *parser, tree decl, enum tree_code code)
 	  || CLASS_TYPE_P (TREE_TYPE (decl))))
     return cond;
 
-  return build_x_binary_op (input_location, TREE_CODE (cond),
+  return build_x_binary_op (EXPR_LOC_OR_LOC (cond, input_location),
+			    TREE_CODE (cond),
 			    TREE_OPERAND (cond, 0), ERROR_MARK,
 			    TREE_OPERAND (cond, 1), ERROR_MARK,
 			    /*overload=*/NULL, tf_warning_or_error);
diff --git a/gcc/testsuite/g++.dg/gomp/loop-1.C b/gcc/testsuite/g++.dg/gomp/loop-1.C
index 46e707f..de08eb3 100644
--- a/gcc/testsuite/g++.dg/gomp/loop-1.C
+++ b/gcc/testsuite/g++.dg/gomp/loop-1.C
@@ -86,16 +86,16 @@  f1 (int x)
     for (j = baz (&i); j < 16; j += 2)
       ;
   #pragma omp for collapse(2)
-  for (i = 0; i < 16; i++) /* { dg-error "condition expression refers to iteration variable" } */
-    for (j = 16; j > (i & x); j--)
+  for (i = 0; i < 16; i++)
+    for (j = 16; j > (i & x); j--) /* { dg-error "condition expression refers to iteration variable" } */
       ;
   #pragma omp for collapse(2)
-  for (i = 0; i < 16; i++) /* { dg-error "condition expression refers to iteration variable" } */
-    for (j = 0; j < i; j++)
+  for (i = 0; i < 16; i++)
+    for (j = 0; j < i; j++) /* { dg-error "condition expression refers to iteration variable" } */
       ;
   #pragma omp for collapse(2)
-  for (i = 0; i < 16; i++) /* { dg-error "condition expression refers to iteration variable" } */
-    for (j = 0; j < i + 4; j++)
+  for (i = 0; i < 16; i++)
+    for (j = 0; j < i + 4; j++) /* { dg-error "condition expression refers to iteration variable" } */
       ;
   #pragma omp for collapse(2)
   for (i = 0; i < j + 4; i++) /* { dg-error "condition expression refers to iteration variable" } */
@@ -110,8 +110,8 @@  f1 (int x)
     for (j = 0; j < 16; j++)
       ;
   #pragma omp for collapse(2)
-  for (i = 0; i < 16; i++) /* { dg-error "condition expression refers to iteration variable" } */
-    for (j = 0; j < baz (&i); j++)
+  for (i = 0; i < 16; i++)
+    for (j = 0; j < baz (&i); j++) /* { dg-error "condition expression refers to iteration variable" } */
       ;
   #pragma omp for collapse(2)
   for (i = 0; i < 16; i += j) /* { dg-error "increment expression refers to iteration variable" } */
@@ -219,20 +219,20 @@  f2 (int x)
     for (int j = baz (&i); j < 16; j += 2)
       ;
   #pragma omp for collapse(2)
-  for (int i = 0; i < 16; i++) /* { dg-error "condition expression refers to iteration variable" } */
-    for (int j = 16; j > (i & x); j--)
+  for (int i = 0; i < 16; i++)
+    for (int j = 16; j > (i & x); j--) /* { dg-error "condition expression refers to iteration variable" } */
       ;
   #pragma omp for collapse(2)
-  for (int i = 0; i < 16; i++) /* { dg-error "condition expression refers to iteration variable" } */
-    for (int j = 0; j < i; j++)
+  for (int i = 0; i < 16; i++)
+    for (int j = 0; j < i; j++) /* { dg-error "condition expression refers to iteration variable" } */
       ;
   #pragma omp for collapse(2)
-  for (int i = 0; i < 16; i++) /* { dg-error "condition expression refers to iteration variable" } */
-    for (int j = 0; j < i + 4; j++)
+  for (int i = 0; i < 16; i++)
+    for (int j = 0; j < i + 4; j++) /* { dg-error "condition expression refers to iteration variable" } */
       ;
   #pragma omp for collapse(2)
-  for (int i = 0; i < 16; i++) /* { dg-error "condition expression refers to iteration variable" } */
-    for (int j = 0; j < baz (&i); j++)
+  for (int i = 0; i < 16; i++)
+    for (int j = 0; j < baz (&i); j++) /* { dg-error "condition expression refers to iteration variable" } */
       ;
   #pragma omp for collapse(2)
   for (int i = 0; i < 16; i++) /* { dg-error "increment expression refers to iteration variable" } */