/* Compiler implementation of the D programming language * Copyright (C) 1999-2025 by The D Language Foundation, All Rights Reserved * written by Walter Bright * https://www.digitalmars.com * Distributed under the Boost Software License, Version 1.0. * https://www.boost.org/LICENSE_1_0.txt * https://github.com/dlang/dmd/blob/master/src/dmd/scope.h */ #pragma once class ErrorSink; class Identifier; class Module; class Statement; class SwitchStatement; class TryFinallyStatement; class LabelStatement; class ForeachStatement; class ClassDeclaration; class AggregateDeclaration; class FuncDeclaration; class UserAttributeDeclaration; struct DocComment; struct AA; class TemplateInstance; class CPPNamespaceDeclaration; #include "dsymbol.h" enum class CSX : uint16_t { none = 0, this_ctor = 1, // called this() super_ctor = 2, // called super() label = 4, // seen a label return_ = 8, // seen a return statement any_ctor = 0x10, // either this() or super() was called halt = 0x20, // assert(0) }; enum class Contract : uint8_t { none = 0u, invariant_ = 1u, require = 2u, ensure = 3u, }; struct Scope final { Scope *enclosing; // enclosing Scope Module *_module; // Root module ScopeDsymbol *scopesym; // current symbol FuncDeclaration *func; // function we are in VarDeclaration *varDecl; // variable we are in during semantic2 Dsymbol *parent; // parent to use LabelStatement *slabel; // enclosing labelled statement SwitchStatement *switchStatement; // enclosing switch statement Statement *tryBody; // enclosing _body of TryCatchStatement or TryFinallyStatement TryFinallyStatement *tryFinally; // enclosing try finally statement ScopeGuardStatement *scopeGuard; // enclosing scope(xxx) statement Statement *sbreak; // enclosing statement that supports "break" Statement *scontinue; // enclosing statement that supports "continue" ForeachStatement *fes; // if nested function for ForeachStatement, this is it Scope *callsc; // used for __FUNCTION__, __PRETTY_FUNCTION__ and __MODULE__ Dsymbol *inunion; // !=null if processing members of a union d_bool nofree; // true if shouldn't free it d_bool inLoop; // true if inside a loop (where constructor calls aren't allowed) d_bool inDefaultArg; // true if inside a default argument (where __FILE__, etc are evaluated at the call site) int intypeof; // in typeof(exp) VarDeclaration *lastVar; // Previous symbol used to prevent goto-skips-init ErrorSink *eSink; // sink for error messages /* If minst && !tinst, it's in definitely non-speculative scope (eg. module member scope). * If !minst && !tinst, it's in definitely speculative scope (eg. template constraint). * If minst && tinst, it's in instantiated code scope without speculation. * If !minst && tinst, it's in instantiated code scope with speculation. */ Module *minst; // root module where the instantiated templates should belong to TemplateInstance *tinst; // enclosing template instance CSX callSuper; // primitive flow analysis for constructors CSX *fieldinit; size_t fieldinit_dim; AlignDeclaration *aligndecl; // alignment for struct members /// C++ namespace this symbol belongs to CPPNamespaceDeclaration *namespace_; LINK linkage; // linkage for external functions CPPMANGLE cppmangle; // C++ mangle type PragmaDeclaration *inlining; // inlining strategy for functions Visibility visibility; // visibility for class members int explicitVisibility; // set if in an explicit visibility attribute StorageClass stc; // storage class DeprecatedDeclaration *depdecl; // customized deprecation message uint16_t flags; uint16_t previews; // state of preview switches bool ctor() const; bool ctor(bool v); bool noAccessCheck() const; bool noAccessCheck(bool v); bool condition() const; bool condition(bool v); bool debug_() const; bool debug_(bool v); bool inTemplateConstraint() const; bool inTemplateConstraint(bool v); Contract contract() const; Contract contract(Contract v); bool ctfe() const; bool ctfe(bool v); bool traitsCompiles() const; bool traitsCompiles(bool v); bool ignoresymbolvisibility() const; bool ignoresymbolvisibility(bool v); bool inCfile() const; bool inCfile(bool v); bool canFree() const; bool canFree(bool v); bool fullinst() const; bool fullinst(bool v); bool ctfeBlock() const; bool ctfeBlock(bool v); UserAttributeDeclaration *userAttribDecl; // user defined attributes DocComment *lastdc; // documentation comment for last symbol at this scope AA *anchorCounts; // lookup duplicate anchor name count Identifier *prevAnchor; // qualified symbol name of last doc anchor AliasDeclaration *aliasAsg; // if set, then aliasAsg is being assigned a new value, // do not set wasRead for it StructDeclaration *argStruct; // elimiate recursion when looking for rvalue construction Dsymbol *search(Loc loc, Identifier *ident, Dsymbol *&pscopesym, SearchOptFlags flags = (SearchOptFlags)SearchOpt::all); };