openmp: Check for PARM_DECL before using C_ARRAY_PARAMETER or DECL_ARRAY_PARAMETER_P...
authorJakub Jelinek <jakub@redhat.com>
Tue, 1 Sep 2020 07:17:58 +0000 (09:17 +0200)
committerJakub Jelinek <jakub@redhat.com>
Tue, 1 Sep 2020 07:17:58 +0000 (09:17 +0200)
The C++ macro performs a PARM_DECL_CHECK, so will ICE if not tested on a PARM_DECL,
C_ARRAY_PARAMETER doesn't, but probably should, otherwise it is testing e.g.
C_DECL_VARIABLE_SIZE on VAR_DECLs.

2020-09-01  Jakub Jelinek  <jakub@redhat.com>

PR c++/96867
* c-typeck.c (handle_omp_array_sections_1): Test C_ARRAY_PARAMETER
only on PARM_DECLs.

* semantics.c (handle_omp_array_sections_1): Test
DECL_ARRAY_PARAMETER_P only on PARM_DECLs.

* c-c++-common/gomp/pr96867.c: New test.

gcc/c/c-typeck.c
gcc/cp/semantics.c
gcc/testsuite/c-c++-common/gomp/pr96867.c [new file with mode: 0644]

index e158d236501df9a0f6360ec64d1179f3676c91f5..bb27099bfe1ccf51ec8b03d73a008e6b22e70809 100644 (file)
@@ -13298,7 +13298,7 @@ handle_omp_array_sections_1 (tree c, tree t, vec<tree> &types,
     {
       if (length == NULL_TREE)
        {
-         if (C_ARRAY_PARAMETER (ret))
+         if (TREE_CODE (ret) == PARM_DECL && C_ARRAY_PARAMETER (ret))
            error_at (OMP_CLAUSE_LOCATION (c),
                      "for array function parameter length expression "
                      "must be specified");
index 7f861fde7d6a45b815a260c1f55023a83b06f992..107d39ddb0ecc9323ec516123d83f840702027a7 100644 (file)
@@ -5083,7 +5083,7 @@ handle_omp_array_sections_1 (tree c, tree t, vec<tree> &types,
     {
       if (length == NULL_TREE)
        {
-         if (DECL_ARRAY_PARAMETER_P (ret))
+         if (TREE_CODE (ret) == PARM_DECL && DECL_ARRAY_PARAMETER_P (ret))
            error_at (OMP_CLAUSE_LOCATION (c),
                      "for array function parameter length expression "
                      "must be specified");
diff --git a/gcc/testsuite/c-c++-common/gomp/pr96867.c b/gcc/testsuite/c-c++-common/gomp/pr96867.c
new file mode 100644 (file)
index 0000000..f55d9cf
--- /dev/null
@@ -0,0 +1,9 @@
+/* PR c++/96867 */
+
+int *v;
+
+void
+foo (int x)
+{
+  #pragma omp target update to (x, v[:])       /* { dg-error "for pointer type length expression must be specified" } */
+}