Kagari
キーワードを入力してドキュメントを検索します。

型 (E2xxx)

型の診断は、アイテムのシグネチャ(型、定数、エイリアス、境界)の検査と、関数やシーンの本体の型推論から報告されます。型の不一致、有界整数の算術、変換、フィールドとメソッド、呼び出し、パターン、match の網羅性が対象です。W2039 以外はすべてエラーです。

E2001 mismatched-types

エラー。 値の型が、文脈が期待する型(let の型注釈、戻り値の型、関数の引数など)と異なります。

kis
fn mismatch() -> bool {
let n: u32 = true;
5
}

修正方法: 値を期待される型に合わせる(例: let n: u32 = 1;)か、型注釈を変えます。

E2002 unsupported-const

エラー。 型の中の定数式(配列の長さ、Int の境界、const ジェネリクス引数)が、リテラル・算術・定数・const パラメーター以外のものを使っているか、評価が循環しています。

kis
const A: i64 = B;
const B: i64 = A;
fn f(n: Int<0, A>) {}

修正方法: 定数をリテラル、算術、循環のない他の定数だけで組み立てます。例: const A: i64 = 4;。

E2003 const-overflow

エラー。 型の中の定数式の評価がオーバーフローしたかゼロ除算になったか、その中の整数リテラルが大きすぎます。

kis
fn f(a: [u32; 10 / 0]) {}

修正方法: 算術が範囲内に収まるように式を変えます。例: fn f(a: [u32; 10 / 2]) {}。

E2004 bad-int-bounds

エラー。 lo > hi のため Int<lo, hi> 型が空であるか、境界が i64 に収まりません。

kis
fn f(n: Int<5, 0>) {}

修正方法: 境界を昇順に書きます: fn f(n: Int<0, 5>) {}。

E2005 wrong-generic-count

エラー。 型または関数が、宣言と異なる個数のジェネリクス引数を受け取っています。Int はちょうど 2 つの境界を必要とし、プリミティブ型は引数を取りません。

kis
fn f(n: Int<5>) {}

修正方法: 宣言どおりの個数の引数を与えます: fn f(n: Int<0, 5>) {}。

E2006 expected-type

エラー。 型の位置にあるパスが、型ではないもの(関数、列挙型のバリアント、モジュール、定数など)に解決されました。

kis
enum Route { A, B }
fn f(r: Route::A) {}

修正方法: 代わりに型を指定します: fn f(r: Route) {}。

E2007 expected-const

エラー。 const ジェネリクスパラメーターに定数ではなく型が与えられています。

kis
fn f(n: Int<u32, 5>) {}

修正方法: 定数値を渡します: fn f(n: Int<0, 5>) {}。

E2008 expected-trait

エラー。 境界や impl … for が、トレイトではないものを指しています。

kis
struct Point { x: u32, y: u32 }
fn same<T: Point>(a: T) {}

修正方法: 境界にはトレイトを使います。例: fn same<T: Eq>(a: T) {}。

E2009 expected-value

エラー。 式の位置にあるパスが、値ではないもの(モジュール、型パラメーター、名前付きフィールドを持つ構造体やバリアントなど)に解決されました。

kis
enum Shape { Circle { r: u32 }, Dot }
fn f() {
let s = Shape::Circle;
}

修正方法: 値を構築します: let s = Shape::Circle { r: 1 };。

E2010 alias-cycle

エラー。 型エイリアスが、直接または他のエイリアスを介して自分自身に展開されます。

kis
type A = B;
type B = A;

修正方法: どれか 1 つのエイリアスを具体的な型にします。例: type B = u32;。

E2011 infer-in-signature

エラー。 アイテムのシグネチャにプレースホルダー _ が現れています。シグネチャでは型を明記する必要があります。

kis
fn f(n: _) -> u32 { 1 }

修正方法: 型を書きます: fn f(n: u32) -> u32 { 1 }。

E2012 bad-literal

エラー。 整数リテラルに、整数型ではないサフィックスが付いています。

kis
fn f() {
let n = 5u7;
}

この例は説明用です。未知のサフィックスはパーサーが先に E0001 で拒否するため、E2012 が報告されるのは検査を経ずに型推論まで届いたリテラルだけです。

修正方法: 有効なサフィックスを使うか、付けません: let n = 5u8;。

E2013 literal-out-of-range

エラー。 式またはパターンの中の整数リテラルが、照合される整数型に収まりません。

kis
fn literals() {
let small: u8 = 300;
let counter: Int<0, 5> = 6;
}

修正方法: 型の範囲内の値を使うか、型を広げます。例: let small: u16 = 300;。

E2014 int-mix

エラー。 算術演算子が 2 つの異なる整数型を組み合わせています。暗黙の変換はありません。

kis
fn int_ranges(a: Int<0, 5>) {
let mixed = a + 1u32;
}

修正方法: 片方を .into() か .saturate() で明示的に変換します。例: let mixed = a.into() + 1u32;。

E2015 bad-operands

エラー。 演算子が、対応していない型のオペランドに適用されています。たとえば bool・整数以外への !、符号なし値の符号反転、結果の範囲がオーバーフローする有界算術です。

kis
struct Point { x: u32, y: u32 }
fn f(p: Point) -> bool {
!p
}

修正方法: 対応する型に演算子を適用します。例: bool に対する !flag。

E2016 divisor-may-be-zero

エラー。 / または % の除数が、範囲に 0 を含む有界 Int 型です。

kis
fn int_ranges(a: Int<0, 5>) {
let quotient = a / a;
}

修正方法: 先に除数の型を 0 を含まないように狭めます。例: b: Int<1, 5> を受け取り a / b と書きます。

E2017 not-eq

エラー。 == または != が、決して Eq にならない型(クロージャなど)に使われています。

kis
fn equality() -> bool {
let f = || 1u32;
f == f
}

修正方法: Eq を実装する値どうしを比較します。例: f() == f()。

E2018 lossy-into

エラー。 .into() が、変換元の値が変換先に常に収まるとは限らない整数型どうしを変換しています。

kis
fn conversions(wide: u32) {
let byte: u8 = wide.into();
}

修正方法: 明示的に飽和させます: let byte: u8 = wide.saturate();。

E2019 as-cast

エラー。 Kagari には as キャストはありません。

kis
fn conversions(wide: u32) {
let cast = wide as u8;
}

修正方法: 損失のない変換には .into()、飽和変換には .saturate() を使います: let cast: u8 = wide.saturate();。

E2020 unknown-field

エラー。 構造体の初期化子またはフィールドアクセスが、型にないフィールドを指定しています。

kis
struct Point { x: u32, y: u32 }
fn fields(p: Point) -> u32 {
let unknown = Point { x: 1, y: 2, z: 3 };
p.z
}

修正方法: 宣言されたフィールドだけを使います。例: p.x。

E2021 missing-field

エラー。 構造体の初期化子で、構造体のフィールドが省略されています。

kis
struct Point { x: u32, y: u32 }
fn fields() {
let missing = Point { x: 1 };
}

修正方法: すべてのフィールドを初期化します: let p = Point { x: 1, y: 2 };。

E2022 unknown-method

エラー。 メソッド呼び出しが、型にもスコープ内のどのトレイトにもないメソッドを指定しています。

kis
struct Point { x: u32, y: u32 }
fn methods(p: Point) {
p.frobnicate();
}

修正方法: 既存のメソッドを呼ぶか、impl Point ブロックに frobnicate を定義します。

E2023 not-a-method

エラー。 self パラメーターを持たない関連関数に、メソッド呼び出し構文が使われています。

kis
struct Point { x: u32, y: u32 }
impl Point {
fn origin() -> Point { Point { x: 0, y: 0 } }
}
fn f(p: Point) {
p.origin();
}

修正方法: 型を通して呼び出します: Point::origin()。

E2024 wrong-arity

エラー。 呼び出しの引数の個数が、関数の受け取る個数と異なります。

kis
fn arity(x: u32) -> u32 {
arity(x, x)
}

修正方法: 宣言どおりの引数を渡します: arity(x)。

E2025 not-callable

エラー。 呼び出し式の呼び出し先が、関数、関数ポインター、クロージャのいずれでもありません。

kis
fn f(n: u32) -> u32 {
n(1)
}

修正方法: 関数値を呼び出すか、n を値として使うつもりなら括弧を外します。

E2026 unsatisfied-bound

エラー。 ジェネリクス引数が、呼び出し先の境界が要求するトレイトを実装していません。

kis
fn same<T: Eq>(a: T, b: T) -> bool {
a == b
}
fn bounds() -> bool {
same(|| 1u32, || 2u32)
}

修正方法: そのトレイトを実装する型を渡します。例: same(1u32, 2u32)。

E2027 bad-nav-start

エラー。 nav::start の第 1 引数が #[entry] シーンを指していません。

kis
#[scene]
pushdown fn Side() {}
fn navigation() {
nav::start(Side, (), |_end| ());
}

修正方法: #[entry] シーンを開始します。例: Side に #[entry] を付けます。

E2028 asset-path-not-literal

エラー。 asset(…) または system_font(…) に渡したパスが文字列リテラルではないため、コンパイル時に検査できません。

kis
const PATH: Text = "missing.png";
const IMAGE: ImageAsset = asset(PATH);

修正方法: パスを直接書きます: const IMAGE: ImageAsset = asset("missing.png");。

E2029 annotations-needed

エラー。 推論で型を決定できませんでした。たとえば、後で制約されない空のコレクションや、型の分からない値への呼び出し・フィールドアクセス・反復です。

kis
fn annotations() {
let list = Vec::new();
}

修正方法: 型注釈を付けます: let list: Vec<u32> = Vec::new();。

E2030 open-range

エラー。 範囲式に境界がありません。値としての範囲には両端(a..b または a..=b)が必要で、a..、..b、..=b、.. はいずれも報告されます。開いた範囲は範囲パターンとしてだけ存在し、範囲パターンは a..、..=b、a..b、a..=b です。..b というパターンはなく、パターン中の単独の .. は範囲ではなく残余パターンです。コンパイラのメッセージは「a.., ..b and .. exist only in patterns」と述べますが、上の一覧のとおりに読んでください。

kis
fn f() {
for i in 0.. {}
}

修正方法: 両方の境界を与えます: for i in 0..10 {}。

E2031 not-iterable

エラー。 for ループが、反復できない型の値を反復しています。

kis
fn f(flag: bool) {
for x in flag {}
}

修正方法: 範囲やコレクションを反復します。例: for x in 0..5 {}。

E2032 not-indexable

エラー。 インデックス […] が、それに対応しない型の値に適用されています。

kis
fn f(n: u32) -> u32 {
n[0]
}

修正方法: 代わりに配列、Vec、その他のインデックス可能なコレクションを使います。

E2033 bad-deref

エラー。 参照外し演算子 * が、参照ではない値に適用されています。

kis
fn f(n: u32) -> u32 {
*n
}

修正方法: * を外すか、r: &u32 のような実際の参照を参照外しします。

E2034 bad-try

エラー。 ? 演算子が Option/Result ではない値に使われているか、関数の戻り値の型がオペランドの種類と一致しません。

kis
fn f(o: Option<u32>) -> u32 {
o?
}

修正方法: 一致する型を返します。例: fn f(o: Option<u32>) -> Option<u32> { Some(o?) }。

E2035 bad-pattern

エラー。 パターンの形が、指す対象と合いません。たとえばタプルでないバリアントへのタプルパターン、フィールド数の誤り、バリアントが期待される場所での列挙型、パターン中の static です。

kis
fn f(r: Option<u32>) -> u32 {
match r {
Some(a, b) => a,
None => 0,
}
}

修正方法: 宣言された形に合わせます: Some(a) => a,。

E2036 capturing-closure

エラー。 ローカル変数をキャプチャするクロージャが、関数ポインターが必要な場所で使われています。

kis
fn f(n: u32) {
let g: fn() -> u32 = || n;
}

修正方法: 値をキャプチャせずパラメーターとして渡します。例: let g: fn(u32) -> u32 = |n| n;。

E2037 non-exhaustive-match

エラー。 match が検査対象のすべての値を網羅していません。メッセージに網羅されていないパターンが表示されます。

kis
fn bounded(n: Int<0, 10>) -> u32 {
match n {
0..=5 => 0,
}
}

修正方法: 不足している値のアームかワイルドカードを追加します: 6..=10 => 1,。

E2038 refutable-pattern

エラー。 照合に失敗しうるパターンが、必ず成功しなければならない場所(let、関数やクロージャのパラメーター、for の束縛)で使われています。

kis
enum Route { A, B, C }
fn refutable(r: Option<Route>) {
let Some(x) = r;
}

修正方法: match か if let Some(x) = r { … } を使って他のケースを扱います。

W2039 unreachable-pattern

警告。 それより前のアームがすでにすべての値を網羅しているため、この match アームには決して到達しません。

kis
enum Route { A, B, C }
fn unreachable(r: Route) -> u32 {
match r {
Route::A | Route::B => 0,
Route::B => 1,
_ => 2,
}
}

修正方法: 到達しないアームを削除するか、それを網羅するアームより前に移します。

最終更新日 2026年10月29日