From: Peter Klausler Date: Wed, 8 Feb 2023 18:44:20 +0000 (-0800) Subject: [flang] Respect inaccessibility of type-bound ASSIGNMENT(=) X-Git-Tag: upstream/17.0.6~17642 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=632fd9fb861c5deb24a6339d76f29a22462cadd8;p=platform%2Fupstream%2Fllvm.git [flang] Respect inaccessibility of type-bound ASSIGNMENT(=) 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 --- diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp index 8f20fc7..62f70f1c 100644 --- a/flang/lib/Semantics/expression.cpp +++ b/flang/lib/Semantics/expression.cpp @@ -4038,18 +4038,16 @@ std::optional 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;