@@ -269,7 +269,8 @@ bool OmpStructureChecker::CheckAllowedClause(llvmOmpClause clause) {
269
269
}
270
270
271
271
void OmpStructureChecker::AnalyzeObject (const parser::OmpObject &object) {
272
- if (std::holds_alternative<parser::Name>(object.u )) {
272
+ if (std::holds_alternative<parser::Name>(object.u ) ||
273
+ std::holds_alternative<parser::OmpObject::Invalid>(object.u )) {
273
274
// Do not analyze common block names. The analyzer will flag an error
274
275
// on those.
275
276
return ;
@@ -294,7 +295,12 @@ void OmpStructureChecker::AnalyzeObject(const parser::OmpObject &object) {
294
295
}
295
296
evaluate::ExpressionAnalyzer ea{context_};
296
297
auto restore{ea.AllowWholeAssumedSizeArray (true )};
297
- common::visit ([&](auto &&s) { ea.Analyze (s); }, object.u );
298
+ common::visit ( //
299
+ common::visitors{
300
+ [&](auto &&s) { ea.Analyze (s); },
301
+ [&](const parser::OmpObject::Invalid &invalid) {},
302
+ },
303
+ object.u );
298
304
}
299
305
300
306
void OmpStructureChecker::AnalyzeObjects (const parser::OmpObjectList &objects) {
@@ -538,6 +544,7 @@ void OmpStructureChecker::CheckPredefinedAllocatorRestriction(
538
544
[&](const parser::Name &name) {
539
545
CheckPredefinedAllocatorRestriction (source, name);
540
546
},
547
+ [&](const parser::OmpObject::Invalid &invalid) {},
541
548
},
542
549
ompObject.u );
543
550
}
@@ -1290,7 +1297,11 @@ void OmpStructureChecker::CheckThreadprivateOrDeclareTargetVar(
1290
1297
void OmpStructureChecker::CheckThreadprivateOrDeclareTargetVar (
1291
1298
const parser::OmpObjectList &objList) {
1292
1299
for (const auto &ompObject : objList.v ) {
1293
- common::visit ([&](auto &&s) { CheckThreadprivateOrDeclareTargetVar (s); },
1300
+ common::visit ( //
1301
+ common::visitors{
1302
+ [&](auto &&s) { CheckThreadprivateOrDeclareTargetVar (s); },
1303
+ [&](const parser::OmpObject::Invalid &invalid) {},
1304
+ },
1294
1305
ompObject.u );
1295
1306
}
1296
1307
}
@@ -1422,8 +1433,14 @@ void OmpStructureChecker::Enter(const parser::OpenMPDepobjConstruct &x) {
1422
1433
// refer to the same depend object as the depobj argument of the construct.
1423
1434
if (clause.Id () == llvm::omp::Clause::OMPC_destroy) {
1424
1435
auto getObjSymbol{[&](const parser::OmpObject &obj) {
1425
- return common::visit (
1426
- [&](auto &&s) { return GetLastName (s).symbol ; }, obj.u );
1436
+ return common::visit ( //
1437
+ common::visitors{
1438
+ [&](auto &&s) { return GetLastName (s).symbol ; },
1439
+ [&](const parser::OmpObject::Invalid &invalid) {
1440
+ return static_cast <Symbol *>(nullptr );
1441
+ },
1442
+ },
1443
+ obj.u );
1427
1444
}};
1428
1445
auto getArgSymbol{[&](const parser::OmpArgument &arg) {
1429
1446
if (auto *locator{std::get_if<parser::OmpLocator>(&arg.u )}) {
@@ -1438,9 +1455,7 @@ void OmpStructureChecker::Enter(const parser::OpenMPDepobjConstruct &x) {
1438
1455
if (const std::optional<parser::OmpDestroyClause> &destroy{wrapper.v }) {
1439
1456
const Symbol *constrSym{getArgSymbol (arguments.v .front ())};
1440
1457
const Symbol *clauseSym{getObjSymbol (destroy->v )};
1441
- assert (constrSym && " Unresolved depobj construct symbol" );
1442
- assert (clauseSym && " Unresolved destroy symbol on depobj construct" );
1443
- if (constrSym != clauseSym) {
1458
+ if (constrSym && clauseSym && constrSym != clauseSym) {
1444
1459
context_.Say (x.source ,
1445
1460
" The DESTROY clause must refer to the same object as the "
1446
1461
" DEPOBJ construct" _err_en_US);
@@ -1678,6 +1693,7 @@ void OmpStructureChecker::CheckSymbolNames(
1678
1693
ContextDirectiveAsFortran ());
1679
1694
}
1680
1695
},
1696
+ [&](const parser::OmpObject::Invalid &invalid) {},
1681
1697
},
1682
1698
ompObject.u );
1683
1699
}
@@ -2698,6 +2714,7 @@ void OmpStructureChecker::Leave(const parser::OmpClauseList &) {
2698
2714
}
2699
2715
}
2700
2716
},
2717
+ [&](const parser::OmpObject::Invalid &invalid) {},
2701
2718
},
2702
2719
ompObject.u );
2703
2720
}
@@ -3405,6 +3422,7 @@ void OmpStructureChecker::CheckVarIsNotPartOfAnotherVar(
3405
3422
}
3406
3423
},
3407
3424
[&](const parser::Name &name) {},
3425
+ [&](const parser::OmpObject::Invalid &invalid) {},
3408
3426
},
3409
3427
ompObject.u );
3410
3428
}
@@ -4090,11 +4108,11 @@ void OmpStructureChecker::CheckStructureComponent(
4090
4108
}};
4091
4109
4092
4110
for (const auto &object : objects.v ) {
4093
- common::visit (
4094
- common::visitors{
4095
- CheckComponent ,
4096
- [&](const parser::Name &name ) {},
4097
- },
4111
+ common::visit (common::visitors{
4112
+ CheckComponent,
4113
+ [&]( const parser::Name &name) {} ,
4114
+ [&](const parser::OmpObject::Invalid &invalid ) {},
4115
+ },
4098
4116
object.u );
4099
4117
}
4100
4118
}
0 commit comments