Lines Matching full:symbol
17 #include "flang/Semantics/symbol.h"
46 const Scope &GetTopLevelUnitContaining(const Symbol &symbol) {
47 return GetTopLevelUnitContaining(symbol.owner());
81 const Scope &GetProgramUnitContaining(const Symbol &symbol) {
82 return GetProgramUnitContaining(symbol.owner());
101 const Scope &GetProgramUnitOrBlockConstructContaining(const Symbol &symbol) {
102 return GetProgramUnitOrBlockConstructContaining(symbol.owner());
212 bool IsGenericDefinedOp(const Symbol &symbol) {
213 const Symbol &ultimate{symbol.GetUltimate()};
236 bool IsCommonBlockContaining(const Symbol &block, const Symbol &object) {
241 bool IsUseAssociated(const Symbol &symbol, const Scope &scope) {
242 const Scope &owner{GetTopLevelUnitContaining(symbol.GetUltimate().owner())};
254 bool DoesScopeContain(const Scope *maybeAncestor, const Symbol &symbol) {
255 return DoesScopeContain(maybeAncestor, symbol.owner());
258 static const Symbol &FollowHostAssoc(const Symbol &symbol) {
259 for (const Symbol *s{&symbol};;) {
264 s = &details->symbol();
268 bool IsHostAssociated(const Symbol &symbol, const Scope &scope) {
269 const Symbol &base{FollowHostAssoc(symbol)};
275 bool IsHostAssociatedIntoSubprogram(const Symbol &symbol, const Scope &scope) {
276 const Symbol &base{FollowHostAssoc(symbol)};
282 bool IsInStmtFunction(const Symbol &symbol) {
283 if (const Symbol * function{symbol.owner().symbol()}) {
289 bool IsStmtFunctionDummy(const Symbol &symbol) {
290 return IsDummy(symbol) && IsInStmtFunction(symbol);
293 bool IsStmtFunctionResult(const Symbol &symbol) {
294 return IsFunctionResult(symbol) && IsInStmtFunction(symbol);
297 bool IsPointerDummy(const Symbol &symbol) {
298 return IsPointer(symbol) && IsDummy(symbol);
301 bool IsBindCProcedure(const Symbol &original) {
302 const Symbol &symbol{original.GetUltimate()};
303 if (const auto *procDetails{symbol.detailsIf<ProcEntityDetails>()}) {
309 return symbol.attrs().test(Attr::BIND_C) && IsProcedure(symbol);
313 if (const Symbol * symbol{scope.GetSymbol()}) {
314 return IsBindCProcedure(*symbol);
320 static const Symbol *FindPointerComponent(
331 const Symbol &symbol{*pair.second};
332 if (IsPointer(symbol)) {
333 return &symbol;
337 const Symbol &symbol{*pair.second};
338 if (const auto *details{symbol.detailsIf<ObjectEntityDetails>()}) {
342 if (const Symbol *
354 const Symbol *FindPointerComponent(const Scope &scope) {
359 const Symbol *FindPointerComponent(const DerivedTypeSpec &derived) {
367 const Symbol *FindPointerComponent(const DeclTypeSpec &type) {
375 const Symbol *FindPointerComponent(const DeclTypeSpec *type) {
379 const Symbol *FindPointerComponent(const Symbol &symbol) {
380 return IsPointer(symbol) ? &symbol : FindPointerComponent(symbol.GetType());
384 const Symbol *FindExternallyVisibleObject(
385 const Symbol &object, const Scope &scope, bool isPointerDefinition) {
388 const Symbol &ultimate{GetAssociationRoot(object)};
402 } else if (const Symbol * block{FindCommonBlockContaining(ultimate)}) {
408 const Symbol &BypassGeneric(const Symbol &symbol) {
409 const Symbol &ultimate{symbol.GetUltimate()};
411 if (const Symbol * specific{generic->specific()}) {
415 return symbol;
418 const Symbol &GetCrayPointer(const Symbol &crayPointee) {
419 const Symbol *found{nullptr};
488 const Symbol *FindInterface(const Symbol &symbol) {
492 const Symbol *interface{details.procInterface()};
496 return FindInterface(details.symbol());
498 [&](const SubprogramDetails &) { return &symbol; },
500 return FindInterface(details.symbol());
503 return FindInterface(details.symbol());
509 [](const auto &) -> const Symbol * { return nullptr; },
511 symbol.details());
514 const Symbol *FindSubprogram(const Symbol &symbol) {
517 [&](const ProcEntityDetails &details) -> const Symbol * {
521 return &symbol;
525 return FindSubprogram(details.symbol());
527 [&](const SubprogramDetails &) { return &symbol; },
529 return FindSubprogram(details.symbol());
532 return FindSubprogram(details.symbol());
538 [](const auto &) -> const Symbol * { return nullptr; },
540 symbol.details());
543 const Symbol *FindOverriddenBinding(
544 const Symbol &symbol, bool &isInaccessibleDeferred) {
546 if (symbol.has<ProcBindingDetails>()) {
547 if (const DeclTypeSpec * parentType{FindParentTypeSpec(symbol.owner())}) {
550 if (const Symbol *
551 overridden{parentScope->FindComponent(symbol.name())}) {
553 if (IsAccessible(*overridden, symbol.owner())) {
567 const Symbol *FindGlobal(const Symbol &original) {
568 const Symbol &ultimate{original.GetUltimate()};
586 const Symbol &global{*iter->second};
611 if (const auto *symbol{scope.symbol()}) {
612 return FindParentTypeSpec(*symbol);
618 const DeclTypeSpec *FindParentTypeSpec(const Symbol &symbol) {
619 if (const Scope * scope{symbol.scope()}) {
620 if (const auto *details{symbol.detailsIf<DerivedTypeDetails>()}) {
621 if (const Symbol * parent{details->GetParentComponent(*scope)}) {
629 const EquivalenceSet *FindEquivalenceSet(const Symbol &symbol) {
630 const Symbol &ultimate{symbol.GetUltimate()};
633 if (object.symbol == ultimate) {
641 bool IsOrContainsEventOrLockComponent(const Symbol &original) {
642 const Symbol &symbol{ResolveAssociations(original)};
643 if (const auto *details{symbol.detailsIf<ObjectEntityDetails>()}) {
654 // Check this symbol suitable as a type-bound procedure - C769
655 bool CanBeTypeBoundProc(const Symbol &symbol) {
656 if (IsDummy(symbol) || IsProcedurePointer(symbol)) {
658 } else if (symbol.has<SubprogramNameDetails>()) {
659 return symbol.owner().kind() == Scope::Kind::Module;
660 } else if (auto *details{symbol.detailsIf<SubprogramDetails>()}) {
662 return !symbol.attrs().test(Attr::ABSTRACT);
664 return symbol.owner().kind() == Scope::Kind::Module;
666 } else if (const auto *proc{symbol.detailsIf<ProcEntityDetails>()}) {
667 return !symbol.attrs().test(Attr::INTRINSIC) &&
674 bool HasDeclarationInitializer(const Symbol &symbol) {
675 if (IsNamedConstant(symbol)) {
677 } else if (const auto *object{symbol.detailsIf<ObjectEntityDetails>()}) {
679 } else if (const auto *proc{symbol.detailsIf<ProcEntityDetails>()}) {
686 bool IsInitialized(const Symbol &symbol, bool ignoreDataStatements,
688 if (!ignoreAllocatable && IsAllocatable(symbol)) {
690 } else if (!ignoreDataStatements && symbol.test(Symbol::Flag::InDataStmt)) {
692 } else if (HasDeclarationInitializer(symbol)) {
694 } else if (IsPointer(symbol)) {
696 } else if (IsNamedConstant(symbol)) {
698 } else if (const auto *object{symbol.detailsIf<ObjectEntityDetails>()}) {
699 if ((!object->isDummy() || IsIntentOut(symbol)) && object->type()) {
709 bool IsDestructible(const Symbol &symbol, const Symbol *derivedTypeSymbol) {
710 if (IsAllocatable(symbol) || IsAutomatic(symbol)) {
712 } else if (IsNamedConstant(symbol) || IsFunctionResult(symbol) ||
713 IsPointer(symbol)) {
715 } else if (const auto *object{symbol.detailsIf<ObjectEntityDetails>()}) {
716 if ((!object->isDummy() || IsIntentOut(symbol)) && object->type()) {
726 bool HasIntrinsicTypeName(const Symbol &symbol) {
727 std::string name{symbol.name().ToString()};
742 bool IsSeparateModuleProcedureInterface(const Symbol *symbol) {
743 if (symbol && symbol->attrs().test(Attr::MODULE)) {
744 if (auto *details{symbol->detailsIf<SubprogramDetails>()}) {
753 const Symbol &typeSymbol{spec.typeSymbol()};
756 const Symbol &subr{*pair.second};
761 if (const Symbol * arg{subprog->dummyArgs()[0]}) {
775 const Symbol *IsFinalizable(const Symbol &symbol,
777 if (IsPointer(symbol) || evaluate::IsAssumedRank(symbol)) {
780 if (const auto *object{symbol.detailsIf<ObjectEntityDetails>()}) {
781 if (object->isDummy() && !IsIntentOut(symbol)) {
787 *typeSpec, inProgress, withImpureFinalizer, symbol.Rank());
793 const Symbol *IsFinalizable(const DerivedTypeSpec &derived,
796 const Symbol *elemental{nullptr};
798 const Symbol *symbol{&ref->GetUltimate()};
799 if (const auto *binding{symbol->detailsIf<ProcBindingDetails>()}) {
800 symbol = &binding->symbol();
802 if (const auto *proc{symbol->detailsIf<ProcEntityDetails>()}) {
803 symbol = proc->procInterface();
805 if (!symbol) {
806 } else if (IsElementalProcedure(*symbol)) {
807 elemental = symbol;
811 subp{symbol->detailsIf<SubprogramDetails>()}) {
819 if (!withImpureFinalizer || !IsPureProcedure(*symbol)) {
820 return symbol;
841 const Symbol *result{nullptr};
842 for (const Symbol &component : PotentialComponentIterator{derived}) {
852 static const Symbol *HasImpureFinal(
857 const Symbol *HasImpureFinal(const Symbol &original, std::optional<int> rank) {
858 const Symbol &symbol{ResolveAssociations(original)};
859 if (symbol.has<ObjectEntityDetails>()) {
860 if (const DeclTypeSpec * symType{symbol.GetType()}) {
862 if (evaluate::IsAssumedRank(symbol)) {
866 int actualRank{rank.value_or(symbol.Rank())};
885 bool IsAssumedLengthCharacter(const Symbol &symbol) {
886 if (const DeclTypeSpec * type{symbol.GetType()}) {
894 bool IsInBlankCommon(const Symbol &symbol) {
895 const Symbol *block{FindCommonBlockContaining(symbol)};
901 bool IsExternal(const Symbol &symbol) {
902 return ClassifyProcedure(symbol) == ProcedureDefinitionClass::External;
910 distinct.emplace(object.symbol);
922 const Symbol *currentCommon{nullptr};
923 for (const Symbol &symbol : associated) {
924 const Symbol *thisCommon{FindCommonBlockContaining(symbol)};
925 if (result.empty() || symbol.offset() >= limit ||
932 result.back().emplace_back(symbol);
933 limit = std::max(limit, symbol.offset() + symbol.size());
938 bool IsModuleProcedure(const Symbol &symbol) {
939 return ClassifyProcedure(symbol) == ProcedureDefinitionClass::Module;
1018 return name.symbol && evaluate::IsCoarray(*name.symbol);
1081 for (const Symbol &symbol : evaluate::CollectSymbols(*expr)) {
1082 if (evaluate::IsCoarray(symbol)) {
1090 bool IsAssumedType(const Symbol &symbol) {
1091 if (const DeclTypeSpec * type{symbol.GetType()}) {
1097 bool IsPolymorphic(const Symbol &symbol) {
1098 if (const DeclTypeSpec * type{symbol.GetType()}) {
1104 bool IsUnlimitedPolymorphic(const Symbol &symbol) {
1105 if (const DeclTypeSpec * type{symbol.GetType()}) {
1111 bool IsPolymorphicAllocatable(const Symbol &symbol) {
1112 return IsAllocatable(symbol) && IsPolymorphic(symbol);
1121 std::optional<common::CUDADataAttr> GetCUDADataAttr(const Symbol *symbol) {
1123 symbol ? symbol->detailsIf<ObjectEntityDetails>() : nullptr};
1127 bool IsAccessible(const Symbol &original, const Scope &scope) {
1128 const Symbol &ultimate{original.GetUltimate()};
1138 const Scope &scope, const Symbol &symbol) {
1139 if (IsAccessible(symbol, scope)) {
1149 symbol.name(),
1150 DEREF(FindModuleContaining(symbol.owner())).GetName().value()};
1154 SymbolVector OrderParameterNames(const Symbol &typeSymbol) {
1164 SymbolVector OrderParameterDeclarations(const Symbol &typeSymbol) {
1188 const Symbol *FindSeparateModuleSubprogramInterface(const Symbol *proc) {
1191 if (const Symbol * iface{subprogram->moduleInterface()}) {
1199 ProcedureDefinitionClass ClassifyProcedure(const Symbol &symbol) { // 15.2.2
1200 const Symbol &ultimate{symbol.GetUltimate()};
1207 } else if (IsProcedurePointer(symbol)) {
1219 } else if (const Symbol * subp{FindSubprogram(symbol)}) {
1256 const Symbol &component) const {
1263 traverse = component.test(Symbol::Flag::ParentComp);
1277 const Symbol &newTypeSymbol{derived->typeSymbol()};
1296 static bool StopAtComponentPre(const Symbol &component) {
1300 return !component.test(Symbol::Flag::ParentComp);
1319 static bool StopAtComponentPost(const Symbol &component) {
1321 component.test(Symbol::Flag::ParentComp);
1353 const Symbol &component{*scopeIter->second};
1382 for (const Symbol &component : GetComponentPath()) {
1399 [](const Symbol &symbol) { return evaluate::IsCoarray(symbol); });
1413 const Symbol &component{*iter};
1422 if (std::find_if(path.begin(), path.end(), [](const Symbol &sym) {
1453 const Symbol *FindUltimateComponent(const DerivedTypeSpec &derived,
1454 const std::function<bool(const Symbol &)> &predicate) {
1457 [&predicate](const Symbol &component) -> bool {
1465 const Symbol *FindUltimateComponent(const Symbol &symbol,
1466 const std::function<bool(const Symbol &)> &predicate) {
1467 if (predicate(symbol)) {
1468 return &symbol;
1469 } else if (const auto *object{symbol.detailsIf<ObjectEntityDetails>()}) {
1479 const Symbol *FindImmediateComponent(const DerivedTypeSpec &type,
1480 const std::function<bool(const Symbol &)> &predicate) {
1482 const Symbol *parent{nullptr};
1484 const Symbol *symbol{&*pair.second};
1485 if (predicate(*symbol)) {
1486 return symbol;
1488 if (symbol->test(Symbol::Flag::ParentComp)) {
1489 parent = symbol;
1505 const Symbol *IsFunctionResultWithSameNameAsFunction(const Symbol &symbol) {
1506 if (IsFunctionResult(symbol)) {
1507 if (const Symbol * function{symbol.owner().symbol()}) {
1508 if (symbol.name() == function->name()) {
1513 const Scope &outer{symbol.owner().parent()};
1514 auto iter{outer.find(symbol.name())};
1516 const Symbol &outerSym{*iter->second};
1518 if (subp->entryScope() == &symbol.owner() &&
1519 symbol.name() == outerSym.name()) {
1587 bool HasAlternateReturns(const Symbol &subprogram) {
1596 bool IsAutomaticallyDestroyed(const Symbol &symbol) {
1597 return symbol.has<ObjectEntityDetails>() &&
1598 (symbol.owner().kind() == Scope::Kind::Subprogram ||
1599 symbol.owner().kind() == Scope::Kind::BlockConstruct) &&
1600 !IsNamedConstant(symbol) && (!IsDummy(symbol) || IsIntentOut(symbol)) &&
1601 !IsPointer(symbol) && !IsSaved(symbol) &&
1602 !FindCommonBlockContaining(symbol);
1639 static const DeclTypeSpec *GetDtvArgTypeSpec(const Symbol &proc) {
1649 const DerivedTypeSpec *GetDtvArgDerivedType(const Symbol &proc) {
1661 const Symbol &symbol{*pair.second};
1662 if (const auto *generic{symbol.detailsIf<GenericDetails>()}) {
1680 const Symbol &procSym{ref->GetUltimate()};
1732 if (const Symbol *
1733 symbol{evaluate::UnwrapWholeSymbolOrComponentDataRef(expr)}) {
1734 const Symbol &ultimate{ResolveAssociations(*symbol)};
1741 symbol->name(), what);
1747 bool CouldBeDataPointerValuedFunction(const Symbol *original) {
1749 const Symbol &ultimate{original->GetUltimate()};
1750 if (const Symbol * result{FindFunctionResult(ultimate)}) {
1764 std::string GetModuleOrSubmoduleName(const Symbol &symbol) {
1765 const auto &details{symbol.get<ModuleDetails>()};
1766 std::string result{symbol.name().ToString()};
1767 if (details.ancestor() && details.ancestor()->symbol()) {
1768 result = details.ancestor()->symbol()->name().ToString() + ':' + result;
1773 std::string GetCommonBlockObjectName(const Symbol &common, bool underscoring) {
1785 SemanticsContext &context, SourceName at, const Symbol *symbol) {
1787 symbol ? symbol->detailsIf<UseErrorDetails>() : nullptr}) {
1789 at, "Reference to '%s' is ambiguous"_err_en_US, symbol->name())};
1791 const Symbol &ultimate{sym->GetUltimate()};
1804 context.SetError(*symbol);