Rust 2024 edition memperkenalkan gen dan raw sebagai keyword baru yang bisa bikin crate-mu gagal compile tanpa error message yang jelas. Plus, lint unsafe_op_in_unsafe_fn, rust_2024_prelude_collisions, dan perubahan unsafe extern bikin codebase besar ambyar diam-diam. Checklist di artikel ini bantu kamu siapkan Cargo.toml, perbaiki syntax, dan update CI sebelum upgrade ke Rust 1.85.
Kamu Upgrade Rust 1.85, Crate 150 Ribu Baris Malah Error 300+
Kamu maintainer crate dengan 40 dependensi dan 150 ribu baris kode. Rust 1.85 rilis dan tim bilang: “ayo coba edition 2024, katanya lebih aman.” Kamu ganti edition = "2024" di Cargo.toml, jalanin cargo build, lalu layar penuh warna merah. 300+ error. Banyak yang bahkan nggak masuk akal: kenapa variabel namanya gen tiba-tiba invalid? Kenapa unsafe block yang udah 4 tahun baik-baik aja sekarang kena warning keras?
Ini bukan bug compiler. Ini behaviour yang didokumentasikan di Rust 2024 Edition Guide, cuma dokumentasinya tersebar di 12 halaman berbeda dan nggak ada checklist terpusat yang bisa kamu ikuti. Artikel ini ngasih kamu checklist itu.

Keyword Baru yang Nggak Kamu Sadari: gen dan raw
Ini jebakan paling fatal. Rust 2024 edition mereservasi gen dan raw sebagai keyword penuh. Bukan soft keyword, bukan contextual keyword, tapi hard keyword yang nggak bisa kamu pakai sebagai identifier. Kalau kamu legacy crate, kemungkinan besar ada variabel, fungsi, atau field bernama gen atau raw.
Kenapa gen Jadi Keyword?
gen dipersiapkan untuk fitur gen blocks di nightly yang memungkinkan coroutine dengan syntax mirip async. Kamu mungkin belum pakai, tapi ekosistem sedang menuju ke sana. Jadi Rust compiler team memutuskan: reserve sekarang, hindari breakage massal nanti.
- Cek variabel bernama
gen:rg '\bgen\b' --type rust - Cek fungsi bernama
gen:rg 'fn gen\b' --type rust - Cek field struct:
rg '\.gen\b' --type rust
Fix: rename jadi generator, gen_fn, atau r#gen (raw identifier) untuk yang butuh kompatibilitas backward sementara. Tapi hati-hati, r#gen cuma solusi jangka pendek karena nanti gen bakal fully reserved.

Lint unsafe_op_in_unsafe_fn: Bom Waktu di Codebase 2021
Di edition 2024, unsafe_op_in_unsafe_fn diaktifkan secara default sebagai deny-by-default lint. Artinya, setiap fungsi bertanda unsafe fn nggak ngasih akses unsafe secara otomatis ke body-nya. Kamu harus eksplisit bungkus operasi unsafe dalam unsafe { } block.
Di edition 2021, kode ini aman:
unsafe fn dangerous(x: *const u8) -> u8 {
*x // implicit unsafe, no block needed
}
Di edition 2024, langsung error. Harus:
unsafe fn dangerous(x: *const u8) -> u8 {
unsafe { *x } // explicit block
}
Fix massal: Jangan manual satu-satu. Pakai cargo fix --edition yang otomatis nambahin unsafe blocks. Tapi awas: cargo fix kadang overcorrect dan nambahin unsafe { } di tempat yang nggak perlu. Always review diff-nya sebelum commit.
unsafe extern: Kenapa FFI-mu Bisa Rusak Diam-Diam
Ini jebakan paling underrated. Di edition 2024, semua deklarasi extern harus ditandai sebagai safe atau unsafe. Deklarasi tanpa marker akan error.
// Edition 2021: fine
extern "C" {
fn open(path: *const c_char) -> i32;
}
// Edition 2024: HARUS unsafe extern
unsafe extern "C" {
fn open(path: *const c_char) -> i32;
}
Kamu yang maintain crate dengan binding C library (OpenSSL, Postgres, LevelDB), semua FFI block harus disentuh. cargo fix --edition bisa bantu, tapi binding yang di-generate otomatis (misalnya via bindgen) perlu regenerasi.
Checklist Upgrade: Dari Cargo.toml Sampai CI
1. Audit Identifier Global
# Deteksi keyword bentrok di seluruh workspace
rg '\b(gen|raw)\b' --type rust -l | sort -u
Output ini adalah daftar file yang wajib kamu review. Jangan skip satu pun.
2. Simulasi Edition 2024 Sebelum Upgrade
# Di Cargo.toml, jangan langsung ganti edition. Coba per-crate:
[package]
name = "my-legacy-crate"
edition = "2024" # dari "2021"
Lalu jalanin cargo check. Error yang muncul adalah checklist real-time buat crate itu. Ulangi per crate, bukan sekaligus di workspace root.
3. Apply cargo fix Bertahap
# Step 1: dry-run
cargo fix --edition --allow-dirty --dry-run
# Step 2: review diff
git diff
# Step 3: apply per crate
cargo fix --edition --allow-dirty -p my-crate
Peringatan: cargo fix --edition mengubah source code-mu secara otomatis. Commit dulu semua perubahan sebelum jalanin command ini. Selalu review diff-nya.

4. Update CI Pipeline
- Pastikan CI pakai Rust >= 1.85. Tambahin di
.github/workflows/ci.yml:toolchain: 1.85 - Tambahin job terpisah untuk edition 2024:
cargo check --edition 2024 - Tambahin
RUSTFLAGS="-D rust_2024_compatibility"untuk deny semua warning edition-migration - Jangan lupa update
clippydanrustfmt: edition 2024 bawa formatting rule baru
5. Dependency yang Belum Siap
Cek workspace-mu: apakah semua dependensi sudah support edition 2024? Kalau ada crate dependen yang masih 2018 atau 2021, crate kamu bisa upgrade duluan karena Rust mendukung multi-edition compilation. Tapi kalau ada proc-macro dependen yang masih 2021, tunda upgrade sampai dependen tersebut upgrade.
# Cek edition semua dependensi
cargo metadata --format-version=1 | jq '.packages[] | {name: .name, edition: .edition}'
Proc-macro crate perlu perhatian ekstra karena mereka berjalan di compiler host yang sama. Mismatch edition antara proc-macro dan crate pemanggil bisa bikin error cryptic yang susah di-debug.

Yang Sering Terlewat: Prelude Collision dan unsafe_attr_outside_unsafe
Rust 2024 nambahin beberapa item baru ke standard prelude. Kalau crate-mu punya item dengan nama yang sama (misalnya Future, IntoFuture, TryInto), bakal ada ambiguity resolution yang bikin compiler bingung. Gunakan rust_2024_prelude_collisions lint untuk deteksi dini.
Selain itu, unsafe_attr_outside_unsafe juga deny-by-default. Setiap #[no_mangle] atau #[export_name] di luar unsafe context bakal ditolak. Kalau crate-mu pakai FFI attributes di safe Rust, ini bakal break.
Baca juga: Setelah upgrade edition 2024, pastikan native async trait di Rust 1.85 sudah menggantikan async_trait crate-mu biar compile time turun signifikan. Sementara itu, kalau kamu sering debugging async panic di production, backtrace ter-annotasi di Rust 1.85 bakal bikin hidupmu lebih tenang. Jangan lewatkan juga perubahan NLL borrow checker yang bikin self-referential pattern lolos kompilasi.
FAQ
Apa itu Rust edition dan bedanya sama Rust version?
Rust version (1.85, 1.86) adalah rilis compiler. Rust edition (2015, 2018, 2021, 2024) adalah set aturan kompatibilitas yang kamu pilih per-crate di Cargo.toml. Kamu bisa pakai Rust 1.85 compiler tapi crate-mu tetap di edition 2021. Edition nggak perlu di-upgrade barengan dengan compiler.
Apakah harus upgrade ke edition 2024?
Nggak wajib. Edition 2021 tetap didukung penuh oleh Rust compiler selamanya. Tapi kalau crate-mu ingin pakai fitur eksklusif edition 2024 seperti gen blocks (ketika stabil), async closures, atau unsafe extern safety, upgrade diperlukan. Juga, komunitas Rust cenderung pindah ke edition terbaru dalam 1-2 tahun setelah rilis.
Gimana cara tahu crate saya siap edition 2024?
Jalanin cargo check --edition 2024 di root workspace. Kalau output bersih (0 error, 0 warning), crate-mu siap. Kalau ada warning soal rust_2024_compatibility, tambahkan RUSTFLAGS="-D rust_2024_compatibility" untuk deny semua warning tersebut dan lihat mana yang wajib difix. Tools tambahan: cargo-semver-checks untuk validasi bahwa upgrade-mu nggak merusak semver.
Kenapa cargo fix nggak bisa fix semua masalah?
cargo fix hanya menangani perubahan yang punya migrasi otomatis (seperti wrapping unsafe ops). Untuk identifier conflict seperti gen dan raw, atau perubahan structural seperti unsafe extern di binding yang di-generate, kamu harus intervensi manual. cargo fix adalah alat bantu, bukan solusi penuh.
Kesimpulan
Rust 2024 edition bukan sekadar ganti angka di Cargo.toml. Keyword gen dan raw, default unsafe_op_in_unsafe_fn, unsafe extern requirement, dan prelude collision adalah empat jebakan utama yang bisa bikin CI-mu merah berhari-hari. Tapi dengan checklist di artikel ini, kamu bisa siapkan codebase, fix syntax otomatis dengan cargo fix, dan update CI sebelum merge ke main branch.
Mau upgrade project Rust besar tanpa drama? Ikuti checklist ini step-by-step. Dan kalau kamu nemuin edge case lain yang nggak dibahas di sini, share di kolom komentar biar sesama maintainer terbantu.
Referensi: Rust 2024 Edition Guide, Rust 1.85 Release Blog, Rust Unstable Book – gen blocks.
]]>


