Report a bug
		
				If you spot a problem with this page, click here to create a Bugzilla issue.
		
			Improve this page
		
			Quickly fork, edit online, and submit a pull request for this page.
			Requires a signed-in GitHub account. This works well for small changes.
			If you'd like to make larger changes you may want to consider using
			a local clone.
		
	dmd.func
Defines a function declaration.
Includes
- function/delegate literals
- function aliases
- (static/shared) constructors/destructors/post-blits
- invariant
- unittest
Authors: 
License: 
Source func.d
Documentation https://dlang.org/phobos/dmd_func.html
- enumILS: ubyte;
- Inline Status- uninitialized
- not computed yet
- no
- cannot inline
- yes
- can inline
 
- structEnsure;
- Tuple of result identifier (possibly null) and statement. This is used to store out contracts: out(id){ ensure }- static Ensures*arraySyntaxCopy(Ensures*a);
- Do syntax copy of an array of Ensure's.
 
- classFuncDeclaration: dmd.declaration.Declaration;
- 
- Statementfbody;
- function body
- FuncDeclarationsfoverrides;
- functions this function overrides
- const(char)*mangleString;
- mangled symbol created from mangleExact()
- VarDeclarationvresult;
- result variable for out contracts
- LabelDsymbolreturnLabel;
- where the return goes
- bool[size_t]isTypeIsolatedCache;
- cache for the potentially very expensive isTypeIsolated check
- VarDeclarationvthis;
- 'this' parameter (member and nested)
- VarDeclarationv_arguments;
- 'arguments' parameter
- VarDeclarationv_argptr;
- 'argptr' variable
- VarDeclarations*parameters;
- Array of VarDeclaration's for parameters
- DsymbolTablelabtab;
- statement label symbol table
- Dsymbolovernext;
- next in overload list
- FuncDeclarationovernext0;
- next in overload list (only used during IFTI)
- Locendloc;
- location of closing curly bracket
- intvtblIndex;
- for member functions, index into vtbl[]
- intinlineNest;
- !=0 if nested inline
- ForeachStatementfes;
- if foreach body, this is the foreach
- BaseClass*interfaceVirtual;
- if virtual, but only appears in base interface vtbl[]
- Typetintro;
- if !=NULL, then this is the type of the 'introducing' function this one is overriding
- STCstorage_class2;
- storage class for template onemember's
- VarDeclarationnrvo_var;
- variable to replace with shidden
- Symbol*shidden;
- hidden pointer passed to function
- GotoStatements*gotos;
- Gotos with forward references
- VarDeclarations*alignSectionVars;
- local variables with alignment needs larger than stackAlign
- Symbol*salignSection;
- pointer to aligned section, if any
- BUILTINbuiltin;
- set if this is a known, builtin function we can evaluate at compile time
- inttookAddressOf;
- set if someone took the address of this function
- VarDeclarationsclosureVars;
- local variables in this function which are referenced by nested functions (They'll get put into the "closure" for this function.)
- VarDeclarationsouterVars;
- Outer variables which are referenced by this nested function (the inverse of closureVars)
- FuncDeclarationssiblingCallers;
- Sibling nested functions which called this one
- AttributeViolation*safetyViolation;
- In case of failed @safe inference, store the error that made the function @system for better diagnostics
- ObjcFuncDeclarationobjc;
- Data for a function declaration that is needed for the Objective-C integration.
- booloverloadInsert(Dsymbols);
- Overload this FuncDeclaration with the new one f. Return true if successful; i.e. no conflict.
- final TemplateDeclarationfindTemplateDeclRoot();
- find function template root in overload list
- final boolinUnittest();
- Returns true if function was declared directly or indirectly in a unittest block
- final LabelDsymbolsearchLabel(Identifierident, Locloc);
- Searches for a label with the given identifier. This function will insert a new LabelDsymbol into labtab if it does not contain a mapping forident.Parameters:Identifier identidentifier of the requested label Loc loclocation used when creating a new LabelDsymbol Returns:the LabelDsymbol forident
- final intgetLevel(FuncDeclarationfd, intintypeof);
- Determine lexical level difference from this to nested functionfd.Parameters:FuncDeclaration fdtarget of call int intypeof!=0 if inside typeof Returns:0 same level0 decrease nesting by number -1 increase nesting by 1 ( fdis nested within this) LevelError error, this cannot callfd
- final const(char)*toFullSignature();
- for diagnostics, e.g. 'int foo(int x, int y) pure'
- final boolisAbstract();
- Override so it can work even if semantic() hasn't yet been run.
- final voidsetThrow(Locloc, const(char)*format, RootObject[]args...);
- The function is doing something that may throw an exception, register that in case nothrow is being inferredParameters:Loc loclocation of action const(char)* formatformat string for error message RootObject[] argsarguments to format string 
- final voidsetThrowCall(Locloc, FuncDeclarationfd);
- The function calls non-nothrow function f, register that in case nothrow is being inferredParameters:Loc loclocation of call FuncDeclaration fdfunction being called 
- boolisNested() const;
- Determine if function needs a static frame pointer.Returns:true if function is really nested within other function.Contracts If isNested() returns true, isThis() should return false, unless the function needs a dual-context pointer. 
- inout(AggregateDeclaration)isThis() inout;
- Determine if function is a non-static member function that has an implicit 'this' expression.Returns:The aggregate it is a member of, or null.Contracts Both isThis() and isNested() should return true if function needs a dual-context pointer, otherwise if isThis() returns true, isNested() should return false. 
- final boolisUnique() const;
- Returns:true if there are no overloads of this function
- final boolneedsClosure();
- Look at all the variables in this function that are referenced by nested functions, and determine if a closure needs to be created for them.
- final boolhasNestedFrameRefs();
- Determine if function's variables are referenced by a function nested within it.
- final ParameterListgetParameterList();
- Returns:the function's parameter list, and whether it is variadic or not.
- static FuncDeclarationgenCfunc(Parameters*fparams, Typetreturn, const(char)*name, STCstc= STC.none);
- Generate a FuncDeclaration for a runtime library function.
 
- autoMODMatchToBuffer(OutBuffer*buf, ubytelhsMod, ubyterhsMod);
- Checks for mismatching modifiers betweenlhsModandrhsModand prints the mismatching modifiers tobuf.The modifiers of thelhsModmismatching the ones with therhsModare printed, i.e. lhs(shared) vs. rhs() prints "shared", wheras lhs() vs rhs(shared) prints "non-shared".Parameters:OutBuffer* bufoutput buffer to write to ubyte lhsModmodifier on the left-hand side ubyte lhsModmodifier on the right-hand side Returns:A tuple with isMutable and isNotShared set if thelhsModis missing those modifiers (compared to rhs).Examples:OutBuffer buf; auto mismatches = MODMatchToBuffer(&buf, MODFlags.shared_, 0); assert(buf[] == "`shared` "); assert(!mismatches.isNotShared); buf.setsize(0); mismatches = MODMatchToBuffer(&buf, 0, MODFlags.shared_); assert(buf[] == "non-shared "); assert(mismatches.isNotShared); buf.setsize(0); mismatches = MODMatchToBuffer(&buf, MODFlags.const_, 0); assert(buf[] == "`const` "); assert(!mismatches.isMutable); buf.setsize(0); mismatches = MODMatchToBuffer(&buf, 0, MODFlags.const_); assert(buf[] == "mutable "); assert(mismatches.isMutable); 
- boolcheckEscapingSiblings(FuncDeclarationf, FuncDeclarationouterFunc, void*p= null);
- Given a nested function f inside a function outerFunc, check if any sibling callers of f have escaped. If so, mark all the enclosing functions as needing closures. This is recursive: we need to check the callers of our siblings. Note that nested functions can only call lexically earlier nested functions, so loops are impossible.Parameters:FuncDeclaration finner function (nested within outerFunc) FuncDeclaration outerFuncouter function void* pfor internal recursion use Returns:true if any closures were needed
- classFuncAliasDeclaration: dmd.func.FuncDeclaration;
- Used as a way to import a set of functions from another scope into this one.
- classFuncLiteralDeclaration: dmd.func.FuncDeclaration;
- classCtorDeclaration: dmd.func.FuncDeclaration;
- classPostBlitDeclaration: dmd.func.FuncDeclaration;
- classDtorDeclaration: dmd.func.FuncDeclaration;
- classStaticCtorDeclaration: dmd.func.FuncDeclaration;
- classSharedStaticCtorDeclaration: dmd.func.StaticCtorDeclaration;
- 
- boolstandalone;
- Exclude this constructor from cyclic dependency check
 
- classStaticDtorDeclaration: dmd.func.FuncDeclaration;
- classSharedStaticDtorDeclaration: dmd.func.StaticDtorDeclaration;
- classInvariantDeclaration: dmd.func.FuncDeclaration;
- classUnitTestDeclaration: dmd.func.FuncDeclaration;
- classNewDeclaration: dmd.func.FuncDeclaration;
- structAttributeViolation;
- Stores a reason why a function failed to infer a function attribute like @safe or pureHas two modes:- a regular safety error, stored in action
- a call to a function without the attribute, which is a special case, because in that case,
  that function might recursively also have a AttributeViolation. This way, in case of a big call stack, the error can go down all the way to the root cause.
 - Locloc;
- location of error
- FuncDeclarationfd;
- function is the focus of the violation
- stringaction;
- Action that made the attribute fail to get inferred
 
Copyright © 1999-2025 by the D Language Foundation | Page generated by
Ddoc on Mon Mar 31 10:27:54 2025