diff --git a/flang/lib/Semantics/resolve-names-utils.cpp b/flang/lib/Semantics/resolve-names-utils.cpp index b8ce8d14a33fa..a838d49c06104 100644 --- a/flang/lib/Semantics/resolve-names-utils.cpp +++ b/flang/lib/Semantics/resolve-names-utils.cpp @@ -31,8 +31,6 @@ using common::NumericOperator; using common::RelationalOperator; using IntrinsicOperator = parser::DefinedOperator::IntrinsicOperator; -static constexpr const char *operatorPrefix{"operator("}; - static GenericKind MapIntrinsicOperator(IntrinsicOperator); Symbol *Resolve(const parser::Name &name, Symbol *symbol) { @@ -69,37 +67,6 @@ bool IsIntrinsicOperator( return false; } -template -std::forward_list GetOperatorNames( - const SemanticsContext &context, E opr) { - std::forward_list result; - for (const char *name : context.languageFeatures().GetNames(opr)) { - result.emplace_front(std::string{operatorPrefix} + name + ')'); - } - return result; -} - -std::forward_list GetAllNames( - const SemanticsContext &context, const SourceName &name) { - std::string str{name.ToString()}; - if (!name.empty() && name.end()[-1] == ')' && - name.ToString().rfind(std::string{operatorPrefix}, 0) == 0) { - for (int i{0}; i != common::LogicalOperator_enumSize; ++i) { - auto names{GetOperatorNames(context, LogicalOperator{i})}; - if (llvm::is_contained(names, str)) { - return names; - } - } - for (int i{0}; i != common::RelationalOperator_enumSize; ++i) { - auto names{GetOperatorNames(context, RelationalOperator{i})}; - if (llvm::is_contained(names, str)) { - return names; - } - } - } - return {str}; -} - bool IsLogicalConstant( const SemanticsContext &context, const SourceName &name) { std::string str{name.ToString()}; diff --git a/flang/lib/Semantics/resolve-names-utils.h b/flang/lib/Semantics/resolve-names-utils.h index 5b537d80e5f88..64784722ff4f8 100644 --- a/flang/lib/Semantics/resolve-names-utils.h +++ b/flang/lib/Semantics/resolve-names-utils.h @@ -51,11 +51,6 @@ parser::MessageFixedText WithSeverity( bool IsIntrinsicOperator(const SemanticsContext &, const SourceName &); bool IsLogicalConstant(const SemanticsContext &, const SourceName &); -// Some intrinsic operators have more than one name (e.g. `operator(.eq.)` and -// `operator(==)`). GetAllNames() returns them all, including symbolName. -std::forward_list GetAllNames( - const SemanticsContext &, const SourceName &); - template MaybeIntExpr EvaluateIntExpr(SemanticsContext &context, const T &expr) { if (MaybeExpr maybeExpr{ diff --git a/flang/lib/Semantics/tools.cpp b/flang/lib/Semantics/tools.cpp index 4d2a0a607abe8..379d5d0eb3eef 100644 --- a/flang/lib/Semantics/tools.cpp +++ b/flang/lib/Semantics/tools.cpp @@ -1654,6 +1654,37 @@ bool HasDefinedIo(common::DefinedIo which, const DerivedTypeSpec &derived, return parentType && HasDefinedIo(which, *parentType, scope); } +template +std::forward_list GetOperatorNames( + const SemanticsContext &context, E opr) { + std::forward_list result; + for (const char *name : context.languageFeatures().GetNames(opr)) { + result.emplace_front("operator("s + name + ')'); + } + return result; +} + +std::forward_list GetAllNames( + const SemanticsContext &context, const SourceName &name) { + std::string str{name.ToString()}; + if (!name.empty() && name.end()[-1] == ')' && + name.ToString().rfind("operator(", 0) == 0) { + for (int i{0}; i != common::LogicalOperator_enumSize; ++i) { + auto names{GetOperatorNames(context, common::LogicalOperator{i})}; + if (llvm::is_contained(names, str)) { + return names; + } + } + for (int i{0}; i != common::RelationalOperator_enumSize; ++i) { + auto names{GetOperatorNames(context, common::RelationalOperator{i})}; + if (llvm::is_contained(names, str)) { + return names; + } + } + } + return {str}; +} + void WarnOnDeferredLengthCharacterScalar(SemanticsContext &context, const SomeExpr *expr, parser::CharBlock at, const char *what) { if (context.languageFeatures().ShouldWarn(