• Home
  • Raw
  • Download

Lines Matching refs:symbol

187       const Symbol &symbol, const T &expr, parser::CharBlock source) {  in EvaluateNonPointerInitializer()  argument
188 if (!context().HasError(symbol)) { in EvaluateNonPointerInitializer()
192 symbol, std::move(*maybeExpr), GetFoldingContext()); in EvaluateNonPointerInitializer()
467 void PushScope(Scope::Kind kind, Symbol *symbol);
509 void EraseSymbol(const Symbol &symbol) { currScope().erase(symbol.name()); } in EraseSymbol() argument
536 auto *symbol{FindInScope(currScope(), name)}; in MakeSymbol() local
537 if (!symbol) { in MakeSymbol()
538 symbol = &MakeSymbol(name, attrs); in MakeSymbol()
539 symbol->set_details(std::move(details)); in MakeSymbol()
540 return *symbol; in MakeSymbol()
543 if (auto *d{symbol->detailsIf<GenericDetails>()}) { in MakeSymbol()
558 if (symbol->CanReplaceDetails(details)) { in MakeSymbol()
560 symbol->attrs() |= attrs; in MakeSymbol()
561 symbol->set_details(std::move(details)); in MakeSymbol()
562 return *symbol; in MakeSymbol()
564 symbol->attrs() |= attrs; in MakeSymbol()
565 return *symbol; in MakeSymbol()
567 if (!CheckPossibleBadForwardRef(*symbol)) { in MakeSymbol()
568 SayAlreadyDeclared(name, *symbol); in MakeSymbol()
571 EraseSymbol(*symbol); in MakeSymbol()
666 Symbol *symbol{nullptr}; // the generic symbol being defined member
670 void SetGenericSymbol(Symbol &symbol) { genericInfo_.top().symbol = &symbol; } in SetGenericSymbol() argument
864 bool PassesSharedLocalityChecks(const parser::Name &name, Symbol &symbol);
929 bool PassesLocalityChecks(const parser::Name &name, Symbol &symbol);
936 Symbol &symbol{MakeSymbol(name, attrs)}; in DeclareEntity() local
937 if (context().HasError(symbol) || symbol.has<T>()) { in DeclareEntity()
938 return symbol; // OK or error already reported in DeclareEntity()
939 } else if (symbol.has<UnknownDetails>()) { in DeclareEntity()
940 symbol.set_details(T{}); in DeclareEntity()
941 return symbol; in DeclareEntity()
942 } else if (auto *details{symbol.detailsIf<EntityDetails>()}) { in DeclareEntity()
943 symbol.set_details(T{std::move(*details)}); in DeclareEntity()
944 return symbol; in DeclareEntity()
946 (symbol.has<ObjectEntityDetails>() || in DeclareEntity()
947 symbol.has<ProcEntityDetails>())) { in DeclareEntity()
948 return symbol; // OK in DeclareEntity()
949 } else if (auto *details{symbol.detailsIf<UseDetails>()}) { in DeclareEntity()
953 } else if (auto *details{symbol.detailsIf<SubprogramNameDetails>()}) { in DeclareEntity()
957 symbol, "Module procedure definition"_en_US); in DeclareEntity()
961 symbol, "Internal procedure definition"_en_US); in DeclareEntity()
966 symbol.has<ProcEntityDetails>()) { in DeclareEntity()
968 name, symbol, "'%s' is already declared as a procedure"_err_en_US); in DeclareEntity()
970 symbol.has<ObjectEntityDetails>()) { in DeclareEntity()
971 if (InCommonBlock(symbol)) { in DeclareEntity()
972 SayWithDecl(name, symbol, in DeclareEntity()
976 name, symbol, "'%s' is already declared as an object"_err_en_US); in DeclareEntity()
978 } else if (!CheckPossibleBadForwardRef(symbol)) { in DeclareEntity()
979 SayAlreadyDeclared(name, symbol); in DeclareEntity()
981 context().SetError(symbol); in DeclareEntity()
982 return symbol; in DeclareEntity()
1465 if (!name.symbol) { in MakePlaceholder()
1466 name.symbol = &context_->globalScope().MakeSymbol( in MakePlaceholder()
1490 bool AttrsVisitor::SetPassNameOn(Symbol &symbol) { in SetPassNameOn() argument
1499 symbol.details()); in SetPassNameOn()
1503 bool AttrsVisitor::SetBindNameOn(Symbol &symbol) { in SetBindNameOn() argument
1516 symbol.details()); in SetBindNameOn()
1881 details->symbol().name(), GetUsedModule(*details).name()); in SayAlreadyDeclared()
1898 void ScopeHandler::SayWithReason(const parser::Name &name, Symbol &symbol, in SayWithReason() argument
1900 Say2(name, std::move(msg1), symbol, std::move(msg2)); in SayWithReason()
1901 context().SetError(symbol, msg1.isFatal()); in SayWithReason()
1905 const parser::Name &name, Symbol &symbol, MessageFixedText &&msg) { in SayWithDecl() argument
1906 SayWithReason(name, symbol, std::move(msg), in SayWithDecl()
1907 symbol.test(Symbol::Flag::Implicit) ? "Implicit declaration of '%s'"_en_US in SayWithDecl()
1912 const parser::Name &name, Symbol &symbol) { in SayLocalMustBeVariable() argument
1913 SayWithDecl(name, symbol, in SayLocalMustBeVariable()
1930 Symbol &symbol, MessageFixedText &&msg2) { in Say2() argument
1931 Say2(name, std::move(msg1), symbol.name(), std::move(msg2)); in Say2()
1932 context().SetError(symbol, msg1.isFatal()); in Say2()
1935 Symbol &symbol, MessageFixedText &&msg2) { in Say2() argument
1936 Say2(name.source, std::move(msg1), symbol.name(), std::move(msg2)); in Say2()
1937 context().SetError(symbol, msg1.isFatal()); in Say2()
1962 void ScopeHandler::PushScope(Scope::Kind kind, Symbol *symbol) { in PushScope() argument
1963 PushScope(currScope().MakeScope(kind, symbol)); in PushScope()
1977 if (auto *symbol{scope.symbol()}) { in PushScope() local
1980 if (!FindInScope(scope, symbol->name())) { in PushScope()
1981 auto &newSymbol{MakeSymbol(symbol->name())}; in PushScope()
1986 newSymbol.set_details(HostAssocDetails{*symbol}); in PushScope()
2013 if (Symbol * symbol{scope.FindComponent(name.source)}) { in FindSymbol()
2014 if (!symbol->has<ProcBindingDetails>() && in FindSymbol()
2015 !symbol->test(Symbol::Flag::ParentComp)) { in FindSymbol()
2016 return Resolve(name, symbol); in FindSymbol()
2027 if (Symbol * symbol{FindInScope(scope, name)}) { in MakeSymbol()
2028 symbol->attrs() |= attrs; in MakeSymbol()
2029 return *symbol; in MakeSymbol()
2044 Symbol &symbol{MakeSymbol(name, HostAssocDetails{hostSymbol})}; in MakeHostAssocSymbol() local
2045 name.symbol = &symbol; in MakeHostAssocSymbol()
2046 symbol.attrs() = hostSymbol.attrs(); // TODO: except PRIVATE, PUBLIC? in MakeHostAssocSymbol()
2047 symbol.flags() = hostSymbol.flags(); in MakeHostAssocSymbol()
2048 return symbol; in MakeHostAssocSymbol()
2050 Symbol &ScopeHandler::CopySymbol(const SourceName &name, const Symbol &symbol) { in CopySymbol() argument
2052 return MakeSymbol(currScope(), name, symbol.attrs()); in CopySymbol()
2079 name.symbol = nullptr; in EraseSymbol()
2082 static bool NeedsType(const Symbol &symbol) { in NeedsType() argument
2083 return !symbol.GetType() && in NeedsType()
2089 return symbol.test(Symbol::Flag::Function) && in NeedsType()
2090 !symbol.attrs().test(Attr::INTRINSIC) && in NeedsType()
2091 !p.interface().type() && !p.interface().symbol(); in NeedsType()
2095 symbol.details()); in NeedsType()
2098 void ScopeHandler::ApplyImplicitRules(Symbol &symbol) { in ApplyImplicitRules() argument
2099 if (NeedsType(symbol)) { in ApplyImplicitRules()
2100 const Scope *scope{&symbol.owner()}; in ApplyImplicitRules()
2105 type{GetImplicitType(symbol, GetInclusiveScope(*scope))}) { in ApplyImplicitRules()
2106 symbol.set(Symbol::Flag::Implicit); in ApplyImplicitRules()
2107 symbol.SetType(*type); in ApplyImplicitRules()
2110 if (symbol.has<ProcEntityDetails>() && in ApplyImplicitRules()
2111 !symbol.attrs().test(Attr::EXTERNAL)) { in ApplyImplicitRules()
2113 if (symbol.test(Symbol::Flag::Function)) { in ApplyImplicitRules()
2115 } else if (symbol.test(Symbol::Flag::Subroutine)) { in ApplyImplicitRules()
2118 if (IsIntrinsic(symbol.name(), functionOrSubroutineFlag)) { in ApplyImplicitRules()
2120 symbol.attrs().set(Attr::INTRINSIC); in ApplyImplicitRules()
2124 if (!context().HasError(symbol)) { in ApplyImplicitRules()
2125 Say(symbol.name(), "No explicit type declared for '%s'"_err_en_US); in ApplyImplicitRules()
2126 context().SetError(symbol); in ApplyImplicitRules()
2132 Symbol &symbol, const Scope &scope) { in GetImplicitType() argument
2133 const auto *type{implicitRulesMap_->at(&scope).GetType(symbol.name())}; in GetImplicitType()
2145 bool ScopeHandler::ConvertToObjectEntity(Symbol &symbol) { in ConvertToObjectEntity() argument
2146 if (symbol.has<ObjectEntityDetails>()) { in ConvertToObjectEntity()
2148 } else if (symbol.has<UnknownDetails>()) { in ConvertToObjectEntity()
2149 symbol.set_details(ObjectEntityDetails{}); in ConvertToObjectEntity()
2150 } else if (auto *details{symbol.detailsIf<EntityDetails>()}) { in ConvertToObjectEntity()
2151 symbol.set_details(ObjectEntityDetails{std::move(*details)}); in ConvertToObjectEntity()
2152 } else if (auto *useDetails{symbol.detailsIf<UseDetails>()}) { in ConvertToObjectEntity()
2153 return useDetails->symbol().has<ObjectEntityDetails>(); in ConvertToObjectEntity()
2160 bool ScopeHandler::ConvertToProcEntity(Symbol &symbol) { in ConvertToProcEntity() argument
2161 if (symbol.has<ProcEntityDetails>()) { in ConvertToProcEntity()
2163 } else if (symbol.has<UnknownDetails>()) { in ConvertToProcEntity()
2164 symbol.set_details(ProcEntityDetails{}); in ConvertToProcEntity()
2165 } else if (auto *details{symbol.detailsIf<EntityDetails>()}) { in ConvertToProcEntity()
2166 symbol.set_details(ProcEntityDetails{std::move(*details)}); in ConvertToProcEntity()
2167 if (symbol.GetType() && !symbol.test(Symbol::Flag::Implicit)) { in ConvertToProcEntity()
2168 CHECK(!symbol.test(Symbol::Flag::Subroutine)); in ConvertToProcEntity()
2169 symbol.set(Symbol::Flag::Function); in ConvertToProcEntity()
2198 if (inSpecificationPart_ && name.symbol) { in NotePossibleBadForwardRef()
2202 bool isHostAssociated{&name.symbol->owner() == &currScope() in NotePossibleBadForwardRef()
2203 ? name.symbol->has<HostAssocDetails>() in NotePossibleBadForwardRef()
2204 : name.symbol->owner().Contains(currScope())}; in NotePossibleBadForwardRef()
2213 const Symbol &symbol) const { in HadForwardRef()
2214 auto iter{specPartForwardRefs_.find(symbol.name())}; in HadForwardRef()
2221 bool ScopeHandler::CheckPossibleBadForwardRef(const Symbol &symbol) { in CheckPossibleBadForwardRef() argument
2222 if (!context().HasError(symbol)) { in CheckPossibleBadForwardRef()
2223 if (auto fwdRef{HadForwardRef(symbol)}) { in CheckPossibleBadForwardRef()
2227 .Attach(symbol.name(), "Later declaration of '%s'"_en_US, *fwdRef); in CheckPossibleBadForwardRef()
2228 context().SetError(symbol); in CheckPossibleBadForwardRef()
2235 void ScopeHandler::MakeExternal(Symbol &symbol) { in MakeExternal() argument
2236 if (!symbol.attrs().test(Attr::EXTERNAL)) { in MakeExternal()
2237 symbol.attrs().set(Attr::EXTERNAL); in MakeExternal()
2238 if (symbol.attrs().test(Attr::INTRINSIC)) { // C840 in MakeExternal()
2239 Say(symbol.name(), in MakeExternal()
2241 symbol.name()); in MakeExternal()
2296 useModuleScope_->symbol()->ReplaceName(x.moduleName.source); in Pre()
2316 for (const auto &[name, symbol] : *useModuleScope_) { in Post()
2317 if (symbol->attrs().test(Attr::PUBLIC) && in Post()
2318 !symbol->attrs().test(Attr::INTRINSIC) && in Post()
2319 !symbol->has<MiscDetails>() && useNames.count(name) == 0) { in Post()
2322 DoAddUse(location, localSymbol->name(), *localSymbol, *symbol); in Post()
2324 DoAddUse(location, location, CopySymbol(name, *symbol), *symbol); in Post()
2360 Symbol &symbol, const SourceName &location, const Scope &module) { in ConvertToUseError() argument
2361 const auto *useDetails{symbol.detailsIf<UseDetails>()}; in ConvertToUseError()
2363 auto &genericDetails{symbol.get<GenericDetails>()}; in ConvertToUseError()
2366 symbol.set_details( in ConvertToUseError()
2470 auto &symbol{MakeSymbol(name, ModuleDetails{isSubmodule})}; in BeginModule() local
2471 auto &details{symbol.get<ModuleDetails>()}; in BeginModule()
2472 PushScope(Scope::Kind::Module, &symbol); in BeginModule()
2495 Resolve(name, scope->symbol()); in FindModule()
2501 Symbol &symbol = *pair.second; in ApplyDefaultAccess() local
2502 if (!symbol.attrs().HasAny({Attr::PUBLIC, Attr::PRIVATE})) { in ApplyDefaultAccess()
2503 symbol.attrs().set(defaultAccess_); in ApplyDefaultAccess()
2524 if (auto *symbol{GenericSpecInfo{x}.FindInScope(context(), currScope())}) { in Pre() local
2525 SetGenericSymbol(*symbol); in Pre()
2547 GetGenericInfo().symbol->attrs().set(AccessSpecToAttr(*accessSpec)); in Post()
2558 return !genericInfo_.empty() && GetGenericInfo().symbol; in isGeneric()
2564 return GetGenericInfo().symbol->get<GenericDetails>(); in GetGenericDetails()
2571 GetGenericInfo().symbol, std::make_pair(&name, kind)); in AddSpecificProcs()
2580 for (const Symbol &symbol : details.specificProcs()) { in ResolveSpecificsInGeneric() local
2581 symbolsSeen.insert(symbol); in ResolveSpecificsInGeneric()
2587 const auto *symbol{FindSymbol(*name)}; in ResolveSpecificsInGeneric() local
2588 if (!symbol) { in ResolveSpecificsInGeneric()
2592 symbol = &symbol->GetUltimate(); in ResolveSpecificsInGeneric()
2593 if (symbol == &generic) { in ResolveSpecificsInGeneric()
2595 symbol = specific; in ResolveSpecificsInGeneric()
2598 if (!symbol->has<SubprogramDetails>() && in ResolveSpecificsInGeneric()
2599 !symbol->has<SubprogramNameDetails>()) { in ResolveSpecificsInGeneric()
2604 if (const auto *nd{symbol->detailsIf<SubprogramNameDetails>()}) { in ResolveSpecificsInGeneric()
2610 const auto *sd{symbol->detailsIf<SubprogramDetails>()}; in ResolveSpecificsInGeneric()
2612 if (symbol->owner().kind() != Scope::Kind::Module || in ResolveSpecificsInGeneric()
2618 if (!symbolsSeen.insert(*symbol).second) { in ResolveSpecificsInGeneric()
2624 details.AddSpecificProc(*symbol, name->source); in ResolveSpecificsInGeneric()
2683 if (auto *symbol{FindSymbol(name)}) { in HandleStmtFunction() local
2684 auto *details{symbol->detailsIf<EntityDetails>()}; in HandleStmtFunction()
2691 symbol->details() = UnknownDetails{}; // will be replaced below in HandleStmtFunction()
2697 auto &symbol{PushSubprogramScope(name, Symbol::Flag::Function)}; in HandleStmtFunction() local
2698 symbol.set(Symbol::Flag::StmtFunction); in HandleStmtFunction()
2699 EraseSymbol(symbol); // removes symbol added by PushSubprogramScope in HandleStmtFunction()
2700 auto &details{symbol.get<SubprogramDetails>()}; in HandleStmtFunction()
2839 name.symbol = currScope().symbol(); // must not be function result symbol in Post()
2847 Symbol &symbol{*currScope().symbol()}; in PostSubprogramStmt() local
2848 CHECK(name.source == symbol.name()); in PostSubprogramStmt()
2849 SetBindNameOn(symbol); in PostSubprogramStmt()
2850 symbol.attrs() |= EndAttrs(); in PostSubprogramStmt()
2851 if (symbol.attrs().test(Attr::MODULE)) { in PostSubprogramStmt()
2852 symbol.attrs().set(Attr::EXTERNAL, false); in PostSubprogramStmt()
2854 return symbol.get<SubprogramDetails>(); in PostSubprogramStmt()
2860 const Symbol *subprogram{inclusiveScope.symbol()}; in Post()
2880 symbol{FindSymbol(inclusiveScope.parent(), *resultName)}) { // C1574 in Post() local
2881 if (const auto *details{symbol->detailsIf<SubprogramDetails>()}) { in Post()
2885 symbol->name(), "Conflicting ENTRY"_en_US); in Post()
2889 if (Symbol * symbol{FindSymbol(name)}) { // C1570 in Post()
2891 if (inclusiveScope.Contains(symbol->owner())) { in Post()
2894 *symbol, "Previous declaration of '%s'"_en_US); in Post()
2931 name.symbol = nullptr; // symbol will be used for entry point below in Post()
3006 auto *symbol{FindSymbol(name)}; in BeginMpSubprogram() local
3007 if (symbol && symbol->has<SubprogramNameDetails>()) { in BeginMpSubprogram()
3008 symbol = FindSymbol(currScope().parent(), name); in BeginMpSubprogram()
3010 if (!IsSeparateModuleProcedureInterface(symbol)) { in BeginMpSubprogram()
3014 if (symbol->owner() == currScope()) { in BeginMpSubprogram()
3015 PushScope(Scope::Kind::Subprogram, symbol); in BeginMpSubprogram()
3019 const auto &details{symbol->get<SubprogramDetails>()}; in BeginMpSubprogram()
3029 currScope().erase(symbol->name()); in BeginMpSubprogram()
3070 auto *symbol{GetSpecificFromGeneric(name)}; in PushSubprogramScope() local
3071 if (!symbol) { in PushSubprogramScope()
3073 symbol = &MakeSymbol(name, SubprogramDetails{}); in PushSubprogramScope()
3075 symbol->set(subpFlag); in PushSubprogramScope()
3076 PushScope(Scope::Kind::Subprogram, symbol); in PushSubprogramScope()
3077 auto &details{symbol->get<SubprogramDetails>()}; in PushSubprogramScope()
3081 MakeExternal(*symbol); in PushSubprogramScope()
3084 GetGenericDetails().AddSpecificProc(*symbol, name.source); in PushSubprogramScope()
3089 return *symbol; in PushSubprogramScope()
3113 if (auto *symbol{FindSymbol(name)}) { in GetSpecificFromGeneric() local
3114 if (auto *details{symbol->detailsIf<GenericDetails>()}) { in GetSpecificFromGeneric()
3147 const auto *details{name.symbol->detailsIf<UseErrorDetails>()}; in CheckUseError()
3161 const SourceName &name, bool isPrivate, Symbol &symbol) { in CheckAccessibility() argument
3162 if (symbol.attrs().test(Attr::PRIVATE) != isPrivate) { in CheckAccessibility()
3165 symbol, "Previous declaration of '%s'"_en_US); in CheckAccessibility()
3210 Symbol &symbol{DeclareUnknownEntity(name, attrs)}; in Post() local
3211 symbol.ReplaceName(name.source); in Post()
3213 if (ConvertToObjectEntity(symbol)) { in Post()
3223 Symbol &symbol{DeclareUnknownEntity(name, Attrs{Attr::POINTER})}; in Post() local
3224 symbol.ReplaceName(name.source); in Post()
3230 Symbol *symbol; in Pre() local
3232 symbol = &HandleAttributeStmt(Attr::BIND_C, name); in Pre()
3234 symbol = &MakeCommonBlockSymbol(name); in Pre()
3235 symbol->attrs().set(Attr::BIND_C); in Pre()
3237 SetBindNameOn(*symbol); in Pre()
3242 auto &symbol{HandleAttributeStmt(Attr::PARAMETER, name)}; in Pre() local
3243 if (!ConvertToObjectEntity(symbol) || in Pre()
3244 symbol.test(Symbol::Flag::CrayPointer) || in Pre()
3245 symbol.test(Symbol::Flag::CrayPointee)) { in Pre()
3247 name, symbol, "PARAMETER attribute not allowed on '%s'"_err_en_US); in Pre()
3251 ApplyImplicitRules(symbol); in Pre()
3254 symbol, expr, expr.thing.value().source)}) { in Pre()
3255 symbol.get<ObjectEntityDetails>().set_init(std::move(*converted)); in Pre()
3271 Symbol *symbol{FindSymbol(name)}; in Pre() local
3272 if (symbol) { in Pre()
3279 SayAlreadyDeclared(name, *symbol); in Pre()
3280 symbol = nullptr; in Pre()
3283 symbol = &MakeSymbol(name, Attrs{Attr::PARAMETER}, ObjectEntityDetails{}); in Pre()
3284 symbol->SetType(context().MakeNumericType( in Pre()
3304 if (symbol) { in Pre()
3306 symbol->get<ObjectEntityDetails>().set_init(SomeExpr{ in Pre()
3309 context().SetError(*symbol); in Pre()
3343 auto *symbol{FindSymbol(name)}; in Pre() local
3344 if (!ConvertToProcEntity(*symbol)) { in Pre()
3346 name, *symbol, "EXTERNAL attribute not allowed on '%s'"_err_en_US); in Pre()
3347 } else if (symbol->attrs().test(Attr::INTRINSIC)) { // C840 in Pre()
3348 Say(symbol->name(), in Pre()
3350 symbol->name()); in Pre()
3364 auto *symbol{FindSymbol(name)}; in Pre() local
3365 if (!ConvertToProcEntity(*symbol)) { in Pre()
3367 name, *symbol, "INTRINSIC attribute not allowed on '%s'"_err_en_US); in Pre()
3368 } else if (symbol->attrs().test(Attr::EXTERNAL)) { // C840 in Pre()
3369 Say(symbol->name(), in Pre()
3371 symbol->name()); in Pre()
3403 auto *symbol{FindInScope(currScope(), name)}; in HandleAttributeStmt() local
3406 if (!symbol && in HandleAttributeStmt()
3410 symbol = &MakeHostAssocSymbol(name, *hostSymbol); in HandleAttributeStmt()
3413 } else if (symbol && symbol->has<UseDetails>()) { in HandleAttributeStmt()
3417 return *symbol; in HandleAttributeStmt()
3419 if (!symbol) { in HandleAttributeStmt()
3420 symbol = &MakeSymbol(name, EntityDetails{}); in HandleAttributeStmt()
3422 symbol->attrs().set(attr); in HandleAttributeStmt()
3423 symbol->attrs() = HandleSaveName(name.source, symbol->attrs()); in HandleAttributeStmt()
3424 return *symbol; in HandleAttributeStmt()
3449 Symbol &symbol{DeclareEntity<EntityDetails>(name, attrs)}; in DeclareUnknownEntity() local
3454 SetBindNameOn(symbol); in DeclareUnknownEntity()
3455 if (symbol.attrs().test(Attr::EXTERNAL)) { in DeclareUnknownEntity()
3456 ConvertToProcEntity(symbol); in DeclareUnknownEntity()
3458 return symbol; in DeclareUnknownEntity()
3464 Symbol &symbol{DeclareEntity<ProcEntityDetails>(name, attrs)}; in DeclareProcEntity() local
3465 if (auto *details{symbol.detailsIf<ProcEntityDetails>()}) { in DeclareProcEntity()
3467 SayWithDecl(name, symbol, in DeclareProcEntity()
3470 context().SetError(symbol); in DeclareProcEntity()
3473 symbol.set(Symbol::Flag::Function); in DeclareProcEntity()
3474 } else if (interface.symbol()) { in DeclareProcEntity()
3475 if (interface.symbol()->test(Symbol::Flag::Function)) { in DeclareProcEntity()
3476 symbol.set(Symbol::Flag::Function); in DeclareProcEntity()
3477 } else if (interface.symbol()->test(Symbol::Flag::Subroutine)) { in DeclareProcEntity()
3478 symbol.set(Symbol::Flag::Subroutine); in DeclareProcEntity()
3482 SetBindNameOn(symbol); in DeclareProcEntity()
3483 SetPassNameOn(symbol); in DeclareProcEntity()
3486 return symbol; in DeclareProcEntity()
3491 Symbol &symbol{DeclareEntity<ObjectEntityDetails>(name, attrs)}; in DeclareObjectEntity() local
3492 if (auto *details{symbol.detailsIf<ObjectEntityDetails>()}) { in DeclareObjectEntity()
3498 if (!context().HasError(symbol)) { in DeclareObjectEntity()
3501 context().SetError(symbol); in DeclareObjectEntity()
3509 if (!context().HasError(symbol)) { in DeclareObjectEntity()
3512 context().SetError(symbol); in DeclareObjectEntity()
3518 SetBindNameOn(symbol); in DeclareObjectEntity()
3523 return symbol; in DeclareObjectEntity()
3598 if (const Symbol * derivedSymbol{derivedName.symbol}) { in Post()
3613 SayWithDecl(typeName, *typeName.symbol, in Post()
3704 CHECK(scope.symbol()); in Pre()
3705 CHECK(scope.symbol()->scope() == &scope); in Pre()
3706 auto &details{scope.symbol()->get<DerivedTypeDetails>()}; in Pre()
3710 auto *symbol{FindInScope(scope, paramName)}; in Pre() local
3711 if (!symbol) { in Pre()
3721 } else if (!symbol->has<TypeParamDetails>()) { in Pre()
3723 *symbol, "Definition of '%s'"_en_US); // C741 in Pre()
3730 for (const auto &[name, symbol] : currScope()) { in Pre()
3731 if (symbol->has<TypeParamDetails>() && !paramNames.count(name)) { in Pre()
3788 auto &symbol{MakeSymbol(name, GetAttrs(), DerivedTypeDetails{})}; in Post() local
3789 symbol.ReplaceName(name.source); in Post()
3790 derivedTypeInfo_.type = &symbol; in Post()
3791 PushScope(Scope::Kind::DerivedType, &symbol); in Post()
3799 auto restorer{common::ScopedSet(extendsName->symbol, nullptr)}; in Post()
3809 DerivedTypeDetails &details{symbol.get<DerivedTypeDetails>()}; in Post()
3821 if (Symbol * symbol{MakeTypeSymbol(name, TypeParamDetails{attr})}) { in Post()
3826 *symbol, *init, init->thing.thing.thing.value().source)}) { in Post()
3828 symbol->get<TypeParamDetails>().set_init(std::move(*intExpr)); in Post()
3922 auto &symbol{DeclareObjectEntity(name, attrs)}; in Post() local
3923 if (symbol.has<ObjectEntityDetails>()) { in Post()
3928 currScope().symbol()->get<DerivedTypeDetails>().add_component(symbol); in Post()
3976 interface.set_symbol(*interfaceName_->symbol); in Post()
3982 if (Symbol * symbol{currScope().symbol()}) { in Post()
3983 dtDetails = symbol->detailsIf<DerivedTypeDetails>(); in Post()
3988 Symbol &symbol{DeclareProcEntity(name, attrs, interface)}; in Post() local
3989 symbol.ReplaceName(name.source); in Post()
3991 dtDetails->add_component(symbol); in Post()
4018 auto *symbol{FindInTypeOrParents(*bindingName)}; in Post() local
4019 if (!symbol) { in Post()
4022 } else if (!symbol->has<ProcBindingDetails>()) { in Post()
4023 SayWithDecl(*bindingName, *symbol, // C772 in Post()
4027 *symbol, bindingName->source); in Post()
4068 const Symbol *procedure{FindSubprogram(details->symbol())}; in CheckBindings()
4070 if (details->symbol().name() != binding->name()) { in CheckBindings()
4075 binding->name(), details->symbol().name()); in CheckBindings()
4108 if (currScope().IsDerivedType() && currScope().symbol()) { in Post()
4109 if (auto *details{currScope().symbol()->detailsIf<DerivedTypeDetails>()}) { in Post()
4113 details->finals().emplace(name->source, DEREF(name->symbol))}; in Post()
4235 Symbol &pointee{*pointeeName.symbol}; in Pre()
4287 auto *symbol{FindSymbol(name)}; in Pre() local
4288 if (!symbol) { in Pre()
4289 symbol = &MakeSymbol(name, ObjectEntityDetails{}); in Pre()
4290 ApplyImplicitRules(*symbol); in Pre()
4291 } else if (!ConvertToObjectEntity(*symbol)) { in Pre()
4292 SayWithDecl(name, *symbol, "'%s' is not a variable"_err_en_US); in Pre()
4294 symbol->GetUltimate().set(Symbol::Flag::InNamelist); in Pre()
4295 details.add_object(*symbol); in Pre()
4310 auto *symbol{FindSymbol(*name)}; in Pre() local
4311 if (!symbol) { in Pre()
4313 } else if (!symbol->GetUltimate().has<NamelistDetails>()) { in Pre()
4315 *name, *symbol, "'%s' is not the name of a namelist group"_err_en_US); in Pre()
4398 auto *symbol{FindInScope(currScope(), name)}; in CheckSaveStmts() local
4399 if (!symbol) { in CheckSaveStmts()
4406 } else if (auto msg{CheckSaveAttr(*symbol)}) { in CheckSaveStmts()
4408 context().SetError(*symbol); in CheckSaveStmts()
4410 SetSaveAttr(*symbol); in CheckSaveStmts()
4414 if (auto *symbol{currScope().FindCommonBlock(name)}) { in CheckSaveStmts() local
4415 auto &objects{symbol->get<CommonBlockDetails>().objects()}; in CheckSaveStmts()
4427 for (auto &object : symbol->get<CommonBlockDetails>().objects()) { in CheckSaveStmts()
4436 auto &symbol{*pair.second}; in CheckSaveStmts() local
4437 if (!CheckSaveAttr(symbol)) { in CheckSaveStmts()
4438 SetSaveAttr(symbol); in CheckSaveStmts()
4447 const Symbol &symbol) { in CheckSaveAttr() argument
4448 if (IsDummy(symbol)) { in CheckSaveAttr()
4450 } else if (symbol.IsFuncResult()) { in CheckSaveAttr()
4452 } else if (symbol.has<ProcEntityDetails>() && in CheckSaveAttr()
4453 !symbol.attrs().test(Attr::POINTER)) { in CheckSaveAttr()
4455 } else if (IsAutomatic(symbol)) { in CheckSaveAttr()
4481 void DeclarationVisitor::SetSaveAttr(Symbol &symbol) { in SetSaveAttr() argument
4482 if (!IsSaved(symbol)) { in SetSaveAttr()
4483 symbol.attrs().set(Attr::SAVE); in SetSaveAttr()
4491 const auto &symbol{*pair.second}; in CheckCommonBlocks() local
4492 if (symbol.get<CommonBlockDetails>().objects().empty() && in CheckCommonBlocks()
4493 symbol.attrs().test(Attr::BIND_C)) { in CheckCommonBlocks()
4494 Say(symbol.name(), in CheckCommonBlocks()
4501 const auto *symbol{currScope().FindSymbol(name)}; in CheckCommonBlocks() local
4502 if (!symbol) { in CheckCommonBlocks()
4505 const auto &attrs{symbol->attrs()}; in CheckCommonBlocks()
4512 } else if (IsDummy(*symbol)) { in CheckCommonBlocks()
4515 } else if (symbol->IsFuncResult()) { in CheckCommonBlocks()
4518 } else if (const DeclTypeSpec * type{symbol->GetType()}) { in CheckCommonBlocks()
4590 Symbol &symbol{ in HandleUnrestrictedSpecificIntrinsicFunction() local
4593 symbol.attrs().set(Attr::ELEMENTAL); in HandleUnrestrictedSpecificIntrinsicFunction()
4595 symbol.set_details(ProcEntityDetails{}); in HandleUnrestrictedSpecificIntrinsicFunction()
4596 Resolve(name, symbol); in HandleUnrestrictedSpecificIntrinsicFunction()
4605 const parser::Name &name, Symbol &symbol) { in PassesSharedLocalityChecks() argument
4606 if (!IsVariableName(symbol)) { in PassesSharedLocalityChecks()
4607 SayLocalMustBeVariable(name, symbol); // C1124 in PassesSharedLocalityChecks()
4610 if (symbol.owner() == currScope()) { // C1125 and C1126 in PassesSharedLocalityChecks()
4611 SayAlreadyDeclared(name, symbol); in PassesSharedLocalityChecks()
4619 const parser::Name &name, Symbol &symbol) { in PassesLocalityChecks() argument
4620 if (IsAllocatable(symbol)) { // C1128 in PassesLocalityChecks()
4621 SayWithDecl(name, symbol, in PassesLocalityChecks()
4625 if (IsOptional(symbol)) { // C1128 in PassesLocalityChecks()
4626 SayWithDecl(name, symbol, in PassesLocalityChecks()
4630 if (IsIntentIn(symbol)) { // C1128 in PassesLocalityChecks()
4631 SayWithDecl(name, symbol, in PassesLocalityChecks()
4635 if (IsFinalizable(symbol)) { // C1128 in PassesLocalityChecks()
4636 SayWithDecl(name, symbol, in PassesLocalityChecks()
4640 if (IsCoarray(symbol)) { // C1128 in PassesLocalityChecks()
4642 name, symbol, "Coarray '%s' not allowed in a locality-spec"_err_en_US); in PassesLocalityChecks()
4645 if (const DeclTypeSpec * type{symbol.GetType()}) { in PassesLocalityChecks()
4646 if (type->IsPolymorphic() && IsDummy(symbol) && in PassesLocalityChecks()
4647 !IsPointer(symbol)) { // C1128 in PassesLocalityChecks()
4648 SayWithDecl(name, symbol, in PassesLocalityChecks()
4654 if (IsAssumedSizeArray(symbol)) { // C1128 in PassesLocalityChecks()
4655 SayWithDecl(name, symbol, in PassesLocalityChecks()
4660 WhyNotModifiable(symbol, currScope())}) { in PassesLocalityChecks()
4661 SayWithReason(name, symbol, in PassesLocalityChecks()
4667 return PassesSharedLocalityChecks(name, symbol); in PassesLocalityChecks()
4699 name.symbol = nullptr; in DeclareStatementEntity()
4702 Symbol &symbol{DeclareEntity<ObjectEntityDetails>(name, {})}; in DeclareStatementEntity() local
4703 if (!symbol.has<ObjectEntityDetails>()) { in DeclareStatementEntity()
4716 ApplyImplicitRules(symbol); in DeclareStatementEntity()
4718 return Resolve(name, &symbol); in DeclareStatementEntity()
4724 CHECK(name.symbol); in SetType()
4725 auto &symbol{*name.symbol}; in SetType() local
4740 auto *prevType{symbol.GetType()}; in SetType()
4742 symbol.SetType(type); in SetType()
4743 } else if (symbol.has<UseDetails>()) { in SetType()
4745 } else if (HadForwardRef(symbol)) { in SetType()
4747 } else if (!symbol.test(Symbol::Flag::Implicit)) { in SetType()
4749 name, symbol, "The type of '%s' has already been declared"_err_en_US); in SetType()
4750 context().SetError(symbol); in SetType()
4752 SayWithDecl(name, symbol, in SetType()
4754 context().SetError(symbol); in SetType()
4756 symbol.set(Symbol::Flag::Implicit, false); in SetType()
4762 Symbol *symbol{FindSymbol(NonDerivedTypeScope(), name)}; in ResolveDerivedType() local
4763 if (!symbol || symbol->has<UnknownDetails>()) { in ResolveDerivedType()
4765 if (!symbol) { in ResolveDerivedType()
4766 symbol = &MakeSymbol(InclusiveScope(), name.source, Attrs{}); in ResolveDerivedType()
4767 Resolve(name, *symbol); in ResolveDerivedType()
4771 symbol->set_details(std::move(details)); in ResolveDerivedType()
4780 symbol = &symbol->GetUltimate(); in ResolveDerivedType()
4781 if (auto *details{symbol->detailsIf<GenericDetails>()}) { in ResolveDerivedType()
4783 symbol = details->derivedType(); in ResolveDerivedType()
4786 if (symbol->has<DerivedTypeDetails>()) { in ResolveDerivedType()
4787 return DerivedTypeSpec{name.source, *symbol}; in ResolveDerivedType()
4811 Symbol &symbol{MakeSymbol(InclusiveScope(), name.source, Attrs{})}; in NoteInterfaceName() local
4812 Resolve(name, symbol); in NoteInterfaceName()
4814 return name.symbol; in NoteInterfaceName()
4818 if (const Symbol * symbol{name.symbol}) { in CheckExplicitInterface() local
4819 if (!symbol->HasExplicitInterface()) { in CheckExplicitInterface()
4823 symbol->name()); in CheckExplicitInterface()
4838 if (auto *symbol{FindInScope(derivedType, name)}) { // C742 in MakeTypeSymbol() local
4842 *symbol, "Previous definition of '%s'"_en_US); in MakeTypeSymbol()
4854 derivedType.symbol()->get<DerivedTypeDetails>().add_paramDecl(result); in MakeTypeSymbol()
4923 name.symbol = nullptr; in ResolveIndexName()
4925 auto &symbol{DeclareObjectEntity(name)}; in ResolveIndexName() local
4926 if (symbol.GetType()) { in ResolveIndexName()
4929 ApplyImplicitRules(symbol); in ResolveIndexName()
4936 symbol.SetType(*type); in ResolveIndexName()
4965 if (auto *symbol{DeclareLocalEntity(name)}) { in Pre() local
4966 symbol->set(Symbol::Flag::LocalityLocal); in Pre()
4974 if (auto *symbol{DeclareLocalEntity(name)}) { in Pre() local
4975 symbol->set(Symbol::Flag::LocalityLocalInit); in Pre()
5036 if (first.symbol) { in Pre()
5037 first.symbol->set(Symbol::Flag::InDataStmt); in Pre()
5051 if (first.symbol) { in Pre()
5052 first.symbol->set(Symbol::Flag::InDataStmt); in Pre()
5070 if (const Symbol * symbol{FindSymbol(*name)}) { in Pre() local
5071 if (const Symbol * ultimate{GetAssociationRoot(*symbol)}) { in Pre()
5136 if (auto *symbol{MakeAssocEntity()}) { in Post() local
5140 SetTypeFromAssociation(*symbol); in Post()
5141 SetAttrsFromAssociation(*symbol); in Post()
5156 if (auto *symbol{FindInScope(currScope(), name)}) { in Post() local
5164 if (!symbol->GetType()) { in Post()
5165 symbol->SetType(ToDeclTypeSpec(std::move(*dynType))); in Post()
5252 if (auto *symbol{MakeAssocEntity()}) { in Post() local
5254 SetTypeFromAssociation(*symbol); in Post()
5256 symbol->SetType(*type); in Post()
5258 SetAttrsFromAssociation(*symbol); in Post()
5263 if (auto *symbol{MakeAssocEntity()}) { in Post() local
5264 SetTypeFromAssociation(*symbol); in Post()
5265 SetAttrsFromAssociation(*symbol); in Post()
5268 auto &details{symbol->get<AssocEntityDetails>()}; in Post()
5300 Symbol *symbol{nullptr}; in MakeAssocEntity() local
5303 symbol = &MakeSymbol(*association.name, UnknownDetails{}); in MakeAssocEntity()
5304 if (symbol->has<AssocEntityDetails>() && symbol->owner() == currScope()) { in MakeAssocEntity()
5311 symbol = &MakeSymbol(whole->name()); in MakeAssocEntity()
5316 symbol->set_details(AssocEntityDetails{common::Clone(*expr)}); in MakeAssocEntity()
5318 symbol->set_details(AssocEntityDetails{}); in MakeAssocEntity()
5320 return symbol; in MakeAssocEntity()
5324 void ConstructVisitor::SetTypeFromAssociation(Symbol &symbol) { in SetTypeFromAssociation() argument
5325 auto &details{symbol.get<AssocEntityDetails>()}; in SetTypeFromAssociation()
5336 symbol.SetType(ToDeclTypeSpec(std::move(*type), in SetTypeFromAssociation()
5341 symbol.SetType(ToDeclTypeSpec(std::move(*type))); in SetTypeFromAssociation()
5345 Say(symbol.name(), "Associate name '%s' must have a type"_err_en_US); in SetTypeFromAssociation()
5351 void ConstructVisitor::SetAttrsFromAssociation(Symbol &symbol) { in SetAttrsFromAssociation() argument
5353 symbol.attrs() |= attrs & in SetAttrsFromAssociation()
5356 symbol.attrs().set(Attr::TARGET); in SetAttrsFromAssociation()
5510 } else if (!name->symbol->has<ProcEntityDetails>()) { in ResolveDataRef()
5511 ConvertToObjectEntity(*name->symbol); in ResolveDataRef()
5512 } else if (!context().HasError(*name->symbol)) { in ResolveDataRef()
5513 SayWithDecl(*name, *name->symbol, in ResolveDataRef()
5534 if (Symbol * symbol{name.symbol}) { in ResolveName()
5539 symbol->set(Symbol::Flag::ImplicitOrError, false); in ResolveName()
5540 if (IsUplevelReference(*symbol)) { in ResolveName()
5541 MakeHostAssocSymbol(name, *symbol); in ResolveName()
5542 } else if (IsDummy(*symbol) || in ResolveName()
5543 (!symbol->GetType() && FindCommonBlockContaining(*symbol))) { in ResolveName()
5544 ConvertToObjectEntity(*symbol); in ResolveName()
5545 ApplyImplicitRules(*symbol); in ResolveName()
5555 auto *symbol{FindSymbol(name)}; in ResolveName() local
5556 if (!symbol) { in ResolveName()
5561 ConvertToObjectEntity(*symbol); in ResolveName()
5562 ApplyImplicitRules(*symbol); in ResolveName()
5579 if (name.symbol) { in CheckForHostAssociatedImplicit()
5580 ApplyImplicitRules(*name.symbol); in CheckForHostAssociatedImplicit()
5587 if (!name.symbol) { in CheckForHostAssociatedImplicit()
5592 } else if (name.symbol->test(Symbol::Flag::ImplicitOrError)) { in CheckForHostAssociatedImplicit()
5593 hostSymbol = name.symbol; in CheckForHostAssociatedImplicit()
5597 Symbol &symbol{MakeHostAssocSymbol(name, *hostSymbol)}; in CheckForHostAssociatedImplicit() local
5599 symbol.get<HostAssocDetails>().implicitOrExplicitTypeError = true; in CheckForHostAssociatedImplicit()
5601 symbol.get<HostAssocDetails>().implicitOrSpecExprError = true; in CheckForHostAssociatedImplicit()
5606 bool DeclarationVisitor::IsUplevelReference(const Symbol &symbol) { in IsUplevelReference() argument
5607 const Scope &symbolUnit{GetProgramUnitContaining(symbol)}; in IsUplevelReference()
5621 if (!base || !base->symbol) { in FindComponent()
5624 auto &symbol{base->symbol->GetUltimate()}; in FindComponent() local
5625 if (!symbol.has<AssocEntityDetails>() && !ConvertToObjectEntity(symbol)) { in FindComponent()
5626 SayWithDecl(*base, symbol, in FindComponent()
5630 auto *type{symbol.GetType()}; in FindComponent()
5659 CheckAccessibleComponent(currScope(), *component.symbol)}) { in FindComponent()
5670 if (symbol.test(Symbol::Flag::Implicit)) { in FindComponent()
5675 *base, symbol, "'%s' is not an object of derived type"_err_en_US); in FindComponent()
5685 if (!name.symbol) { in Initialization()
5688 Symbol &ultimate{name.symbol->GetUltimate()}; in Initialization()
5736 if (name.symbol) { in PointerInitialization()
5737 Symbol &ultimate{name.symbol->GetUltimate()}; in PointerInitialization()
5758 if (name.symbol) { in PointerInitialization()
5759 Symbol &ultimate{name.symbol->GetUltimate()}; in PointerInitialization()
5766 if (targetName->symbol) { in PointerInitialization()
5768 details.set_init(*targetName->symbol); in PointerInitialization()
5785 if (name.symbol) { in NonPointerInitialization()
5786 Symbol &ultimate{name.symbol->GetUltimate()}; in NonPointerInitialization()
5823 auto *symbol{FindSymbol(NonDerivedTypeScope(), name)}; in HandleProcedureName() local
5824 if (!symbol) { in HandleProcedureName()
5826 symbol = in HandleProcedureName()
5829 symbol = &MakeSymbol(context().globalScope(), name.source, Attrs{}); in HandleProcedureName()
5831 Resolve(name, *symbol); in HandleProcedureName()
5832 if (symbol->has<ModuleDetails>()) { in HandleProcedureName()
5833 SayWithDecl(name, *symbol, in HandleProcedureName()
5837 if (!symbol->attrs().test(Attr::INTRINSIC)) { in HandleProcedureName()
5838 if (isImplicitNoneExternal() && !symbol->attrs().test(Attr::EXTERNAL)) { in HandleProcedureName()
5844 MakeExternal(*symbol); in HandleProcedureName()
5846 ConvertToProcEntity(*symbol); in HandleProcedureName()
5847 SetProcFlag(name, *symbol, flag); in HandleProcedureName()
5851 symbol = &Resolve(name, symbol)->GetUltimate(); in HandleProcedureName()
5852 bool convertedToProcEntity{ConvertToProcEntity(*symbol)}; in HandleProcedureName()
5853 if (convertedToProcEntity && !symbol->attrs().test(Attr::EXTERNAL) && in HandleProcedureName()
5854 IsIntrinsic(symbol->name(), flag) && !IsDummy(*symbol)) { in HandleProcedureName()
5855 symbol->attrs().set(Attr::INTRINSIC); in HandleProcedureName()
5857 symbol->get<ProcEntityDetails>().set_interface(ProcInterface{}); in HandleProcedureName()
5859 if (!SetProcFlag(name, *symbol, flag)) { in HandleProcedureName()
5862 if (IsProcedure(*symbol) || symbol->has<DerivedTypeDetails>() || in HandleProcedureName()
5863 symbol->has<ObjectEntityDetails>() || in HandleProcedureName()
5864 symbol->has<AssocEntityDetails>()) { in HandleProcedureName()
5870 } else if (symbol->test(Symbol::Flag::Implicit)) { in HandleProcedureName()
5874 SayWithDecl(name, *symbol, in HandleProcedureName()
5891 if (Symbol * symbol{currScope().FindSymbol(name->source)}) { in NoteExecutablePartCall()
5895 if (!symbol->test(other)) { in NoteExecutablePartCall()
5896 ConvertToProcEntity(*symbol); in NoteExecutablePartCall()
5897 if (symbol->has<ProcEntityDetails>()) { in NoteExecutablePartCall()
5898 symbol->set(flag); in NoteExecutablePartCall()
5899 if (IsDummy(*symbol)) { in NoteExecutablePartCall()
5900 symbol->attrs().set(Attr::EXTERNAL); in NoteExecutablePartCall()
5902 ApplyImplicitRules(*symbol); in NoteExecutablePartCall()
5911 const parser::Name &name, Symbol &symbol, Symbol::Flag flag) { in SetProcFlag() argument
5912 if (symbol.test(Symbol::Flag::Function) && flag == Symbol::Flag::Subroutine) { in SetProcFlag()
5914 name, symbol, "Cannot call function '%s' like a subroutine"_err_en_US); in SetProcFlag()
5916 } else if (symbol.test(Symbol::Flag::Subroutine) && in SetProcFlag()
5919 name, symbol, "Cannot call subroutine '%s' like a function"_err_en_US); in SetProcFlag()
5921 } else if (symbol.has<ProcEntityDetails>()) { in SetProcFlag()
5922 symbol.set(flag); // in case it hasn't been set yet in SetProcFlag()
5924 ApplyImplicitRules(symbol); in SetProcFlag()
5926 } else if (symbol.GetType() && flag == Symbol::Flag::Subroutine) { in SetProcFlag()
5928 name, symbol, "Cannot call function '%s' like a subroutine"_err_en_US); in SetProcFlag()
5959 if (auto *symbol{info.FindInScope(context(), currScope())}) { in Pre() local
5960 info.Resolve(&SetAccess(symbolName, accessAttr, symbol)); in Pre()
5976 const SourceName &name, Attr attr, Symbol *symbol) { in SetAccess() argument
5977 if (!symbol) { in SetAccess()
5978 symbol = &MakeSymbol(name); in SetAccess()
5980 Attrs &attrs{symbol->attrs()}; in SetAccess()
5992 return *symbol; in SetAccess()
5995 static bool NeedsExplicitType(const Symbol &symbol) { in NeedsExplicitType() argument
5996 if (symbol.has<UnknownDetails>()) { in NeedsExplicitType()
5998 } else if (const auto *details{symbol.detailsIf<EntityDetails>()}) { in NeedsExplicitType()
6000 } else if (const auto *details{symbol.detailsIf<ObjectEntityDetails>()}) { in NeedsExplicitType()
6002 } else if (const auto *details{symbol.detailsIf<ProcEntityDetails>()}) { in NeedsExplicitType()
6003 return !details->interface().symbol() && !details->interface().type(); in NeedsExplicitType()
6091 existing->get<UseDetails>().symbol()); in CreateGeneric()
6111 auto &symbol{*pair.second}; in FinishSpecificationPart() local
6112 if (NeedsExplicitType(symbol)) { in FinishSpecificationPart()
6113 ApplyImplicitRules(symbol); in FinishSpecificationPart()
6115 if (symbol.has<GenericDetails>()) { in FinishSpecificationPart()
6116 CheckGenericProcedures(symbol); in FinishSpecificationPart()
6118 if (inModule && symbol.attrs().test(Attr::EXTERNAL) && in FinishSpecificationPart()
6119 !symbol.test(Symbol::Flag::Function) && in FinishSpecificationPart()
6120 !symbol.test(Symbol::Flag::Subroutine)) { in FinishSpecificationPart()
6122 symbol.set( in FinishSpecificationPart()
6123 symbol.GetType() ? Symbol::Flag::Function : Symbol::Flag::Subroutine); in FinishSpecificationPart()
6125 if (!symbol.has<HostAssocDetails>()) { in FinishSpecificationPart()
6126 CheckPossibleBadForwardRef(symbol); in FinishSpecificationPart()
6151 Symbol *symbol{std::get<parser::Name>(stmtFunc.t).symbol}; in AnalyzeStmtFunctionStmt() local
6152 if (!symbol || !symbol->has<SubprogramDetails>()) { in AnalyzeStmtFunctionStmt()
6155 auto &details{symbol->get<SubprogramDetails>()}; in AnalyzeStmtFunctionStmt()
6159 context().SetError(*symbol); in AnalyzeStmtFunctionStmt()
6162 if (auto type{evaluate::DynamicType::From(*symbol)}) { in AnalyzeStmtFunctionStmt()
6165 context().SetError(*symbol); in AnalyzeStmtFunctionStmt()
6201 if (auto *symbol{FindInScope(currScope(), name)}) { in CheckImport() local
6203 .Attach(symbol->name(), "'%s' is hidden by this entity"_en_US, in CheckImport()
6204 symbol->name()); in CheckImport()
6288 ConvertToObjectEntity(DEREF(name->symbol)); in Post()
6293 ConvertToObjectEntity(DEREF(name->symbol)); in Post()
6370 if (Symbol * symbol{scope.symbol()}) { in ResolveSpecificationParts()
6371 if (auto *details{symbol->detailsIf<SubprogramDetails>()}) { in ResolveSpecificationParts()
6396 auto &symbol{MakeSymbol(child.name(), SubprogramNameDetails{kind, child})}; in AddSubpNames() local
6397 symbol.set(child.GetSubpFlag()); in AddSubpNames()
6442 if (Symbol * symbol{name.symbol}) { in Post()
6443 if (Scope * scope{symbol->scope()}) { in Post()
6533 CHECK(scope.IsDerivedType() && !scope.symbol()); in FinishDerivedTypeInstantiation()
6539 origTypeScope->symbol() == &origTypeSymbol); in FinishDerivedTypeInstantiation()