@@ -256,7 +256,8 @@ ENUM_CLASS(ArgFlag, none,
256256 defaultsToSameKind, // for MatchingDefaultKIND
257257 defaultsToSizeKind, // for SizeDefaultKIND
258258 defaultsToDefaultForResult, // for DefaultingKIND
259- notAssumedSize)
259+ notAssumedSize,
260+ onlyConstantInquiry) // e.g., PRECISION(X)
260261
261262struct IntrinsicDummyArgument {
262263 const char *keyword{nullptr };
@@ -398,7 +399,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
398399 DefaultLogical},
399400 {" bit_size" ,
400401 {{" i" , SameIntOrUnsigned, Rank::anyOrAssumedRank, Optionality::required,
401- common::Intent::In, {ArgFlag::canBeMoldNull}}},
402+ common::Intent::In,
403+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
402404 SameInt, Rank::scalar, IntrinsicClass::inquiryFunction},
403405 {" ble" ,
404406 {{" i" , AnyIntOrUnsigned, Rank::elementalOrBOZ},
@@ -439,7 +441,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
439441 {" digits" ,
440442 {{" x" , AnyIntUnsignedOrReal, Rank::anyOrAssumedRank,
441443 Optionality::required, common::Intent::In,
442- {ArgFlag::canBeMoldNull}}},
444+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry }}},
443445 DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
444446 {" dim" , {{" x" , OperandIntOrReal}, {" y" , OperandIntOrReal}},
445447 OperandIntOrReal},
@@ -485,7 +487,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
485487 IntrinsicClass::transformationalFunction},
486488 {" epsilon" ,
487489 {{" x" , SameReal, Rank::anyOrAssumedRank, Optionality::required,
488- common::Intent::In, {ArgFlag::canBeMoldNull}}},
490+ common::Intent::In,
491+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
489492 SameReal, Rank::scalar, IntrinsicClass::inquiryFunction},
490493 {" erf" , {{" x" , SameReal}}, SameReal},
491494 {" erfc" , {{" x" , SameReal}}, SameReal},
@@ -562,7 +565,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
562565 {" huge" ,
563566 {{" x" , SameIntUnsignedOrReal, Rank::anyOrAssumedRank,
564567 Optionality::required, common::Intent::In,
565- {ArgFlag::canBeMoldNull}}},
568+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry }}},
566569 SameIntUnsignedOrReal, Rank::scalar, IntrinsicClass::inquiryFunction},
567570 {" hypot" , {{" x" , OperandReal}, {" y" , OperandReal}}, OperandReal},
568571 {" iachar" , {{" c" , AnyChar}, DefaultingKIND}, KINDInt},
@@ -650,7 +653,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
650653 {" jzext" , {{" i" , AnyInt}}, DefaultInt},
651654 {" kind" ,
652655 {{" x" , AnyIntrinsic, Rank::anyOrAssumedRank, Optionality::required,
653- common::Intent::In, {ArgFlag::canBeMoldNull}}},
656+ common::Intent::In,
657+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
654658 DefaultInt, Rank::elemental, IntrinsicClass::inquiryFunction},
655659 {" lbound" ,
656660 {{" array" , AnyData, Rank::anyOrAssumedRank}, RequiredDIM,
@@ -724,7 +728,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
724728 SameCharNoLen},
725729 {" maxexponent" ,
726730 {{" x" , AnyReal, Rank::anyOrAssumedRank, Optionality::required,
727- common::Intent::In, {ArgFlag::canBeMoldNull}}},
731+ common::Intent::In,
732+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
728733 DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
729734 {" maxloc" ,
730735 {{" array" , AnyRelatable, Rank::array}, RequiredDIM, OptionalMASK,
@@ -769,7 +774,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
769774 SameCharNoLen},
770775 {" minexponent" ,
771776 {{" x" , AnyReal, Rank::anyOrAssumedRank, Optionality::required,
772- common::Intent::In, {ArgFlag::canBeMoldNull}}},
777+ common::Intent::In,
778+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
773779 DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
774780 {" minloc" ,
775781 {{" array" , AnyRelatable, Rank::array}, RequiredDIM, OptionalMASK,
@@ -798,7 +804,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
798804 {" nearest" , {{" x" , SameReal}, {" s" , AnyReal}}, SameReal},
799805 {" new_line" ,
800806 {{" a" , SameCharNoLen, Rank::anyOrAssumedRank, Optionality::required,
801- common::Intent::In, {ArgFlag::canBeMoldNull}}},
807+ common::Intent::In,
808+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
802809 SameCharNoLen, Rank::scalar, IntrinsicClass::inquiryFunction},
803810 {" nint" , {{" a" , AnyReal}, DefaultingKIND}, KINDInt},
804811 {" norm2" , {{" x" , SameReal, Rank::array}, RequiredDIM}, SameReal,
@@ -838,21 +845,25 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
838845 SameNumeric, Rank::scalar, IntrinsicClass::transformationalFunction},
839846 {" precision" ,
840847 {{" x" , AnyFloating, Rank::anyOrAssumedRank, Optionality::required,
841- common::Intent::In, {ArgFlag::canBeMoldNull}}},
848+ common::Intent::In,
849+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
842850 DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
843851 {" present" , {{" a" , Addressable, Rank::anyOrAssumedRank}}, DefaultLogical,
844852 Rank::scalar, IntrinsicClass::inquiryFunction},
845853 {" radix" ,
846854 {{" x" , AnyIntOrReal, Rank::anyOrAssumedRank, Optionality::required,
847- common::Intent::In, {ArgFlag::canBeMoldNull}}},
855+ common::Intent::In,
856+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
848857 DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
849858 {" range" ,
850859 {{" x" , AnyNumeric, Rank::anyOrAssumedRank, Optionality::required,
851- common::Intent::In, {ArgFlag::canBeMoldNull}}},
860+ common::Intent::In,
861+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
852862 DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
853863 {" rank" ,
854864 {{" a" , AnyData, Rank::anyOrAssumedRank, Optionality::required,
855- common::Intent::In, {ArgFlag::canBeMoldNull}}},
865+ common::Intent::In,
866+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
856867 DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
857868 {" real" , {{" a" , SameComplex, Rank::elemental}},
858869 SameReal}, // 16.9.160(4)(ii)
@@ -979,7 +990,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
979990 IntrinsicClass::transformationalFunction},
980991 {" tiny" ,
981992 {{" x" , SameReal, Rank::anyOrAssumedRank, Optionality::required,
982- common::Intent::In, {ArgFlag::canBeMoldNull}}},
993+ common::Intent::In,
994+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
983995 SameReal, Rank::scalar, IntrinsicClass::inquiryFunction},
984996 {" trailz" , {{" i" , AnyInt}}, DefaultInt},
985997 {" transfer" ,
@@ -1034,35 +1046,59 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
10341046 {" __builtin_ieee_next_up" , {{" x" , SameReal}}, SameReal},
10351047 {" __builtin_ieee_real" , {{" a" , AnyIntOrReal}, DefaultingKIND}, KINDReal},
10361048 {" __builtin_ieee_support_datatype" ,
1037- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1049+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1050+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1051+ DefaultLogical},
10381052 {" __builtin_ieee_support_denormal" ,
1039- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1053+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1054+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1055+ DefaultLogical},
10401056 {" __builtin_ieee_support_divide" ,
1041- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1057+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1058+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1059+ DefaultLogical},
10421060 {" __builtin_ieee_support_flag" ,
10431061 {{" flag" , IeeeFlagType, Rank::scalar},
1044- {" x" , AnyReal, Rank::known, Optionality::optional}},
1062+ {" x" , AnyReal, Rank::known, Optionality::optional,
1063+ common::Intent::In,
1064+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
10451065 DefaultLogical},
10461066 {" __builtin_ieee_support_halting" , {{" flag" , IeeeFlagType, Rank::scalar}},
10471067 DefaultLogical},
10481068 {" __builtin_ieee_support_inf" ,
1049- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1069+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1070+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1071+ DefaultLogical},
10501072 {" __builtin_ieee_support_io" ,
1051- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1073+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1074+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1075+ DefaultLogical},
10521076 {" __builtin_ieee_support_nan" ,
1053- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1077+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1078+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1079+ DefaultLogical},
10541080 {" __builtin_ieee_support_rounding" ,
10551081 {{" round_value" , IeeeRoundType, Rank::scalar},
1056- {" x" , AnyReal, Rank::known, Optionality::optional}},
1082+ {" x" , AnyReal, Rank::known, Optionality::optional,
1083+ common::Intent::In,
1084+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
10571085 DefaultLogical},
10581086 {" __builtin_ieee_support_sqrt" ,
1059- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1087+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1088+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1089+ DefaultLogical},
10601090 {" __builtin_ieee_support_standard" ,
1061- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1091+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1092+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1093+ DefaultLogical},
10621094 {" __builtin_ieee_support_subnormal" ,
1063- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1095+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1096+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1097+ DefaultLogical},
10641098 {" __builtin_ieee_support_underflow_control" ,
1065- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1099+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1100+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1101+ DefaultLogical},
10661102 {" __builtin_numeric_storage_size" , {}, DefaultInt},
10671103};
10681104
@@ -2637,6 +2673,10 @@ std::optional<SpecificCall> IntrinsicInterface::Match(
26372673 std::get_if<characteristics::DummyDataObject>(
26382674 &dc->u )}) {
26392675 dummyObject->type .set_corank (0 );
2676+ if (d.flags .test (ArgFlag::onlyConstantInquiry)) {
2677+ dummyObject->attrs .set (
2678+ characteristics::DummyDataObject::Attr::OnlyIntrinsicInquiry);
2679+ }
26402680 }
26412681 dummyArgs.emplace_back (std::move (*dc));
26422682 if (d.typePattern .kindCode == KindCode::same && !sameDummyArg) {
0 commit comments