@@ -135,6 +135,18 @@ 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 {
145+ context.Warn (common::LanguageFeature::AssumedRankSequenceAssociation,
146+ messages.at (),
147+ " Assumed-rank character array should not be storage sequence associated with a dummy argument" _port_en_US);
148+ }
149+ }
138150 if (dummy.type .LEN () && actualType.LEN ()) {
139151 evaluate::FoldingContext &foldingContext{context.foldingContext ()};
140152 auto dummyLength{
@@ -148,7 +160,7 @@ static void CheckCharacterActual(evaluate::Expr<evaluate::SomeType> &actual,
148160 if (auto dummySize{evaluate::ToInt64 (evaluate::Fold (
149161 foldingContext, evaluate::GetSize (dummy.type .shape ())))}) {
150162 auto dummyChars{*dummySize * *dummyLength};
151- if (actualType.Rank () == 0 ) {
163+ if (actualType.Rank () == 0 && !actualIsAssumedRank ) {
152164 evaluate::DesignatorFolder folder{
153165 context.foldingContext (), /* getLastComponent=*/ true };
154166 if (auto actualOffset{folder.FoldDesignator (actual)}) {
@@ -602,7 +614,18 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
602614 characteristics::DummyDataObject::Attr::DeducedFromActual)) {
603615 if (auto dummySize{evaluate::ToInt64 (evaluate::Fold (
604616 foldingContext, evaluate::GetSize (dummy.type .shape ())))}) {
605- if (actualRank == 0 && !actualIsAssumedRank) {
617+ if (actualIsAssumedRank) {
618+ if (!context.languageFeatures ().IsEnabled (
619+ common::LanguageFeature::AssumedRankSequenceAssociation)) {
620+ messages.Say (
621+ " Assumed-rank array may not be storage sequence associated with a dummy argument" _err_en_US);
622+ } else {
623+ context.Warn (
624+ common::LanguageFeature::AssumedRankSequenceAssociation,
625+ messages.at (),
626+ " Assumed-rank array should not be storage sequence associated with a dummy argument" _port_en_US);
627+ }
628+ } else if (actualRank == 0 ) {
606629 if (evaluate::IsArrayElement (actual)) {
607630 // Actual argument is a scalar array element
608631 evaluate::DesignatorFolder folder{
@@ -643,7 +666,7 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
643666 }
644667 }
645668 }
646- } else { // actualRank > 0 || actualIsAssumedRank
669+ } else {
647670 if (auto actualSize{evaluate::ToInt64 (evaluate::Fold (
648671 foldingContext, evaluate::GetSize (actualType.shape ())))};
649672 actualSize && *actualSize < *dummySize) {
0 commit comments