Index: flang/docs/Extensions.md =================================================================== --- flang/docs/Extensions.md +++ flang/docs/Extensions.md @@ -88,6 +88,7 @@ from sharing the same name as a symbol in its scope's host, if it has one. We accept this usage with a portability warning. +* The argument to `RANDOM_NUMBER` may not be an assumed-size array. ## Extensions, deletions, and legacy features supported by default Index: flang/lib/Evaluate/intrinsics.cpp =================================================================== --- flang/lib/Evaluate/intrinsics.cpp +++ flang/lib/Evaluate/intrinsics.cpp @@ -226,7 +226,7 @@ defaultsToSameKind, // for MatchingDefaultKIND defaultsToSizeKind, // for SizeDefaultKIND defaultsToDefaultForResult, // for DefaultingKIND -) + notAssumedSize) struct IntrinsicDummyArgument { const char *keyword{nullptr}; @@ -811,8 +811,9 @@ Rank::scalar, IntrinsicClass::inquiryFunction}, {"spacing", {{"x", SameReal}}, SameReal}, {"spread", - {{"source", SameType, Rank::known}, RequiredDIM, - {"ncopies", AnyInt, Rank::scalar}}, + {{"source", SameType, Rank::known, Optionality::required, + common::Intent::In, {ArgFlag::notAssumedSize}}, + RequiredDIM, {"ncopies", AnyInt, Rank::scalar}}, SameType, Rank::rankPlus1, IntrinsicClass::transformationalFunction}, {"sqrt", {{"x", SameFloating}}, SameFloating}, {"stopped_images", {OptionalTEAM, SizeDefaultKIND}, KINDInt, Rank::vector, @@ -1364,7 +1365,7 @@ {}, Rank::elemental, IntrinsicClass::impureSubroutine}, {"random_number", {{"harvest", AnyReal, Rank::known, Optionality::required, - common::Intent::Out}}, + common::Intent::Out, {ArgFlag::notAssumedSize}}}, {}, Rank::elemental, IntrinsicClass::impureSubroutine}, {"random_seed", {{"size", DefaultInt, Rank::scalar, Optionality::optional, @@ -1687,6 +1688,16 @@ } } } + if (d.flags.test(ArgFlag::notAssumedSize)) { + if (auto named{ExtractNamedEntity(*arg)}) { + if (semantics::IsAssumedSizeArray(named->GetLastSymbol())) { + messages.Say(arg->sourceLocation(), + "The '%s=' argument to the intrinsic procedure '%s' may not be assumed-size"_err_en_US, + d.keyword, name); + return std::nullopt; + } + } + } if (arg->GetAssumedTypeDummy()) { // TYPE(*) assumed-type dummy argument forwarded to intrinsic if (d.typePattern.categorySet == AnyType && @@ -1971,8 +1982,7 @@ if (semantics::IsAssumedSizeArray(named->GetLastSymbol())) { if (strcmp(name, "shape") == 0) { messages.Say(arg->sourceLocation(), - "The '%s=' argument to the intrinsic function '%s' may not be assumed-size"_err_en_US, - d.keyword, name); + "The 'source=' argument to the intrinsic function 'shape' may not be assumed-size"_err_en_US); } else { messages.Say(arg->sourceLocation(), "A dim= argument is required for '%s' when the array is assumed-size"_err_en_US, Index: flang/test/Semantics/misc-intrinsics.f90 =================================================================== --- flang/test/Semantics/misc-intrinsics.f90 +++ flang/test/Semantics/misc-intrinsics.f90 @@ -13,6 +13,8 @@ print *, ubound(arg) !ERROR: The 'source=' argument to the intrinsic function 'shape' may not be assumed-size print *, shape(arg) + !ERROR: The 'harvest=' argument to the intrinsic procedure 'random_number' may not be assumed-size + call random_number(arg) !ERROR: missing mandatory 'dim=' argument print *, lbound(scalar) !ERROR: 'array=' argument has unacceptable rank 0