aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2014-09-25 08:47:43 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2014-09-25 08:47:43 +0200
commitd90c0a5980ceedb40f9f7536c32f17856997435a (patch)
tree11854d3aa5d168c198966468dbfb18b3c2fd2f09 /gcc
parenta16ee37946f575365bb39d238863422465902054 (diff)
downloadgcc-d90c0a5980ceedb40f9f7536c32f17856997435a.zip
gcc-d90c0a5980ceedb40f9f7536c32f17856997435a.tar.gz
gcc-d90c0a5980ceedb40f9f7536c32f17856997435a.tar.bz2
re PR c++/63249 ([OpenMP] Spurious »set but not used« warnings when actually used in OpenMP target's array section's lower-bound and length)
PR c++/63249 * semantics.c (handle_omp_array_sections_1): Call mark_rvalue_use on low_bound and length. * g++.dg/gomp/pr63249.C: New test. * c-c++-common/gomp/pr63249.c: New test. 2014-09-25 Thomas Schwinge <thomas@codesourcery.com> PR c++/63249 * c-parser.c (c_parser_omp_variable_list): Call mark_exp_read on low_bound and length. From-SVN: r215580
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c/ChangeLog6
-rw-r--r--gcc/c/c-parser.c10
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/semantics.c4
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/c-c++-common/gomp/pr63249.c16
-rw-r--r--gcc/testsuite/g++.dg/gomp/pr63249.C35
7 files changed, 81 insertions, 2 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 67099c1..cb69773 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,9 @@
+2014-09-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/63249
+ * c-parser.c (c_parser_omp_variable_list): Call mark_exp_read
+ on low_bound and length.
+
2014-09-24 Marek Polacek <polacek@redhat.com>
PR c/61405
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
index 71f40b7..0d159fd 100644
--- a/gcc/c/c-parser.c
+++ b/gcc/c/c-parser.c
@@ -9882,7 +9882,10 @@ c_parser_omp_variable_list (c_parser *parser,
c_parser_consume_token (parser);
if (!c_parser_next_token_is (parser, CPP_COLON))
- low_bound = c_parser_expression (parser).value;
+ {
+ low_bound = c_parser_expression (parser).value;
+ mark_exp_read (low_bound);
+ }
if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
length = integer_one_node;
else
@@ -9895,7 +9898,10 @@ c_parser_omp_variable_list (c_parser *parser,
break;
}
if (!c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
- length = c_parser_expression (parser).value;
+ {
+ length = c_parser_expression (parser).value;
+ mark_exp_read (length);
+ }
}
/* Look for the closing `]'. */
if (!c_parser_require (parser, CPP_CLOSE_SQUARE,
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ee5169f..2457ccd 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2014-09-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/63249
+ * semantics.c (handle_omp_array_sections_1): Call mark_rvalue_use
+ on low_bound and length.
+
2014-09-24 Aldy Hernandez <aldyh@redhat.com>
* class.c, decl.c, optimize.c: Rename all instances of
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 2728f58..debd785 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -4291,6 +4291,10 @@ handle_omp_array_sections_1 (tree c, tree t, vec<tree> &types,
length);
return error_mark_node;
}
+ if (low_bound)
+ low_bound = mark_rvalue_use (low_bound);
+ if (length)
+ length = mark_rvalue_use (length);
if (low_bound
&& TREE_CODE (low_bound) == INTEGER_CST
&& TYPE_PRECISION (TREE_TYPE (low_bound))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ef8faa3..6a201b6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2014-09-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/63249
+ * g++.dg/gomp/pr63249.C: New test.
+ * c-c++-common/gomp/pr63249.c: New test.
+
2014-09-25 Tobias Burnus <burnus@net-b.de>
* gfortran.dg/coarray/collectives_3.f90: New.
diff --git a/gcc/testsuite/c-c++-common/gomp/pr63249.c b/gcc/testsuite/c-c++-common/gomp/pr63249.c
new file mode 100644
index 0000000..878788a
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/gomp/pr63249.c
@@ -0,0 +1,16 @@
+/* PR c++/63249 */
+/* { dg-do compile } */
+/* { dg-options "-Wall -W -fopenmp" } */
+
+int
+foo (int *v, int A, int B) /* { dg-bogus "set but not used" } */
+{
+ int r = 0;
+ int a = 2; /* { dg-bogus "set but not used" } */
+ int b = 4; /* { dg-bogus "set but not used" } */
+#pragma omp target map(to: v[a:b])
+ r |= v[3];
+#pragma omp target map(to: v[A:B])
+ r |= v[3];
+ return r;
+}
diff --git a/gcc/testsuite/g++.dg/gomp/pr63249.C b/gcc/testsuite/g++.dg/gomp/pr63249.C
new file mode 100644
index 0000000..80f763a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/pr63249.C
@@ -0,0 +1,35 @@
+// PR c++/63249
+// { dg-do compile }
+// { dg-options "-Wall -W -fopenmp" }
+
+template <int N>
+int
+foo (int *v, int A, int B) // { dg-bogus "set but not used" }
+{
+ int r = 0;
+ int a = 2; // { dg-bogus "set but not used" }
+ int b = 4; // { dg-bogus "set but not used" }
+#pragma omp target map(to: v[a:b])
+ r |= v[3];
+#pragma omp target map(to: v[A:B])
+ r |= v[3];
+ return r;
+}
+
+template <typename T>
+int
+bar (T *v, T A, T B) // { dg-bogus "set but not used" }
+{
+ T r = 0, a = 2, b = 4; // { dg-bogus "set but not used" }
+#pragma omp target map(to: v[a:b])
+ r |= v[3];
+#pragma omp target map(to: v[A:B])
+ r |= v[3];
+ return r;
+}
+
+int
+baz (int *v, int A, int B)
+{
+ return foo<0> (v, A, B) + bar (v, A, B);
+}