@@ -56,6 +56,7 @@ class PointerAssignmentChecker {
5656 PointerAssignmentChecker &set_isContiguous (bool );
5757 PointerAssignmentChecker &set_isVolatile (bool );
5858 PointerAssignmentChecker &set_isBoundsRemapping (bool );
59+ PointerAssignmentChecker &set_isAssumedRank (bool );
5960 PointerAssignmentChecker &set_pointerComponentLHS (const Symbol *);
6061 bool CheckLeftHandSide (const SomeExpr &);
6162 bool Check (const SomeExpr &);
@@ -88,6 +89,7 @@ class PointerAssignmentChecker {
8889 bool isContiguous_{false };
8990 bool isVolatile_{false };
9091 bool isBoundsRemapping_{false };
92+ bool isAssumedRank_{false };
9193 const Symbol *pointerComponentLHS_{nullptr };
9294};
9395
@@ -115,6 +117,12 @@ PointerAssignmentChecker &PointerAssignmentChecker::set_isBoundsRemapping(
115117 return *this ;
116118}
117119
120+ PointerAssignmentChecker &PointerAssignmentChecker::set_isAssumedRank (
121+ bool isAssumedRank) {
122+ isAssumedRank_ = isAssumedRank;
123+ return *this ;
124+ }
125+
118126PointerAssignmentChecker &PointerAssignmentChecker::set_pointerComponentLHS (
119127 const Symbol *symbol) {
120128 pointerComponentLHS_ = symbol;
@@ -263,7 +271,7 @@ bool PointerAssignmentChecker::Check(const evaluate::FunctionRef<T> &f) {
263271 CHECK (frTypeAndShape);
264272 if (!lhsType_->IsCompatibleWith (foldingContext_.messages (), *frTypeAndShape,
265273 " pointer" , " function result" ,
266- isBoundsRemapping_ /* omit shape check */ ,
274+ /* omitShapeConformanceCheck= */ isBoundsRemapping_ || isAssumedRank_ ,
267275 evaluate::CheckConformanceFlags::BothDeferredShape)) {
268276 return false ; // IsCompatibleWith() emitted message
269277 }
@@ -489,17 +497,20 @@ static bool CheckPointerBounds(
489497bool CheckPointerAssignment (SemanticsContext &context,
490498 const evaluate::Assignment &assignment, const Scope &scope) {
491499 return CheckPointerAssignment (context, assignment.lhs , assignment.rhs , scope,
492- CheckPointerBounds (context.foldingContext (), assignment));
500+ CheckPointerBounds (context.foldingContext (), assignment),
501+ /* isAssumedRank=*/ false );
493502}
494503
495504bool 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) {
497507 const Symbol *pointer{GetLastSymbol (lhs)};
498508 if (!pointer) {
499509 return false ; // error was reported
500510 }
501511 PointerAssignmentChecker checker{context, scope, *pointer};
502512 checker.set_isBoundsRemapping (isBoundsRemapping);
513+ checker.set_isAssumedRank (isAssumedRank);
503514 bool lhsOk{checker.CheckLeftHandSide (lhs)};
504515 bool rhsOk{checker.Check (rhs)};
505516 return lhsOk && rhsOk; // don't short-circuit
@@ -514,19 +525,22 @@ bool CheckStructConstructorPointerComponent(SemanticsContext &context,
514525
515526bool CheckPointerAssignment (SemanticsContext &context, parser::CharBlock source,
516527 const std::string &description, const DummyDataObject &lhs,
517- const SomeExpr &rhs, const Scope &scope) {
528+ const SomeExpr &rhs, const Scope &scope, bool isAssumedRank ) {
518529 return PointerAssignmentChecker{context, scope, source, description}
519530 .set_lhsType (common::Clone (lhs.type ))
520531 .set_isContiguous (lhs.attrs .test (DummyDataObject::Attr::Contiguous))
521532 .set_isVolatile (lhs.attrs .test (DummyDataObject::Attr::Volatile))
533+ .set_isAssumedRank (isAssumedRank)
522534 .Check (rhs);
523535}
524536
525537bool CheckInitialDataPointerTarget (SemanticsContext &context,
526538 const SomeExpr &pointer, const SomeExpr &init, const Scope &scope) {
527539 return evaluate::IsInitialDataTarget (
528540 init, &context.foldingContext ().messages ()) &&
529- CheckPointerAssignment (context, pointer, init, scope);
541+ CheckPointerAssignment (context, pointer, init, scope,
542+ /* isBoundsRemapping=*/ false ,
543+ /* isAssumedRank=*/ false );
530544}
531545
532546} // namespace Fortran::semantics
0 commit comments