@@ -2891,7 +2891,8 @@ parser::Messages CheckHelper::WhyNotInteroperableDerivedType(
2891
2891
} else {
2892
2892
bool interoperableParent{true };
2893
2893
if (parent->symbol ()) {
2894
- auto bad{WhyNotInteroperableDerivedType (*parent->symbol (), false )};
2894
+ auto bad{WhyNotInteroperableDerivedType (
2895
+ *parent->symbol (), /* isError=*/ false )};
2895
2896
if (bad.AnyFatalError ()) {
2896
2897
auto &msg{msgs.Say (symbol.name (),
2897
2898
" The parent of an interoperable type is not interoperable" _err_en_US)};
@@ -2981,6 +2982,9 @@ parser::Messages CheckHelper::WhyNotInteroperableDerivedType(
2981
2982
}
2982
2983
}
2983
2984
}
2985
+ if (msgs.AnyFatalError ()) {
2986
+ examinedByWhyNotInteroperableDerivedType_.erase (symbol);
2987
+ }
2984
2988
return msgs;
2985
2989
}
2986
2990
@@ -3068,16 +3072,18 @@ void CheckHelper::CheckBindC(const Symbol &symbol) {
3068
3072
}
3069
3073
context_.SetError (symbol);
3070
3074
} else if (auto bad{WhyNotInteroperableDerivedType (
3071
- derived->typeSymbol (), false )};
3072
- ! bad.empty ()) {
3075
+ derived->typeSymbol (), /* isError= */ false )};
3076
+ bad.AnyFatalError ()) {
3073
3077
if (auto *msg{messages_.Say (symbol.name (),
3074
3078
" The derived type of an interoperable object must be interoperable, but is not" _err_en_US)}) {
3075
3079
msg->Attach (
3076
3080
derived->typeSymbol ().name (), " Non-interoperable type" _en_US);
3077
3081
bad.AttachTo (*msg, parser::Severity::None);
3078
3082
}
3079
3083
context_.SetError (symbol);
3080
- } else {
3084
+ } else if (context_.ShouldWarn (
3085
+ common::LanguageFeature::NonBindCInteroperability) &&
3086
+ !InModuleFile ()) {
3081
3087
if (auto *msg{messages_.Say (symbol.name (),
3082
3088
" The derived type of an interoperable object should be BIND(C)" _warn_en_US)}) {
3083
3089
msg->Attach (derived->typeSymbol ().name (), " Non-BIND(C) type" _en_US);
@@ -3151,7 +3157,7 @@ void CheckHelper::CheckBindC(const Symbol &symbol) {
3151
3157
}
3152
3158
}
3153
3159
} else if (symbol.has <DerivedTypeDetails>()) {
3154
- if (auto msgs{WhyNotInteroperableDerivedType (symbol, false )};
3160
+ if (auto msgs{WhyNotInteroperableDerivedType (symbol, /* isError= */ false )};
3155
3161
!msgs.empty ()) {
3156
3162
bool anyFatal{msgs.AnyFatalError ()};
3157
3163
if (msgs.AnyFatalError () ||
0 commit comments