@@ -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},
@@ -568,7 +571,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
568571 {" huge" ,
569572 {{" x" , SameIntUnsignedOrReal, Rank::anyOrAssumedRank,
570573 Optionality::required, common::Intent::In,
571- {ArgFlag::canBeMoldNull}}},
574+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry }}},
572575 SameIntUnsignedOrReal, Rank::scalar, IntrinsicClass::inquiryFunction},
573576 {" hypot" , {{" x" , OperandReal}, {" y" , OperandReal}}, OperandReal},
574577 {" iachar" , {{" c" , AnyChar}, DefaultingKIND}, KINDInt},
@@ -656,7 +659,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
656659 {" jzext" , {{" i" , AnyInt}}, DefaultInt},
657660 {" kind" ,
658661 {{" x" , AnyIntrinsic, Rank::anyOrAssumedRank, Optionality::required,
659- common::Intent::In, {ArgFlag::canBeMoldNull}}},
662+ common::Intent::In,
663+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
660664 DefaultInt, Rank::elemental, IntrinsicClass::inquiryFunction},
661665 {" lbound" ,
662666 {{" array" , AnyData, Rank::anyOrAssumedRank}, RequiredDIM,
@@ -730,7 +734,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
730734 SameCharNoLen},
731735 {" maxexponent" ,
732736 {{" x" , AnyReal, Rank::anyOrAssumedRank, Optionality::required,
733- common::Intent::In, {ArgFlag::canBeMoldNull}}},
737+ common::Intent::In,
738+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
734739 DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
735740 {" maxloc" ,
736741 {{" array" , AnyRelatable, Rank::array}, RequiredDIM, OptionalMASK,
@@ -775,7 +780,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
775780 SameCharNoLen},
776781 {" minexponent" ,
777782 {{" x" , AnyReal, Rank::anyOrAssumedRank, Optionality::required,
778- common::Intent::In, {ArgFlag::canBeMoldNull}}},
783+ common::Intent::In,
784+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
779785 DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
780786 {" minloc" ,
781787 {{" array" , AnyRelatable, Rank::array}, RequiredDIM, OptionalMASK,
@@ -804,7 +810,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
804810 {" nearest" , {{" x" , SameReal}, {" s" , AnyReal}}, SameReal},
805811 {" new_line" ,
806812 {{" a" , SameCharNoLen, Rank::anyOrAssumedRank, Optionality::required,
807- common::Intent::In, {ArgFlag::canBeMoldNull}}},
813+ common::Intent::In,
814+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
808815 SameCharNoLen, Rank::scalar, IntrinsicClass::inquiryFunction},
809816 {" nint" , {{" a" , AnyReal}, DefaultingKIND}, KINDInt},
810817 {" norm2" , {{" x" , SameReal, Rank::array}, RequiredDIM}, SameReal,
@@ -844,21 +851,25 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
844851 SameNumeric, Rank::scalar, IntrinsicClass::transformationalFunction},
845852 {" precision" ,
846853 {{" x" , AnyFloating, Rank::anyOrAssumedRank, Optionality::required,
847- common::Intent::In, {ArgFlag::canBeMoldNull}}},
854+ common::Intent::In,
855+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
848856 DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
849857 {" present" , {{" a" , Addressable, Rank::anyOrAssumedRank}}, DefaultLogical,
850858 Rank::scalar, IntrinsicClass::inquiryFunction},
851859 {" radix" ,
852860 {{" x" , AnyIntOrReal, Rank::anyOrAssumedRank, Optionality::required,
853- common::Intent::In, {ArgFlag::canBeMoldNull}}},
861+ common::Intent::In,
862+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
854863 DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
855864 {" range" ,
856865 {{" x" , AnyNumeric, Rank::anyOrAssumedRank, Optionality::required,
857- common::Intent::In, {ArgFlag::canBeMoldNull}}},
866+ common::Intent::In,
867+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
858868 DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
859869 {" rank" ,
860870 {{" a" , AnyData, Rank::anyOrAssumedRank, Optionality::required,
861- common::Intent::In, {ArgFlag::canBeMoldNull}}},
871+ common::Intent::In,
872+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
862873 DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
863874 {" real" , {{" a" , SameComplex, Rank::elemental}},
864875 SameReal}, // 16.9.160(4)(ii)
@@ -987,7 +998,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
987998 IntrinsicClass::transformationalFunction},
988999 {" tiny" ,
9891000 {{" x" , SameReal, Rank::anyOrAssumedRank, Optionality::required,
990- common::Intent::In, {ArgFlag::canBeMoldNull}}},
1001+ common::Intent::In,
1002+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
9911003 SameReal, Rank::scalar, IntrinsicClass::inquiryFunction},
9921004 {" trailz" , {{" i" , AnyInt}}, DefaultInt},
9931005 {" transfer" ,
@@ -1044,35 +1056,59 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
10441056 {" __builtin_ieee_next_up" , {{" x" , SameReal}}, SameReal},
10451057 {" __builtin_ieee_real" , {{" a" , AnyIntOrReal}, DefaultingKIND}, KINDReal},
10461058 {" __builtin_ieee_support_datatype" ,
1047- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1059+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1060+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1061+ DefaultLogical},
10481062 {" __builtin_ieee_support_denormal" ,
1049- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1063+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1064+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1065+ DefaultLogical},
10501066 {" __builtin_ieee_support_divide" ,
1051- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1067+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1068+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1069+ DefaultLogical},
10521070 {" __builtin_ieee_support_flag" ,
10531071 {{" flag" , IeeeFlagType, Rank::scalar},
1054- {" x" , AnyReal, Rank::known, Optionality::optional}},
1072+ {" x" , AnyReal, Rank::known, Optionality::optional,
1073+ common::Intent::In,
1074+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
10551075 DefaultLogical},
10561076 {" __builtin_ieee_support_halting" , {{" flag" , IeeeFlagType, Rank::scalar}},
10571077 DefaultLogical},
10581078 {" __builtin_ieee_support_inf" ,
1059- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1079+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1080+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1081+ DefaultLogical},
10601082 {" __builtin_ieee_support_io" ,
1061- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1083+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1084+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1085+ DefaultLogical},
10621086 {" __builtin_ieee_support_nan" ,
1063- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1087+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1088+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1089+ DefaultLogical},
10641090 {" __builtin_ieee_support_rounding" ,
10651091 {{" round_value" , IeeeRoundType, Rank::scalar},
1066- {" x" , AnyReal, Rank::known, Optionality::optional}},
1092+ {" x" , AnyReal, Rank::known, Optionality::optional,
1093+ common::Intent::In,
1094+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
10671095 DefaultLogical},
10681096 {" __builtin_ieee_support_sqrt" ,
1069- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1097+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1098+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1099+ DefaultLogical},
10701100 {" __builtin_ieee_support_standard" ,
1071- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1101+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1102+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1103+ DefaultLogical},
10721104 {" __builtin_ieee_support_subnormal" ,
1073- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1105+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1106+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1107+ DefaultLogical},
10741108 {" __builtin_ieee_support_underflow_control" ,
1075- {{" x" , AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
1109+ {{" x" , AnyReal, Rank::known, Optionality::optional, common::Intent::In,
1110+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
1111+ DefaultLogical},
10761112 {" __builtin_numeric_storage_size" , {}, DefaultInt},
10771113};
10781114
@@ -2671,6 +2707,10 @@ std::optional<SpecificCall> IntrinsicInterface::Match(
26712707 std::get_if<characteristics::DummyDataObject>(
26722708 &dc->u )}) {
26732709 dummyObject->type .set_corank (0 );
2710+ if (d.flags .test (ArgFlag::onlyConstantInquiry)) {
2711+ dummyObject->attrs .set (
2712+ characteristics::DummyDataObject::Attr::OnlyIntrinsicInquiry);
2713+ }
26742714 }
26752715 dummyArgs.emplace_back (std::move (*dc));
26762716 if (d.typePattern .kindCode == KindCode::same && !sameDummyArg) {
0 commit comments