Hi! As mentioned earlier, for this feature the branch had just parsing support and limited diagnostics, plus preparations on the runtime library side, not the actual lowering/expansion, which I think will need 2 weeks full time, so deferring that to GCC 10. Instead of backing out the parsing, this emits a sorry.
Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk. 2018-11-09 Jakub Jelinek <ja...@redhat.com> * gimplify.c (gimplify_scan_omp_clauses): Call sorry_at for valid but unsupported lastprivate with conditional modifier. * c-c++-common/gomp/lastprivate-conditional-1.c: New test. * c-c++-common/gomp/lastprivate-conditional-2.c: New test. --- gcc/gimplify.c.jj 2018-11-08 18:07:56.327070930 +0100 +++ gcc/gimplify.c 2018-11-09 15:50:30.194813418 +0100 @@ -8065,6 +8065,10 @@ gimplify_scan_omp_clauses (tree *list_p, "%<lastprivate%> clause", decl); OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (c) = 0; } + if (OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (c)) + sorry_at (OMP_CLAUSE_LOCATION (c), + "%<conditional%> modifier on %<lastprivate%> clause " + "not supported yet"); if (outer_ctx && (outer_ctx->region_type == ORT_COMBINED_PARALLEL || ((outer_ctx->region_type & ORT_COMBINED_TEAMS) --- gcc/testsuite/c-c++-common/gomp/lastprivate-conditional-1.c.jj 2018-11-09 14:40:24.416193799 +0100 +++ gcc/testsuite/c-c++-common/gomp/lastprivate-conditional-1.c 2018-11-09 15:55:42.043671395 +0100 @@ -0,0 +1,64 @@ +void +foo (int *p) +{ + int a = -1, b = -1, c = -1, d = -1, e = -1, f = -1, g = -1, h = -1; + int i; + #pragma omp teams + { + #pragma omp distribute lastprivate (conditional: a) /* { dg-error "conditional 'lastprivate' clause on 'distribute' construct" } */ + for (i = 0; i < 32; i++) + if (p[i]) + a = i; + #pragma omp distribute simd lastprivate (conditional: b) /* { dg-error "conditional 'lastprivate' clause on 'distribute' construct" } */ + for (i = 0; i < 32; i++) + if (p[i]) + b = i; + #pragma omp distribute parallel for lastprivate (conditional: c) /* { dg-error "conditional 'lastprivate' clause on 'distribute' construct" } */ + for (i = 0; i < 32; i++) + if (p[i]) + c = i; + #pragma omp distribute parallel for simd lastprivate (conditional: d) /* { dg-error "conditional 'lastprivate' clause on 'distribute' construct" } */ + for (i = 0; i < 32; i++) + if (p[i]) + d = i; + } + #pragma omp teams distribute parallel for lastprivate (conditional: e) /* { dg-error "conditional 'lastprivate' clause on 'distribute' construct" } */ + for (i = 0; i < 32; i++) + if (p[i]) + e = i; + #pragma omp parallel + { + #pragma omp master + #pragma omp taskloop lastprivate (conditional: f) /* { dg-error "conditional 'lastprivate' clause on 'taskloop' construct" } */ + for (i = 0; i < 32; i++) + if (p[i]) + f = i; + #pragma omp master taskloop simd lastprivate (conditional: g) /* { dg-error "conditional 'lastprivate' clause on 'taskloop' construct" } */ + for (i = 0; i < 32; i++) + if (p[i]) + g = i; + } + #pragma omp parallel master taskloop simd lastprivate (conditional: h) /* { dg-error "conditional 'lastprivate' clause on 'taskloop' construct" } */ + for (i = 0; i < 32; i++) + if (p[i]) + h = i; +} + +struct S { int a, b; }; + +void +bar (int *p) +{ + struct S s = { -1, -1 }, t = { 1, 2 }; + int i; + #pragma omp parallel for lastprivate (conditional: s) /* { dg-error "non-scalar variable 's' in conditional 'lastprivate' clause" } */ + for (i = 0; i < 32; i++) + if (p[i]) + { + struct S u = t; + u.b = i; + s = u; + } +} + +/* { dg-prune-output "not supported yet" } */ --- gcc/testsuite/c-c++-common/gomp/lastprivate-conditional-2.c.jj 2018-11-09 15:43:31.781711861 +0100 +++ gcc/testsuite/c-c++-common/gomp/lastprivate-conditional-2.c 2018-11-09 15:52:09.920169067 +0100 @@ -0,0 +1,28 @@ +void +foo (int *p) +{ + int a = -1, b = -1, c = -1, d = -1, e = -1, f = -1, g = -1, h = -1; + int i; + #pragma omp parallel + #pragma omp for lastprivate (conditional: a) /* { dg-message "not supported yet" } */ + for (i = 0; i < 32; i++) + if (p[i]) + a = i; + #pragma omp simd lastprivate (conditional: b) /* { dg-message "not supported yet" } */ + for (i = 0; i < 32; i++) + if (p[i]) + b = i; + #pragma omp parallel + #pragma omp for simd lastprivate (conditional: c) /* { dg-message "not supported yet" } */ + for (i = 0; i < 32; i++) + if (p[i]) + c = i; + #pragma omp parallel for lastprivate (conditional: d) /* { dg-message "not supported yet" } */ + for (i = 0; i < 32; i++) + if (p[i]) + d = i; + #pragma omp parallel for simd lastprivate (conditional: e) /* { dg-message "not supported yet" } */ + for (i = 0; i < 32; i++) + if (p[i]) + e = i; +} Jakub