diff --git a/flang/lib/Evaluate/characteristics.cpp b/flang/lib/Evaluate/characteristics.cpp --- a/flang/lib/Evaluate/characteristics.cpp +++ b/flang/lib/Evaluate/characteristics.cpp @@ -530,15 +530,17 @@ [&](const semantics::ProcBindingDetails &binding) { if (auto result{CharacterizeProcedure( binding.symbol(), context, seenProcs)}) { + if (binding.symbol().attrs().test(semantics::Attr::INTRINSIC)) { + result->attrs.reset(Procedure::Attr::Elemental); + } if (!symbol.attrs().test(semantics::Attr::NOPASS)) { auto passName{binding.passName()}; for (auto &dummy : result->dummyArguments) { if (!passName || dummy.name.c_str() == *passName) { dummy.pass = true; - return result; + break; } } - DIE("PASS argument missing"); } return result; } else { diff --git a/flang/lib/Evaluate/tools.cpp b/flang/lib/Evaluate/tools.cpp --- a/flang/lib/Evaluate/tools.cpp +++ b/flang/lib/Evaluate/tools.cpp @@ -1247,7 +1247,8 @@ IsElementalProcedure(*procInterface); } } else if (const auto *details{symbol.detailsIf()}) { - return IsElementalProcedure(details->symbol()); + return !details->symbol().attrs().test(Attr::INTRINSIC) && + IsElementalProcedure(details->symbol()); } else if (!IsProcedure(symbol)) { return false; } diff --git a/flang/lib/Semantics/check-declarations.cpp b/flang/lib/Semantics/check-declarations.cpp --- a/flang/lib/Semantics/check-declarations.cpp +++ b/flang/lib/Semantics/check-declarations.cpp @@ -1661,7 +1661,7 @@ return; } if (!IsElementalProcedure(binding.symbol()) && - IsElementalProcedure(overriddenBinding->symbol())) { + IsElementalProcedure(*overridden)) { SayWithDeclaration(*overridden, "A type-bound procedure and its override must both, or neither, be ELEMENTAL"_err_en_US); return; @@ -1674,7 +1674,7 @@ : "A passed-argument type-bound procedure may not override a NOPASS procedure"_err_en_US); } else { const auto *bindingChars{Characterize(binding.symbol())}; - const auto *overriddenChars{Characterize(overriddenBinding->symbol())}; + const auto *overriddenChars{Characterize(*overridden)}; if (bindingChars && overriddenChars) { if (isNopass) { if (!bindingChars->CanOverride(*overriddenChars, std::nullopt)) {