英語版
このページの英語版を見る

dmd.func

関数宣言を定義する。

  • 関数/デリゲートリテラル
  • 関数エイリアス
  • (静的/共有)コンストラクタ/デストラクタ/ポストブリッツ
  • invariant
  • unittest

Authors:

ソースfunc.d

カバレッジ https://codecov.io/gh/dlang/dmd/src/master/src/dmd/func.d

enum ILS: ubyte;
インラインステータス
uninitialized
まだ計算されていない
no
インライン化不可
yes
インライン化可能
struct Ensure;
結果識別子(nullの場合あり)と文のタプル。 これはout契約を保存するために使用される:out(id){ ensure }
static Ensures* arraySyntaxCopy(Ensures* a);
Ensureの配列の構文コピーを行う。
class FuncDeclaration: dmd.declaration.Declaration;
Statement fbody;
関数本体
FuncDeclarations foverrides;
この関数は、
const(char)* mangleString;
mangleExact()の結果変数から作成された文字化けシンボルを上書きする
VarDeclaration vresult;
out契約の結果変数
LabelDsymbol returnLabel;
キャッシュに格納される
bool[size_t] isTypeIsolatedCache;
非常に高価になる可能性がある isTypeIsolated チェックのキャッシュ用
VarDeclaration vthis;
'this' パラメータ(メンバーおよびネストされたもの)
VarDeclaration v_arguments;
'arguments' パラメータ
VarDeclaration v_argptr;
'argptr' 変数
VarDeclarations* parameters;
パラメータのVarDeclarationの配列
DsymbolTable labtab;
文ラベルシンボルテーブル
Dsymbol overnext;
オーバーロードリストの次の
FuncDeclaration overnext0;
オーバーロードリストの次の項目(IFTI の実行時のみ使用される)
Loc endloc;
メンバ関数の閉じ中括弧の位置
int vtblIndex;
メンバ関数、vtbl[]へのインデックス
int inlineNest;
ネストされたインラインの場合、!=0
ForeachStatement fes;
if foreach body の場合、これは foreach
BaseClass* interfaceVirtual;
仮想関数だが、ベースインターフェースの vtbl[] にのみ表示される
Type tintro;
if !=NULL であれば、これは 「導入」関数の型 であり、これは上書きしている
StorageClass storage_class2;
テンプレートのストレージクラスをオーバーライドしている。
int hasReturnExp;
1 戻り値の exp; 文がある場合 2 "スロー"文がある場合 4 "アサート(0)"がある場合 8 "インラインasm"がある場合 16 複数の"return"文がある場合
VarDeclaration nrvo_var;
隠された変数に置き換える
Symbol* shidden;
関数に渡される隠されたポインタ
GotoStatements* gotos;
前方参照を持つ分岐
VarDeclarations* alignSectionVars;
アラインメントが必要なローカル変数で、スタックアラインメントよりも大きな値を持つ
Symbol* salignSection;
ポインタがアラインメントセクションに存在する場合、
BUILTIN builtin;
これは既知の組み込み関数であり、コンパイル時に評価できる場合、設定する
int tookAddressOf;
この関数のアドレスを取得した場合に設定される
VarDeclarations closureVars;
ネストした関数から参照されるこの関数のローカル変数 (これらはこの関数の「クロージャ」に格納される。)
VarDeclarations outerVars;
このネストされた関数によって参照される外部変数 (closureVarsの逆数)
FuncDeclarations siblingCallers;
この関数を呼び出した兄弟ネスト関数
AttributeViolation* safetyViolation;
@safe の推論に失敗した場合、関数@system の診断を改善するためのエラーを保存する
ObjcFuncDeclaration objc;
Objective-C 統合に必要な関数宣言用のデータ。
final int overrides(FuncDeclaration fd);
'this' が fd をオーバーライドしているかどうかを判断する。 オーバーライドしている場合は 0 を返す。
bool overloadInsert(Dsymbol s);
このFuncDeclarationを新しいfでオーバーロードする。 成功した場合、つまり競合がない場合はtrueを返す。
final TemplateDeclaration findTemplateDeclRoot();
関数テンプレートルートをオーバーロードリストから検索する
final bool inUnittest();
関数が直接または間接的に unittest ブロックで宣言されている場合は true を返す。
static MATCH leastAsSpecialized(FuncDeclaration f, FuncDeclaration g, Identifiers* names);
関数の部分的な特殊化の順序を決定する fg。 これは、TemplateDeclaration::leastAsSpecialized()と非常に似ている。
Parameters: 最初の関数
FuncDeclaration f 最初の関数
FuncDeclaration g 2番目の関数
Identifiers* names パラメータの名前
Returns:
一致する 'this' は g と同じくらい少なくとも特化されている 0 g は 'this' よりも特化されている
final LabelDsymbol searchLabel(Identifier ident, const ref Loc loc);
指定された識別子を持つラベルを検索する。この関数は、labtab にマッピングが含まれていない場合、LabelDsymbol を挿入する ident
Parameters:
Identifier ident 要求されたラベルの識別子
Loc loc 新しいラベルを作成する際に使用するLabelDsymbol
Returns: xml-ph-0000@deepl.internal
LabelDsymbolident
final int getLevel(FuncDeclaration fd, int intypeof);
this からネストされた関数への()()レベルの違いを判断する fd
Parameters:
FuncDeclaration fd 呼び出しのターゲット
int intypeof !=0 if inside typeof
Returns: 0 同じレベル
0 同じレベル

0 ネストの数を減らす -1 ネストの数を1増やす (fdthis の内部にネストされている LevelError エラー、thisfd

final const(char)* toFullSignature();
例えば 'int foo(int x, int y) pure'
final bool isAbstract();
semantic()がまだ実行されていない場合でも動作するようにオーバーライドする。
final void initInferAttributes();
この関数の属性を推論するための初期化。
final bool setImpure(Loc loc = Loc.init, const(char)* fmt = null, RootObject arg0 = null);
この関数は純粋でないことを行っているので、"pureでない"とマークする。
Parameters:
Loc loc "pureでない"動作の場所
const(char)* fmt エラーメッセージの書式文字列。関数の種類と名前には「%s%s 」を含める必要がある。
RootObject arg0 (オプション)フォーマット文字列の引数
Returns:
true 純度エラーが発生した場合
final bool setUnsafe(bool gag = false, Loc loc = Loc.init, const(char)* fmt = null, RootObject arg0 = null, RootObject arg1 = null, RootObject arg2 = null);
関数が安全でないことを意味する場合は、それをマークする。
Parameters:
bool gag エラーメッセージを抑制する(エスケープ.dで使用される)
Loc loc エラーの発生場所
const(char)* fmt printf 形式のフォーマット文字列
RootObject arg0 (オプション) 最初の %s フォーマット指定子用の引数
RootObject arg1 (オプション) 2番目の %s フォーマット指定子に対する引数
RootObject arg2 (オプション)3番目の %s フォーマット指定子用の引数
Returns:
安全なエラーがあるかどうか
final bool setUnsafeCall(FuncDeclaration f);
この関数は@system 関数を呼び出している fので、安全ではないとマークする。
Parameters:
FuncDeclaration f 呼び出される関数(推測される関数の診断に必要)
Returns: 安全なエラーがあるかどうか
安全なエラーがあるかどうか
final bool setGC(Loc loc, const(char)* fmt, RootObject arg0 = null);
この関数は、GCで割り当てが発生する可能性がある処理を行っているため、 nogc(ノーハウ)ではないとマークする。
Parameters: 不純な動作の場所
Loc loc 不純な動作の場所
const(char)* fmt エラーメッセージのフォーマット文字列。関数の種類と名前については、「%s%s 」を含める必要がある。
RootObject arg0 (オプション)フォーマット文字列の引数
Returns:
関数が@nogcとしてマークされている場合、つまりユーザーエラーが発生したことを意味する場合は「true」とする
final bool setGCCall(FuncDeclaration f);
関数が非@nogc 関数fを呼び出し、それをnogcではないとマークする。
Parameters:
FuncDeclaration f 関数が呼び出される
Returns:
関数が@nogcとマークされている場合、ユーザーエラーが発生したことを意味する
final void setThrow(Loc loc, const(char)* fmt, RootObject arg0 = null);
関数は例外をスローする可能性がある処理を行っている。nothrowが推論される場合は、例外を登録する。
Parameters:
Loc loc アクションの場所
const(char)* fmt エラーメッセージのフォーマット文字列
RootObject arg0 (オプション)フォーマット文字列の引数
final void setThrowCall(Loc loc, FuncDeclaration f);
関数は、nothrow 以外の関数fを呼び出す。nothrowが推論されている場合は、その旨を記録する
Parameters:
Loc loc 呼び出しの場所
FuncDeclaration f 呼び出される関数
final bool isReturnIsolated();
関数のパラメータ、変更可能なグローバル変数、上位関数からのポインタが 戻り値に漏れ出していないか確認する。
Returns:
関数の戻り値が関数への入力から隔離されている場合は「真」
final bool isTypeIsolated(Type t);

final bool isTypeIsolated(Type t, ref StringTable!Type parentTypes);
関数パラメータ、変更可能なグローバル変数、上位関数からのポインタが 型に漏れ込んでいないか確認する t
Parameters:
Type t 型をチェックして、それが分離されているかどうかを確認する
Returns:
true if t関数への入力から隔離されている 場合はtrueを返す
const bool isNested();
関数に静的フレームポインタが必要かどうかを判断する。
Returns:
true 関数が他の関数内にネストされているかどうかを判断する。

契約 isNested() が true を返した場合、関数がデュアルコンテキストポインタを必要としない限り、isThis() は false を返すべきである。

inout inout(AggregateDeclaration) isThis();
関数が非静的メンバ関数であり、暗黙的に「this」式を持つかどうかを判断する。
Returns:
その集合は、メンバーであるか、nullである。

契約 isThis() および isNested() は、関数が二重コンテキストポインタを必要とする場合は true を返し、 そうでない場合は isThis() が true を返す場合は isNested() は false を返す。

final const bool isUnique();
Returns:
この関数のオーバーロードが存在しない場合は true を返す
final bool needsClosure();
この関数内のすべての変数で、ネストした関数から参照されているものについて確認し、 それらの変数に対してクロージャを作成する必要があるかどうかを判断する。
final bool checkClosure();
その関数にクロージャが含まれているか確認する。 @nogcの場合は、適切なエラーを報告する。 これは、FuncDeclaration::needsClosure()とほぼ一致する。
Returns:
エラーが発生した場合は true を返す。
final bool hasNestedFrameRefs();
関数の変数が、その関数内にネストされた関数によって参照されているかどうかを判断する。
static @safe bool needsFensure(FuncDeclaration fd);
指定した関数またはそのオーバーライドのいずれかで「アウト」契約が宣言されているかどうかを判断する。
Parameters:
FuncDeclaration fd 検索する関数
Returns:
true 'out'契約が見つかった
final ParameterList getParameterList();
Returns:
関数のパラメータリスト、および それが可変長引数であるかどうかを
static FuncDeclaration genCfunc(Parameters* fparams, Type treturn, const(char)* name, StorageClass stc = 0);
ランタイムライブラリ関数の FuncDeclaration を生成する。
final bool checkNRVO();
関数のすべての return 文をチェックし、 NRVO を使用した戻り値が可能かどうかを検証する。
Returns:
false 結果が隠れた参照によって返されない場合。
int overloadApply(Dsymbol fstart, scope int delegate(Dsymbol) dg, Scope* sc = null);
オーバーロードされた関数/テンプレートを順に調べ、dg(s) を呼び出す。 dg(s) がゼロ以外の値を返すか、それ以上呼び出せなくなったら終了する。
Parameters: シンボルから開始する
Dsymbol fstart シンボルから開始する
int delegate(Dsymbol) dg オーバーロードのコンテキストで呼び出されるデリゲートから開始する
Scope* sc コンテキストで呼び出されるデリゲートから開始する。シンボルがアクセス可能(したがって可視)であるかどうかを確認するために使用される。 nullにすることも可能である
Returns:
==0 継続 !=0 完了 (そして、最後の dg() 呼び出しからの戻り値)
auto MODMatchToBuffer(OutBuffer* buf, ubyte lhsMod, ubyte rhsMod);
修飾子の不一致をチェックする。 lhsModrhsMod不一致の修飾子を 表示する。 buf
不一致の修飾子の lhsMod一致しないもの、すなわち rhsMod、すなわち lhs(shared) vs. rhs() は "shared" と表示し、lhs() vs. rhs(shared) は "共有でない" と表示する。
Parameters:
OutBuffer* buf 出力バッファに書き込む
ubyte lhsMod 左辺の修飾子
ubyte lhsMod 右辺の修飾子
Returns: xml-ph-0000@deepl.internalとxml-ph-0001@deepl.internalが設定されたタプル
isMutableisNotShared が設定されたタプル が、 lhsModそれらの修飾子(右辺と比較して)が欠けている場合。
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);
Type getIndirection(Type t);
tから1段階間接した型を返す。
class FuncAliasDeclaration: dmd.func.FuncDeclaration;
別のスコープからこのスコープに一連の関数をインポートする方法として使用される。
class FuncLiteralDeclaration: dmd.func.FuncDeclaration;
class CtorDeclaration: dmd.func.FuncDeclaration;
class PostBlitDeclaration: dmd.func.FuncDeclaration;
class DtorDeclaration: dmd.func.FuncDeclaration;
class StaticCtorDeclaration: dmd.func.FuncDeclaration;
class SharedStaticCtorDeclaration: dmd.func.StaticCtorDeclaration;
bool standalone;
このコンストラクタを循環依存チェックから除外する
class StaticDtorDeclaration: dmd.func.FuncDeclaration;
class SharedStaticDtorDeclaration: dmd.func.StaticDtorDeclaration;
class InvariantDeclaration: dmd.func.FuncDeclaration;
class UnitTestDeclaration: dmd.func.FuncDeclaration;
class NewDeclaration: dmd.func.FuncDeclaration;
struct AttributeViolation;
関数属性の推論に失敗した理由を保存する。@safepureのような
2つのモードがある:
  • 通常の安全エラー、(fmtStr, arg0, arg1) に格納される
  • 属性のない関数の呼び出しは、特別なケースである。なぜなら、その場合、
その関数も再帰的にエラーが発生する可能性がある AttributeViolation。この方法では、 大きなコールスタックの場合、エラーが根本原因までたどることができる。FunctionDeclarationarg0 に格納され、fmtStrnull でなければならない。
Loc loc;
エラーの発生場所
const(char)* fmtStr;
printf形式のフォーマット文字列
RootObject arg0;

RootObject arg1;

RootObject arg2;
最大2つの%s 形式指定子を含む引数
void errorSupplementalInferredAttr(FuncDeclaration fd, int maxDepth, bool deprecation, STC stc);
推論された理由を印刷する fd推測された理由を@system 補足エラーとして
Parameters:
FuncDeclaration fd 関数として、
int maxDepth エラーを報告する関数の深さをいくつまでチェックするかを
bool deprecation エラーの代わりに非推奨の表示を行う
STC stc 属性のストレージクラスをチェックする