オフィスアワーがそろそろ始まるよ!()

E02系 (General)

E02000

エラーコードは存在しますが説明はありません。

E02001

戻り値型がエラー共用体である関数において、エラー型の推論に失敗しました。

Zen言語の関数定義では戻り値となるエラー型の宣言を省略することができます。 その場合、コンパイラが関数本体からエラー型を推論します。 E02001は推論に失敗したことを示します。

発生原因には、再帰関数の戻り値型であるエラー型を推論するケースがあります。 なお相互再帰の場合もこのケースの対象になります。

E02001 が発生するコードを例示します。

pub fn main() !void {
    try main();
}

この場合、明示的にエラー型を記述することで回避できます。

pub fn main() error{SomeError}!void {
    try main();
}

E02002

E02002 は変数の型推論に失敗した場合に発生します。

Zen言語では、変数の宣言時に型の記述を省略できます。 その場合、コンパイラは宣言文から型を推論します。 E02002 は推論に失敗したことを示します。

発生原因には、トップレベルの変数宣言において、変数の型を省略するケースがあります。

次の例では、変数 v の型を省略しているため E02002 が発生します。

var v = 25; // error
pub fn main() void {
    const x = v;
}

この場合、型を明示することでエラーを回避できます。

var v: u8 = 25; // OK

E02003

E02003 は次のいずれかの場合に発生します。

  • フィールドを持つ構造体の初期化時、初期化されていないフィールドが存在した場合
  • 列挙型を定義した上でタグ付き共用体を定義する場合、列挙型のタグとタグ付き共用体のヴァリアントとの間に過不足があった場合

次の例ではフィールド x の初期化を省略しているため E02003 が発生します。

const A = struct {
    x : i32,
    y : i32,
};

pub fn main() void {
    const a = A {
        .y = 2, // error
    };
}

この場合、すべてのフィールドを初期化することでエラーを回避できます。

pub fn main() void {
    const a = A {
        .x = 3, // OK
        .y = 2,
    };
}

E02004

エラーコードは存在しますが説明はありません。

E02005

エラーコードは存在しますが説明はありません。

E02006

E02006 は関数のインライン展開に失敗した場合に発生します。

関数を呼び出さず呼出箇所に関数の実体を挿入することをインライン展開と呼びます。 Zenコンパイラは関数のインライン展開を LLVM に委譲します。 LLVM がインライン展開に失敗した場合、エラーが発生します。

次の例では関数 foo と関数 bar が相互再帰となるため E02006 が発生します。

pub fn main() void {
    foo();
}
inline fn foo() void {
    bar();
}
inline fn bar() void {
    foo();
}

E02008

E02008 は制御構造内のコンパイル時計算に失敗した場合に発生します。

Zen言語のループのインライン展開では、ループ制御はコンパイル時計算可能である必要があります。 E02008 は制御構造内に実行時に決定する処理が存在することを示します。

次の例では inline キーワードによりループをインライン展開しています。 ループ内の if の条件式にはブール型の変数があります。 変数の値はコンパイル時に決定しないため、インライン展開に失敗します。

pub fn main() void {
    var b :bool = true;
    inline while (true) {
        if (b) { continue; } // error
    }
}

E02009

E02009 はビルトイン関数 @atomicLoad において、指定されたアトミックオーダが不正な場合に発生します。

アトミックオーダは builtin.AtomicOrder 列挙型として定義されています。

pub const AtomicOrder = enum {
    Unordered,
    Monotonic,
    Acquire,
    Release,
    AcqRel,
    SeqCst,
};

@atomicLoad では、引数に次のアトミックオーダを指定することができません。

  • Release
  • AcqRel

そのため次のコードはE02009 が発生します。

pub fn main() void {
    var x: u32 = 0;
    _ = @atomicLoad(u32, &mut x, .Release); // error
}

Release または AcqRel 以外のアトミックオーダを指定することでエラーを回避できます。

pub fn main() void {
    var x: u32 = 0;
    _ = @atomicLoad(u32, &mut x, .Acquire); // OK
}

E02010

E02010 はビルトイン関数 @atomicRmw において、指定されたアトミックオーダが不正な場合に発生します。

アトミックオーダは builtin.AtomicOrder 列挙型として定義されています。

pub const AtomicOrder = enum {
    Unordered,
    Monotonic,
    Acquire,
    Release,
    AcqRel,
    SeqCst,
};

@atomicRmw では、引数に Unordered アトミックオーダを指定することができません。

そのため次のコードは E02010 が発生します。

pub fn main() void {
    var x: u8 = 1;
    var res = @atomicRmw(u8, &mut x, .Xchg, 3, .Unordered); // error
}

Unordered 以外のアトミックオーダを指定することでエラーを回避できます。

pub fn main() void {
    var x: u8 = 1;
    var res = @atomicRmw(u8, &mut x, .Xchg, 3, .SeqCst); // OK
}

E02011

E02011 はコールスタックのアライメントに失敗した場合に発生します。

ビルトイン関数 @setAlignStack は自身が呼ばれた関数のスタックをアライメントします。 E02011 はこのアライメントに失敗したことを示します。

発生原因には、インライン展開する関数内で、@setAlignStack が呼ばれるケースがあります。

次の例では、関数 foo はインライン展開されるため、メモリに関数の実体が作られません。そのため自身のコールスタックは存在せず、アライメントに失敗します。

pub fn main() void {
    foo();
}

inline fn foo() void {
    @setAlignStack(16);
}

E02012

E02011 はコールスタックのアライメントに指定した整数が 256 より大きい場合に発生します。

ビルトイン関数の @setAlignStack では、引数にバイト数を指定することで、自身が呼ばれる関数のスタックをバイト数以上にアライメントできます。 E02011256 を超える整数を指定した場合に発生します。

fn foo() void {
    @setAlignStack(512); // error
}

E02013

E02013 は式の値を無視した場合に発生します。

次の例では、関数 foo の戻り値を無視しているため E02013 が発生します。

pub fn main() void {
    foo(); // error
}
fn foo() i32 { return 0; }

この場合戻り値を変数に格納するか、_ で戻り値が不要であることを明示することで回避できます。

pub fn main() void {
    const n = foo(); // OK
    _ = foo();       // OK
}
fn foo() i32 { return 0; }

E02014

E02014 は型のパターンマッチにおいて、必要な else が存在しない場合に発生します。

Zen言語では、型もパターンマッチできます。 switch の条件式が次に挙げる型である場合、else による分岐が必要です。

  • type
  • anyerror

次の例では型 t のパターンマッチを行います。 ttype 型ですが、else による分岐がないため E02014 が発生します。

pub fn main() void {
    const t: type = u32;
    switch (t) {
        u32 => {}, // error
    }
}

else を追加することでエラーを回避できます。

pub fn main() void {
    const t: type = u32;
    switch (t) {
        u32 => {},
        else => {}, // OK
    }
}

E02015

E02015 は整数型またはブール型をパターンマッチする際、網羅されていない値が存在した場合に発生します。

次の例は u1 型の変数 x に対し、パターンマッチを行います。 u1 型には値 1 が含まれますが、その場合の処理がありません。 よって E02015 が発生します。

pub fn main() void {
    var x: u1 = 0;
    switch(x) {
        0 => {}, // error
    }
}

1 場合の処理を追加することでエラーを回避できます。

pub fn main() void {
    var x: u1 = 0;
    switch(x) {
        0 => {},
        1 => {}, // OK
    }
}

E02016

E02015 はパターンマッチにおいて、条件式の値が取りうるパターンに重複がある場合に発生します。

次の例は整数型の変数に対しパターンマッチを行います。 値 0 のパターンが重複しているため E02015 が発生します。

pub fn main() void {
    var x: u8 = 0;
    switch (x) {
        0 => {},
        0 => {}, // error
        else => {},
    }
}

重複したパターンを削除することでエラーを回避できます。

pub fn main() void {
    var x: u8 = 0;
    switch (x) {
        0 => {},
        else => {},
    }
}

E02017

エラーコードは存在しますが説明はありません。

E02018

E02018 は列挙型またはエラー型をパターンマッチする際、網羅されていないパターンが存在した場合に発生します。

次の例は列挙型 Number のパターンマッチを行います。 Number にはタグ Three が含まれますが、その場合の処理がありません。 よって E02018 が発生します。

const Number = enum {
    One,
    Two,
    Three,
};

fn f(n: Number) i32 {
    return switch (n) {
        Number.One => 1,
        Number.Two => 2,
    };
}

Three に対する処理を追加することでエラーを回避できます。

fn f(n: Number) i32 {
    return switch (n) {
        Number.One => 1,
        Number.Two => 2,
        Number.Three => 3, // OK
    };
}

E02019

E02019 はサイズ不明の型に対し @alignOf を使用した場合に発生します。

@alignOf ビルトイン関数は、引数に指定した型のアライメントを取得します。 以下の型はサイズが確定しないため @alignOf に失敗します。

  • void
  • comptime_int
  • comptime_float

次の例では void 型のアライメントを取得しているため E02019 が発生します。

pub fn main() void {
    var v: usize = @alignOf(void);
}

E02020

E02020 は、アトミックなメモリ操作を行うビルトイン関数において、指定されたアトミックオーダが基準より弱い場合に発生します。

アトミックオーダは builtin.AtomicOrder 列挙型として定義されています。 下に行くほど、保証するアトミック性が強くなります。

pub const AtomicOrder = enum {
    Unordered,
    Monotonic,
    Acquire,
    Release,
    AcqRel,
    SeqCst,
};

対象のビルトイン関数と必要なアトミック性は次のとおりです。

ビルトイン関数 必要なアトミック性
@fence Acquire以上のアトミック性
@cmpxchgStrong Monotonic以上のアトミック性
@cmpxchgWeak Monotonic以上のアトミック性

次のコードは @fence のアトミックオーダが .Monotonic であるため E02020 が発生します。

pub fn main() void {
    @fence(.Monotonic); // error
}

Acquire 以上のアトミック性を持つアトミックオーダを指定することで回避できます。

pub fn main() void {
    @fence(.SeqCst); // OK
}

E02021

E02021 は、アトミックな比較交換を実行するビルトイン関数において、 比較失敗時のアトミックオーダのアトミック性が、成功時のアトミックオーダと比べて、強い場合に発生します。

ビルトイン関数 @cmpxchgStrong@cmpxchgWeak はアトミックな比較交換 (compare and swap) を実行します。 その引数として次の2つを指定できます。

  • 比較成功時のアトミックオーダ
  • 比較失敗時のアトミックオーダ

比較失敗時のアトミックオーダは比較成功時のものと比べ、同じ強さまたはそれより弱くする必要があります。 そうでない場合 E02021 が発生します。

またアトミックオーダは builtin.AtomicOrder 列挙型として定義されています。 下に行くほど、保証するアトミック性が強くなります。

pub const AtomicOrder = enum {
    Unordered,
    Monotonic,
    Acquire,
    Release,
    AcqRel,
    SeqCst,
};

次のコードは比較失敗時のアトミックオーダ SeqCst のアトミック性が、 成功時のアトミックオーダ Monotonic と比べて強いため E02021 が発生します。

pub fn main() void {
    var x: i32 = 1234;
    _ = @cmpxchgWeak(i32, &mut x, 1234, 5678, .Monotonic, .SeqCst); // error
}

比較失敗時のアトミックオーダを、 成功時のアトミックオーダ以下にすることで回避できます。

pub fn main() void {
    var x: i32 = 1234;
    _ = @cmpxchgWeak(i32, &mut x, 1234, 5678, .SeqCst, .Acquire); // OK
}

E02022

E02022 は、アトミックな比較交換を実行するビルトイン関数において、 比較失敗時のアトミックオーダが不正な場合に発生します。

ビルトイン関数 @cmpxchgStrong@cmpxchgWeak はアトミックな比較交換 (compare and swap) を実行します。 どちらも比較失敗時のアトミックオーダとして、以下を指定することができません。

  • Release
  • AcqRel

アトミックオーダは builtin.AtomicOrder 列挙型として定義されています。

pub const AtomicOrder = enum {
    Unordered,
    Monotonic,
    Acquire,
    Release,
    AcqRel,
    SeqCst,
};

次の例では @cmpxchgWeak の比較失敗時のアトミックオーダに Release を指定しているため E02022 が発生します。 なお @cmpxchgWeak の第六引数が比較失敗時のアトミックオーダです。

pub fn main() void {
    var x: i32 = 1234;
    _ = @cmpxchgWeak(i32, &mut x, 1234, 5678, .SeqCst, .Release); // error
}

Release または AcqRel 以外のアトミックオーダを指定することでエラーを回避できます。

pub fn main() void {
    var x: i32 = 1234;
    _ = @cmpxchgWeak(i32, &mut x, 1234, 5678, .SeqCst, .Acquire); // OK
}

E02023

E02023 は指定されたファイルが開けなかった場合に発生します。

このエラーが発生するビルトイン関数は次のとおりです。

  • @import
  • @cImport
  • @embedFile

次の例では存在しない bogus.txt を指定したため E02023 が発生します。

pub fn main() void {
    const resource = @embedFile("bogus.txt");
}

E02024

E02024 は依存関係にループがあった場合発生します。

次の例では2つのグローバル変数 ab がお互いの型に依存して定義されています。 依存関係がループになるためエラーが発生します。

const a: @TypeOf(b) = 0; // error
const b: @TypeOf(a) = 0; // error
pub fn main() void {
    const c = a + b;
}

E02025

E02025@byteOffsetOf または @bitOffsetOf の引数として、型のビット幅が 0 である構造体のメンバフィールドを指定した場合に発生します。

@byteOffsetOf@bitOffsetOf は指定されたメンバフィールドに対し、構造体の先頭からのオフセットを取得するビルトイン関数です。 引数に指定したメンバフィールドの型のビット幅が 0 である場合、オフセットを計算できません。

次の例では void 型のフィールド val に対し、オフセットを取得しているため E02025 が発生します。

const Empty = struct {
    val: void,
};

pub fn main() void {
    const fieldOffset = @byteOffsetOf(Empty, "val");
}

E02026

E02026 はデバッグ用のビルトイン関数である @compileLog が実行された場合に発生します。

@compileLog はコンパイル時に実行されるコードを printfデバッグ するためのビルトイン関数です。 デバッグ後は実行される全ての @compileLog を取り除く必要があります。

次の例は、@compileLog が呼び出されるため E02026 が発生します。

pub fn main() void {
    @compileLog("foo"); // error
    @compileLog("bar"); // error
}

@compileLog を削除することでエラーを回避できます。

pub fn main() void {
}

E02027

エラーコードは存在しますが説明はありません。

E02028

E02028 は型のパターンマッチにおいて、マッチした型を変数にキャプチャした場合に発生します。

Zen言語では型をパターンマッチすることができます。 しかしマッチした型を変数にキャプチャすることはできません。

次の例では、コンパイル時に決まる型 T に対し、パターンマッチを行います。 パターンマッチの中で型 i32 にマッチした場合、型を変数 t にキャプチャしているため E02028 が発生します。

fn typeMatch(comptime T: type) void {
    const x = switch (T) {
        i32 => |t| 123,
        else => unreachable,
    };
}

E02029

E02029 はインライン展開する関数呼び出しに失敗した場合に発生します。

Zen言語では、inline 指定子がついた関数は、関数の呼び出しのインライン展開を強制します。

一方 @call ビルトイン関数は CallModifier と呼ばれるタグに never_inline を指定することで、インライン展開しない関数呼び出しを強制します。

両者は相反する関数呼び出しを強制するため併用できません。

次の例では、inline 指定子が付与された関数 foo に対し、@call ビルトイン関数で never_inline タグを付け関数を呼び出すため、 E02029 が発生します。

inline fn foo() void {}
pub fn main() void {
    @call(.never_inline, null, foo, .{});
}

E02030

E02030 は定数に値を再代入するときに発生します。

Zen言語の定数は、イミュータブルな値であるという特性をもちます。 そのため、一度初期化した定数はその値を変更することができません。

次の例では、初期化済みの定数 a に対し、4 を代入しているため E02030 が発生します。

pub fn main() void {
    const a = 3;
    a = 4;
}

E02031

E02031 はエラー型を返す関数の戻り値を明示的に無視した場合に発生します。

Zen言語では、関数の戻り値が不要な場合 _ でその値を明示的に無視することができます。 しかし戻り値の型がエラー型の場合、無視することができません。

次の例ではエラー型を返す関数 foo の戻り値を _ によって無視しているため、E02031 が発生します。

pub fn main() void {
    _ = foo(); // error
}

fn foo() !void {
    return error.E;
}

try を使うか、catch でエラーをハンドルすることで回避できます。

pub fn main() void {
    foo() catch return; // OK
}

fn foo() !void {
    return error.E;
}

E02032

エラーコードは存在しますが説明はありません。

E02033

E02033return キーワードが存在するスコープの中で、return の後にコードが続く場合に発生します。

return キーワードが実行されると、呼び出し元に制御が戻ります。 return 以降のコードは実行されず不要なため、コンパイラはエラーとして検出します。

次のコードは return 以降に const x = 1; が存在するため E02033 が発生します。

pub fn main() void {
    return;
    const x = 1; // error
}

E02034

E02034 は制御フローの中で comptime 変数が実行時に使用された場合に発生します。

Zen言語では comptime 変数に対する値の更新はコンパイル時に実行されます。ただし、更新する値もコンパイル時計算可能でなければなりません。

次のコードは、while ループの中で、comptime 変数 i の値が更新されます。 通常 while ループは実行時に処理されるため、更新される値はコンパイル時に決定しません。 そのため E02034 が発生します。

pub fn main() void {
    comptime var i: u8 = 0;
    while (i < 10) {
        i += 1; // error
    }
}

この場合 while ループをインライン展開することで、エラーを回避できます。

pub fn main() void {
    comptime var i: u8 = 0;
    inline while (i < 10) {
        i += 1; // OK
    }
}

E02035

E02035 はエラー値をキャプチャするコードの後に、 unreachable キーワードが存在した場合に発生します。

Zen言語では次のどちらかのキーワードを使い、発生するエラー値をキャプチャできます。

  • catch
  • errdefer

キャプチャ後に unreachable キーワードが続く場合、 変数にキャプチャされたエラー値は使用されないままプログラムが停止します。 E02035 は使用されないエラーがキャプチャされたことを知らせるエラーです。

次の例では、エラー型を返す関数 foo の戻り値を catch を使いキャプチャしています。 しかしキャプチャ後に unreachable キーワードが存在するため E02035 が発生します。

pub fn main() void {
    foo() catch |a| unreachable; // error
}

fn foo() !void {
    return error.A;
}

E02036

E02036 は存在しないビルトイン関数が呼ばれた場合に発生します。

次の例では存在しない @bogus というビルトイン関数を呼び出しているため E02036 が発生します。

pub fn main() void {
    @bogus(); // error
}

E02037

E02037_ キーワードが値を無視すること以外に使われた場合に発生します。

Zen言語では _ キーワードで値を無視することができます。 典型的な用途は、戻り値を持つ関数を呼び出したとき、戻り値を無視する使い方です。

次の例では、定数 x_ を代入しているため E02037 が発生します。

pub fn main() void {
    const x = _;
}

E02038

E02038 は呼出規約が .Naked である関数に対し、通常の関数呼び出しを行った場合に発生します。

呼出規約に .Naked が指定された関数は、自身のプロローグとエピローグが出力されません。 そのため通常の関数呼び出しを行うと、コンパイラはエラーとして検出します。

次の例では foo 関数の呼出規約として .Naked を指定しています。 foo 関数は通常の関数呼び出しが行われるため E02038 が発生します。

pub fn main() void {
    foo(); // error
}

fn foo() callconv(.Naked) void {}

E02039

エラーコードは存在しますが説明はありません。

E02040

E02040@compileError がコンパイラの意味解析フェーズで検出された場合に発生します。

プログラマは @compileError ビルトイン関数により意図的にコンパイルエラーを発生させることができます。 この関数の主な用途はデバッグです。

次の例では @compileError を使いコンパイルエラーを発生させます。

pub fn main() void {
    @compileError("something is wrong"); // error
}

E02041

エラーコードは存在しますが説明はありません。

E02042

エラーコードは存在しますが説明はありません。

E02043

エラーコードは存在しますが説明はありません。

E02044

エラーコードは存在しますが説明はありません。

E02046

エラーコードは存在しますが説明はありません。

E02047

エラーコードは存在しますが説明はありません。

E02048

エラーコードは存在しますが説明はありません。

E02049

エラーコードは存在しますが説明はありません。

E02050

エラーコードは存在しますが説明はありません。

E02051

エラーコードは存在しますが説明はありません。

E02052

エラーコードは存在しますが説明はありません。

E02054

エラーコードは存在しますが説明はありません。

E02055

エラーコードは存在しますが説明はありません。

E02056

エラーコードは存在しますが説明はありません。

E02057

E02057 はビルトイン関数 @atomicStore において、指定されたアトミックオーダが不正な場合に発生します。

アトミックオーダは builtin.AtomicOrder 列挙型として定義されています。

pub const AtomicOrder = enum {
    Unordered,
    Monotonic,
    Acquire,
    Release,
    AcqRel,
    SeqCst,
};

@atomicStore では、引数に次のアトミックオーダを指定することができません。

  • Acquire
  • AcqRel

そのため次のコードはE02057 が発生します。

pub fn main() void {
    var x: u32 = 0;
    @atomicStore(u32, &mut x, 1, .Acquire); // error
}

Acquire または AcqRel 以外のアトミックオーダを指定することでエラーを回避できます。

pub fn main() void {
    var x: u32 = 0;
    @atomicStore(u32, &mut x, 1, .SeqCst); // OK
}

E02058

エラーコードは存在しますが説明はありません。

E02059

エラーコードは存在しますが説明はありません。

E02060

エラーコードは存在しますが説明はありません。

E02061

エラーコードは存在しますが説明はありません。

E02062

エラーコードは存在しますが説明はありません。

E02063

エラーコードは存在しますが説明はありません。

E02064

エラーコードは存在しますが説明はありません。

E02065

エラーコードは存在しますが説明はありません。

E02066

エラーコードは存在しますが説明はありません。

E02067

エラーコードは存在しますが説明はありません。

E02068

エラーコードは存在しますが説明はありません。

E02069

エラーコードは存在しますが説明はありません。

E02070

エラーコードは存在しますが説明はありません。

E02071

エラーコードは存在しますが説明はありません。

E02072

エラーコードは存在しますが説明はありません。

E02073

エラーコードは存在しますが説明はありません。

E02074

エラーコードは存在しますが説明はありません。

E02075

エラーコードは存在しますが説明はありません。

E02076

エラーコードは存在しますが説明はありません。

E02077

エラーコードは存在しますが説明はありません。

E02078

エラーコードは存在しますが説明はありません。

E02079

エラーコードは存在しますが説明はありません。

Chapter 1

Chapter 2

Chapter 3

Chapter 4

Chapter 5

Chapter 6

Chapter 7

Chapter 8

Chapter 9

Chapter 10

Chapter 11

Chapter 12

Chapter 13

Chapter 14

Chapter 15

Appendix

Error Explanation

☰ 人の生きた証は永遠に残るよう ☰
Copyright © 2018-2020 connectFree Corporation. All rights reserved. | 特定商取引法に基づく表示
Zen, the Zen three-circles logo and The Zen Programming Language are trademarks of connectFree corporation in Japan and other countries.