Index: flang/lib/Semantics/mod-file.cpp =================================================================== --- flang/lib/Semantics/mod-file.cpp +++ flang/lib/Semantics/mod-file.cpp @@ -322,7 +322,13 @@ }, [](const HostAssocDetails &) {}, [](const MiscDetails &) {}, - [&](const auto &) { PutEntity(decls_, symbol); }, + [&](const auto &) { + PutEntity(decls_, symbol); + if (symbol.test(Symbol::Flag::OmpThreadprivate) && + !FindCommonBlockContaining(symbol)) { + decls_ << "!$omp threadprivate(" << symbol.name() << ")\n"; + } + }, }, symbol.details()); } @@ -925,6 +931,7 @@ parser::Options options; options.isModuleFile = true; options.features.Enable(common::LanguageFeature::BackslashEscapes); + options.features.Enable(common::LanguageFeature::OpenMP); if (!isIntrinsic.value_or(false)) { options.searchDirectories = context_.searchDirectories(); // If a directory is in both lists, the intrinsic module directory Index: flang/test/Semantics/modfile44.f90 =================================================================== --- /dev/null +++ flang/test/Semantics/modfile44.f90 @@ -0,0 +1,35 @@ +! RUN: %python %S/test_modfile.py %s %flang_fc1 -fopenmp +! Check correct modfile generation for OpenMP threadprivate directive. + +module m + implicit none + type :: my_type(kind_param, len_param) + integer, KIND :: kind_param + integer, LEN :: len_param + integer :: t_i + integer :: t_arr(10) + end type + type(my_type(kind_param=2, len_param=4)) :: t + real, dimension(3) :: thrtest + real :: x + common /blk/ x + + !$omp threadprivate(thrtest, t, /blk/) +end + +!Expect: m.mod +!module m +!type::my_type(kind_param,len_param) +!integer(4),kind::kind_param +!integer(4),len::len_param +!integer(4)::t_i +!integer(4)::t_arr(1_8:10_8) +!end type +!type(my_type(kind_param=2_4,len_param=4_4))::t +!!$omp threadprivate(t) +!real(4)::thrtest(1_8:3_8) +!!$omp threadprivate(thrtest) +!real(4)::x +!common/blk/x +!end +