@@ -256,7 +256,8 @@ ENUM_CLASS(ArgFlag, none,
256
256
defaultsToSameKind, // for MatchingDefaultKIND
257
257
defaultsToSizeKind, // for SizeDefaultKIND
258
258
defaultsToDefaultForResult, // for DefaultingKIND
259
- notAssumedSize)
259
+ notAssumedSize,
260
+ onlyConstantInquiry) // e.g., PRECISION(X)
260
261
261
262
struct IntrinsicDummyArgument {
262
263
const char *keyword{nullptr };
@@ -398,7 +399,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
398
399
DefaultLogical},
399
400
{" bit_size" ,
400
401
{{" i" , SameIntOrUnsigned, Rank::anyOrAssumedRank, Optionality::required,
401
- common::Intent::In, {ArgFlag::canBeMoldNull}}},
402
+ common::Intent::In,
403
+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
402
404
SameInt, Rank::scalar, IntrinsicClass::inquiryFunction},
403
405
{" ble" ,
404
406
{{" i" , AnyIntOrUnsigned, Rank::elementalOrBOZ},
@@ -439,7 +441,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
439
441
{" digits" ,
440
442
{{" x" , AnyIntUnsignedOrReal, Rank::anyOrAssumedRank,
441
443
Optionality::required, common::Intent::In,
442
- {ArgFlag::canBeMoldNull}}},
444
+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry }}},
443
445
DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
444
446
{" dim" , {{" x" , OperandIntOrReal}, {" y" , OperandIntOrReal}},
445
447
OperandIntOrReal},
@@ -485,7 +487,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
485
487
IntrinsicClass::transformationalFunction},
486
488
{" epsilon" ,
487
489
{{" x" , SameReal, Rank::anyOrAssumedRank, Optionality::required,
488
- common::Intent::In, {ArgFlag::canBeMoldNull}}},
490
+ common::Intent::In,
491
+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
489
492
SameReal, Rank::scalar, IntrinsicClass::inquiryFunction},
490
493
{" erf" , {{" x" , SameReal}}, SameReal},
491
494
{" erfc" , {{" x" , SameReal}}, SameReal},
@@ -568,7 +571,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
568
571
{" huge" ,
569
572
{{" x" , SameIntUnsignedOrReal, Rank::anyOrAssumedRank,
570
573
Optionality::required, common::Intent::In,
571
- {ArgFlag::canBeMoldNull}}},
574
+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry }}},
572
575
SameIntUnsignedOrReal, Rank::scalar, IntrinsicClass::inquiryFunction},
573
576
{" hypot" , {{" x" , OperandReal}, {" y" , OperandReal}}, OperandReal},
574
577
{" iachar" , {{" c" , AnyChar}, DefaultingKIND}, KINDInt},
@@ -656,7 +659,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
656
659
{" jzext" , {{" i" , AnyInt}}, DefaultInt},
657
660
{" kind" ,
658
661
{{" x" , AnyIntrinsic, Rank::anyOrAssumedRank, Optionality::required,
659
- common::Intent::In, {ArgFlag::canBeMoldNull}}},
662
+ common::Intent::In,
663
+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
660
664
DefaultInt, Rank::elemental, IntrinsicClass::inquiryFunction},
661
665
{" lbound" ,
662
666
{{" array" , AnyData, Rank::anyOrAssumedRank}, RequiredDIM,
@@ -730,7 +734,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
730
734
SameCharNoLen},
731
735
{" maxexponent" ,
732
736
{{" x" , AnyReal, Rank::anyOrAssumedRank, Optionality::required,
733
- common::Intent::In, {ArgFlag::canBeMoldNull}}},
737
+ common::Intent::In,
738
+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
734
739
DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
735
740
{" maxloc" ,
736
741
{{" array" , AnyRelatable, Rank::array}, RequiredDIM, OptionalMASK,
@@ -775,7 +780,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
775
780
SameCharNoLen},
776
781
{" minexponent" ,
777
782
{{" x" , AnyReal, Rank::anyOrAssumedRank, Optionality::required,
778
- common::Intent::In, {ArgFlag::canBeMoldNull}}},
783
+ common::Intent::In,
784
+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
779
785
DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
780
786
{" minloc" ,
781
787
{{" array" , AnyRelatable, Rank::array}, RequiredDIM, OptionalMASK,
@@ -804,7 +810,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
804
810
{" nearest" , {{" x" , SameReal}, {" s" , AnyReal}}, SameReal},
805
811
{" new_line" ,
806
812
{{" a" , SameCharNoLen, Rank::anyOrAssumedRank, Optionality::required,
807
- common::Intent::In, {ArgFlag::canBeMoldNull}}},
813
+ common::Intent::In,
814
+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
808
815
SameCharNoLen, Rank::scalar, IntrinsicClass::inquiryFunction},
809
816
{" nint" , {{" a" , AnyReal}, DefaultingKIND}, KINDInt},
810
817
{" norm2" , {{" x" , SameReal, Rank::array}, RequiredDIM}, SameReal,
@@ -844,21 +851,25 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
844
851
SameNumeric, Rank::scalar, IntrinsicClass::transformationalFunction},
845
852
{" precision" ,
846
853
{{" x" , AnyFloating, Rank::anyOrAssumedRank, Optionality::required,
847
- common::Intent::In, {ArgFlag::canBeMoldNull}}},
854
+ common::Intent::In,
855
+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
848
856
DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
849
857
{" present" , {{" a" , Addressable, Rank::anyOrAssumedRank}}, DefaultLogical,
850
858
Rank::scalar, IntrinsicClass::inquiryFunction},
851
859
{" radix" ,
852
860
{{" x" , AnyIntOrReal, Rank::anyOrAssumedRank, Optionality::required,
853
- common::Intent::In, {ArgFlag::canBeMoldNull}}},
861
+ common::Intent::In,
862
+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
854
863
DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
855
864
{" range" ,
856
865
{{" x" , AnyNumeric, Rank::anyOrAssumedRank, Optionality::required,
857
- common::Intent::In, {ArgFlag::canBeMoldNull}}},
866
+ common::Intent::In,
867
+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
858
868
DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
859
869
{" rank" ,
860
870
{{" a" , AnyData, Rank::anyOrAssumedRank, Optionality::required,
861
- common::Intent::In, {ArgFlag::canBeMoldNull}}},
871
+ common::Intent::In,
872
+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
862
873
DefaultInt, Rank::scalar, IntrinsicClass::inquiryFunction},
863
874
{" real" , {{" a" , SameComplex, Rank::elemental}},
864
875
SameReal}, // 16.9.160(4)(ii)
@@ -987,7 +998,8 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
987
998
IntrinsicClass::transformationalFunction},
988
999
{" tiny" ,
989
1000
{{" x" , SameReal, Rank::anyOrAssumedRank, Optionality::required,
990
- common::Intent::In, {ArgFlag::canBeMoldNull}}},
1001
+ common::Intent::In,
1002
+ {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
991
1003
SameReal, Rank::scalar, IntrinsicClass::inquiryFunction},
992
1004
{" trailz" , {{" i" , AnyInt}}, DefaultInt},
993
1005
{" transfer" ,
@@ -1044,35 +1056,59 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
1044
1056
{" __builtin_ieee_next_up" , {{" x" , SameReal}}, SameReal},
1045
1057
{" __builtin_ieee_real" , {{" a" , AnyIntOrReal}, DefaultingKIND}, KINDReal},
1046
1058
{" __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},
1048
1062
{" __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},
1050
1066
{" __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},
1052
1070
{" __builtin_ieee_support_flag" ,
1053
1071
{{" 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}}},
1055
1075
DefaultLogical},
1056
1076
{" __builtin_ieee_support_halting" , {{" flag" , IeeeFlagType, Rank::scalar}},
1057
1077
DefaultLogical},
1058
1078
{" __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},
1060
1082
{" __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},
1062
1086
{" __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},
1064
1090
{" __builtin_ieee_support_rounding" ,
1065
1091
{{" 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}}},
1067
1095
DefaultLogical},
1068
1096
{" __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},
1070
1100
{" __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},
1072
1104
{" __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},
1074
1108
{" __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},
1076
1112
{" __builtin_numeric_storage_size" , {}, DefaultInt},
1077
1113
};
1078
1114
@@ -2671,6 +2707,10 @@ std::optional<SpecificCall> IntrinsicInterface::Match(
2671
2707
std::get_if<characteristics::DummyDataObject>(
2672
2708
&dc->u )}) {
2673
2709
dummyObject->type .set_corank (0 );
2710
+ if (d.flags .test (ArgFlag::onlyConstantInquiry)) {
2711
+ dummyObject->attrs .set (
2712
+ characteristics::DummyDataObject::Attr::OnlyIntrinsicInquiry);
2713
+ }
2674
2714
}
2675
2715
dummyArgs.emplace_back (std::move (*dc));
2676
2716
if (d.typePattern .kindCode == KindCode::same && !sameDummyArg) {
0 commit comments