new file mode 100644
@@ -0,0 +1,121 @@
+/* { dg-do compile } */
+/* { dg-options "-msve-vector-bits=256 -std=gnu99 -fopenmp -O2 -fdump-tree-ompexp" } */
+
+#include <arm_sve.h>
+
+#define N 8
+
+#ifndef CONSTRUCT
+#define CONSTRUCT
+#endif
+
+svint32_t __attribute__ ((noinline))
+omp_lastprivate_sections ()
+{
+
+ int a[N], b[N], c[N];
+ svint32_t va, vb, vc;
+ int i;
+
+#pragma omp parallel for
+ for (i = 0; i < N; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+
+/* This worksharing construct binds to an implicit outer parallel region in
+ whose scope va is declared and therefore is default private. This causes
+ the lastprivate clause list item va to be diagnosed as private in the outer
+ context. Similarly for constructs for and distribute. */
+#pragma omp sections lastprivate (va) /* { dg-error {lastprivate variable 'va' is private in outer context} } */
+ {
+ #pragma omp section
+ vb = svld1_s32 (svptrue_b32 (), b);
+ #pragma omp section
+ vc = svld1_s32 (svptrue_b32 (), c);
+ #pragma omp section
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+ return va;
+}
+
+
+svint32_t __attribute__ ((noinline))
+omp_lastprivate_for ()
+{
+
+ int a[N], b[N], c[N];
+ svint32_t va, vb, vc;
+ int i;
+
+#pragma omp parallel for
+ for (i = 0; i < N; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+
+#pragma omp for lastprivate (va) /* { dg-error {lastprivate variable 'va' is private in outer context} } */
+ for (i = 0; i < 1; i++)
+ {
+ vb = svld1_s32 (svptrue_b32 (), b);
+ vc = svld1_s32 (svptrue_b32 (), c);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+ return va;
+}
+
+svint32_t __attribute__ ((noinline))
+omp_lastprivate_simd ()
+{
+
+ int a[N], b[N], c[N];
+ svint32_t va, vb, vc;
+ int i;
+
+#pragma omp parallel for
+ for (i = 0; i < N; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+
+#pragma omp simd lastprivate (va)
+ for (i = 0; i < 1; i++)
+ {
+ vb = svld1_s32 (svptrue_b32 (), b);
+ vc = svld1_s32 (svptrue_b32 (), c);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+ return va;
+}
+
+svint32_t __attribute__ ((noinline))
+omp_lastprivate_distribute ()
+{
+
+ int a[N], b[N], c[N];
+ svint32_t va, vb, vc;
+ int i;
+
+#pragma omp parallel for
+ for (i = 0; i < N; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+
+#pragma omp distribute lastprivate (va) /* { dg-error {lastprivate variable 'va' is private in outer context} } */
+ for (i = 0; i < 1; i++)
+ {
+ vb = svld1_s32 (svptrue_b32 (), b);
+ vc = svld1_s32 (svptrue_b32 (), c);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+ return va;
+}