@@ -1732,6 +1732,45 @@ 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 (GetContext ().clauseSource ,
1767+ " %s task-dependence-type is not supported in %s, %s" _warn_en_US,
1768+ parser::ToUpperCaseLetters (
1769+ parser::OmpTaskDependenceType::EnumToString (x)),
1770+ ThisVersion (version), TryVersion (since));
1771+ }
1772+ }
1773+
17351774void OmpStructureChecker::Enter (
17361775 const parser::OpenMPSimpleStandaloneConstruct &x) {
17371776 const auto &dir{std::get<parser::OmpSimpleStandaloneDirective>(x.t )};
@@ -3393,20 +3432,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Depend &x) {
33933432 using DepType = parser::OmpTaskDependenceType::Type;
33943433 DepType depType = x.v .GetDepType ();
33953434
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- }
3435+ CheckTaskDependenceType (depType);
34103436
34113437 if (directive == llvm::omp::OMPD_depobj) {
34123438 // [5.0:255:11], [5.1:288:3]
@@ -3593,6 +3619,8 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Update &x) {
35933619 llvm::omp::Directive directive{GetContext ().directive };
35943620 unsigned version{context_.langOptions ().OpenMPVersion };
35953621
3622+ CheckTaskDependenceType (x.v .v .v );
3623+
35963624 // [5.1:288:4-5]
35973625 // An update clause on a depobj construct must not have source, sink or depobj
35983626 // as dependence-type.
0 commit comments