Error Rust E0554: #![feature] may not be used on the stable release channel (khusus nightly)
E0554 artinya: kodemu diawali baris #![feature(...)], dan hanya Rust versi nightly yang menerima baris seperti itu. Hampir selalu, error ini datang dari kode yang kamu salin: artikel blog, repo GitHub, jawaban AI, atau jawaban lama di Stack Overflow. Kode itu ditulis untuk Rust nightly, sedangkan kamu memakai stable, versi yang dipasang rustup secara default. Tidak ada yang salah dengan instalasimu. Perbaikannya biasanya menghapus satu baris dan memakai cara stabil untuk melakukan hal yang sama. (Halaman ini bagian dari Penjelasan error compiler Rust.)
Pesan error-nya
Section titled “Pesan error-nya”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 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Artinya: #![feature] tidak boleh dipakai di kanal rilis stable.
Ini program yang menghasilkan error tersebut:
#![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);}Apa artinya
Section titled “Apa artinya”Tanda ^^^ menggarisbawahi seluruh baris pertama, #![feature(iter_map_windows)]. Baris itu sebuah permintaan: “tolong nyalakan fitur yang belum selesai bernama iter_map_windows.” Hanya compiler nightly yang menerima permintaan seperti itu. “Stable release channel” (kanal rilis stable) di pesannya adalah Rust biasa yang kamu dapat dari rustup, dan ia menolak.
Perhatikan apa yang tidak dikeluhkan rustc: map_windows di baris 5. rustc berhenti lebih dulu di baris #![feature]. Setelah baris itu kamu hapus, barulah kamu tahu apakah sisa kodenya jalan di stable.
Kamu mendapat error yang sama di kanal beta. Kalau kodemu punya beberapa baris #![feature], rustc biasanya hanya melaporkan yang pertama, jadi cek bagian atas file untuk baris lainnya.
Ibaratnya kartu akses “khusus staf”. Dapur percobaan (nightly) membiarkanmu masuk dengan kartu itu. Restoran (stable) sama sekali tidak menerima kartu seperti itu, sesopan apa pun kamu menunjukkannya.
Kenapa Rust melakukan ini
Section titled “Kenapa Rust melakukan ini”Rust berjanji bahwa kode yang ter-compile di stable hari ini akan tetap ter-compile di setiap rilis stable 1.x berikutnya. Fitur yang belum selesai tidak bisa jadi bagian dari janji itu: nama, argumen, dan perilakunya masih bisa berubah, atau fiturnya bisa dihapus. Jadi fitur-fitur itu hanya ada di nightly, build compiler baru yang dibuat setiap malam, dan kamu menyalakan masing-masing berdasarkan namanya dengan #![feature(...)].
Rust stable tidak sekadar mengabaikan baris itu: ia berhenti dengan error. Dengan begitu kamu tidak bisa membangun proyek di atas fitur yang belum selesai tanpa menyadarinya. Saat sebuah fitur sudah selesai, fitur itu menjadi bagian dari Rust stable dan tidak butuh baris tersebut lagi.
Jadi saat melihat E0554, hanya ada tiga pertanyaan yang penting: apakah ada cara stabil untuk melakukan ini (Perbaikan 1), apakah fiturnya sudah stabil (Perbaikan 2), atau apakah kamu memang ingin nightly (Perbaikan 3)? Lihat Stable, beta, dan nightly.
Cara memperbaikinya
Section titled “Cara memperbaikinya”Perbaikan 1: Hapus atributnya dan pakai API stabil
Section titled “Perbaikan 1: Hapus atributnya dan pakai API stabil”Pilih ini hampir setiap saat. Hapus baris #![feature] dan compile lagi. Kalau sekarang kamu mendapat E0658 (use of unstable library feature `iter_map_windows` ), fiturnya memang belum selesai, dan kamu butuh cara stabil untuk melakukan hal yang sama. Kebanyakan method yang belum stabil adalah jalan pintas untuk sesuatu yang sudah bisa dilakukan Rust stable. Di sini, .windows(2) pada sebuah slice memberimu setiap pasangan tetangga:
fn main() { let temps = [18, 21, 19, 24]; let changes: Vec<i32> = temps.windows(2).map(|w| w[1] - w[0]).collect(); // ✅ stabil println!("{:?}", changes);
for w in temps.windows(2) { println!("{} -> {}", w[0], w[1]); }}Output:
[3, -2, 5]18 -> 2121 -> 1919 -> 24Untuk menemukan cara yang stabil, buka method-nya di dokumentasi standard library. Item yang belum stabil punya kotak bertuliskan “This is a nightly-only experimental API”, dan nama fitur di baris #![feature]-mu biasanya cocok dengan sebuah halaman di The Unstable Book (bahasa Inggris). Lihat Slice dan Iterator.
Perbaikan 2: Cek apakah fiturnya sekarang sudah stabil
Section titled “Perbaikan 2: Cek apakah fiturnya sekarang sudah stabil”Pilih ini kalau kodenya agak lama. Banyak fitur yang dulu butuh #![feature] sekarang sudah jadi bagian dari Rust stable, dan barisnya tidak diperlukan lagi. rustc memberitahumu lewat warning tepat di bawah error-nya:
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 | ^^^^^^^^^^^^^^^Artinya: warning-nya bilang fitur slice_as_chunks sudah stabil sejak 1.88.0 dan tidak butuh atribut lagi untuk dinyalakan. Program yang rusak:
// 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); }}Hapus baris #![feature] (dan komentar di atasnya), dan sisanya jalan tanpa perubahan:
fn main() { let pixels = [255, 0, 0, 0, 128, 255]; let (rgb, _rest) = pixels.as_chunks::<3>(); // ✅ stabil sejak Rust 1.88 for [r, g, b] in rgb { println!("r={} g={} b={}", r, g, b); }}Output:
r=255 g=0 b=0r=0 g=128 b=255Untuk fitur bahasa, rustc bahkan lebih langsung dan menambahkan help: remove the attribute (hapus atributnya) di bawah error-nya, plus baris seperti the feature `async_closure` has been stable since `1.85.0` and no longer requires an attribute to enable.
Tidak ada warning, tapi kamu curiga fiturnya sudah stabil? Mungkin versi Rust-mu lebih lama daripada versi saat fitur itu menjadi stabil. Cek dan update:
rustc --versionrustup updateKalau setelah itu rustc --version masih menampilkan versi lama, kemungkinan proyeknya punya file rust-toolchain.toml yang mengunci versinya. Lihat Mengunci toolchain per proyek.
Perbaikan 3: Pakai nightly dengan sengaja
Section titled “Perbaikan 3: Pakai nightly dengan sengaja”Pilih ini paling akhir, saat tidak ada cara stabil dan kamu menerima bahwa kodemu bisa rusak di nightly berikutnya. Alasan bagus yang umum: kamu sedang mencoba fitur baru, menulis eksperimen kecil, atau proyek tempatmu berkontribusi memang sudah memakai nightly. Pasang nightly di samping stable dan pakai untuk satu perintah saja:
rustup toolchain install nightlycargo +nightly runAtau buat seluruh proyek memakai nightly dengan file rust-toolchain.toml di samping Cargo.toml. Setelah itu cargo run biasa memilih nightly di folder itu, dan stable di tempat lain:
[toolchain]channel = "nightly"Untuk proyek yang juga di-build orang lain, kunci tanggalnya, seperti channel = "nightly-2026-10-01", supaya semua orang mendapat compiler yang sama. Di Rust Playground, pilih Nightly di menu toolchain.
Kamu mungkin menemukan saran untuk mengatur RUSTC_BOOTSTRAP=1 agar stable mau menerima #![feature]. Saklar itu ada untuk membangun compiler Rust itu sendiri. Memakainya memberimu semua risiko nightly sambil berpura-pura memakai stable, jadi jangan.
Di mana biasanya kamu melihatnya
Section titled “Di mana biasanya kamu melihatnya”Benchmark dengan #[bench]. Panduan lama menulis benchmark seperti ini, dan #![feature(test)] masih khusus 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 | ^^^^^^^^^^^^^^^^^//! Price helpers.//! Benchmark written the old way, for nightly Rust.#![feature(test)] // ❌ built-in benchmarks are nightly-onlyextern 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]));}Perbaikannya: pakai crate benchmark yang jalan di stable, seperti criterion atau divan, lalu jalankan cargo bench. Menghapus baris #![feature] saja tidak cukup di sini: extern crate test; lalu memberi E0658 (use of unstable library feature `test` ). Lihat Performa.
Dependency yang butuh nightly. Kalau baris --> menunjuk ke sebuah crate di ~/.cargo/registry/, bukan ke src/ milikmu, berarti itu crate yang kamu pakai sebagai dependency dan crate itu memakai #![feature]. Perbaikannya: cek README crate-nya; sering kali versi yang lebih baru sudah jalan di stable (misalnya, framework web Rocket butuh nightly sampai versi 0.4, dan 0.5 jalan di stable). Kalau tidak, pilih crate lain. Lihat Cargo & crate.
Kode salinan dengan #![feature(let_chains)]. Let chains (if let Some(x) = a && x > 0) menjadi stabil di Rust 1.88, tapi hanya di edisi 2024. Perbaikannya: hapus barisnya (Perbaikan 2) dan atur edition = "2024" di Cargo.toml. Tanpa itu, kamu mendapat let chains are only allowed in Rust 2024 or later.
Error terkait
Section titled “Error terkait”- E0658: use of unstable feature: yang biasanya kamu dapat setelah menghapus baris
#![feature], kalau fiturnya masih khusus nightly. - E0599: no method found: kalau kamu menghapus barisnya dan method-nya memang tidak ada, atau berasal dari crate yang belum kamu tambahkan.
- E0463: can’t find crate: kalau kamu beralih ke
criterionataudivandan lupa menambahkannya keCargo.toml. - E0435: attempt to use a non-constant value in a constant: alasan umum orang mencari fitur const khusus nightly sejak awal.
- Semua error compiler: daftar lengkap halaman error.
Kuis singkat
Section titled “Kuis singkat”Kuis singkat
1. Kamu menempelkan kode yang diawali #![feature(try_blocks)] dan mendapat E0554. Apa artinya?
2. Di bawah error-nya, rustc memberi warning bahwa fiturnya sudah stabil sejak 1.88.0. Apa yang sebaiknya kamu lakukan?
3. Kamu memang ingin nightly untuk satu eksperimen. Cara mana yang paling rapi?
Skor: 0 / 3
Bacaan lebih lanjut
Section titled “Bacaan lebih lanjut”- E0554 — Rust error codes index (bahasa Inggris): penjelasan resmi: atribut feature hanya boleh dipakai di kanal nightly.
- How Rust is Made and “Nightly Rust” — The Rust Book (bahasa Inggris): kanal stable, beta, dan nightly, dan bagaimana sebuah fitur berpindah dari nightly ke stable.
- Channels — The rustup book (bahasa Inggris): memasang nightly dan memakainya di samping stable.
- The toolchain file — The rustup book (bahasa Inggris): bagaimana
rust-toolchain.tomlmemilih compiler untuk satu proyek, termasuk tanggal nightly yang dikunci. - The Unstable Book (bahasa Inggris): setiap nama fitur yang bisa kamu taruh di
#![feature], dengan link ke tracking issue-nya.