https://github.com/amitamd7 updated https://github.com/llvm/llvm-project/pull/181780
>From 4430ae24981bc22b779acb5a484c0e5a81562bb7 Mon Sep 17 00:00:00 2001 From: amtiwari <[email protected]> Date: Tue, 17 Feb 2026 01:41:31 -0500 Subject: [PATCH 1/2] parsing_checks --- ...d_ptr_variable_count_and_stride_messages.c | 62 ++++++++++++++ ...date_strided_ptr_variable_count_messages.c | 57 +++++++++++++ ...ate_strided_ptr_variable_stride_messages.c | 64 ++++++++++++++ ..._update_strided_struct_ptr_messages_from.c | 40 +++++++++ ...et_update_strided_struct_ptr_messages_to.c | 40 +++++++++ ...trided_struct_ptr_multiple_messages_from.c | 47 ++++++++++ ..._strided_struct_ptr_multiple_messages_to.c | 47 ++++++++++ ...strided_struct_ptr_partial_messages_from.c | 32 +++++++ ...e_strided_struct_ptr_partial_messages_to.c | 32 +++++++ ...truct_variable_count_and_stride_messages.c | 72 ++++++++++++++++ ...pdate_variable_count_and_stride_messages.c | 85 +++++++++++++++++++ 11 files changed, 578 insertions(+) create mode 100644 clang/test/OpenMP/target_update_strided_ptr_variable_count_and_stride_messages.c create mode 100644 clang/test/OpenMP/target_update_strided_ptr_variable_count_messages.c create mode 100644 clang/test/OpenMP/target_update_strided_ptr_variable_stride_messages.c create mode 100644 clang/test/OpenMP/target_update_strided_struct_ptr_messages_from.c create mode 100644 clang/test/OpenMP/target_update_strided_struct_ptr_messages_to.c create mode 100644 clang/test/OpenMP/target_update_strided_struct_ptr_multiple_messages_from.c create mode 100644 clang/test/OpenMP/target_update_strided_struct_ptr_multiple_messages_to.c create mode 100644 clang/test/OpenMP/target_update_strided_struct_ptr_partial_messages_from.c create mode 100644 clang/test/OpenMP/target_update_strided_struct_ptr_partial_messages_to.c create mode 100644 clang/test/OpenMP/target_update_strided_struct_variable_count_and_stride_messages.c create mode 100644 clang/test/OpenMP/target_update_variable_count_and_stride_messages.c diff --git a/clang/test/OpenMP/target_update_strided_ptr_variable_count_and_stride_messages.c b/clang/test/OpenMP/target_update_strided_ptr_variable_count_and_stride_messages.c new file mode 100644 index 0000000000000..932cd6b1c97bb --- /dev/null +++ b/clang/test/OpenMP/target_update_strided_ptr_variable_count_and_stride_messages.c @@ -0,0 +1,62 @@ +// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized + +int main(int argc, char **argv) { + int len = 16; + int count = 8; + int stride = 2; + int stride_large = 5; + double *data; + + // Valid strided array sections with both variable count and variable stride (FROM) + #pragma omp target update from(data[0:count:stride]) // OK - both variable + {} + + #pragma omp target update from(data[0:len/2:stride]) // OK - count expression, variable stride + {} + + #pragma omp target update from(data[0:count:stride_large]) // OK - variable count, different stride + {} + + #pragma omp target update from(data[1:len-2:stride]) // OK - with offset, count expression + {} + + #pragma omp target update from(data[0:count/2:stride*2]) // OK - both expressions + {} + + #pragma omp target update from(data[0:(len+1)/2:stride+1]) // OK - complex expressions + {} + + #pragma omp target update from(data[2:count-2:len/4]) // OK - all expressions + {} + + // Edge cases + int stride_one = 1; + #pragma omp target update from(data[0:count:stride_one]) // OK - variable count, stride=1 + {} + + #pragma omp target update from(data[0:len/stride:stride]) // OK - count depends on stride + {} + + // Invalid compile-time constant strides with variable count + #pragma omp target update from(data[0:count:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + #pragma omp target update from(data[0:len/2:-1]) // expected-error {{section stride is evaluated to a non-positive value -1}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + #pragma omp target update from(data[1:count:-2]) // expected-error {{section stride is evaluated to a non-positive value -2}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + // Valid strided array sections with variable count and stride (TO) + #pragma omp target update to(data[0:count:stride]) // OK + {} + + #pragma omp target update to(data[0:len/2:stride]) // OK + {} + + #pragma omp target update to(data[0:count:stride*2]) // OK + {} + + // Invalid stride with TO + #pragma omp target update to(data[0:count:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + return 0; +} diff --git a/clang/test/OpenMP/target_update_strided_ptr_variable_count_messages.c b/clang/test/OpenMP/target_update_strided_ptr_variable_count_messages.c new file mode 100644 index 0000000000000..23fba9c8bc84f --- /dev/null +++ b/clang/test/OpenMP/target_update_strided_ptr_variable_count_messages.c @@ -0,0 +1,57 @@ +// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized + +int main(int argc, char **argv) { + int len = 16; + int count = 8; + int divisor = 2; + double *data; + + // Valid strided array sections with variable count expressions (FROM) + #pragma omp target update from(data[0:count:2]) // OK - variable count + {} + + #pragma omp target update from(data[0:len/2:2]) // OK - count expression + {} + + #pragma omp target update from(data[0:len-4:3]) // OK - count with subtraction + {} + + #pragma omp target update from(data[1:(len+1)/2:2]) // OK - complex count expression + {} + + #pragma omp target update from(data[0:count*2:3]) // OK - count multiplication + {} + + #pragma omp target update from(data[2:len%divisor:2]) // OK - count with modulo + {} + + // Variable count with stride = 1 (contiguous) + #pragma omp target update from(data[0:count]) // OK - variable count, implicit stride + {} + + #pragma omp target update from(data[0:len/divisor]) // OK - expression count, implicit stride + {} + + // Invalid stride expressions with variable count + #pragma omp target update from(data[0:count:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + #pragma omp target update from(data[0:len/2:-1]) // expected-error {{section stride is evaluated to a non-positive value -1}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + #pragma omp target update from(data[1:count:-2]) // expected-error {{section stride is evaluated to a non-positive value -2}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + // Valid strided array sections with variable count expressions (TO) + #pragma omp target update to(data[0:count:2]) // OK + {} + + #pragma omp target update to(data[0:len/2:2]) // OK + {} + + #pragma omp target update to(data[0:len-4:3]) // OK + {} + + // Invalid stride with TO + #pragma omp target update to(data[0:count:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + return 0; +} diff --git a/clang/test/OpenMP/target_update_strided_ptr_variable_stride_messages.c b/clang/test/OpenMP/target_update_strided_ptr_variable_stride_messages.c new file mode 100644 index 0000000000000..3f85ed0c48d66 --- /dev/null +++ b/clang/test/OpenMP/target_update_strided_ptr_variable_stride_messages.c @@ -0,0 +1,64 @@ +// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized + +int main(int argc, char **argv) { + int len = 16; + int stride = 2; + int stride_large = 5; + double *data; + + // Valid strided array sections with variable stride (FROM) + #pragma omp target update from(data[0:8:stride]) // OK - variable stride + {} + + #pragma omp target update from(data[0:4:stride_large]) // OK - different variable stride + {} + + #pragma omp target update from(data[1:6:stride]) // OK - with offset + {} + + #pragma omp target update from(data[0:5:stride+1]) // OK - stride expression + {} + + #pragma omp target update from(data[0:4:stride*2]) // OK - stride multiplication + {} + + #pragma omp target update from(data[2:3:len/4]) // OK - stride from expression + {} + + // Edge case: stride = 1 (should be contiguous, not non-contiguous) + int stride_one = 1; + #pragma omp target update from(data[0:8:stride_one]) // OK - stride=1 is contiguous + {} + + // Invalid variable stride expressions + int zero_stride = 0; + int neg_stride = -1; + + // Note: These are runtime checks, so no compile-time error + #pragma omp target update from(data[0:8:zero_stride]) // OK at compile-time (runtime will fail) + {} + + #pragma omp target update from(data[0:4:neg_stride]) // OK at compile-time (runtime will fail) + {} + + // Compile-time constant invalid strides + #pragma omp target update from(data[0:4:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + #pragma omp target update from(data[0:4:-1]) // expected-error {{section stride is evaluated to a non-positive value -1}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + // Valid strided array sections with variable stride (TO) + #pragma omp target update to(data[0:8:stride]) // OK + {} + + #pragma omp target update to(data[0:5:stride+1]) // OK + {} + + #pragma omp target update to(data[0:4:stride*2]) // OK + {} + + // Invalid stride with TO + #pragma omp target update to(data[0:4:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + return 0; +} diff --git a/clang/test/OpenMP/target_update_strided_struct_ptr_messages_from.c b/clang/test/OpenMP/target_update_strided_struct_ptr_messages_from.c new file mode 100644 index 0000000000000..d86ce9e89766b --- /dev/null +++ b/clang/test/OpenMP/target_update_strided_struct_ptr_messages_from.c @@ -0,0 +1,40 @@ +// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized + +#define N 16 +typedef struct { + double *data; + int len; +} T; + +int main(int argc, char **argv) { + T s; + s.len = N; + s.data = (double *)__builtin_alloca(N * sizeof(double)); + + // Valid strided array sections with pointer member + #pragma omp target update from(s.data[0:4:2]) // OK + {} + + #pragma omp target update from(s.data[1:3:2]) // OK + {} + + // Missing stride (default = 1) + #pragma omp target update from(s.data[0:4]) // OK + {} + + // Invalid stride expressions + #pragma omp target update from(s.data[0:4:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + #pragma omp target update from(s.data[0:4:-1]) // expected-error {{section stride is evaluated to a non-positive value -1}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + // Missing colon + #pragma omp target update from(s.data[0:4 2]) // expected-error {{expected ']'}} expected-note {{to match this '['}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + {} + + // Too many colons + #pragma omp target update from(s.data[0:4:2:1]) // expected-error {{expected ']'}} expected-note {{to match this '['}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + {} + + return 0; +} diff --git a/clang/test/OpenMP/target_update_strided_struct_ptr_messages_to.c b/clang/test/OpenMP/target_update_strided_struct_ptr_messages_to.c new file mode 100644 index 0000000000000..012f484a6ae36 --- /dev/null +++ b/clang/test/OpenMP/target_update_strided_struct_ptr_messages_to.c @@ -0,0 +1,40 @@ +// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized + +#define N 16 +typedef struct { + double *data; + int len; +} T; + +int main(int argc, char **argv) { + T s; + s.len = N; + s.data = (double *)__builtin_alloca(N * sizeof(double)); + + // Valid strided array sections with pointer member + #pragma omp target update to(s.data[0:4:2]) // OK + {} + + #pragma omp target update to(s.data[1:3:2]) // OK + {} + + // Missing stride (default = 1) + #pragma omp target update to(s.data[0:4]) // OK + {} + + // Invalid stride expressions + #pragma omp target update to(s.data[0:4:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + #pragma omp target update to(s.data[0:4:-1]) // expected-error {{section stride is evaluated to a non-positive value -1}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + // Missing colon + #pragma omp target update to(s.data[0:4 2]) // expected-error {{expected ']'}} expected-note {{to match this '['}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + {} + + // Too many colons + #pragma omp target update to(s.data[0:4:2:1]) // expected-error {{expected ']'}} expected-note {{to match this '['}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + {} + + return 0; +} diff --git a/clang/test/OpenMP/target_update_strided_struct_ptr_multiple_messages_from.c b/clang/test/OpenMP/target_update_strided_struct_ptr_multiple_messages_from.c new file mode 100644 index 0000000000000..7020ccb77d231 --- /dev/null +++ b/clang/test/OpenMP/target_update_strided_struct_ptr_multiple_messages_from.c @@ -0,0 +1,47 @@ +// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized + +#define N 20 +typedef struct { + double *data; + int len; +} T; + +int main(int argc, char **argv) { + T s1, s2; + s1.len = N; + s1.data = (double *)__builtin_alloca(N * sizeof(double)); + s2.len = N; + s2.data = (double *)__builtin_alloca(N * sizeof(double)); + + // Multiple valid strided updates + #pragma omp target update from(s1.data[0:10:2], s2.data[0:7:3]) // OK + {} + + // Mixed: one with stride, one without + #pragma omp target update from(s1.data[0:N], s2.data[0:5:2]) // OK + {} + + int stride1 = 2; + int stride2 = 3; + + // Multiple with expression strides + #pragma omp target update from(s1.data[1:5:stride1], s2.data[0:4:stride2]) // OK + {} + + // One valid, one invalid + #pragma omp target update from(s1.data[0:5:2], s2.data[0:4:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} + + #pragma omp target update from(s1.data[0:5:-1], s2.data[0:4:2]) // expected-error {{section stride is evaluated to a non-positive value -1}} + + #pragma omp target update from(s1.data[0:5:0], s2.data[0:4:1]) // expected-error {{section stride is evaluated to a non-positive value 0}} + + // Syntax errors + #pragma omp target update from(s1.data[0:5:2], s2.data[0:4 3]) // expected-error {{expected ']'}} expected-note {{to match this '['}} + {} + + #pragma omp target update from(s1.data[0:5:2:3], s2.data[0:4:2]) // expected-error {{expected ']'}} expected-note {{to match this '['}} + {} + + return 0; +} diff --git a/clang/test/OpenMP/target_update_strided_struct_ptr_multiple_messages_to.c b/clang/test/OpenMP/target_update_strided_struct_ptr_multiple_messages_to.c new file mode 100644 index 0000000000000..05278308ad173 --- /dev/null +++ b/clang/test/OpenMP/target_update_strided_struct_ptr_multiple_messages_to.c @@ -0,0 +1,47 @@ +// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized + +#define N 20 +typedef struct { + double *data; + int len; +} T; + +int main(int argc, char **argv) { + T s1, s2; + s1.len = N; + s1.data = (double *)__builtin_alloca(N * sizeof(double)); + s2.len = N; + s2.data = (double *)__builtin_alloca(N * sizeof(double)); + + // Multiple valid strided updates (to clause) + #pragma omp target update to(s1.data[0:10:2], s2.data[0:7:3]) // OK + {} + + // Mixed: one with stride, one without + #pragma omp target update to(s1.data[0:N], s2.data[0:5:2]) // OK + {} + + int stride1 = 2; + int stride2 = 3; + + // Multiple with expression strides + #pragma omp target update to(s1.data[1:5:stride1], s2.data[0:4:stride2]) // OK + {} + + // One valid, one invalid + #pragma omp target update to(s1.data[0:5:2], s2.data[0:4:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} + + #pragma omp target update to(s1.data[0:5:-1], s2.data[0:4:2]) // expected-error {{section stride is evaluated to a non-positive value -1}} + + #pragma omp target update to(s1.data[0:5:0], s2.data[0:4:1]) // expected-error {{section stride is evaluated to a non-positive value 0}} + + // Syntax errors + #pragma omp target update to(s1.data[0:5:2], s2.data[0:4 3]) // expected-error {{expected ']'}} expected-note {{to match this '['}} + {} + + #pragma omp target update to(s1.data[0:5:2:3], s2.data[0:4:2]) // expected-error {{expected ']'}} expected-note {{to match this '['}} + {} + + return 0; +} diff --git a/clang/test/OpenMP/target_update_strided_struct_ptr_partial_messages_from.c b/clang/test/OpenMP/target_update_strided_struct_ptr_partial_messages_from.c new file mode 100644 index 0000000000000..4c835d3bef6f0 --- /dev/null +++ b/clang/test/OpenMP/target_update_strided_struct_ptr_partial_messages_from.c @@ -0,0 +1,32 @@ +// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized +// expected-no-diagnostics + +#define N 24 +typedef struct { + double *data; + int len; +} T; + +int main(int argc, char **argv) { + T s; + s.len = N; + s.data = (double *)__builtin_alloca(N * sizeof(double)); + + // Valid partial strided updates with pointer member + #pragma omp target update from(s.data[0:2:10]) // OK - partial coverage + {} + + // Stride larger than length + #pragma omp target update from(s.data[0:2:20]) // OK + {} + + // Valid: complex expressions + int offset = 1; + + // Runtime-dependent stride expressions + #pragma omp target update from(s.data[0:4:offset+1]) // OK + {} + + return 0; +} diff --git a/clang/test/OpenMP/target_update_strided_struct_ptr_partial_messages_to.c b/clang/test/OpenMP/target_update_strided_struct_ptr_partial_messages_to.c new file mode 100644 index 0000000000000..d62a6c640d0b3 --- /dev/null +++ b/clang/test/OpenMP/target_update_strided_struct_ptr_partial_messages_to.c @@ -0,0 +1,32 @@ +// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized +// expected-no-diagnostics + +#define N 24 +typedef struct { + double *data; + int len; +} T; + +int main(int argc, char **argv) { + T s; + s.len = N; + s.data = (double *)__builtin_alloca(N * sizeof(double)); + + // Valid partial strided updates with pointer member (to clause) + #pragma omp target update to(s.data[0:2:10]) // OK - partial coverage + {} + + // Stride larger than length + #pragma omp target update to(s.data[0:2:20]) // OK + {} + + // Valid: complex expressions + int offset = 1; + + // Runtime-dependent stride expressions + #pragma omp target update to(s.data[0:4:offset+1]) // OK + {} + + return 0; +} diff --git a/clang/test/OpenMP/target_update_strided_struct_variable_count_and_stride_messages.c b/clang/test/OpenMP/target_update_strided_struct_variable_count_and_stride_messages.c new file mode 100644 index 0000000000000..70775d5c8322c --- /dev/null +++ b/clang/test/OpenMP/target_update_strided_struct_variable_count_and_stride_messages.c @@ -0,0 +1,72 @@ +// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized + +#define N 20 +typedef struct { + double data[N]; + int len; + int stride; +} T; + +int main(int argc, char **argv) { + T s; + s.len = 16; + s.stride = 2; + int count = 8; + int ext_stride = 3; + + // Valid strided struct member array sections with variable count/stride (FROM) + #pragma omp target update from(s.data[0:s.len/2:2]) // OK - member count expression + {} + + #pragma omp target update from(s.data[0:count:s.stride]) // OK - external count, member stride + {} + + #pragma omp target update from(s.data[0:s.len:ext_stride]) // OK - member count, external stride + {} + + #pragma omp target update from(s.data[0:count:ext_stride]) // OK - both external + {} + + #pragma omp target update from(s.data[0:s.len/2:s.stride]) // OK - both from struct + {} + + #pragma omp target update from(s.data[1:(s.len-2)/2:s.stride]) // OK - complex count expression + {} + + #pragma omp target update from(s.data[0:count*2:s.stride+1]) // OK - expressions for both + {} + + // Edge cases + int stride_one = 1; + #pragma omp target update from(s.data[0:s.len:stride_one]) // OK - stride=1 + {} + + #pragma omp target update from(s.data[0:s.len/s.stride:s.stride]) // OK - count depends on stride + {} + + // Invalid compile-time constant strides with variable count + #pragma omp target update from(s.data[0:s.len:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + #pragma omp target update from(s.data[0:count:-1]) // expected-error {{section stride is evaluated to a non-positive value -1}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + #pragma omp target update from(s.data[1:s.len/2:-2]) // expected-error {{section stride is evaluated to a non-positive value -2}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + // Valid strided struct member array sections with variable count and stride (TO) + #pragma omp target update to(s.data[0:s.len/2:2]) // OK + {} + + #pragma omp target update to(s.data[0:count:s.stride]) // OK + {} + + #pragma omp target update to(s.data[0:s.len:ext_stride]) // OK + {} + + #pragma omp target update to(s.data[0:count*2:s.stride+1]) // OK + {} + + // Invalid stride with TO + #pragma omp target update to(s.data[0:s.len:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + return 0; +} diff --git a/clang/test/OpenMP/target_update_variable_count_and_stride_messages.c b/clang/test/OpenMP/target_update_variable_count_and_stride_messages.c new file mode 100644 index 0000000000000..0082539538a32 --- /dev/null +++ b/clang/test/OpenMP/target_update_variable_count_and_stride_messages.c @@ -0,0 +1,85 @@ +// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized + +int main(int argc, char **argv) { + int len = 16; + int count = 8; + int stride = 2; + int divisor = 2; + double data[100]; + + // Valid strided array sections with variable count expressions (FROM) + #pragma omp target update from(data[0:count:2]) // OK - variable count + {} + + #pragma omp target update from(data[0:len/2:2]) // OK - count expression + {} + + #pragma omp target update from(data[0:len-4:3]) // OK - count with subtraction + {} + + #pragma omp target update from(data[1:(len+1)/2:2]) // OK - complex count expression + {} + + #pragma omp target update from(data[0:count*2:3]) // OK - count multiplication + {} + + #pragma omp target update from(data[2:len%divisor:2]) // OK - count with modulo + {} + + // Variable stride with constant/variable count + #pragma omp target update from(data[0:10:stride]) // OK - constant count, variable stride + {} + + #pragma omp target update from(data[0:count:stride]) // OK - both variable + {} + + #pragma omp target update from(data[0:len/2:stride]) // OK - count expression, variable stride + {} + + #pragma omp target update from(data[0:count:stride*2]) // OK - variable count, stride expression + {} + + #pragma omp target update from(data[0:len/divisor:stride+1]) // OK - both expressions + {} + + // Variable count with stride = 1 (contiguous) + #pragma omp target update from(data[0:count]) // OK - variable count, implicit stride + {} + + #pragma omp target update from(data[0:len/divisor]) // OK - expression count, implicit stride + {} + + // Edge cases + int stride_one = 1; + #pragma omp target update from(data[0:len:stride_one]) // OK - stride=1 variable + {} + + #pragma omp target update from(data[0:len/stride:stride]) // OK - count depends on stride + {} + + // Invalid stride expressions with variable count + #pragma omp target update from(data[0:count:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + #pragma omp target update from(data[0:len/2:-1]) // expected-error {{section stride is evaluated to a non-positive value -1}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + #pragma omp target update from(data[1:count:-2]) // expected-error {{section stride is evaluated to a non-positive value -2}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + // Valid strided array sections with variable count expressions (TO) + #pragma omp target update to(data[0:count:2]) // OK + {} + + #pragma omp target update to(data[0:len/2:stride]) // OK + {} + + #pragma omp target update to(data[0:count:stride]) // OK + {} + + #pragma omp target update to(data[0:len/divisor:stride+1]) // OK + {} + + // Invalid stride with TO + #pragma omp target update to(data[0:count:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} + + return 0; +} >From 9f6c4b92d3aed82c9890a7e9a5ccf0ddbd84e83a Mon Sep 17 00:00:00 2001 From: amtiwari <[email protected]> Date: Thu, 19 Feb 2026 12:04:48 -0500 Subject: [PATCH 2/2] revised --- ...d_ptr_variable_count_and_stride_messages.c | 27 +-------------- ...date_strided_ptr_variable_count_messages.c | 11 ------ ...ate_strided_ptr_variable_stride_messages.c | 25 +------------- ..._update_strided_struct_ptr_messages_from.c | 5 --- ...et_update_strided_struct_ptr_messages_to.c | 5 --- ...trided_struct_ptr_multiple_messages_from.c | 5 --- ..._strided_struct_ptr_multiple_messages_to.c | 5 --- ...strided_struct_ptr_partial_messages_from.c | 8 +---- ...e_strided_struct_ptr_partial_messages_to.c | 8 +---- ...truct_variable_count_and_stride_messages.c | 17 ---------- ...pdate_variable_count_and_stride_messages.c | 34 +------------------ 11 files changed, 5 insertions(+), 145 deletions(-) diff --git a/clang/test/OpenMP/target_update_strided_ptr_variable_count_and_stride_messages.c b/clang/test/OpenMP/target_update_strided_ptr_variable_count_and_stride_messages.c index 932cd6b1c97bb..61d40462ba8e9 100644 --- a/clang/test/OpenMP/target_update_strided_ptr_variable_count_and_stride_messages.c +++ b/clang/test/OpenMP/target_update_strided_ptr_variable_count_and_stride_messages.c @@ -1,5 +1,6 @@ // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized +// expected-no-diagnostics int main(int argc, char **argv) { int len = 16; @@ -10,53 +11,27 @@ int main(int argc, char **argv) { // Valid strided array sections with both variable count and variable stride (FROM) #pragma omp target update from(data[0:count:stride]) // OK - both variable - {} #pragma omp target update from(data[0:len/2:stride]) // OK - count expression, variable stride - {} #pragma omp target update from(data[0:count:stride_large]) // OK - variable count, different stride - {} #pragma omp target update from(data[1:len-2:stride]) // OK - with offset, count expression - {} #pragma omp target update from(data[0:count/2:stride*2]) // OK - both expressions - {} #pragma omp target update from(data[0:(len+1)/2:stride+1]) // OK - complex expressions - {} #pragma omp target update from(data[2:count-2:len/4]) // OK - all expressions - {} - - // Edge cases - int stride_one = 1; - #pragma omp target update from(data[0:count:stride_one]) // OK - variable count, stride=1 - {} #pragma omp target update from(data[0:len/stride:stride]) // OK - count depends on stride - {} - - // Invalid compile-time constant strides with variable count - #pragma omp target update from(data[0:count:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} - - #pragma omp target update from(data[0:len/2:-1]) // expected-error {{section stride is evaluated to a non-positive value -1}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} - - #pragma omp target update from(data[1:count:-2]) // expected-error {{section stride is evaluated to a non-positive value -2}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} // Valid strided array sections with variable count and stride (TO) #pragma omp target update to(data[0:count:stride]) // OK - {} #pragma omp target update to(data[0:len/2:stride]) // OK - {} #pragma omp target update to(data[0:count:stride*2]) // OK - {} - - // Invalid stride with TO - #pragma omp target update to(data[0:count:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} return 0; } diff --git a/clang/test/OpenMP/target_update_strided_ptr_variable_count_messages.c b/clang/test/OpenMP/target_update_strided_ptr_variable_count_messages.c index 23fba9c8bc84f..e00dfb77a8245 100644 --- a/clang/test/OpenMP/target_update_strided_ptr_variable_count_messages.c +++ b/clang/test/OpenMP/target_update_strided_ptr_variable_count_messages.c @@ -9,29 +9,21 @@ int main(int argc, char **argv) { // Valid strided array sections with variable count expressions (FROM) #pragma omp target update from(data[0:count:2]) // OK - variable count - {} #pragma omp target update from(data[0:len/2:2]) // OK - count expression - {} #pragma omp target update from(data[0:len-4:3]) // OK - count with subtraction - {} #pragma omp target update from(data[1:(len+1)/2:2]) // OK - complex count expression - {} #pragma omp target update from(data[0:count*2:3]) // OK - count multiplication - {} #pragma omp target update from(data[2:len%divisor:2]) // OK - count with modulo - {} // Variable count with stride = 1 (contiguous) #pragma omp target update from(data[0:count]) // OK - variable count, implicit stride - {} #pragma omp target update from(data[0:len/divisor]) // OK - expression count, implicit stride - {} // Invalid stride expressions with variable count #pragma omp target update from(data[0:count:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} @@ -42,13 +34,10 @@ int main(int argc, char **argv) { // Valid strided array sections with variable count expressions (TO) #pragma omp target update to(data[0:count:2]) // OK - {} #pragma omp target update to(data[0:len/2:2]) // OK - {} #pragma omp target update to(data[0:len-4:3]) // OK - {} // Invalid stride with TO #pragma omp target update to(data[0:count:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} diff --git a/clang/test/OpenMP/target_update_strided_ptr_variable_stride_messages.c b/clang/test/OpenMP/target_update_strided_ptr_variable_stride_messages.c index 3f85ed0c48d66..41dd89c362915 100644 --- a/clang/test/OpenMP/target_update_strided_ptr_variable_stride_messages.c +++ b/clang/test/OpenMP/target_update_strided_ptr_variable_stride_messages.c @@ -1,5 +1,6 @@ // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized +// expected-no-diagnostics int main(int argc, char **argv) { int len = 16; @@ -9,27 +10,16 @@ int main(int argc, char **argv) { // Valid strided array sections with variable stride (FROM) #pragma omp target update from(data[0:8:stride]) // OK - variable stride - {} #pragma omp target update from(data[0:4:stride_large]) // OK - different variable stride - {} #pragma omp target update from(data[1:6:stride]) // OK - with offset - {} #pragma omp target update from(data[0:5:stride+1]) // OK - stride expression - {} #pragma omp target update from(data[0:4:stride*2]) // OK - stride multiplication - {} #pragma omp target update from(data[2:3:len/4]) // OK - stride from expression - {} - - // Edge case: stride = 1 (should be contiguous, not non-contiguous) - int stride_one = 1; - #pragma omp target update from(data[0:8:stride_one]) // OK - stride=1 is contiguous - {} // Invalid variable stride expressions int zero_stride = 0; @@ -37,28 +27,15 @@ int main(int argc, char **argv) { // Note: These are runtime checks, so no compile-time error #pragma omp target update from(data[0:8:zero_stride]) // OK at compile-time (runtime will fail) - {} #pragma omp target update from(data[0:4:neg_stride]) // OK at compile-time (runtime will fail) - {} - - // Compile-time constant invalid strides - #pragma omp target update from(data[0:4:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} - - #pragma omp target update from(data[0:4:-1]) // expected-error {{section stride is evaluated to a non-positive value -1}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} // Valid strided array sections with variable stride (TO) #pragma omp target update to(data[0:8:stride]) // OK - {} #pragma omp target update to(data[0:5:stride+1]) // OK - {} #pragma omp target update to(data[0:4:stride*2]) // OK - {} - - // Invalid stride with TO - #pragma omp target update to(data[0:4:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} return 0; } diff --git a/clang/test/OpenMP/target_update_strided_struct_ptr_messages_from.c b/clang/test/OpenMP/target_update_strided_struct_ptr_messages_from.c index d86ce9e89766b..5e301f384498b 100644 --- a/clang/test/OpenMP/target_update_strided_struct_ptr_messages_from.c +++ b/clang/test/OpenMP/target_update_strided_struct_ptr_messages_from.c @@ -14,14 +14,11 @@ int main(int argc, char **argv) { // Valid strided array sections with pointer member #pragma omp target update from(s.data[0:4:2]) // OK - {} #pragma omp target update from(s.data[1:3:2]) // OK - {} // Missing stride (default = 1) #pragma omp target update from(s.data[0:4]) // OK - {} // Invalid stride expressions #pragma omp target update from(s.data[0:4:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} @@ -30,11 +27,9 @@ int main(int argc, char **argv) { // Missing colon #pragma omp target update from(s.data[0:4 2]) // expected-error {{expected ']'}} expected-note {{to match this '['}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} - {} // Too many colons #pragma omp target update from(s.data[0:4:2:1]) // expected-error {{expected ']'}} expected-note {{to match this '['}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} - {} return 0; } diff --git a/clang/test/OpenMP/target_update_strided_struct_ptr_messages_to.c b/clang/test/OpenMP/target_update_strided_struct_ptr_messages_to.c index 012f484a6ae36..648ba6b7e675d 100644 --- a/clang/test/OpenMP/target_update_strided_struct_ptr_messages_to.c +++ b/clang/test/OpenMP/target_update_strided_struct_ptr_messages_to.c @@ -14,14 +14,11 @@ int main(int argc, char **argv) { // Valid strided array sections with pointer member #pragma omp target update to(s.data[0:4:2]) // OK - {} #pragma omp target update to(s.data[1:3:2]) // OK - {} // Missing stride (default = 1) #pragma omp target update to(s.data[0:4]) // OK - {} // Invalid stride expressions #pragma omp target update to(s.data[0:4:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} @@ -30,11 +27,9 @@ int main(int argc, char **argv) { // Missing colon #pragma omp target update to(s.data[0:4 2]) // expected-error {{expected ']'}} expected-note {{to match this '['}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} - {} // Too many colons #pragma omp target update to(s.data[0:4:2:1]) // expected-error {{expected ']'}} expected-note {{to match this '['}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} - {} return 0; } diff --git a/clang/test/OpenMP/target_update_strided_struct_ptr_multiple_messages_from.c b/clang/test/OpenMP/target_update_strided_struct_ptr_multiple_messages_from.c index 7020ccb77d231..6aacc1f001b3a 100644 --- a/clang/test/OpenMP/target_update_strided_struct_ptr_multiple_messages_from.c +++ b/clang/test/OpenMP/target_update_strided_struct_ptr_multiple_messages_from.c @@ -16,18 +16,15 @@ int main(int argc, char **argv) { // Multiple valid strided updates #pragma omp target update from(s1.data[0:10:2], s2.data[0:7:3]) // OK - {} // Mixed: one with stride, one without #pragma omp target update from(s1.data[0:N], s2.data[0:5:2]) // OK - {} int stride1 = 2; int stride2 = 3; // Multiple with expression strides #pragma omp target update from(s1.data[1:5:stride1], s2.data[0:4:stride2]) // OK - {} // One valid, one invalid #pragma omp target update from(s1.data[0:5:2], s2.data[0:4:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} @@ -38,10 +35,8 @@ int main(int argc, char **argv) { // Syntax errors #pragma omp target update from(s1.data[0:5:2], s2.data[0:4 3]) // expected-error {{expected ']'}} expected-note {{to match this '['}} - {} #pragma omp target update from(s1.data[0:5:2:3], s2.data[0:4:2]) // expected-error {{expected ']'}} expected-note {{to match this '['}} - {} return 0; } diff --git a/clang/test/OpenMP/target_update_strided_struct_ptr_multiple_messages_to.c b/clang/test/OpenMP/target_update_strided_struct_ptr_multiple_messages_to.c index 05278308ad173..ea6f029c70320 100644 --- a/clang/test/OpenMP/target_update_strided_struct_ptr_multiple_messages_to.c +++ b/clang/test/OpenMP/target_update_strided_struct_ptr_multiple_messages_to.c @@ -16,18 +16,15 @@ int main(int argc, char **argv) { // Multiple valid strided updates (to clause) #pragma omp target update to(s1.data[0:10:2], s2.data[0:7:3]) // OK - {} // Mixed: one with stride, one without #pragma omp target update to(s1.data[0:N], s2.data[0:5:2]) // OK - {} int stride1 = 2; int stride2 = 3; // Multiple with expression strides #pragma omp target update to(s1.data[1:5:stride1], s2.data[0:4:stride2]) // OK - {} // One valid, one invalid #pragma omp target update to(s1.data[0:5:2], s2.data[0:4:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} @@ -38,10 +35,8 @@ int main(int argc, char **argv) { // Syntax errors #pragma omp target update to(s1.data[0:5:2], s2.data[0:4 3]) // expected-error {{expected ']'}} expected-note {{to match this '['}} - {} #pragma omp target update to(s1.data[0:5:2:3], s2.data[0:4:2]) // expected-error {{expected ']'}} expected-note {{to match this '['}} - {} return 0; } diff --git a/clang/test/OpenMP/target_update_strided_struct_ptr_partial_messages_from.c b/clang/test/OpenMP/target_update_strided_struct_ptr_partial_messages_from.c index 4c835d3bef6f0..c2a1eeb256117 100644 --- a/clang/test/OpenMP/target_update_strided_struct_ptr_partial_messages_from.c +++ b/clang/test/OpenMP/target_update_strided_struct_ptr_partial_messages_from.c @@ -14,19 +14,13 @@ int main(int argc, char **argv) { s.data = (double *)__builtin_alloca(N * sizeof(double)); // Valid partial strided updates with pointer member - #pragma omp target update from(s.data[0:2:10]) // OK - partial coverage - {} - - // Stride larger than length - #pragma omp target update from(s.data[0:2:20]) // OK - {} + #pragma omp target update from(s.data[0:2:10]) // OK - partial coverage (stride > length) // Valid: complex expressions int offset = 1; // Runtime-dependent stride expressions #pragma omp target update from(s.data[0:4:offset+1]) // OK - {} return 0; } diff --git a/clang/test/OpenMP/target_update_strided_struct_ptr_partial_messages_to.c b/clang/test/OpenMP/target_update_strided_struct_ptr_partial_messages_to.c index d62a6c640d0b3..699082b2faf53 100644 --- a/clang/test/OpenMP/target_update_strided_struct_ptr_partial_messages_to.c +++ b/clang/test/OpenMP/target_update_strided_struct_ptr_partial_messages_to.c @@ -14,19 +14,13 @@ int main(int argc, char **argv) { s.data = (double *)__builtin_alloca(N * sizeof(double)); // Valid partial strided updates with pointer member (to clause) - #pragma omp target update to(s.data[0:2:10]) // OK - partial coverage - {} - - // Stride larger than length - #pragma omp target update to(s.data[0:2:20]) // OK - {} + #pragma omp target update to(s.data[0:2:10]) // OK - partial coverage (stride > length) // Valid: complex expressions int offset = 1; // Runtime-dependent stride expressions #pragma omp target update to(s.data[0:4:offset+1]) // OK - {} return 0; } diff --git a/clang/test/OpenMP/target_update_strided_struct_variable_count_and_stride_messages.c b/clang/test/OpenMP/target_update_strided_struct_variable_count_and_stride_messages.c index 70775d5c8322c..8658ec06ce7c1 100644 --- a/clang/test/OpenMP/target_update_strided_struct_variable_count_and_stride_messages.c +++ b/clang/test/OpenMP/target_update_strided_struct_variable_count_and_stride_messages.c @@ -17,33 +17,20 @@ int main(int argc, char **argv) { // Valid strided struct member array sections with variable count/stride (FROM) #pragma omp target update from(s.data[0:s.len/2:2]) // OK - member count expression - {} #pragma omp target update from(s.data[0:count:s.stride]) // OK - external count, member stride - {} #pragma omp target update from(s.data[0:s.len:ext_stride]) // OK - member count, external stride - {} #pragma omp target update from(s.data[0:count:ext_stride]) // OK - both external - {} #pragma omp target update from(s.data[0:s.len/2:s.stride]) // OK - both from struct - {} #pragma omp target update from(s.data[1:(s.len-2)/2:s.stride]) // OK - complex count expression - {} #pragma omp target update from(s.data[0:count*2:s.stride+1]) // OK - expressions for both - {} - - // Edge cases - int stride_one = 1; - #pragma omp target update from(s.data[0:s.len:stride_one]) // OK - stride=1 - {} #pragma omp target update from(s.data[0:s.len/s.stride:s.stride]) // OK - count depends on stride - {} // Invalid compile-time constant strides with variable count #pragma omp target update from(s.data[0:s.len:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} @@ -54,16 +41,12 @@ int main(int argc, char **argv) { // Valid strided struct member array sections with variable count and stride (TO) #pragma omp target update to(s.data[0:s.len/2:2]) // OK - {} #pragma omp target update to(s.data[0:count:s.stride]) // OK - {} #pragma omp target update to(s.data[0:s.len:ext_stride]) // OK - {} #pragma omp target update to(s.data[0:count*2:s.stride+1]) // OK - {} // Invalid stride with TO #pragma omp target update to(s.data[0:s.len:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} diff --git a/clang/test/OpenMP/target_update_variable_count_and_stride_messages.c b/clang/test/OpenMP/target_update_variable_count_and_stride_messages.c index 0082539538a32..5d8c51584bcf1 100644 --- a/clang/test/OpenMP/target_update_variable_count_and_stride_messages.c +++ b/clang/test/OpenMP/target_update_variable_count_and_stride_messages.c @@ -1,5 +1,6 @@ // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized +// expected-no-diagnostics int main(int argc, char **argv) { int len = 16; @@ -10,76 +11,43 @@ int main(int argc, char **argv) { // Valid strided array sections with variable count expressions (FROM) #pragma omp target update from(data[0:count:2]) // OK - variable count - {} #pragma omp target update from(data[0:len/2:2]) // OK - count expression - {} #pragma omp target update from(data[0:len-4:3]) // OK - count with subtraction - {} #pragma omp target update from(data[1:(len+1)/2:2]) // OK - complex count expression - {} #pragma omp target update from(data[0:count*2:3]) // OK - count multiplication - {} #pragma omp target update from(data[2:len%divisor:2]) // OK - count with modulo - {} // Variable stride with constant/variable count #pragma omp target update from(data[0:10:stride]) // OK - constant count, variable stride - {} #pragma omp target update from(data[0:count:stride]) // OK - both variable - {} #pragma omp target update from(data[0:len/2:stride]) // OK - count expression, variable stride - {} #pragma omp target update from(data[0:count:stride*2]) // OK - variable count, stride expression - {} #pragma omp target update from(data[0:len/divisor:stride+1]) // OK - both expressions - {} // Variable count with stride = 1 (contiguous) #pragma omp target update from(data[0:count]) // OK - variable count, implicit stride - {} #pragma omp target update from(data[0:len/divisor]) // OK - expression count, implicit stride - {} - - // Edge cases - int stride_one = 1; - #pragma omp target update from(data[0:len:stride_one]) // OK - stride=1 variable - {} #pragma omp target update from(data[0:len/stride:stride]) // OK - count depends on stride - {} - - // Invalid stride expressions with variable count - #pragma omp target update from(data[0:count:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} - - #pragma omp target update from(data[0:len/2:-1]) // expected-error {{section stride is evaluated to a non-positive value -1}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} - - #pragma omp target update from(data[1:count:-2]) // expected-error {{section stride is evaluated to a non-positive value -2}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} // Valid strided array sections with variable count expressions (TO) #pragma omp target update to(data[0:count:2]) // OK - {} #pragma omp target update to(data[0:len/2:stride]) // OK - {} #pragma omp target update to(data[0:count:stride]) // OK - {} #pragma omp target update to(data[0:len/divisor:stride+1]) // OK - {} - - // Invalid stride with TO - #pragma omp target update to(data[0:count:0]) // expected-error {{section stride is evaluated to a non-positive value 0}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} return 0; } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
