@@ -135,6 +135,21 @@ static void CheckCharacterActual(evaluate::Expr<evaluate::SomeType> &actual,
135135 dummy.type .type ().kind () == actualType.type ().kind () &&
136136 !dummy.attrs .test (
137137 characteristics::DummyDataObject::Attr::DeducedFromActual)) {
138+ bool actualIsAssumedRank{evaluate::IsAssumedRank (actual)};
139+ if (actualIsAssumedRank) {
140+ if (!context.languageFeatures ().IsEnabled (
141+ common::LanguageFeature::AssumedRankSequenceAssociation)) {
142+ messages.Say (
143+ " Assumed-rank character array may not be storage sequence associated with a dummy argument" _err_en_US);
144+ } else if (!evaluate::IsContiguous (actual, context.foldingContext ())) {
145+ messages.Say (
146+ " Assumed-rank character array may not be storage sequence associated with a dummy argument if possibly discontiguous" _err_en_US);
147+ } else {
148+ context.Warn (common::LanguageFeature::AssumedRankSequenceAssociation,
149+ messages.at (),
150+ " Assumed-rank character array should not be storage sequence associated with a dummy argument" _port_en_US);
151+ }
152+ }
138153 if (dummy.type .LEN () && actualType.LEN ()) {
139154 evaluate::FoldingContext &foldingContext{context.foldingContext ()};
140155 auto dummyLength{
@@ -148,7 +163,7 @@ static void CheckCharacterActual(evaluate::Expr<evaluate::SomeType> &actual,
148163 if (auto dummySize{evaluate::ToInt64 (evaluate::Fold (
149164 foldingContext, evaluate::GetSize (dummy.type .shape ())))}) {
150165 auto dummyChars{*dummySize * *dummyLength};
151- if (actualType.Rank () == 0 ) {
166+ if (actualType.Rank () == 0 && !actualIsAssumedRank ) {
152167 evaluate::DesignatorFolder folder{
153168 context.foldingContext (), /* getLastComponent=*/ true };
154169 if (auto actualOffset{folder.FoldDesignator (actual)}) {
@@ -602,7 +617,22 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
602617 characteristics::DummyDataObject::Attr::DeducedFromActual)) {
603618 if (auto dummySize{evaluate::ToInt64 (evaluate::Fold (
604619 foldingContext, evaluate::GetSize (dummy.type .shape ())))}) {
605- if (actualRank == 0 && !actualIsAssumedRank) {
620+ if (actualIsAssumedRank) {
621+ if (!context.languageFeatures ().IsEnabled (
622+ common::LanguageFeature::AssumedRankSequenceAssociation)) {
623+ messages.Say (
624+ " Assumed-rank array may not be storage sequence associated with a dummy argument" _err_en_US);
625+ } else if (!evaluate::IsContiguous (
626+ actual, context.foldingContext ())) {
627+ messages.Say (
628+ " Assumed-rank array may not be storage sequence associated with a dummy argument if possibly discontiguous" _err_en_US);
629+ } else {
630+ context.Warn (
631+ common::LanguageFeature::AssumedRankSequenceAssociation,
632+ messages.at (),
633+ " Assumed-rank array should not be storage sequence associated with a dummy argument" _port_en_US);
634+ }
635+ } else if (actualRank == 0 ) {
606636 if (evaluate::IsArrayElement (actual)) {
607637 // Actual argument is a scalar array element
608638 evaluate::DesignatorFolder folder{
@@ -643,7 +673,7 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
643673 }
644674 }
645675 }
646- } else { // actualRank > 0 || actualIsAssumedRank
676+ } else {
647677 if (auto actualSize{evaluate::ToInt64 (evaluate::Fold (
648678 foldingContext, evaluate::GetSize (actualType.shape ())))};
649679 actualSize && *actualSize < *dummySize) {
0 commit comments