コンテンツにスキップ

Rustのエラー E0554: #![feature] may not be used on the stable release channel(stableでは使えない)

E0554 は、コードのいちばん上に #![feature(...)] の行があり、それを受け付けるのは nightly 版の Rust だけ、という意味のエラーです。ほとんどの場合、どこかからコピーしたコードで出会います。ブログ記事、GitHub のリポジトリ、AI の回答、古い Stack Overflow の回答などです。そのコードは nightly の Rust 向けに書かれていて、あなたが使っているのは stable です。stable は、rustup がデフォルトでインストールするものです。あなたの環境は何も壊れていません。たいていは、1行消して、同じことを stable のやり方で書けば直ります。このシリーズのほかのエラーは、Rustのコンパイルエラー解説を見てください。

error[E0554]: `#![feature]` may not be used on the stable release channel
--> src/main.rs:1:1
|
1 | #![feature(iter_map_windows)] // ❌ copied from code written for nightly Rust
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

「#![feature] may not be used on the stable release channel」は「#![feature] は stable のリリースチャネルでは使えない」という意味です。

このエラーが出るのは、次のプログラムです。

#![feature(iter_map_windows)] // ❌ copied from code written for nightly Rust
fn main() {
let temps = [18, 21, 19, 24];
let changes: Vec<i32> = temps.iter().map_windows(|[a, b]| *b - *a).collect();
println!("{:?}", changes);
}

コメントは「nightly の Rust 向けに書かれたコードからコピーした」という意味です(エラーになる例なので、コードはそのままにしています)。

^^^ は、1行目の #![feature(iter_map_windows)] 全体に引かれています。この行は「iter_map_windows という未完成の機能を有効にしてください」というお願いです。こういうお願いを受け付けるのは、nightly のコンパイラだけです。メッセージにある「stable release channel」(stable のリリースチャネル)とは、rustup で入るふつうの Rust のことで、こちらはお願いを断ります。

rustc が文句を言っていないところにも注目してください。5行目の map_windows です。rustc は、まず #![feature] の行で止まります。その行を消してはじめて、残りのコードが stable で動くかどうかがわかります。

beta チャネルでも同じエラーになります。#![feature] の行が複数あっても、rustc はふつう最初の1つしか報告しないので、ファイルの先頭にほかにもないか確かめましょう。

「関係者以外立入禁止」の通行証にたとえてみましょう。試作用のキッチン(nightly)なら、その通行証で入れます。でもレストラン(stable)は、どんなに丁寧に見せても、その通行証をまったく受け付けません。

Rust は、今日の stable でコンパイルできるコードは、これから先のすべての stable 1.x でもコンパイルできる、と約束しています。未完成の機能は、この約束に含められません。名前も引数も動きも、まだ変わるかもしれませんし、なくなるかもしれないからです。そこで、未完成の機能はnightly(毎晩作られるコンパイラの新しいビルド)にだけ入っていて、#![feature(...)] で1つずつ名前を指定して有効にします。

stable の Rust は、この行をただ無視するのではなく、エラーで止まります。そのおかげで、気づかないうちに未完成の機能の上にプロジェクトを築いてしまうことがありません。機能が完成すると stable の Rust の一部になり、もうこの行は必要なくなります。

ですから、E0554 を見たら、考えることは3つだけです。stable で同じことをする方法はあるか(直し方1)、その機能はもう stable になっていないか(直し方2)、本当に nightly を使いたいのか(直し方3)です。stable、beta、nightlyを見てください。

直し方1:属性を消して stable の API を使う

Section titled “直し方1:属性を消して stable の API を使う”

ほとんどいつもこれを選びます。#![feature] の行を消して、もう一度コンパイルしてみましょう。今度は E0658(use of unstable library feature `iter_map_windows` 、不安定なライブラリ機能の使用)が出たら、その機能はまだ未完成なので、同じことをする stable の方法が必要です。不安定なメソッドの多くは、stable の Rust でもうできることの近道にすぎません。ここでは、スライスの .windows(2) を使えば、隣り合う2つずつの組が手に入ります。

fn main() {
let temps = [18, 21, 19, 24];
let changes: Vec<i32> = temps.windows(2).map(|w| w[1] - w[0]).collect(); // ✅ stable
println!("{:?}", changes);
for w in temps.windows(2) {
println!("{} -> {}", w[0], w[1]);
}
}

実行結果:

[3, -2, 5]
18 -> 21
21 -> 19
19 -> 24
▶ 実際に試してみよう

stable の方法を探すには、標準ライブラリのドキュメントでそのメソッドを開いてみましょう。不安定なアイテムには「This is a nightly-only experimental API」(これは nightly 専用の実験的な API です)という囲みがあります。また、#![feature] の行に書かれた機能名は、たいてい The Unstable Book(英語)のページの名前と同じです。スライスとイテレータも見てください。

直し方2:その機能がもう stable になっていないか確かめる

Section titled “直し方2:その機能がもう stable になっていないか確かめる”

コードが少し古いときは、これを選びます。昔は #![feature] が必要だった機能の多くが、今では stable の Rust の一部になっています。その場合、この行はもういりません。rustc は、エラーのすぐ下の警告でそれを教えてくれます。

error[E0554]: `#![feature]` may not be used on the stable release channel
--> src/main.rs:2:1
|
2 | #![feature(slice_as_chunks)] // ❌ not needed any more: this feature is stable now
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
warning: the feature `slice_as_chunks` has been stable since 1.88.0 and no longer requires an attribute to enable
--> src/main.rs:2:12
|
2 | #![feature(slice_as_chunks)] // ❌ not needed any more: this feature is stable now
| ^^^^^^^^^^^^^^^

警告は「機能 slice_as_chunks は 1.88.0 から stable になっていて、有効にするための属性はもう必要ない」という意味です。

エラーになるプログラムです(コメントは「古いチュートリアルからコピーした」と「もう必要ない。この機能は今は stable」という意味です)。

// Copied from an older tutorial
#![feature(slice_as_chunks)] // ❌ not needed any more: this feature is stable now
fn main() {
let pixels = [255, 0, 0, 0, 128, 255];
let (rgb, _rest) = pixels.as_chunks::<3>();
for [r, g, b] in rgb {
println!("r={} g={} b={}", r, g, b);
}
}

#![feature] の行(とその上のコメント)を消せば、残りはそのまま動きます。

fn main() {
let pixels = [255, 0, 0, 0, 128, 255];
let (rgb, _rest) = pixels.as_chunks::<3>(); // ✅ Rust 1.88 から stable
for [r, g, b] in rgb {
println!("r={} g={} b={}", r, g, b);
}
}

実行結果:

r=255 g=0 b=0
r=0 g=128 b=255
▶ 実際に試してみよう

言語の機能の場合、rustc はもっとはっきり教えてくれます。エラーの下に help: remove the attribute(属性を削除してください)が付き、the feature `async_closure` has been stable since `1.85.0` and no longer requires an attribute to enable のような行も出ます。

警告は出ないけれど、その機能はもう stable のはずだと思うときは? 使っている Rust が、その機能が stable になったバージョンより古いだけかもしれません。確かめて、更新しましょう。

Terminal window
rustc --version
rustup update

更新したあとも rustc --version が古いバージョンのままなら、おそらくプロジェクトにバージョンを固定する rust-toolchain.toml ファイルがあります。プロジェクトごとにツールチェーンを固定するを見てください。

直し方3:わかったうえで nightly を使う

Section titled “直し方3:わかったうえで nightly を使う”

stable の方法がなく、将来の nightly でコードが壊れるかもしれないことを受け入れられるときに、最後の手段として選びます。よくある正当な理由は、新しい機能を試してみたい、小さな実験をしている、参加しているプロジェクトがすでに nightly を使っている、などです。stable と並べて nightly をインストールし、1つのコマンドだけで使いましょう。

Terminal window
rustup toolchain install nightly
cargo +nightly run

あるいは、Cargo.toml の隣に rust-toolchain.toml ファイルを置いて、プロジェクト全体で nightly を使うようにすることもできます。そうすると、そのフォルダではふつうの cargo run で nightly が選ばれ、それ以外の場所では stable のままです。

[toolchain]
channel = "nightly"

ほかの人もビルドするプロジェクトなら、channel = "nightly-2026-10-01" のように日付を固定しましょう。そうすれば、みんなが同じコンパイラを使えます。Rust Playground では、ツールチェーンのメニューで Nightly を選びます。

stable で #![feature] を受け付けさせるために RUSTC_BOOTSTRAP=1 を設定する、というアドバイスを見かけるかもしれません。このスイッチは、Rust のコンパイラそのものをビルドするためにあるものです。使うと、stable のふりをしながら nightly のリスクをすべて背負うことになります。使わないでください。

#[bench] を使ったベンチマーク。 古いガイドではベンチマークをこう書きますが、#![feature(test)] は今も nightly 専用です。

error[E0554]: `#![feature]` may not be used on the stable release channel
--> src/main.rs:3:1
|
3 | #![feature(test)] // ❌ built-in benchmarks are nightly-only
| ^^^^^^^^^^^^^^^^^

このエラーが出るプログラムです(コメントは「組み込みのベンチマークは nightly 専用」という意味です)。

//! Price helpers.
//! Benchmark written the old way, for nightly Rust.
#![feature(test)] // ❌ built-in benchmarks are nightly-only
extern crate test;
fn total(prices: &[u32]) -> u32 {
prices.iter().sum()
}
#[bench]
fn bench_total(b: &mut test::Bencher) {
let prices: Vec<u32> = (1..1000).collect();
b.iter(|| total(&prices));
}
fn main() {
println!("{}", total(&[3, 4, 5]));
}

直し方:criterion や divan のような、stable で動くベンチマーク用のクレートを使って、cargo bench を実行します。ここでは #![feature] の行を消すだけでは足りません。今度は extern crate test; が E0658(use of unstable library feature `test` )になるからです。パフォーマンスを見てください。

nightly が必要な依存クレート。 --> の行が、自分の src/ ではなく ~/.cargo/registry/ の下のクレートを指していたら、#![feature] を使っているのは依存しているクレートのほうです。直し方:そのクレートの README を確かめましょう。新しいバージョンなら stable で動くことがよくあります(たとえば Web フレームワークの Rocket は 0.4 までは nightly が必要でしたが、0.5 は stable で動きます)。だめなら、別のクレートを選びます。Cargoとクレートを見てください。

#![feature(let_chains)] が付いたコピーしたコード。 let チェーン(if let Some(x) = a && x > 0)は Rust 1.88 で stable になりましたが、使えるのは 2024 エディションだけです。直し方:行を消して(直し方2)、Cargo.toml に edition = "2024" と書きます。そうしないと let chains are only allowed in Rust 2024 or later(let チェーンは Rust 2024 以降でしか使えない)になります。

  • E0658:use of unstable feature(不安定な機能の使用)。#![feature] の行を消したあと、その機能がまだ nightly 専用ならたいていこれが出ます。
  • E0599:no method found(メソッドが見つからない)。行を消したら、そのメソッドが本当は存在しなかった、またはまだ追加していないクレートのものだったときです。
  • E0463:can’t find crate(クレートが見つからない)。criterion や divan に切り替えたのに、Cargo.toml に追加し忘れたときです。
  • E0435:attempt to use a non-constant value in a constant(定数に定数でない値を使った)。そもそも nightly の const の機能を探しに行くきっかけになりやすいエラーです。
  • コンパイルエラーの一覧:エラー解説ページの全リストです。

理解度チェック

1. #![feature(try_blocks)] で始まるコードを貼り付けたら、E0554 が出ました。どういう意味ですか?

2. エラーの下に、その機能は 1.88.0 から stable だという警告が出ています。どうすればよいですか?

3. 1つの実験のためだけに nightly を使いたいです。いちばんきれいな方法はどれですか?

スコア: 0 / 3