エラーコードは存在しますが説明はありません。
戻り値型がエラー共用体である関数において、エラー型の推論に失敗しました。
Zen言語の関数定義では戻り値となるエラー型の宣言を省略することができます。
その場合、コンパイラが関数本体からエラー型を推論します。
E02001
は推論に失敗したことを示します。
発生原因には、再帰関数の戻り値型であるエラー型を推論するケースがあります。 なお相互再帰の場合もこのケースの対象になります。
E02001
が発生するコードを例示します。
pub fn main() !void {
try main();
}
この場合、明示的にエラー型を記述することで回避できます。
pub fn main() error{SomeError}!void {
try main();
}
E02002
は変数の型推論に失敗した場合に発生します。
Zen言語では、変数の宣言時に型の記述を省略できます。
その場合、コンパイラは宣言文から型を推論します。
E02002
は推論に失敗したことを示します。
発生原因には、トップレベルの変数宣言において、変数の型を省略するケースがあります。
次の例では、変数 v
の型を省略しているため E02002
が発生します。
var v = 25; // error
pub fn main() void {
const x = v;
}
この場合、型を明示することでエラーを回避できます。
var v: u8 = 25; // OK
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,
};
}
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
E02006
は関数のインライン展開に失敗した場合に発生します。
関数を呼び出さず呼出箇所に関数の実体を挿入することをインライン展開と呼びます。 Zenコンパイラは関数のインライン展開を LLVM に委譲します。 LLVM がインライン展開に失敗した場合、エラーが発生します。
次の例では関数 foo
と関数 bar
が相互再帰となるため E02006
が発生します。
pub fn main() void {
foo();
}
inline fn foo() void {
bar();
}
inline fn bar() void {
foo();
}
E02008
は制御構造内のコンパイル時計算に失敗した場合に発生します。
Zen言語のループのインライン展開では、ループ制御はコンパイル時計算可能である必要があります。
E02008
は制御構造内に実行時に決定する処理が存在することを示します。
次の例では inline
キーワードによりループをインライン展開しています。
ループ内の if
の条件式にはブール型の変数があります。
変数の値はコンパイル時に決定しないため、インライン展開に失敗します。
pub fn main() void {
var b :bool = true;
inline while (true) {
if (b) { continue; } // error
}
}
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
はビルトイン関数 @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
はコールスタックのアライメントに失敗した場合に発生します。
ビルトイン関数 @setAlignStack
は自身が呼ばれた関数のスタックをアライメントします。
E02011
はこのアライメントに失敗したことを示します。
発生原因には、インライン展開する関数内で、@setAlignStack
が呼ばれるケースがあります。
次の例では、関数 foo
はインライン展開されるため、メモリに関数の実体が作られません。そのため自身のコールスタックは存在せず、アライメントに失敗します。
pub fn main() void {
foo();
}
inline fn foo() void {
@setAlignStack(16);
}
E02011
はコールスタックのアライメントに指定した整数が 256
より大きい場合に発生します。
ビルトイン関数の @setAlignStack
では、引数にバイト数を指定することで、自身が呼ばれる関数のスタックをバイト数以上にアライメントできます。
E02011
は 256
を超える整数を指定した場合に発生します。
fn foo() void {
@setAlignStack(512); // error
}
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
は型のパターンマッチにおいて、必要な else
が存在しない場合に発生します。
Zen言語では、型もパターンマッチできます。
switch
の条件式が次に挙げる型である場合、else
による分岐が必要です。
type
anyerror
次の例では型 t
のパターンマッチを行います。
t
は type
型ですが、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
は整数型またはブール型をパターンマッチする際、網羅されていない値が存在した場合に発生します。
次の例は 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
}
}
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 => {},
}
}
エラーコードは存在しますが説明はありません。
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
はサイズ不明の型に対し @alignOf
を使用した場合に発生します。
@alignOf
ビルトイン関数は、引数に指定した型のアライメントを取得します。
以下の型はサイズが確定しないため @alignOf
に失敗します。
void
comptime_int
comptime_float
次の例では void
型のアライメントを取得しているため E02019
が発生します。
pub fn main() void {
var v: usize = @alignOf(void);
}
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
は、アトミックな比較交換を実行するビルトイン関数において、
比較失敗時のアトミックオーダのアトミック性が、成功時のアトミックオーダと比べて、強い場合に発生します。
ビルトイン関数 @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
は、アトミックな比較交換を実行するビルトイン関数において、
比較失敗時のアトミックオーダが不正な場合に発生します。
ビルトイン関数 @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
は指定されたファイルが開けなかった場合に発生します。
このエラーが発生するビルトイン関数は次のとおりです。
@import
@cImport
@embedFile
次の例では存在しない bogus.txt
を指定したため E02023
が発生します。
pub fn main() void {
const resource = @embedFile("bogus.txt");
}
E02024
は依存関係にループがあった場合発生します。
次の例では2つのグローバル変数 a
と b
がお互いの型に依存して定義されています。
依存関係がループになるためエラーが発生します。
const a: @TypeOf(b) = 0; // error
const b: @TypeOf(a) = 0; // error
pub fn main() void {
const c = a + b;
}
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
はデバッグ用のビルトイン関数である @compileLog
が実行された場合に発生します。
@compileLog
はコンパイル時に実行されるコードを printfデバッグ するためのビルトイン関数です。
デバッグ後は実行される全ての @compileLog
を取り除く必要があります。
次の例は、@compileLog
が呼び出されるため E02026
が発生します。
pub fn main() void {
@compileLog("foo"); // error
@compileLog("bar"); // error
}
@compileLog
を削除することでエラーを回避できます。
pub fn main() void {
}
エラーコードは存在しますが説明はありません。
E02028
は型のパターンマッチにおいて、マッチした型を変数にキャプチャした場合に発生します。
Zen言語では型をパターンマッチすることができます。 しかしマッチした型を変数にキャプチャすることはできません。
次の例では、コンパイル時に決まる型 T
に対し、パターンマッチを行います。
パターンマッチの中で型 i32
にマッチした場合、型を変数 t
にキャプチャしているため E02028
が発生します。
fn typeMatch(comptime T: type) void {
const x = switch (T) {
i32 => |t| 123,
else => unreachable,
};
}
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
は定数に値を再代入するときに発生します。
Zen言語の定数は、イミュータブルな値であるという特性をもちます。 そのため、一度初期化した定数はその値を変更することができません。
次の例では、初期化済みの定数 a
に対し、4
を代入しているため E02030
が発生します。
pub fn main() void {
const a = 3;
a = 4;
}
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;
}
エラーコードは存在しますが説明はありません。
E02033
は return
キーワードが存在するスコープの中で、return
の後にコードが続く場合に発生します。
return
キーワードが実行されると、呼び出し元に制御が戻ります。
return
以降のコードは実行されず不要なため、コンパイラはエラーとして検出します。
次のコードは return
以降に const x = 1;
が存在するため E02033
が発生します。
pub fn main() void {
return;
const x = 1; // error
}
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
はエラー値をキャプチャするコードの後に、 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
は存在しないビルトイン関数が呼ばれた場合に発生します。
次の例では存在しない @bogus
というビルトイン関数を呼び出しているため E02036
が発生します。
pub fn main() void {
@bogus(); // error
}
E02037
は _
キーワードが値を無視すること以外に使われた場合に発生します。
Zen言語では _
キーワードで値を無視することができます。
典型的な用途は、戻り値を持つ関数を呼び出したとき、戻り値を無視する使い方です。
次の例では、定数 x
に _
を代入しているため E02037
が発生します。
pub fn main() void {
const x = _;
}
E02038
は呼出規約が .Naked
である関数に対し、通常の関数呼び出しを行った場合に発生します。
呼出規約に .Naked
が指定された関数は、自身のプロローグとエピローグが出力されません。
そのため通常の関数呼び出しを行うと、コンパイラはエラーとして検出します。
次の例では foo
関数の呼出規約として .Naked
を指定しています。
foo
関数は通常の関数呼び出しが行われるため E02038
が発生します。
pub fn main() void {
foo(); // error
}
fn foo() callconv(.Naked) void {}
エラーコードは存在しますが説明はありません。
E02040
は @compileError
がコンパイラの意味解析フェーズで検出された場合に発生します。
プログラマは @compileError
ビルトイン関数により意図的にコンパイルエラーを発生させることができます。
この関数の主な用途はデバッグです。
次の例では @compileError
を使いコンパイルエラーを発生させます。
pub fn main() void {
@compileError("something is wrong"); // error
}
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
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
}
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
エラーコードは存在しますが説明はありません。
☰ 人の生きた証は永遠に残るよう ☰
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.