diff --git a/flang/include/flang/Semantics/semantics.h b/flang/include/flang/Semantics/semantics.h --- a/flang/include/flang/Semantics/semantics.h +++ b/flang/include/flang/Semantics/semantics.h @@ -145,6 +145,14 @@ return *this; } + bool anyDefinedIntrinsicOperator() const { + return anyDefinedIntrinsicOperator_; + } + SemanticsContext &set_anyDefinedIntrinsicOperator(bool yes = true) { + anyDefinedIntrinsicOperator_ = yes; + return *this; + } + const DeclTypeSpec &MakeNumericType(TypeCategory, int kind = 0); const DeclTypeSpec &MakeLogicalType(int kind = 0); @@ -270,6 +278,7 @@ const Scope *builtinsScope_{nullptr}; // module __Fortran_builtins std::list modFileParseTrees_; std::unique_ptr commonBlockMap_; + bool anyDefinedIntrinsicOperator_{false}; }; class Semantics { diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp --- a/flang/lib/Semantics/expression.cpp +++ b/flang/lib/Semantics/expression.cpp @@ -3411,7 +3411,7 @@ if (expr.typedExpr) { return expr.typedExpr->v; } - if (!wasIterativelyAnalyzing) { + if (!wasIterativelyAnalyzing && !context_.anyDefinedIntrinsicOperator()) { iterativelyAnalyzingSubexpressions_ = true; result = IterativelyAnalyzeSubexpressions(expr); } diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -3176,6 +3176,11 @@ if (auto *symbol{FindInScope(GenericSpecInfo{x}.symbolName())}) { SetGenericSymbol(*symbol); } + if (const auto *opr{std::get_if(&x.u)}; opr && + std::holds_alternative( + opr->u)) { + context().set_anyDefinedIntrinsicOperator(true); + } return false; }