Skip to content

Commit

Permalink
[flang] Respect inaccessibility of type-bound ASSIGNMENT(=)
Browse files Browse the repository at this point in the history
When a derived type has a PRIVATE type-bound generic binding for
a defined ASSIGNMENT(=), don't use it in scopes outside of the
module that defines the type.  We already get this case right
for other type-bound generics, including defined operators,
and for non-type-bound generic interfaces, but the check was
not applied for this case.

Differential Revision: https://reviews.llvm.org/D143826
  • Loading branch information
klausler committed Feb 13, 2023
1 parent 5402110 commit 632fd9f
Showing 1 changed file with 6 additions and 8 deletions.
14 changes: 6 additions & 8 deletions flang/lib/Semantics/expression.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4038,18 +4038,16 @@ std::optional<ProcedureRef> ArgumentAnalyzer::GetDefinedAssignmentProc() {
auto restorer{context_.GetContextualMessages().DiscardMessages()};
if (const Symbol *symbol{scope.FindSymbol(oprName)}) {
ExpressionAnalyzer::AdjustActuals noAdjustment;
auto pair{context_.ResolveGeneric(*symbol, actuals_, noAdjustment, true)};
if (pair.first) {
proc = pair.first;
} else {
context_.EmitGenericResolutionError(*symbol, pair.second, true);
}
proc =
context_.ResolveGeneric(*symbol, actuals_, noAdjustment, true).first;
}
for (std::size_t i{0}; !proc && i < actuals_.size(); ++i) {
const Symbol *generic{nullptr};
if (const Symbol *binding{FindBoundOp(oprName, i, generic, true)}) {
if (const Symbol *resolution{
GetBindingResolution(GetType(i), *binding)}) {
if (CheckAccessibleSymbol(scope, DEREF(generic))) {
// ignore inaccessible type-bound ASSIGNMENT(=) generic
} else if (const Symbol *
resolution{GetBindingResolution(GetType(i), *binding)}) {
proc = resolution;
} else {
proc = binding;
Expand Down

0 comments on commit 632fd9f

Please sign in to comment.