@@ -135,6 +135,20 @@ 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+ !dummy.type .attrs ().test (
141+ characteristics::TypeAndShape::Attr::AssumedRank)) {
142+ if (!context.languageFeatures ().IsEnabled (
143+ common::LanguageFeature::AssumedRankPassedToNonAssumedRank)) {
144+ messages.Say (
145+ " Assumed-rank character array may not be associated with a dummy argument that is not assumed-rank" _err_en_US);
146+ } else {
147+ context.Warn (common::LanguageFeature::AssumedRankPassedToNonAssumedRank,
148+ messages.at (),
149+ " Assumed-rank character array should not be associated with a dummy argument that is not assumed-rank" _port_en_US);
150+ }
151+ }
138152 if (dummy.type .LEN () && actualType.LEN ()) {
139153 evaluate::FoldingContext &foldingContext{context.foldingContext ()};
140154 auto dummyLength{
@@ -148,7 +162,7 @@ static void CheckCharacterActual(evaluate::Expr<evaluate::SomeType> &actual,
148162 if (auto dummySize{evaluate::ToInt64 (evaluate::Fold (
149163 foldingContext, evaluate::GetSize (dummy.type .shape ())))}) {
150164 auto dummyChars{*dummySize * *dummyLength};
151- if (actualType.Rank () == 0 ) {
165+ if (actualType.Rank () == 0 && !actualIsAssumedRank ) {
152166 evaluate::DesignatorFolder folder{
153167 context.foldingContext (), /* getLastComponent=*/ true };
154168 if (auto actualOffset{folder.FoldDesignator (actual)}) {
@@ -602,7 +616,18 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
602616 characteristics::DummyDataObject::Attr::DeducedFromActual)) {
603617 if (auto dummySize{evaluate::ToInt64 (evaluate::Fold (
604618 foldingContext, evaluate::GetSize (dummy.type .shape ())))}) {
605- if (actualRank == 0 && !actualIsAssumedRank) {
619+ if (actualIsAssumedRank) {
620+ if (!context.languageFeatures ().IsEnabled (
621+ common::LanguageFeature::AssumedRankPassedToNonAssumedRank)) {
622+ messages.Say (
623+ " Assumed-rank array may not be associated with a dummy argument that is not assumed-rank" _err_en_US);
624+ } else {
625+ context.Warn (
626+ common::LanguageFeature::AssumedRankPassedToNonAssumedRank,
627+ messages.at (),
628+ " Assumed-rank array should not be associated with a dummy argument that is not assumed-rank" _port_en_US);
629+ }
630+ } else if (actualRank == 0 ) {
606631 if (evaluate::IsArrayElement (actual)) {
607632 // Actual argument is a scalar array element
608633 evaluate::DesignatorFolder folder{
@@ -643,7 +668,7 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
643668 }
644669 }
645670 }
646- } else { // actualRank > 0 || actualIsAssumedRank
671+ } else {
647672 if (auto actualSize{evaluate::ToInt64 (evaluate::Fold (
648673 foldingContext, evaluate::GetSize (actualType.shape ())))};
649674 actualSize && *actualSize < *dummySize) {
0 commit comments