@@ -56,6 +56,7 @@ class PointerAssignmentChecker {
56
56
PointerAssignmentChecker &set_isContiguous (bool );
57
57
PointerAssignmentChecker &set_isVolatile (bool );
58
58
PointerAssignmentChecker &set_isBoundsRemapping (bool );
59
+ PointerAssignmentChecker &set_isAssumedRank (bool );
59
60
PointerAssignmentChecker &set_pointerComponentLHS (const Symbol *);
60
61
bool CheckLeftHandSide (const SomeExpr &);
61
62
bool Check (const SomeExpr &);
@@ -88,6 +89,7 @@ class PointerAssignmentChecker {
88
89
bool isContiguous_{false };
89
90
bool isVolatile_{false };
90
91
bool isBoundsRemapping_{false };
92
+ bool isAssumedRank_{false };
91
93
const Symbol *pointerComponentLHS_{nullptr };
92
94
};
93
95
@@ -115,6 +117,12 @@ PointerAssignmentChecker &PointerAssignmentChecker::set_isBoundsRemapping(
115
117
return *this ;
116
118
}
117
119
120
+ PointerAssignmentChecker &PointerAssignmentChecker::set_isAssumedRank (
121
+ bool isAssumedRank) {
122
+ isAssumedRank_ = isAssumedRank;
123
+ return *this ;
124
+ }
125
+
118
126
PointerAssignmentChecker &PointerAssignmentChecker::set_pointerComponentLHS (
119
127
const Symbol *symbol) {
120
128
pointerComponentLHS_ = symbol;
@@ -263,7 +271,7 @@ bool PointerAssignmentChecker::Check(const evaluate::FunctionRef<T> &f) {
263
271
CHECK (frTypeAndShape);
264
272
if (!lhsType_->IsCompatibleWith (foldingContext_.messages (), *frTypeAndShape,
265
273
" pointer" , " function result" ,
266
- isBoundsRemapping_ /* omit shape check */ ,
274
+ /* omitShapeConformanceCheck= */ isBoundsRemapping_ || isAssumedRank_ ,
267
275
evaluate::CheckConformanceFlags::BothDeferredShape)) {
268
276
return false ; // IsCompatibleWith() emitted message
269
277
}
@@ -489,17 +497,20 @@ static bool CheckPointerBounds(
489
497
bool CheckPointerAssignment (SemanticsContext &context,
490
498
const evaluate::Assignment &assignment, const Scope &scope) {
491
499
return CheckPointerAssignment (context, assignment.lhs , assignment.rhs , scope,
492
- CheckPointerBounds (context.foldingContext (), assignment));
500
+ CheckPointerBounds (context.foldingContext (), assignment),
501
+ /* isAssumedRank=*/ false );
493
502
}
494
503
495
504
bool CheckPointerAssignment (SemanticsContext &context, const SomeExpr &lhs,
496
- const SomeExpr &rhs, const Scope &scope, bool isBoundsRemapping) {
505
+ const SomeExpr &rhs, const Scope &scope, bool isBoundsRemapping,
506
+ bool isAssumedRank) {
497
507
const Symbol *pointer{GetLastSymbol (lhs)};
498
508
if (!pointer) {
499
509
return false ; // error was reported
500
510
}
501
511
PointerAssignmentChecker checker{context, scope, *pointer};
502
512
checker.set_isBoundsRemapping (isBoundsRemapping);
513
+ checker.set_isAssumedRank (isAssumedRank);
503
514
bool lhsOk{checker.CheckLeftHandSide (lhs)};
504
515
bool rhsOk{checker.Check (rhs)};
505
516
return lhsOk && rhsOk; // don't short-circuit
@@ -514,19 +525,22 @@ bool CheckStructConstructorPointerComponent(SemanticsContext &context,
514
525
515
526
bool CheckPointerAssignment (SemanticsContext &context, parser::CharBlock source,
516
527
const std::string &description, const DummyDataObject &lhs,
517
- const SomeExpr &rhs, const Scope &scope) {
528
+ const SomeExpr &rhs, const Scope &scope, bool isAssumedRank ) {
518
529
return PointerAssignmentChecker{context, scope, source, description}
519
530
.set_lhsType (common::Clone (lhs.type ))
520
531
.set_isContiguous (lhs.attrs .test (DummyDataObject::Attr::Contiguous))
521
532
.set_isVolatile (lhs.attrs .test (DummyDataObject::Attr::Volatile))
533
+ .set_isAssumedRank (isAssumedRank)
522
534
.Check (rhs);
523
535
}
524
536
525
537
bool CheckInitialDataPointerTarget (SemanticsContext &context,
526
538
const SomeExpr &pointer, const SomeExpr &init, const Scope &scope) {
527
539
return evaluate::IsInitialDataTarget (
528
540
init, &context.foldingContext ().messages ()) &&
529
- CheckPointerAssignment (context, pointer, init, scope);
541
+ CheckPointerAssignment (context, pointer, init, scope,
542
+ /* isBoundsRemapping=*/ false ,
543
+ /* isAssumedRank=*/ false );
530
544
}
531
545
532
546
} // namespace Fortran::semantics
0 commit comments