From: Julian Brown Date: Tue, 5 Feb 2019 21:43:21 +0000 (-0800) Subject: Interaction of dynamic/multidimensional arrays with attach/detach. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ba3ba16fa3decf4d826be73eb40ffe3195a4a8fd;p=thirdparty%2Fgcc.git Interaction of dynamic/multidimensional arrays with attach/detach. gcc/ * omp-low.c (scan_sharing_clauses): Disallow dynamic (multidimensional) arrays within structs. gcc/testsuite/ * c-c++-common/goacc/deep-copy-multidim.c: Add test. (cherry picked from openacc-gcc-9-branch commit 857f3bc94d843467db9857b82512a1a5a470b1ef) --- diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp index fbe1afe552ca..3095c0c79f99 100644 --- a/gcc/ChangeLog.omp +++ b/gcc/ChangeLog.omp @@ -1,3 +1,8 @@ +2019-02-05 Julian Brown + + * omp-low.c (scan_sharing_clauses): Disallow dynamic (multidimensional) + arrays within structs. + 2018-10-16 Chung-Lin Tang * tree-pretty-print.c (dump_omp_clauses): Add cases for printing diff --git a/gcc/omp-low.c b/gcc/omp-low.c index d69d9dc9c119..a6bf2200f378 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -1468,7 +1468,15 @@ scan_sharing_clauses (tree clauses, omp_context *ctx) t = TREE_TYPE (t); } - install_var_field (da_decl, by_ref, 3, ctx); + if (DECL_P (decl)) + install_var_field (da_decl, by_ref, 3, ctx); + else + { + error_at (OMP_CLAUSE_LOCATION (c), + "dynamic arrays cannot be used within structs"); + break; + } + tree new_var = install_var_local (da_decl, ctx); bool existed = ctx->dynamic_arrays->put (new_var, da_dimensions); diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp index 33af5c50689f..7e5117da871f 100644 --- a/gcc/testsuite/ChangeLog.omp +++ b/gcc/testsuite/ChangeLog.omp @@ -1,3 +1,7 @@ +2019-02-05 Julian Brown + + * c-c++-common/goacc/deep-copy-multidim.c: Add test. + 2019-01-31 Julian Brown * c-c++-common/goacc/deep-copy-arrayofstruct.c: New test. diff --git a/gcc/testsuite/c-c++-common/goacc/deep-copy-multidim.c b/gcc/testsuite/c-c++-common/goacc/deep-copy-multidim.c new file mode 100644 index 000000000000..1696f0cd7838 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/deep-copy-multidim.c @@ -0,0 +1,32 @@ +/* { dg-do compile } */ + +#include +#include + +struct dc +{ + int a; + int **b; +}; + +int +main () +{ + int n = 100, i, j; + struct dc v = { .a = 3 }; + + v.b = (int **) malloc (sizeof (int *) * n); + for (i = 0; i < n; i++) + v.b[i] = (int *) malloc (sizeof (int) * n); + +#pragma acc parallel loop copy(v.a, v.b[:n][:n]) /* { dg-error "dynamic arrays cannot be used within structs" } */ + for (i = 0; i < n; i++) + for (j = 0; j < n; j++) + v.b[i][j] = v.a + i + j; + + for (i = 0; i < n; i++) + for (j = 0; j < n; j++) + assert (v.b[i][j] == v.a + i + j); + + return 0; +}