@@ -1732,6 +1732,46 @@ void OmpStructureChecker::CheckTargetUpdate() {
17321732 }
17331733}
17341734
1735+ void OmpStructureChecker::CheckTaskDependenceType (
1736+ const parser::OmpTaskDependenceType::Type &x) {
1737+ // Common checks for task-dependence-type (DEPEND and UPDATE clauses).
1738+ unsigned version{context_.langOptions ().OpenMPVersion };
1739+ unsigned since{0 }, deprecatedIn{~0u };
1740+
1741+ switch (x) {
1742+ case parser::OmpTaskDependenceType::Type::In:
1743+ case parser::OmpTaskDependenceType::Type::Out:
1744+ case parser::OmpTaskDependenceType::Type::Inout:
1745+ break ;
1746+ case parser::OmpTaskDependenceType::Type::Source:
1747+ case parser::OmpTaskDependenceType::Type::Sink:
1748+ deprecatedIn = 52 ;
1749+ break ;
1750+ case parser::OmpTaskDependenceType::Type::Mutexinoutset:
1751+ case parser::OmpTaskDependenceType::Type::Depobj:
1752+ since = 50 ;
1753+ break ;
1754+ case parser::OmpTaskDependenceType::Type::Inoutset:
1755+ since = 52 ;
1756+ break ;
1757+ }
1758+
1759+ if (version >= deprecatedIn) {
1760+ context_.Say (GetContext ().clauseSource ,
1761+ " %s task-dependence-type is deprecated in %s" _warn_en_US,
1762+ parser::ToUpperCaseLetters (
1763+ parser::OmpTaskDependenceType::EnumToString (x)),
1764+ ThisVersion (deprecatedIn));
1765+ } else if (version < since) {
1766+ context_.Say (
1767+ GetContext ().clauseSource ,
1768+ " %s task-dependence-type is not supported in %s, %s" _warn_en_US,
1769+ parser::ToUpperCaseLetters (
1770+ parser::OmpTaskDependenceType::EnumToString (x)),
1771+ ThisVersion (version), TryVersion (since));
1772+ }
1773+ }
1774+
17351775void OmpStructureChecker::Enter (
17361776 const parser::OpenMPSimpleStandaloneConstruct &x) {
17371777 const auto &dir{std::get<parser::OmpSimpleStandaloneDirective>(x.t )};
@@ -3393,20 +3433,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Depend &x) {
33933433 using DepType = parser::OmpTaskDependenceType::Type;
33943434 DepType depType = x.v .GetDepType ();
33953435
3396- if (version >= 52 ) {
3397- switch (depType) {
3398- case DepType::Sink:
3399- case DepType::Source:
3400- context_.Say (GetContext ().clauseSource ,
3401- " The %s task-dependence-type is deprecated in %s" _warn_en_US,
3402- parser::ToUpperCaseLetters (
3403- parser::OmpTaskDependenceType::EnumToString (depType)),
3404- ThisVersion (version));
3405- break ;
3406- default :
3407- break ;
3408- }
3409- }
3436+ CheckTaskDependenceType (depType);
34103437
34113438 if (directive == llvm::omp::OMPD_depobj) {
34123439 // [5.0:255:11], [5.1:288:3]
@@ -3593,6 +3620,8 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Update &x) {
35933620 llvm::omp::Directive directive{GetContext ().directive };
35943621 unsigned version{context_.langOptions ().OpenMPVersion };
35953622
3623+ CheckTaskDependenceType (x.v .v .v );
3624+
35963625 // [5.1:288:4-5]
35973626 // An update clause on a depobj construct must not have source, sink or depobj
35983627 // as dependence-type.
0 commit comments