diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp index 5fcebdca0bc5f..10e353a500813 100644 --- a/flang/lib/Semantics/check-omp-structure.cpp +++ b/flang/lib/Semantics/check-omp-structure.cpp @@ -1516,6 +1516,12 @@ void OmpStructureChecker::CheckThreadprivateOrDeclareTargetVar( "A variable in a %s directive cannot appear in an " "EQUIVALENCE statement"_err_en_US, ContextDirectiveAsFortran()); + } else if (name->symbol->test(Symbol::Flag::InNamelist) && + GetContext().directive == + llvm::omp::Directive::OMPD_threadprivate) { + context_.Say(name->source, + "A variable in a %s directive cannot appear in a NAMELIST"_err_en_US, + ContextDirectiveAsFortran()); } else if (name->symbol->test(Symbol::Flag::OmpThreadprivate) && GetContext().directive == llvm::omp::Directive::OMPD_declare_target) { @@ -1571,6 +1577,13 @@ void OmpStructureChecker::CheckThreadprivateOrDeclareTargetVar( ContextDirectiveAsFortran(), obj->name(), name.symbol->name()); } + if (obj->test(Symbol::Flag::InNamelist) && + GetContext().directive == + llvm::omp::OMPD_threadprivate) { + context_.Say(name.source, + "A variable in a %s directive cannot appear in a NAMELIST"_err_en_US, + ContextDirectiveAsFortran()); + } } } } diff --git a/flang/test/Semantics/OpenMP/threadprivate09.f90 b/flang/test/Semantics/OpenMP/threadprivate09.f90 new file mode 100644 index 0000000000000..02236d19d9d01 --- /dev/null +++ b/flang/test/Semantics/OpenMP/threadprivate09.f90 @@ -0,0 +1,12 @@ +! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags + +! Check that namelist variables cannot be used with threadprivate + +module m + integer :: nam1 + common /com1/nam1 + namelist /nam/nam1 + + !ERROR: A variable in a THREADPRIVATE directive cannot appear in a NAMELIST + !$omp threadprivate(/com1/) +end