@@ -56,8 +56,8 @@ class FoldingContext;
56
56
// that can also be typeless values are encoded with an "elementalOrBOZ"
57
57
// rank pattern.
58
58
// Assumed-type (TYPE(*)) dummy arguments can be forwarded along to some
59
- // intrinsic functions that accept AnyType + Rank::anyOrAssumedRank or
60
- // AnyType + Kind::addressable.
59
+ // intrinsic functions that accept AnyType + Rank::anyOrAssumedRank,
60
+ // AnyType + Rank::arrayOrAssumedRank, or AnyType + Kind::addressable.
61
61
using CategorySet = common::EnumSet<TypeCategory, 8 >;
62
62
static constexpr CategorySet IntType{TypeCategory::Integer};
63
63
static constexpr CategorySet RealType{TypeCategory::Real};
@@ -203,7 +203,8 @@ ENUM_CLASS(Rank,
203
203
coarray, // rank is known and can be scalar; has nonzero corank
204
204
atom, // is scalar and has nonzero corank or is coindexed
205
205
known, // rank is known and can be scalar
206
- anyOrAssumedRank, // rank can be unknown; assumed-type TYPE(*) allowed
206
+ anyOrAssumedRank, // any rank, or assumed; assumed-type TYPE(*) allowed
207
+ arrayOrAssumedRank, // rank >= 1 or assumed; assumed-type TYPE(*) allowed
207
208
conformable, // scalar, or array of same rank & shape as "array" argument
208
209
reduceOperation, // a pure function with constraints for REDUCE
209
210
dimReduced, // scalar if no DIM= argument, else rank(array)-1
@@ -554,7 +555,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
554
555
{{" array" , AnyData, Rank::anyOrAssumedRank}, RequiredDIM,
555
556
SizeDefaultKIND},
556
557
KINDInt, Rank::scalar, IntrinsicClass::inquiryFunction},
557
- {" lbound" , {{" array" , AnyData, Rank::anyOrAssumedRank }, SizeDefaultKIND},
558
+ {" lbound" , {{" array" , AnyData, Rank::arrayOrAssumedRank }, SizeDefaultKIND},
558
559
KINDInt, Rank::vector, IntrinsicClass::inquiryFunction},
559
560
{" lcobound" ,
560
561
{{" coarray" , AnyData, Rank::coarray}, OptionalDIM, SizeDefaultKIND},
@@ -802,7 +803,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
802
803
{" sind" , {{" x" , SameFloating}}, SameFloating},
803
804
{" sinh" , {{" x" , SameFloating}}, SameFloating},
804
805
{" size" ,
805
- {{" array" , AnyData, Rank::anyOrAssumedRank },
806
+ {{" array" , AnyData, Rank::arrayOrAssumedRank },
806
807
OptionalDIM, // unless array is assumed-size
807
808
SizeDefaultKIND},
808
809
KINDInt, Rank::scalar, IntrinsicClass::inquiryFunction},
@@ -862,7 +863,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
862
863
{{" array" , AnyData, Rank::anyOrAssumedRank}, RequiredDIM,
863
864
SizeDefaultKIND},
864
865
KINDInt, Rank::scalar, IntrinsicClass::inquiryFunction},
865
- {" ubound" , {{" array" , AnyData, Rank::anyOrAssumedRank }, SizeDefaultKIND},
866
+ {" ubound" , {{" array" , AnyData, Rank::arrayOrAssumedRank }, SizeDefaultKIND},
866
867
KINDInt, Rank::vector, IntrinsicClass::inquiryFunction},
867
868
{" ucobound" ,
868
869
{{" coarray" , AnyData, Rank::coarray}, OptionalDIM, SizeDefaultKIND},
@@ -1689,7 +1690,8 @@ std::optional<SpecificCall> IntrinsicInterface::Match(
1689
1690
if (arg->GetAssumedTypeDummy ()) {
1690
1691
// TYPE(*) assumed-type dummy argument forwarded to intrinsic
1691
1692
if (d.typePattern .categorySet == AnyType &&
1692
- d.rank == Rank::anyOrAssumedRank &&
1693
+ (d.rank == Rank::anyOrAssumedRank ||
1694
+ d.rank == Rank::arrayOrAssumedRank) &&
1693
1695
(d.typePattern .kindCode == KindCode::any ||
1694
1696
d.typePattern .kindCode == KindCode::addressable)) {
1695
1697
continue ;
@@ -1871,7 +1873,8 @@ std::optional<SpecificCall> IntrinsicInterface::Match(
1871
1873
const IntrinsicDummyArgument &d{dummy[std::min (j, dummyArgPatterns - 1 )]};
1872
1874
if (const ActualArgument *arg{actualForDummy[j]}) {
1873
1875
bool isAssumedRank{IsAssumedRank (*arg)};
1874
- if (isAssumedRank && d.rank != Rank::anyOrAssumedRank) {
1876
+ if (isAssumedRank && d.rank != Rank::anyOrAssumedRank &&
1877
+ d.rank != Rank::arrayOrAssumedRank) {
1875
1878
messages.Say (arg->sourceLocation (),
1876
1879
" Assumed-rank array cannot be forwarded to '%s=' argument" _err_en_US,
1877
1880
d.keyword );
@@ -1949,6 +1952,11 @@ std::optional<SpecificCall> IntrinsicInterface::Match(
1949
1952
argOk = rank == knownArg->Rank ();
1950
1953
break ;
1951
1954
case Rank::anyOrAssumedRank:
1955
+ case Rank::arrayOrAssumedRank:
1956
+ if (d.rank == Rank::arrayOrAssumedRank && rank == 0 ) {
1957
+ argOk = false ;
1958
+ break ;
1959
+ }
1952
1960
if (!dimArg && rank > 0 && !isAssumedRank &&
1953
1961
(std::strcmp (name, " shape" ) == 0 ||
1954
1962
std::strcmp (name, " size" ) == 0 ||
@@ -2245,6 +2253,7 @@ std::optional<SpecificCall> IntrinsicInterface::Match(
2245
2253
case Rank::atom:
2246
2254
case Rank::known:
2247
2255
case Rank::anyOrAssumedRank:
2256
+ case Rank::arrayOrAssumedRank:
2248
2257
case Rank::reduceOperation:
2249
2258
case Rank::dimRemovedOrScalar:
2250
2259
common::die (" INTERNAL: bad Rank code on intrinsic '%s' result" , name);
0 commit comments