diff --git a/flang/lib/Evaluate/tools.cpp b/flang/lib/Evaluate/tools.cpp --- a/flang/lib/Evaluate/tools.cpp +++ b/flang/lib/Evaluate/tools.cpp @@ -78,8 +78,11 @@ // IsVariable() auto IsVariableHelper::operator()(const Symbol &symbol) const -> Result { - const Symbol &root{GetAssociationRoot(symbol)}; - return !IsNamedConstant(root) && root.has(); + // ASSOCIATE(x => expr) -- x counts as a variable, but undefinable + const Symbol &ultimate{symbol.GetUltimate()}; + return !IsNamedConstant(ultimate) && + (ultimate.has() || + ultimate.has()); } auto IsVariableHelper::operator()(const Component &x) const -> Result { const Symbol &comp{x.GetLastSymbol()}; @@ -1263,15 +1266,10 @@ } bool IsVariableName(const Symbol &original) { - const Symbol &symbol{ResolveAssociations(original)}; - if (symbol.has()) { - return !IsNamedConstant(symbol); - } else if (const auto *assoc{symbol.detailsIf()}) { - const auto &expr{assoc->expr()}; - return expr && IsVariable(*expr) && !HasVectorSubscript(*expr); - } else { - return false; - } + const Symbol &ultimate{original.GetUltimate()}; + return !IsNamedConstant(ultimate) && + (ultimate.has() || + ultimate.has()); } bool IsPureProcedure(const Symbol &original) {