diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -2631,6 +2631,7 @@ DSAStack->pop(); DiscardCleanupsInEvaluationContext(); PopExpressionEvaluationContext(); + CleanupVarDeclMarking(); } static bool FinishOpenMPLinearClause(OMPLinearClause &Clause, DeclRefExpr *IV, diff --git a/clang/test/OpenMP/sema_alignas.cpp b/clang/test/OpenMP/sema_alignas.cpp new file mode 100644 --- /dev/null +++ b/clang/test/OpenMP/sema_alignas.cpp @@ -0,0 +1,86 @@ +// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 %s +// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -fopenmp-version=50 %s + +// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 %s +// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -fopenmp-version=50 %s + +// expected-no-diagnostics + +#ifndef HEADER +#define HEADER + +struct FOO { + static const int vec_align_bytes = 32; + + void foo() { + alignas(vec_align_bytes) double a; +#pragma omp parallel + a++; + +#pragma omp master + a++; + +#pragma omp parallel private(a) + a++; + } +}; + +namespace { +class FOO { +public: + static const int vec_align_bytes = 32; + + void foo() { + alignas(vec_align_bytes) double a; +#pragma omp parallel + a++; + +#pragma omp master + a++; + +#pragma omp parallel private(a) + a++; + } +}; +} // namespace + +template +struct FOO : public T { + static const T vec_align_bytes = 32; + + void foo() { + alignas(vec_align_bytes) double a; +#pragma omp parallel + a++; + +#pragma omp master + a++; + +#pragma omp parallel private(a) + a++; + } +}; + +namespace { +namespace { +template +class FOO : public T { +public: + static const T vec_align_bytes = 32; + + void foo() { + alignas(vec_align_bytes) double a; +#pragma omp parallel + a++; + +#pragma omp master + a++; + +#pragma omp parallel private(a) + a++; + } +}; +} // namespace +} // namespace + +#endif