[flang-commits] [PATCH] D131104: [flang] Don't inherit ELEMENTAL attribute from intrinsics for TBP bindings
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Wed Aug 3 13:03:40 PDT 2022
klausler created this revision.
klausler added a reviewer: jeanPerier.
klausler added a project: Flang.
Herald added a subscriber: jdoerfert.
Herald added a project: All.
klausler requested review of this revision.
Type-bound procedure bindings that specify intrinsic procedures as their
interfaces should not acquire the ELEMENTAL attribute from the purposes
of compatibility checking between inherited bindings and their overrides
in extended derived types.
https://reviews.llvm.org/D131104
Files:
flang/lib/Evaluate/characteristics.cpp
flang/lib/Evaluate/tools.cpp
flang/lib/Semantics/check-declarations.cpp
Index: flang/lib/Semantics/check-declarations.cpp
===================================================================
--- flang/lib/Semantics/check-declarations.cpp
+++ 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)) {
Index: flang/lib/Evaluate/tools.cpp
===================================================================
--- flang/lib/Evaluate/tools.cpp
+++ flang/lib/Evaluate/tools.cpp
@@ -1247,7 +1247,8 @@
IsElementalProcedure(*procInterface);
}
} else if (const auto *details{symbol.detailsIf<ProcBindingDetails>()}) {
- return IsElementalProcedure(details->symbol());
+ return !details->symbol().attrs().test(Attr::INTRINSIC) &&
+ IsElementalProcedure(details->symbol());
} else if (!IsProcedure(symbol)) {
return false;
}
Index: flang/lib/Evaluate/characteristics.cpp
===================================================================
--- flang/lib/Evaluate/characteristics.cpp
+++ 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 {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D131104.449755.patch
Type: text/x-patch
Size: 2730 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20220803/9e10518b/attachment.bin>
More information about the flang-commits
mailing list