@@ -135,6 +135,20 @@ static void CheckCharacterActual(evaluate::Expr<evaluate::SomeType> &actual,
135
135
dummy.type .type ().kind () == actualType.type ().kind () &&
136
136
!dummy.attrs .test (
137
137
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
+ }
138
152
if (dummy.type .LEN () && actualType.LEN ()) {
139
153
evaluate::FoldingContext &foldingContext{context.foldingContext ()};
140
154
auto dummyLength{
@@ -148,7 +162,7 @@ static void CheckCharacterActual(evaluate::Expr<evaluate::SomeType> &actual,
148
162
if (auto dummySize{evaluate::ToInt64 (evaluate::Fold (
149
163
foldingContext, evaluate::GetSize (dummy.type .shape ())))}) {
150
164
auto dummyChars{*dummySize * *dummyLength};
151
- if (actualType.Rank () == 0 ) {
165
+ if (actualType.Rank () == 0 && !actualIsAssumedRank ) {
152
166
evaluate::DesignatorFolder folder{
153
167
context.foldingContext (), /* getLastComponent=*/ true };
154
168
if (auto actualOffset{folder.FoldDesignator (actual)}) {
@@ -602,7 +616,18 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
602
616
characteristics::DummyDataObject::Attr::DeducedFromActual)) {
603
617
if (auto dummySize{evaluate::ToInt64 (evaluate::Fold (
604
618
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 ) {
606
631
if (evaluate::IsArrayElement (actual)) {
607
632
// Actual argument is a scalar array element
608
633
evaluate::DesignatorFolder folder{
@@ -643,7 +668,7 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
643
668
}
644
669
}
645
670
}
646
- } else { // actualRank > 0 || actualIsAssumedRank
671
+ } else {
647
672
if (auto actualSize{evaluate::ToInt64 (evaluate::Fold (
648
673
foldingContext, evaluate::GetSize (actualType.shape ())))};
649
674
actualSize && *actualSize < *dummySize) {
0 commit comments