@@ -1531,6 +1531,7 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPBlockConstruct &x) {
15311531 case llvm::omp::Directive::OMPD_masked:
15321532 case llvm::omp::Directive::OMPD_parallel_masked:
15331533 case llvm::omp::Directive::OMPD_master:
1534+ case llvm::omp::Directive::OMPD_parallel_master:
15341535 case llvm::omp::Directive::OMPD_ordered:
15351536 case llvm::omp::Directive::OMPD_parallel:
15361537 case llvm::omp::Directive::OMPD_scope:
@@ -1550,7 +1551,8 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPBlockConstruct &x) {
15501551 // TODO others
15511552 break ;
15521553 }
1553- if (beginDir.v == llvm::omp::Directive::OMPD_master)
1554+ if (beginDir.v == llvm::omp::Directive::OMPD_master ||
1555+ beginDir.v == llvm::omp::Directive::OMPD_parallel_master)
15541556 IssueNonConformanceWarning (beginDir.v , beginDir.source );
15551557 ClearDataSharingAttributeObjects ();
15561558 ClearPrivateDataSharingAttributeObjects ();
@@ -1563,7 +1565,9 @@ void OmpAttributeVisitor::Post(const parser::OpenMPBlockConstruct &x) {
15631565 const auto &beginDir{std::get<parser::OmpBlockDirective>(beginBlockDir.t )};
15641566 switch (beginDir.v ) {
15651567 case llvm::omp::Directive::OMPD_masked:
1568+ case llvm::omp::Directive::OMPD_master:
15661569 case llvm::omp::Directive::OMPD_parallel_masked:
1570+ case llvm::omp::Directive::OMPD_parallel_master:
15671571 case llvm::omp::Directive::OMPD_parallel:
15681572 case llvm::omp::Directive::OMPD_scope:
15691573 case llvm::omp::Directive::OMPD_single:
@@ -1634,10 +1638,14 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPLoopConstruct &x) {
16341638 case llvm::omp::Directive::OMPD_loop:
16351639 case llvm::omp::Directive::OMPD_masked_taskloop_simd:
16361640 case llvm::omp::Directive::OMPD_masked_taskloop:
1641+ case llvm::omp::Directive::OMPD_master_taskloop_simd:
1642+ case llvm::omp::Directive::OMPD_master_taskloop:
16371643 case llvm::omp::Directive::OMPD_parallel_do:
16381644 case llvm::omp::Directive::OMPD_parallel_do_simd:
16391645 case llvm::omp::Directive::OMPD_parallel_masked_taskloop_simd:
16401646 case llvm::omp::Directive::OMPD_parallel_masked_taskloop:
1647+ case llvm::omp::Directive::OMPD_parallel_master_taskloop_simd:
1648+ case llvm::omp::Directive::OMPD_parallel_master_taskloop:
16411649 case llvm::omp::Directive::OMPD_simd:
16421650 case llvm::omp::Directive::OMPD_target_loop:
16431651 case llvm::omp::Directive::OMPD_target_parallel_do:
@@ -1662,7 +1670,11 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPLoopConstruct &x) {
16621670 default :
16631671 break ;
16641672 }
1665- if (beginDir.v == llvm::omp::Directive::OMPD_target_loop)
1673+ if (beginDir.v == llvm::omp::OMPD_master_taskloop ||
1674+ beginDir.v == llvm::omp::OMPD_master_taskloop_simd ||
1675+ beginDir.v == llvm::omp::OMPD_parallel_master_taskloop ||
1676+ beginDir.v == llvm::omp::OMPD_parallel_master_taskloop_simd ||
1677+ beginDir.v == llvm::omp::Directive::OMPD_target_loop)
16661678 IssueNonConformanceWarning (beginDir.v , beginDir.source );
16671679 ClearDataSharingAttributeObjects ();
16681680 SetContextAssociatedLoopLevel (GetAssociatedLoopLevelFromClauses (clauseList));
@@ -2891,18 +2903,39 @@ void OmpAttributeVisitor::AddOmpRequiresToScope(Scope &scope,
28912903
28922904void OmpAttributeVisitor::IssueNonConformanceWarning (
28932905 llvm::omp::Directive D, parser::CharBlock source) {
2894- std::string warnStr = " " ;
2895- std::string dirName = llvm::omp::getOpenMPDirectiveName (D).str ();
2906+ std::string warnStr;
2907+ llvm::raw_string_ostream warnStrOS (warnStr);
2908+ warnStrOS << " OpenMP directive "
2909+ << parser::ToUpperCaseLetters (
2910+ llvm::omp::getOpenMPDirectiveName (D).str ())
2911+ << " has been deprecated" ;
2912+
2913+ auto setAlternativeStr = [&warnStrOS](llvm::StringRef alt) {
2914+ warnStrOS << " , please use " << alt << " instead." ;
2915+ };
28962916 switch (D) {
28972917 case llvm::omp::OMPD_master:
2898- warnStr = " OpenMP directive '" + dirName +
2899- " ' has been deprecated, please use 'masked' instead." ;
2918+ setAlternativeStr (" MASKED" );
2919+ break ;
2920+ case llvm::omp::OMPD_master_taskloop:
2921+ setAlternativeStr (" MASKED TASKLOOP" );
2922+ break ;
2923+ case llvm::omp::OMPD_master_taskloop_simd:
2924+ setAlternativeStr (" MASKED TASKLOOP SIMD" );
2925+ break ;
2926+ case llvm::omp::OMPD_parallel_master:
2927+ setAlternativeStr (" PARALLEL MASKED" );
2928+ break ;
2929+ case llvm::omp::OMPD_parallel_master_taskloop:
2930+ setAlternativeStr (" PARALLEL MASKED TASKLOOP" );
2931+ break ;
2932+ case llvm::omp::OMPD_parallel_master_taskloop_simd:
2933+ setAlternativeStr (" PARALLEL_MASKED TASKLOOP SIMD" );
29002934 break ;
29012935 case llvm::omp::OMPD_target_loop:
2902- default :
2903- warnStr = " OpenMP directive '" + dirName + " ' has been deprecated." ;
2936+ default :;
29042937 }
2905- context_.Warn (
2906- common::UsageWarning::OpenMPUsage, source, " %s " _warn_en_US, warnStr );
2938+ context_.Warn (common::UsageWarning::OpenMPUsage, source, " %s " _warn_en_US,
2939+ warnStrOS. str () );
29072940}
29082941} // namespace Fortran::semantics
0 commit comments