diff mbox

[gomp4.1] Add negative length check even for pointers

Message ID 20151009093412.GF8714@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Oct. 9, 2015, 9:34 a.m. UTC
On Fri, Oct 09, 2015 at 11:14:33AM +0200, Jakub Jelinek wrote:
> The 4.0 spec required that low-bound in array section must not be negative.
> The 4.5 spec removes that restriction, for arrays it is obvious that it is
> invalid anyway (pointer arithmetics disallows that), and for pointers it is
> meaningful.
> 
> After looking what I've implemented, it seems I've applied common sense
> rather than strictly reading the standard.  And that is the behavior we want
> for OpenMP 4.5, so I've just added new testcases to cover the various cases.

The requirement that length is non-negative stays, for a reason, and
unfortunately it seems it has been only tested for arrays, not for pointers.

Thus I've applied this fix and added further tests.

2015-10-09  Jakub Jelinek  <jakub@redhat.com>

c/
	* c-typeck.c (handle_omp_array_sections_1): Diagnose negative
	length even for pointer based array sections.
cp/
	* semantics.c (handle_omp_array_sections_1): Diagnose negative
	length even for pointer based array sections.
testsuite/
	* c-c++-common/gomp/depend-4.c (main): Add tests for negative
	lengths.
	* c-c++-common/gomp/map-2.c (main): Likewise.



	Jakub
diff mbox

Patch

--- gcc/c/c-typeck.c.jj	2015-10-09 10:59:18.000000000 +0200
+++ gcc/c/c-typeck.c	2015-10-09 11:17:17.577429234 +0200
@@ -11889,6 +11889,15 @@  handle_omp_array_sections_1 (tree c, tre
 		    "for pointer type length expression must be specified");
 	  return error_mark_node;
 	}
+      if (length != NULL_TREE
+	  && TREE_CODE (length) == INTEGER_CST
+	  && tree_int_cst_sgn (length) == -1)
+	{
+	  error_at (OMP_CLAUSE_LOCATION (c),
+		    "negative length in array section in %qs clause",
+		    omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
+	  return error_mark_node;
+	}
       /* If there is a pointer type anywhere but in the very first
 	 array-section-subscript, the array section can't be contiguous.  */
       if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_DEPEND
--- gcc/cp/semantics.c.jj	2015-10-09 10:59:18.000000000 +0200
+++ gcc/cp/semantics.c	2015-10-09 11:19:37.057473471 +0200
@@ -4668,6 +4668,15 @@  handle_omp_array_sections_1 (tree c, tre
 		    "for pointer type length expression must be specified");
 	  return error_mark_node;
 	}
+      if (length != NULL_TREE
+	  && TREE_CODE (length) == INTEGER_CST
+	  && tree_int_cst_sgn (length) == -1)
+	{
+	  error_at (OMP_CLAUSE_LOCATION (c),
+		    "negative length in array section in %qs clause",
+		    omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
+	  return error_mark_node;
+	}
       /* If there is a pointer type anywhere but in the very first
 	 array-section-subscript, the array section can't be contiguous.  */
       if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_DEPEND
--- gcc/testsuite/c-c++-common/gomp/depend-4.c.jj	2015-10-09 11:04:46.000000000 +0200
+++ gcc/testsuite/c-c++-common/gomp/depend-4.c	2015-10-09 11:24:34.316305364 +0200
@@ -23,4 +23,22 @@  foo (int *p, int (*q)[10], int r[10], in
   ;
   #pragma omp task depend (inout: b[1:2][-2:4])	 /* { dg-error "negative low bound in array section in" } */
   ;
+  #pragma omp task depend (inout: p[2:-3])	 /* { dg-error "negative length in array section in" } */
+  ;
+  #pragma omp task depend (inout: q[2:-3][:])	 /* { dg-error "negative length in array section in" } */
+  ;
+  #pragma omp task depend (inout: q[2:3][0:-1])	 /* { dg-error "negative length in array section in" } */
+  ;
+  #pragma omp task depend (inout: r[2:-5])	 /* { dg-error "negative length in array section in" } */
+  ;
+  #pragma omp task depend (inout: s[2:-5][:])	 /* { dg-error "negative length in array section in" } */
+  ;
+  #pragma omp task depend (inout: s[2:5][0:-4])	 /* { dg-error "negative length in array section in" } */
+  ;
+  #pragma omp task depend (inout: a[2:-5])	 /* { dg-error "negative length in array section in" } */
+  ;
+  #pragma omp task depend (inout: b[2:-5][0:10]) /* { dg-error "negative length in array section in" } */
+  ;
+  #pragma omp task depend (inout: b[2:5][0:-4]) /* { dg-error "negative length in array section in" } */
+  ;
 }
--- gcc/testsuite/c-c++-common/gomp/map-2.c.jj	2015-10-09 11:07:19.000000000 +0200
+++ gcc/testsuite/c-c++-common/gomp/map-2.c	2015-10-09 11:25:03.097901794 +0200
@@ -23,4 +23,22 @@  foo (int *p, int (*q)[10], int r[10], in
   ;
   #pragma omp target map (tofrom: b[1:2][-2:10]) /* { dg-error "negative low bound in array section in" } */
   ;
+  #pragma omp target map (tofrom: p[2:-3])	 /* { dg-error "negative length in array section in" } */
+  ;
+  #pragma omp target map (tofrom: q[2:-3][:])	 /* { dg-error "negative length in array section in" } */
+  ;
+  #pragma omp target map (tofrom: q[2:3][0:-1])	 /* { dg-error "negative length in array section in" } */
+  ;
+  #pragma omp target map (tofrom: r[2:-5])	 /* { dg-error "negative length in array section in" } */
+  ;
+  #pragma omp target map (tofrom: s[2:-5][:])	 /* { dg-error "negative length in array section in" } */
+  ;
+  #pragma omp target map (tofrom: s[2:5][0:-4])	 /* { dg-error "negative length in array section in" } */
+  ;
+  #pragma omp target map (tofrom: a[2:-5])	 /* { dg-error "negative length in array section in" } */
+  ;
+  #pragma omp target map (tofrom: b[2:-5][0:10]) /* { dg-error "negative length in array section in" } */
+  ;
+  #pragma omp target map (tofrom: b[2:5][0:-4]) /* { dg-error "negative length in array section in" } */
+  ;
 }