Skip to content

Commit aa68dd5

Browse files
authored
[flang] Disable extension by default (#114875)
f18 allows, as an extension, an assumed-rank array to be associated with a dummy argument that is not assumed-rank. This usage is non-conforming and supported by only one other compiler, perhaps unintentionally. Disable the extension by default, but also make it controllable so that we can turn it back on later if it's really needed. (If it turns out to not appear in applications after more exposure, I'll remove it entirely.) Fixes #114080.
1 parent ba623e1 commit aa68dd5

File tree

4 files changed

+53
-4
lines changed

4 files changed

+53
-4
lines changed

flang/include/flang/Common/Fortran-features.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ ENUM_CLASS(LanguageFeature, BackslashEscapes, OldDebugLines,
5353
NonBindCInteroperability, CudaManaged, CudaUnified,
5454
PolymorphicActualAllocatableOrPointerToMonomorphicDummy, RelaxedPureDummy,
5555
UndefinableAsynchronousOrVolatileActual, AutomaticInMainProgram, PrintCptr,
56-
SavedLocalInSpecExpr, PrintNamelist)
56+
SavedLocalInSpecExpr, PrintNamelist, AssumedRankPassedToNonAssumedRank)
5757

5858
// Portability and suspicious usage warnings
5959
ENUM_CLASS(UsageWarning, Portability, PointerToUndefinable,

flang/lib/Common/Fortran-features.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ LanguageFeatureControl::LanguageFeatureControl() {
3030
disable_.set(LanguageFeature::LogicalAbbreviations);
3131
disable_.set(LanguageFeature::XOROperator);
3232
disable_.set(LanguageFeature::OldStyleParameter);
33+
// Possibly an accidental "feature" of nvfortran.
34+
disable_.set(LanguageFeature::AssumedRankPassedToNonAssumedRank);
3335
// These warnings are enabled by default, but only because they used
3436
// to be unconditional. TODO: prune this list
3537
warnLanguage_.set(LanguageFeature::ExponentMatchingKindParam);

flang/lib/Semantics/check-call.cpp

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {

flang/test/Semantics/call38.f90

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,3 +522,25 @@ subroutine test
522522
call scalar('a')
523523
end
524524
end
525+
526+
subroutine bug114080(arg, contigArg)
527+
character(*) :: arg(..)
528+
character(*), contiguous :: contigArg(..)
529+
interface
530+
subroutine sub1(arg1) bind(c)
531+
character(1) :: arg1(2,4)
532+
end subroutine
533+
end interface
534+
!ERROR: Assumed-rank character array may not be associated with a dummy argument that is not assumed-rank
535+
call sub1(arg)
536+
!ERROR: Assumed-rank character array may not be associated with a dummy argument that is not assumed-rank
537+
call sub1(contigArg)
538+
!ERROR: Assumed-rank character array may not be associated with a dummy argument that is not assumed-rank
539+
call sub2(arg)
540+
!ERROR: Assumed-rank character array may not be associated with a dummy argument that is not assumed-rank
541+
call sub2(contigArg)
542+
contains
543+
subroutine sub2(arg2)
544+
character(*) :: arg2(10)
545+
end subroutine sub2
546+
end subroutine

0 commit comments

Comments
 (0)