RustのRFC一覧 (~1552)

概要: RustのRFCの一覧を作ろうとしたが、あまりに多いのでとりあえず1552までで公開することにした。なお、単に全てのRFCを列挙したいならばここを見ればよい

このRFCはRustのコミュニティーが管理しているものであり、 “RFC” の元祖であるIETF RFCとは関係ない。いずれもrequest-for-commentの略である。

メタ

  • RFC 0002 Rust RFCの提出プロセスの説明
  • RFC 0531 Rust RFCが関与する範囲を Rust/Cargo/Crates.io/このRFCプロセス自身 の4つに限定
  • RFC 1068 Rust開発者チームの組織構造を文書化したもの
  • RFC 1105 標準ライブラリや crates.io 上のライブラリについて、どのような変更がsemverの major change/minor changeにあたるかの基準を与える
  • RFC 1122 コンパイラのバージョニングについて、マイナーバージョンでの破壊的変更は「コンパイラのバグ」「型システム上の問題」の修正などに留めることを明記。破壊的変更の影響を最小限に抑えるための手続き (crater/cargobombツールの利用、 [breaking-change]タグ、tracking issueの作成、warning cycleの実施など)を策定。

スタイル/慣習

  • RFC 0199 似たような動作で、所有権/借用の種別だけが異なるようなメソッドの命名規則を定める
  • RFC 0236 panic!/Result の使い分けの慣習を定義する、関連するメソッドの命名規則を定める
  • RFC 0240 unsafe の慣習の整理: unsafe 関数をメソッドにする条件の定義、論理的な不変条件を壊すが未定義動作を引き起こさない関数は unsafe ではなく *_unchecked と命名することを定義、その他 unsafe 関数の命名規則の定義
  • RFC 0344 関数/メソッド名が型名に言及する際の命名規則 (Prelude*RFC 0445により廃止され、Rust PR #23104により完全に不要になった)
  • RFC 0430 命名規則のケーシング(snake_case, CamelCase, etc.) と、 unwrap/into_*命名規則を定義
  • RFC 0445 拡張トレイトパターンに使うトレイトの名前を *Ext とする命名規則
  • RFC 0505 doc-commentの慣習の確立: /// を優先的に使う。Markdownを使う

ソースファイル処理と字句

  • RFC 0063 二重インクルードによる混乱を防ぐため、 mod foo; による外部ファイルの読み込みに制限をつける
  • RFC 0069 バイトリテラル b'x' とバイト列リテラル b"Foo" の導入
  • RFC 0090/0021 字句解析器をより単純にする
  • RFC 0326 文字/文字列リテラルにおいて \x00-\x7F に限定し \x80-\xFF を禁止
  • RFC 0342 abstract, final, override をキーワードとして予約する
  • RFC 0446 文字/文字列リテラル\uXXXX/\UXXXXXXXX を廃止し、 \u{XXXXXX} を導入
  • RFC 0463 将来の互換性のために、リテラル直後の識別子の字句規則を変更
  • RFC 0593 Self をキーワードにする
  • RFC 0601 将来の末尾再帰のための予約キーワード be を廃止し、新たに become を予約
  • RFC 0879 2進/8進リテラル直後の数字を禁止する (0b0120b01 2 に分割せずにエラーにする)

構文

  • RFC 0016 属性を let 文、ブロック、式にも使えるようにする (#![feature(stmt_expr_attributes)])
  • RFC 0049 マッチ腕に属性を使えるようにする
  • RFC 0059 ~T 型と ~x 式を削除し、 Box/box で置き換える
  • RFC 0068 *T 型を *const T にリネーム
  • RFC 0071 const/static 内でも、一定条件下でブロックを使えるようにする
  • RFC 0087 トレイトオブジェクトの追加の境界を &(Foo : Send + Sync) ではなく &(Foo + Send + Sync) のように指定するようにする
  • RFC 0092 iffor などのブロックと紛らわしい場面では構造体の {} を禁止する
  • RFC 0132 UFCS (<T as Trait>::sth / <T>::sth) の導入
  • RFC 0135 where 節の導入 (一部未実装)
  • RFC 0160 if let 構文
  • RFC 0164 スライスパターンをfeature gateにする
  • RFC 0168 {mod, ..} によりモジュール自体とその中身を同時にインポートする (RFC 0532により廃止)
  • RFC 0169 use baz = foo::bar; 構文を廃止し use foo::bar as baz; で置き換える
  • RFC 0179 &p パターンを &p&mut p パターンに分割し、参照のミュータビリティーに応じて使い分けるようにする
  • RFC 0184 foo.0 のように、タプル/タプル構造体のフィールドに整数でアクセスできるようにする
  • RFC 0194 #[cfg(...)] の構文の整理
  • RFC 0198 foo[]/foo[n..m]/foo[n..]/foo[..n] のためのトレイト Slice/SliceMut を導入 (RFC 0439とRFC 0702により廃止: foo[]foo[..] になり、 ..[] と独立な構文になった)
  • RFC 0202 [x, ..ys] パターンを [x, ys..] に変更 (#![feature(slice_patterns)]/#![feature(advanced_slice_patterns)] に注意)
  • RFC 0214 while let 構文
  • RFC 0218 空のレコード構造体 struct A {} を許可
  • RFC 0243 e?(do) catch {} 構文によるエラー処理 (RFC 1859も参照。catch構文は#![feature(catch_expr)])
  • RFC 0339 バイト列リテラルの型を &'static [u8] から &'static [u8; N] に変更
  • RFC 0418 enum のバリアントをレコード形式 (enum Foo { Bar {}}) で宣言する機能を安定化
  • RFC 0438 型における &+ の優先順位を変更し、 &(Foo + Bar) のように書くようにする
  • RFC 0450 RFC 0184 (foo.0), RFC 0160 (if let), RFC 0214 (while let) の安定化, TupleN トレイトの廃止
  • RFC 0469 box p パターンをfeature gateにし、安定化するまで使用を禁止
  • RFC 0490 Sized? T 記法を T: ?Sized に変更
  • RFC 0520 配列型と繰り返しリテラルの構文 [x, ..N][x; N] に変更
  • RFC 0522 Selfimpl 内でも使えるようにする (RFC 1647も参照)
  • RFC 0532 use foo::{self, X}; によりモジュール自体とその中身を同時にインポートする。RFC 0168のキーワード置き換え
  • RFC 0534 #[deriving(Foo)]#[derive(Foo)] にリネーム
  • RFC 0544 int/uintisize/usize にリネーム。対応するリテラル接尾辞を is/us に変更 (リテラル接尾辞 is/usRFC 573で廃止)
  • RFC 0558 比較演算子を非結合的にし、 a == b == c をどうしても書きたい場合は (a == b) == c のように書くようにする
  • RFC 0572 将来の後方互換性のために、未知の属性(#[foo]等) をfeature gateにする(stableでの使用を禁止する)
  • RFC 0702 RangeFull とその構文糖衣 .. の導入。 foo[] 記法を廃止して foo[..] に置き換え
  • RFC 0803 型帰属 (type ascription): e: T による型の明示 (#![feature(type_ascription)])
  • RFC 0809 box (place) expr 構文を廃止して in place { block } に置き換える。かわりに box expr 構文を導入する。 (#![feature(placement_in_syntax)], #![feature(box_syntax)], RFC 1228も参照)
  • RFC 0940 crate名のハイフンを禁止(cargoでは許可)し、 extern crate "foo";extern crate foo; に変更
  • RFC 0968 クロージャの戻り値型を指定したときは本体がブロックであることを要請する (|| -> i32 1 とは書けず、 || -> i32 {1} と書く必要がある)
  • RFC 1192区間のための x ... y / x ..= y 構文 (どちらの構文になるかはまだ決定されていない) (#![feature(inclusive_range_syntax)])
  • RFC 1219 use foo::{bar as baz, Bar as Baz}; のように、 {} による複数インポート構文でのリネームを可能にする
  • RFC 1228 配置構文 in place { block } の別構文 place <- expr (#![feature(placement_in_syntax)])
  • RFC 1331 Rustの権威的な文法はrustcの実装ではなく src/grammar 内の形式文法であるとする (未実装)
  • RFC 1492 .. をタプルパターンやタプル構造体パターンの途中で使えるようにする
  • RFC 1506 タプル構造体/ユニット構造体を特殊なレコード構造体とみなし、タプル構造体を A { 0: "foo", 1: bar } のように初期化したり、同様のパターンマッチをしたりする

マクロ

  • RFC 0085 パターンの位置でマクロを使えるようにする
  • RFC 0378 文マクロには {} または ; を必須とし、どちらも持たないマクロは式マクロとして解釈する
  • RFC 0453 マクロのエクスポート (#[macro_export]/#[macro_reexport]/#[macro_use])、 $crate メタ変数、プラグインのための #[plugin] 属性
  • RFC 0550 macro_rules! のマッチャーとして、非曖昧な(おそらくLL(1)な)マッチャーだけを許可する
  • RFC 0873 型の位置でマクロを使えるようにする

モジュール・名前解決・可視性・警告

  • RFC 0001 構造体フィールドの可視性をデフォルトでprivateにする。
  • RFC 0003 未使用の属性のチェック方法を改善する
  • RFC 0026 enum のバリアントの可視性を常にpublicにし、 priv キーワードを廃止する。
  • RFC 0109 バージョン込みでcrateを指定できるcrate idを廃止して、ソースコードレベルではcrateの名前だけを指定するようにする
  • RFC 0116 use/let 等による同レベルシャドウイングの廃止 (現在はglob importの復活により、globのshadowingが可能)
  • RFC 0136 publicな定義の型にprivateな型を使うのを禁止する
  • RFC 0155 固有実装は該当の型と同じモジュールでのみ可能 (RFC 0735により廃止)
  • RFC 0234 enum のバリアントは常に値名前空間と型名前空間の両方に属するようにする
  • RFC 0385 モジュールシステムの整理: use/mod 順の強制を廃止、pub extern crate を許可、 extern crate のブロック内の出現を許可
  • RFC 0390 バリアントを enum名前空間の中に移動する。つまり、 enum Foo { Bar }Bar ではなく Foo::Bar とアクセスする
  • RFC 0459 impl とその中の fn の間での、生存期間変数と型変数のシャドウイングを禁止
  • RFC 0501 #![no_implicit_prelude]#![no_prelude] にリネームし、動作を変更 (RFC 1184も参照)
  • RFC 0735 固有実装は該当の型と異なるモジュールに置いてもよい
  • RFC 0736 構造体の関数型レコード更新記法(FRU) S { x: 42, ..old } において、更新されないフィールドの可視性もチェックする
  • RFC 1023 トレイト実装の一貫性を保つため、orphan規則を厳しくする。 #[fundamental] を導入する
  • RFC 1096 #[static_assert] の廃止 (#[static_assert] は、 bool 型の static アイテムにつけると、その値が false だったときにコンパイルエラーとなる)
  • RFC 1184 #![no_std]#![no_std]#![no_core] に分割した上で、 #![no_std] を安定化する。また libcore の名称を安定化(内容の安定化はしない) (RFC 0501も参照)
  • RFC 1193 #![deny(some_lint)] を設定しているcrateがコンパイラのバージョンアップで破壊された場合に、lint levelを強制的に上書きできるオプション --cap-lints を用意する
  • RFC 1229 static などの定数文脈で、定数式評価の途中でエラーが発生しても、コンパイラは警告を出力して処理を続行する
  • RFC 1270 #[deprecated] をユーザー定義のライブラリ内でも利用できるようにする
  • RFC 1422 pub(restricted) 構文
  • RFC 1445 定数パターンの透明性を高めるための制限と #[structural_match] (網羅性チェックの制限は未実装)

型システム

  • RFC 0019 既定実装 impl Send for .. {}, 否定実装 impl !Send for T {} により Send/Sync をライブラリレベルで実現する (#![feature(optin_builtin_traits)])
  • RFC 0034/0011 struct/enum の型引数に境界 T: Trait を書けるようにし、それが充足されていることを利用側で検査する。
  • RFC 0048 トレイト周りの整理: self の一般化、coherence条件の整理、トレイト選択アルゴリズムの改善など
  • RFC 0111 IndexIndex/IndexMut に分割する
  • RFC 0112/0033 Box<T> から &mut T への型強制の廃止(DerefMut型強制とは別) (RFC 0139も参照)
  • RFC 0115 整数リテラル型がデフォルトで isize にフォールバックしないようにする (RFC 0212により廃止)
  • RFC 0139 Box<T> から &T への型強制の廃止 (Deref型強制とは別) (RFC 0112も参照)
  • RFC 0195 関連型・関連定数・関連生存期間 (関連生存期間は未実装)
  • RFC 0212 RFC 0115をリバートするが、整数型のデフォルトは isize ではなく i32 にする
  • RFC 0213 fn/impl でもデフォルト型引数を使えるようにする。_ を型引数のデフォルト値の意味で使えるようにする (#![feature(default_type_parameter_fallback)])
  • RFC 0241 Deref型強制: &Rc<T>&T に自動変換等 (RFC 0401も参照)
  • RFC 0255 トレイトにobject-safetyを課すようにする
  • RFC 0341 virtual構造体と継承 virtual struct Foo {} struct Bar : Foo {} の削除
  • RFC 0401 型強制とキャストの整理: スライスへの自動参照の削除、生ポインタ型強制、サブトレイト型強制、unsizedタプル型強制、推移的型強制、ユーザー定義型のunsize型強制など (RFC 0241, RFC 0982, RFC 1558も参照; いくつかの機能は未実装)
  • RFC 0447 未使用だったり、一意でないような impl の型引数を禁止
  • RFC 0495 スライスパターン [x, xs..] の変更: [T] にはマッチするが &[T] にはマッチしない。可変借用の分割に対応 (#![feature(slice_patterns)]/#![feature(advanced_slice_patterns)] に注意)
  • RFC 0546 トレイトをデフォルトで ?Sized にする。 Sized なトレイトをobject-safeから外す。
  • RFC 0982 CoerceUnsized によるユーザー定義スマートポインタの型強制
  • RFC 1210 特殊化。 default 弱キーワードの導入と、特定条件下での重複する実装の許可 (#![feature(specialization)])
  • RFC 1214 型システムをよりよくするための3つの変更: 長命(outlives)関係に関する規則を単純化。射影型の規則を整理。型の適格性(well-formedness)を要求する位置を明確化。 (実装途中)
  • RFC 1216 ! をファーストクラスの型に昇格し、様々な位置で使えるようにする。 (#![feature(never_type)])
  • RFC 1268 マーカートレイトに対する実装が重複するのを許す (#![feature(overlapping_marker_traits)])
  • RFC 1504 i128, u128 型の追加 (#![feature(i128_type)])
  • RFC 1522 存在型のための impl Trait 構文を限定的にサポート (#![feature(conservative_impl_trait)], RFC 1951により拡充)

クロージャ

  • RFC 0114 クロージャの整理: unboxed closureのための Fn/FnMut/FnOnce トレイトの導入、 proc の削除、クロージャ型を削除して |_| -> _ を構文糖衣に変更(構文糖衣はRFC 0231により廃止)、キャプチャー方式の指定、レシーバモード |:| |&:| |&mut :| の明示(RFC 0231により廃止)
  • RFC 0151 クロージャref を指定しない限りムーブキャプチャーする (RFC 0231により廃止)
  • RFC 0231 キャプチャーモードの推論方式を変更、 ref || を廃止して move || を導入、 |_| -> _ 型構文を廃止、レシーバモード |:| |&:| |&mut :| を廃止
  • RFC 0587 Fn* 系トレイトの戻り値型を型引数ではなく関連型にする

生存期間/ボローチェッカー/部分型付け/const/mut

  • RFC 0066 一時的な値に対する参照を間接的に取った場合も、直接取った場合と同様にそ の生存期間を延長できるようにする
  • RFC 0107 パターンマッチのガード内でムーブ束縛された変数を使う (未実装)
  • RFC 0130 ボローチェッカーにおける Box<T> の特別扱いの廃止
  • RFC 0141 生存期間の省略規則の整理
  • RFC 0192 トレイトオブジェクト型の生存期間 (RFC 0599, RFC 1156も参照)
  • RFC 0246 staticconst/static に分割
  • RFC 0387 高階トレイト境界 T: for<'a> Trait の導入
  • RFC 0533 配列の特定要素からのムーブと要素ごとの初期化を廃止
  • RFC 0599 トレイトオブジェクト型の生存期間の、外側の型にもとづくデフォルト値 (RFC 1156により上書き, RFC 0192も参照)
  • RFC 0738 部分型付けにおける変性(variance)を推論するようにし、変性のためのラッパー型を削除する。未使用の型引数/生存期間引数(=双変 bivariant な引数)はエラーにする。
  • RFC 0769 ドロップチェッカーの導入により、多相型の Drop を安全に実装できるようにする。 (RFC 1238, RFC 1327により上書き)
  • RFC 0911 const fn による定数関数
  • RFC 1066 safeなプログラムでもデストラクタが実行されないことがあることを明記し、 std::mem::forgetunsafe を外す
  • RFC 1156 トレイトオブジェクト型の生存期間のデフォルト値を定めたRFC 0599を上書きし、関数本体内でのbase defaultの規則を変更する (RFC 0192も参照)
  • RFC 1238 RFC 0769が仮定している型のパラメトリシティーが特殊化によって崩れることを念頭に、ドロップチェッカーの動作を安全寄りに倒す (RFC 1327により上書き、 #![feature(dropck_parametricity)])
  • RFC 1327 RFC 0769とRFC 1238を上書きし、 #[unsafe_destructor_blind_to_params] よりも子細に状況を指定できる #[may_dangle] を導入 (#![feature(dropck_eyepatch)], 利用するには #![feature(generic_param_attrs)] も必要)
  • RFC 1414 &42 など定数参照の生存期間を 'static に延長する (#![feature(rvalue_static_promotion)])
  • RFC 1440 const/static にデストラクタを持つ型を許可する (未実装)

コード生成/ABI

  • RFC 0008 extern "rust-intrinsic" の廃止 (破棄)
  • RFC 0079 #[repr(C)] などで明示しない限り、構造体レイアウトは入れ替えられる可能性がある
  • RFC 0320 構造体等からdrop flagフィールドを削除、変数ごとのdrop flagに移行 (RFC 0533も参照)
  • RFC 0379 ランタイムリフレクションと、それを用いた {:?} の削除、 libdebug/Poly の削除 ({:?}RFC 0504により復活)
  • RFC 1201 関数プロローグとエピローグを省く #[naked] の追加 (#![feature(naked_functions)], RFC 1548も参照)
  • RFC 1240 #[repr(packed)] な構造体のフィールドへの参照の取得は unsafe であると取り決める
  • RFC 1260 ::main()fn main() {} ではなく use foo::bar as main の形で定義されていてもエントリポイントとみなす (未実装, PR 38312も参照)
  • RFC 1300 extern "rust-intrinsic"/extern "platform-intrinsic" は呼び出し側に直接コード生成されるものであり、関数ポインタ化はできないことを明記
  • RFC 1358 アラインメントを指定する #[repr(align = "N")] 属性 (#![feature(repr_align)])
  • RFC 1399 #[repr(packed)] の一般化である #[repr(packed = "N")] の導入 (未実装, おそらく #![feature(repr_packed)] になる)
  • RFC 1444 共用体 union X { .. } (#![feature(union)])
  • RFC 1513 panic 時にunwind(スタックを巻き戻してスレッドを終了)ではなくabort(その場でプログラムを終了)にするオプションを -C panic=abort として安定化し、ユーザー定義のパニック戦略を提供できるようにする (ユーザー定義のパニック戦略は #![feature(panic_runtime)], #![feature(needs_panic_runtime)])
  • RFC 1535 整数オーバーフロー検査を有効化するためのオプションを -C overflow-checks として安定化
  • RFC 1548 関数外でシンボルを定義するための global_asm!() マクロ (#![feature(global_asm)], RFC 1201も参照)

ライブラリ全般

  • RFC 0040 libstd の実装を libcore, liballoc, liblibc などのライブラリに分割する。
  • RFC 0042/0007 regex crateの同梱 (現在は同梱されていない, RFC 1242も参照)
  • RFC 0050 デバッグモードでのみ有効化される debug_assert!() の導入
  • RFC 0060 StrBufString にリネーム
  • RFC 0093 println!format! から地域化の機能を削除し、構文を整理
  • RFC 0100 PartialOrd::partial_cmp を追加
  • RFC 0123 ShareSync にリネーム
  • RFC 0201 std::error::Error トレイトによるエラーの相互変換
  • RFC 0216 HashMap 等でfindの結果を保持する Entry 型の導入
  • RFC 0221 fail!()panic!() にリネーム
  • RFC 0230 標準ライブラリからグリーンスレッド関係の部分を削除
  • RFC 0235 コレクション関連ライブラリの整理と慣例の確立: Cow を導入、 Deque などの抽象化用トレイトを削除し Iterator を中心にした枠組みを整備、各種関数の命名規則を統一 (RFC 0509により上書き, RFC 0580によりリネーム)
  • RFC 0256 Gc<T>/@T (Rc<T> とは異なり、循環参照も解放される) の削除
  • RFC 0356 型名にモジュール名を含めない慣習を定義し、 io::IoErrorio::Error にリネーム
  • RFC 0369 std::num にあった様々な抽象的な数値型トレイトの削除 (現在は Signed も含め大部分が削除され num crateに移管済み)
  • RFC 0380 std::fmt の安定化
  • RFC 0439 std::cmpstd::ops の整理: 演算子オーバーロードトレイトの整理、ヘテロジェニアスな Eq, Slice/SliceMutを削除してRange*型を導入、IndexSetの導入 (IndexSet は実装されていない模様; RFC issue #997 も参照)
  • RFC 0458 Send: 'static を削除、 &T: Send ←→ T: Sync
  • RFC 0461 タスクローカル領域のための std::local_data を整理してスレッドローカル領域のための std::tls を導入 (RFC 0909により、現在は std::thread に統合)
  • RFC 0474 std::path の整理: 正規化の意味論を変更、UTF-8とは限らないパスのために PathBuf/OsPath 型を新たに導入
  • RFC 0486 std::ascii::Ascii 型を削除して ascii 外部crateに分離
  • RFC 0494 std::c_vec を廃止、 std::c_strstd::ffi にリネーム、 CString の所有権の扱いを変更
  • RFC 0503 std::prelude からいくつかの名前を削除し、安定化
  • RFC 0504 ShowString(現在のDisplay)とShow(現在のDebug)に分割し、新しい Show のために {:?} を割り当て (RFC 0565により現在の名前に変更)
  • RFC 0509 コレクション関連ライブラリの整備、RFC 0235の続き。いくつかのコレクションAPIの削除。コレクションAPIの安定化。 (RFC 0580によりリネーム)
  • RFC 0517 std::iostd::os の大改革。 env fs io net os os_str process への分割。アトミック性に関する意味論の整理。非utf-8文字列のサポート。ブロッキングI/Oに注力しつつ、ノンブロッキング/非同期IOのための前方互換性は確保するようにする。など
  • RFC 0526 任意のバイト列を出力できてしまう std::fmt::Formatter::write 関数を削除することで、UTF-8チェックのコストを削減
  • RFC 0528 文字列のパターン検索のための Pattern トレイトを導入
  • RFC 0529 汎用的な変換トレイト AsRef, AsMut, Into, From の導入
  • RFC 0556 from_raw* 系関数のインターフェースを変更し、誤用を防ぐためドキュメントを充実させる
  • RFC 0560 整数演算オーバーフローの意味論を変更し、条件次第でpanicしうるとする。オーバーフロー時に常に巡回させたい場合のためのメソッド wrapping_* を用意する
  • RFC 0565 std::fmt::Stringstd::fmt::ShowDisplay, Debug にリネーム
  • RFC 0574 Vec::drain, String::drain がバッファの一部だけをドレインできるようにする (RFC 1257により上書き)
  • RFC 0580 コレクション関連ライブラリのリネーム (DListLinkedList, RingBufVecDequeなど)
  • RFC 0592 String/str に対して、 CString の対応物である CStr を導入する
  • RFC 0640 {:#?} によるpretty printingの導入と、 Debug の実装のためのヘルパー型の整備
  • RFC 0771 std::iter::oncestd::iter::empty の追加
  • RFC 0823 std::hash の整理: Hasher トレイトと Writer トレイトの統一 write_u*/write_i* メソッドの導入、 reset メソッドの削除
  • RFC 0832 vec![e; n] 記法のための vec::from_elem 関数 (この関数は確かに追加され、現在は alloc::vec::from_elem で公開されているが、 #[doc(hidden)] で隠されている)
  • RFC 0839 どんなコレクションでも、要素が Copy なら参照イテレータから extend できるように Extend を実装する
  • RFC 0840 CString::from_slice, CString::from_vec はpanicせずに Result を返す (実際のRust PR #22482 ではさらに、これらを CString::new に統一している)
  • RFC 0888 コンパイラ用のメモリフェンス指令 std::intrinsics::atomic_singlethreadfence(_rel|_acq|_acqrel)? を追加
  • RFC 0909 std::thread_localstd::thread に統合
  • RFC 0921 コレクションの Entryget メソッドを or_insert/or_insert_with に置き換え
  • RFC 0953 += など複合代入演算子のためのトレイト AddAssign etc. を追加
  • RFC 0979 SliceExt::splitn, StrExt::splitnn の意味を、セパレーターの最大数ではなく要素の最大数と解釈するようにする
  • RFC 0980定量読むまで繰り返す Read::read_exact を追加
  • RFC 1011 プロセスを即座に終了する std::process::exit (Cの_exit相当)を追加
  • RFC 1014 std::io::stdout, std::io::stderr, std::io::stdin は、対応する入出力ストリームがなかった場合にエラーにせずにダミーを返すようにする
  • RFC 1030 Default, IntoIterator, ToOwned をpreludeに追加
  • RFC 1040 Duration を整理し、一部を安定化
  • RFC 1044 std::fs で、プラットフォーム依存のファイル属性を扱えるように std::os::linux::fs::MetadataExt のような拡張トレイトを追加、 FileType 型の追加など
  • RFC 1047 TcpStream, UdpSocket に、タイムアウトを設定するメソッドを追加
  • RFC 1048 プラットフォーム非依存の soft_link を廃止して、プラットフォームごとのシンボリックリンク作成関数のみを提供する
  • RFC 1054 str::words を廃止して、 std::split_whitespace にリネーム
  • RFC 1057 io::Error のカスタムエラーを error::Error + Send から error::Error + Send + Sync にすることで、 io::Error: Sync にする
  • RFC 1058 失敗時にパニックする [T]::init[T]::tail を廃止し、 Option を返す [T]::split_last, [T]::split_first で置き換える
  • RFC 1102 SliceConcatExt::connect を、多くのプログラミング言語と同じ名称である SliceConcatExt::join にリネーム
  • RFC 1119 Result::expect の追加
  • RFC 1123 str::split_at の追加
  • RFC 1131 std::intrinsics::likelystd::intrinsics::unlikely の追加 (#![feature(core_intrinsics)])
  • RFC 1135 生ポインタ (*const T, *mut T) が fat-pointerの場合でも、これらの比較をできるようにする (RFC中では Eq に限定されているが、実際は一般の Ord の関数が動作するようだ)
  • RFC 1152 str[T] の対称性のために、 str::into_stringString::into_boxed_str を追加
  • RFC 1174 IntoRawFd, IntoRawSocket, IntoRawHandle トレイトを追加
  • RFC 1194 HashSetBTreeSetcontains, remove, insert の一般化(削除/発見した要素を返す)である get, take, replace を追加
  • RFC 1212 str::lines, BufRead::lines などの行処理関数の挙動を変更し、LFだけではなくCRLFも改行として扱うようにする
  • RFC 1236 panic! によるunwindをキャッチする std::thread::catch_panicstd::panic::catch_unwind にリネームし、要請するトレイトを Send から新しく導入する UnwindSafe に変更する。これにより std::panic::catch_unwind を安定化する。 (RFC 1328も参照)
  • RFC 1242 regex, uuid など多数の同梱crateを@rust-langから分離、移管する (RFC 1291も参照)
  • RFC 1252 OpenOptions の挙動の明確化とオプションの拡充
  • RFC 1257 RFC 0574を拡充し、コレクションの種類に応じて .drain(a..b) または .drain() を実装する
  • RFC 1288 std::time を拡充し、 Instant, SystemTime, Duration を追加する
  • RFC 1291 libc@rust-lang-nurseryから@rust-langに昇格し、モジュール構造を整理する
  • RFC 1307 OsString/OsStrlen などいくつかのメソッドを追加
  • RFC 1328 パニックハンドラーを指定する std::panic::set_hook, std::panic::take_hook を追加 (RFC 1236も参照)
  • RFC 1359 Unix系特有のプロセス起動オプションを指定するための CommandExt トレイトと、 CommandExt::exec, CommandExt::before_exec メソッドの追加
  • RFC 1398 カスタムアロケーターのためのAPI (#![feature(allocator_api)])
  • RFC 1415 std::os 内のプラットフォーム依存のデータ構造を廃止し、プラットフォーム依存の機能は拡張トレイトにより提供する
  • RFC 1419 memcpy 相当の機能を提供する [T]::copy_from_slice
  • RFC 1432 Vec, String の一定範囲をイテレーターからの値で置き換える splice メソッド (#![feature(splice)])
  • RFC 1434 値が範囲内かどうかを判定するための Range::contains etc. (#![feature(range_contains)])
  • RFC 1443 Atomic* 型に、 compare_and_swap の一般化である compare_and_exchange, compare_and_exchange_weak を追加する
  • RFC 1461 TcpStream, TcpListener, UdpSocket に、ディレイ、TTL, IPv6, ブロッキングなどの設定をするメソッド (net2 crateに既に存在する機能) を追加
  • RFC 1467 std::ptr::read_volatilestd::ptr::write_volatile を安定化
  • RFC 1479 Unixドメインソケットのための std::os::unix::net モジュールを追加
  • RFC 1498 Ipv4Addr, Ipv6Addr[u8; N] との相互変換関数
  • RFC 1521 Copy な型の clone の動作は単純コピーと一致しなければならないことを明記
  • RFC 1542 失敗するかもしれない変換のための TryFrom, TryInto トレイトを追加 (#![feature(try_from)])
  • RFC 1543 AtomicIsize, AtomicUsize の兄弟にあたる AtomicI8, AtomicU8, AtomicI16, AtomicU16, AtomicI32, AtomicU32, AtomicI64, AtomicU64, AtomicI128, AtomicU128 を追加 (#![feature(integer_atomics)])
  • RFC 1552 VecDeque, LinkedList にある要素があるか調べる contains メソッドを追加

コンパイラ/リンカ/Cargo

  • RFC 0086 手続きマクロの登録処理を一般化して、他のコンパイラプラグインの登録にも使えるようにする
  • RFC 0089 リントをコンパイラプラグインとして追加できるようにする
  • RFC 0131 ターゲットアーキテクチャーの指定の要件を緩める
  • RFC 0403 cargo build とネイティブライブラリとの相性を良くする: rustc -l オプションの追加、Cargoマニフェストのキーの追加、build.rs の導入など
  • RFC 0404 デフォルトで動的リンクよりも静的リンクを優先する
  • RFC 0507 stable/beta/nightlyリリースチャンネルの導入、後方互換性のための #![feature] の強化
  • RFC 0563 ndebug コンフィグを削除し、 debug_assertions コンフィグに移行
  • RFC 1183 アロケーターの実装(システムのmallocまたはjemalloc)をリンク時に選べるようにし、システムのmallocをデフォルトにする
  • RFC 1191 高層中間表現HIRの導入。ASTから直接transせずに、AST→HIR→LLVM IRの順で翻訳する (RFC 1211も参照)
  • RFC 1199 SIMDを外部crateで実現するためのコンパイラ側のサポートを整備する (#[repr(simd)] など)
  • RFC 1200 cargo install, cargo uninstall の追加
  • RFC 1211 中層中間表現MIRを導入し、AST→HIR→MIR→LLVM IRの順で翻訳する (RFC 1191も参照)
  • RFC 1241 crates.ioにおいて、 foo = "*" のようなワイルドカード依存関係をもつcrateのアップロードを禁止
  • RFC 1298 インクリメンタルコンパイルの提案
  • RFC 1317 IDEサポートのためのRLS (Rust Language Server) の提案 (実装途中で不安定)
  • RFC 1361 Cargoにおける、 [section.'cfg(..)'] による条件つき設定。Rustの #[cfg(..)] と同じ構文
  • RFC 1510 crate形式として、RustライブラリのCインターフェースをエクスポートするためのcdylib形式を追加
  • RFC 1525 Cargo.toml をプロジェクト内の複数crateで共有するためのworkspace機能を追加

Rustのコヒーレンス

概要: Rustの impl が定義できる型にはコヒーレンスと呼ばれる制限がある。これについて説明する。なお、この記事では特殊化がない前提で説明する。

コヒーレンス初心者のための概説

以下のように impl が重複していたり、自分のところ以外の型の impl を定義しようとするとエラーになる場合がある。これをコヒーレンスという。

struct A;


// overlap rule 違反
impl A {
    fn f(x: i32) {}
}
impl A {
    fn f(x: i8) {}
}

// orphan rule 違反
impl Option<A> {
}

コヒーレンスの目的

コヒーレンスには以下の2つの目的がある。

  1. 同じトレイト/型に対して、状況に応じて異なる実装が採用されてしまうことを防ぐ。
  2. 将来の上流クレイトの変更による下流クレイトへの影響を最小限に留める。

コヒーレンスの分類

コヒーレンス孤児規則 (orphan rule, オーファン規則) と重複規則 (overlap rule, オーバーラップ規則) に分かれている。またこれに加えて、 impl の適格性チェックで検査される引数の唯一性コヒーレンスと目的を同じくするのでここで扱う。

引数の唯一性規則

impl はそれ自体がジェネリック引数を持つが、これらの引数が入力から一意に特定できる必要がある。具体的には以下のように定義されている。

  • 入力とは、以下の3つである。
    • Self
    • トレイトの型実引数 (トレイト実装の場合)
    • where 節に書ける境界
  • impl の生存期間引数は、後方互換性のため原則としてチェックされない。ただし、関連型で使われている生存期間引数については、入力のどこかで使われている必要がある
  • 型引数はRFC 0447に定めるとおりに制約されている (constrained) 必要がある。ただし、型引数が制約されているという性質は、以下の規則により帰納的に定義される。
    • Self 型またはトレイトの型実引数の一部(射影型、匿名型は除く)に出現する型引数は、制約されている。
    • トレイトが <T as Trait<U>>::Output == V のような射影型の制約を持っており、 <T as Trait<U>>::Output 側に出現する型引数(射影型、匿名型も含む)が全て制約されているとき、 V 側の一部(射影型、匿名型は除く)に出現する型引数は、制約されている。
struct A<X>(X);

impl<X, Y> A<(X, Y)> {} // OK
// impl<X> A<()> {} // Error
// impl<X: Iterator> A<X::Item> {} // Error
// impl<X: Iterator<Item=Y>, Y: Iterator<Item=X>> A<i32> {} // Error

孤児規則

孤児規則は、下流クレイトが定義できる実装を制限するものである。

固有実装の孤児規則

固有実装の孤児規則は以下の通りである。

  • 固有実装の Self 型は、ユーザー定義型またはトレイトオブジェクト型でなければならない。 (型別名は展開する)
  • Self の型コンストラクタは、 impl と同じクレイトで定義されたものでなければならない。

ただし、例外として、標準ライブラリで基本型に対する固有実装が定義されている

struct A;

impl A {}
// impl Vec<A> {} // Error
// impl Box<A> {} // Error
// impl<'a> &'a A {} // Error

既定実装の孤児規則

既定実装は、同じクレイトで定義されたトレイトに対してのみ与えることができる

#![feature(optin_builtin_traits)]

impl Copy for .. {} // Error
fn main() {}

トレイト実装の孤児規則

トレイト実装の孤児規則はRFC 1023で解説されており、やや複雑である。

impl<P1, .., Pm> T0 for Trait<T1, .., Tn>別のクレイトのトレイトに対して定義する場合は、以下の規則を満たさなければならない。

  • ある i が存在して、 Ti は局所的である。
  • 同じ i について、 T0, T1, ..., T(i-1) は型引数・射影型を持たない。

ただし、ある型が局所的であるとは、以下のいずれかである。

  • 同じクレイトで定義されている構造体・列挙型・共用体または、同じクレイトで定義されているトレイトのトレイトオブジェクトである。
  • 基礎型 (&T, &mut T, Box<T>, Fn<T>, FnMut<T>, FnOnce<T> のいずれか)であり、 T は局所的である。
use std::ops::Add;

// OK
struct A;
impl<'a, T> Add<T> for &'a A { type Output = (); fn add(self, _: T) {} }
use std::ops::Add;

// Error
// struct A;
// impl<'a, T> Add<&'a A> for T { type Output = (); fn add(self, _: &'a A) {} }

ただし、該当トレイトが既定実装をもつ場合は制約が厳しくなる。この場合は &T などの基礎型は局所性を継承しない。

#![feature(optin_builtin_traits)]

use std::panic::UnwindSafe;

struct A;
// impl !UnwindSafe for Box<A> {} // Error

なお、 #[fundamental] (現在は不安定な属性) を一般のライブラリが使う場合を考えると、規則はより複雑になる。

トレイト実装の孤児規則 (完全版)

より一般の #[fundamental] 型を考える場合の孤児規則は以下のようになる。

  • ある i が存在して、 Ti は局所的 (local type) である。
  • 同じ i について、 T0, T1, .., Ti は網羅的 (type without uncovered type parameters) である。

ただし、ある型が局所的であるとは、以下のいずれかである。

  • 同じクレイトで定義されている構造体・列挙型・共用体または、同じクレイトで定義されているトレイトのトレイトオブジェクトである。
  • 基礎型であり、その型引数も全て局所的である。

また、ある型が網羅的であるとは、以下のいずれかである。

  • 同じクレイトで定義されている構造体・列挙型・共用体または、同じクレイトで定義されているトレイトのトレイトオブジェクトである。(型引数を持っていてもよい)
  • 基礎型であり、その型実引数も全て網羅的である。
  • 型仮引数・射影型を持たない。

ある型コンストラクターが基礎型であるとは、以下のいずれかである。

  • 参照型 &T, &mut T である。
  • #[fundamental] のついた構造体・列挙型・共用体または、 #[fundamental] のついたトレイトのトレイトオブジェクトである。

重複規則

重複規則は、既知の重複する実装を禁止する規則である。(未知の重複する実装は孤児規則により防がれる)

固有実装の重複規則

固有実装の重複規則は以下の通りである。

struct A<X>(X);

// OK
impl A<i32> {
    fn f() {}
}
impl A<i8> {
    fn f(&self) {}
}
impl A<i8> {
    fn g() {}
}
struct A<X>(X);

// Error
impl<X> A<(X, i32)> {
    fn f() {}
}
impl<X> A<(i32, X)> {
    fn f() {}
}

既定実装の重複規則

同じトレイトに対する既定実装が複数あってはいけない

#![feature(optin_builtin_traits)]

trait Foo {}
impl Foo for .. {}
impl Foo for .. {}

トレイト実装の重複規則

トレイト実装の重複規則は以下の通りである。

trait Foo {}

// Error
impl<X> Foo for (i32, X) {}
impl<X> Foo for (X, i32) {}
trait Foo<X> {}
trait Bar<X> : Foo<X> {}

impl Foo<i32> for Bar<i8> {} // Error

重複判定

2つの impl が重複とみなされる条件は複雑で、場合によっては直感に反する挙動をすることがある。以下がその重複判定処理である。

  • 2つの impl のトレイト/型の部分を単一化する。単一化に失敗したら排反である。
  • 単一化に成功したら、それによって発生した制約 (元の impl に由来する where 境界や、射影型の制約) をそれぞれ解く。 (ある制約を解いた結果は、別の制約の判定には使わない)
  • 適用不可能な制約があったら、排反である。
  • 全ての制約が適用可能(曖昧含む)ならば、重複である。

ここで出てくる制約の解決処理は、以前の記事で説明したトレイト選択によるものである。ただし、重複判定では、トレイト選択がクレイト際モード(intercrate mode)で行われる。

クレイト際モードでは、トレイト選択の動作が以下のように変化する

型変数を含むトレイト制約の扱い

クレイト際モードでは、いずれかのSelf/実引数が型変数(型引数や射影型は型変数になる)であるようなトレイト制約は全て曖昧と解釈される。例えば、

trait Foo<X> {}
trait Bar<X> {}
impl<X, T> Foo<X> for T where T: Bar<X> {}
impl<X> Foo<X> for i32 {}

は重複でエラーになる。この2つの impl が重複するためには i32: Bar<?X> が解決可能である必要があるが、これは下流クレイトで

struct A;
impl Bar<A> for i32 {}

のような実装があったときに満たされうるからである。

ただし、型変数が何らかの型コンストラクタの内側にある場合は問題ない (これはバグの可能性がある)。

trait Foo<X> {}
trait Bar<X> {}
impl<X, T> Foo<X> for T where T: Bar<X> {}
impl<X> Foo<(X,)> for i32 {} // OK

不可知なトレイト制約の扱い

(型変数を含むかもしれない)トレイト制約が不可知 (not knowable) であるとは、

  • 局所的な型実引数をもたず、かつ
  • 以下のどちらかの条件を満たす
    • 自分以外のクレイトで定義された #[fundamental] でないトレイトに対する参照である。または
    • 型変数への代入の方法によっては局所的な型実引数を持ちうる (これが満たされることはない気がするが、よくわからない)

ことである。不可知なトレイト制約は強制的に曖昧と見なされる。

trait Foo {}
impl<T> Foo for T where T: ::std::fmt::Octal {}
impl Foo for () {} // Error

この例では、 (): ::std::fmt::Octal が満たされることが重複する条件である。

孤児規則より、これが下流クレイトによって満たされることはないことはすぐにわかる。また、現時点では (): ::std::fmt::Octal は満たされていない。しかし、このトレイト制約は不可知であるため、上記の impl は重複と見なされてしまう。

この規則は、上流クレイトのバージョンアップを想定してのことである。 RFC 1105 で説明されているように、マイナーバージョンアップでも下流クレイトが壊れる可能性はゼロではないが、この規則により以下のようなbreakageが発生しないことが保証される。

  • #[fundamental] でないトレイトに、局所的な型実引数を持ち、全ての型引数が網羅的であるような実装を追加することによる、下流クレイトの重複規則の破壊。

まとめ

  • 重複規則は、同じクレイト内や、上流クレイトとの衝突を防ぐ。
  • 孤児規則は、兄弟クレイトとの衝突を防ぐ。
  • 重複規則ではクレイト際モードが採用される。これにより以下のような衝突を防ぐ。
    • 下流クレイトが関与することによる、同じクレイト内や上流クレイトとの衝突。
    • 上流クレイトのマイナーバージョンアップによる衝突。

RustのRFC一覧 (~1240)

概要: RustのRFCの一覧を作ろうとしたが、あまりに多いのでとりあえず1240までで公開することにした。なお、単に全てのRFCを列挙したいならばここを見ればよい

このRFCはRustのコミュニティーが管理しているものであり、 “RFC” の元祖であるIETF RFCとは関係ない。いずれもrequest-for-commentの略である。

メタ

  • RFC 0002 Rust RFCの提出プロセスの説明
  • RFC 0531 Rust RFCが関与する範囲を Rust/Cargo/Crates.io/このRFCプロセス自身 の4つに限定
  • RFC 1068 Rust開発者チームの組織構造を文書化したもの
  • RFC 1105 標準ライブラリや crates.io 上のライブラリについて、どのような変更がsemverの major change/minor changeにあたるかの基準を与える
  • RFC 1122 コンパイラのバージョニングについて、マイナーバージョンでの破壊的変更は「コンパイラのバグ」「型システム上の問題」の修正などに留めることを明記。破壊的変更の影響を最小限に抑えるための手続き (crater/cargobombツールの利用、 [breaking-change]タグ、tracking issueの作成、warning cycleの実施など)を策定。

スタイル/慣習

  • RFC 0199 似たような動作で、所有権/借用の種別だけが異なるようなメソッドの命名規則を定める
  • RFC 0236 panic!/Result の使い分けの慣習を定義する、関連するメソッドの命名規則を定める
  • RFC 0240 unsafe の慣習の整理: unsafe 関数をメソッドにする条件の定義、論理的な不変条件を壊すが未定義動作を引き起こさない関数は unsafe ではなく *_unchecked と命名することを定義、その他 unsafe 関数の命名規則の定義
  • RFC 0344 関数/メソッド名が型名に言及する際の命名規則 (Prelude*RFC 0445により廃止され、Rust PR #23104により完全に不要になった)
  • RFC 0430 命名規則のケーシング(snake_case, CamelCase, etc.) と、 unwrap/into_*命名規則を定義
  • RFC 0445 拡張トレイトパターンに使うトレイトの名前を *Ext とする命名規則
  • RFC 0505 doc-commentの慣習の確立: /// を優先的に使う。Markdownを使う

ソースファイル処理と字句

  • RFC 0063 二重インクルードによる混乱を防ぐため、 mod foo; による外部ファイルの読み込みに制限をつける
  • RFC 0069 バイトリテラル b'x' とバイト列リテラル b"Foo" の導入
  • RFC 0090/0021 字句解析器をより単純にする
  • RFC 0326 文字/文字列リテラルにおいて \x00-\x7F に限定し \x80-\xFF を禁止
  • RFC 0342 abstract, final, override をキーワードとして予約する
  • RFC 0446 文字/文字列リテラル\uXXXX/\UXXXXXXXX を廃止し、 \u{XXXXXX} を導入
  • RFC 0463 将来の互換性のために、リテラル直後の識別子の字句規則を変更
  • RFC 0593 Self をキーワードにする
  • RFC 0601 将来の末尾再帰のための予約キーワード be を廃止し、新たに become を予約
  • RFC 0879 2進/8進リテラル直後の数字を禁止する (0b0120b01 2 に分割せずにエラーにする)

構文

  • RFC 0016 属性を let 文、ブロック、式にも使えるようにする (#![feature(stmt_expr_attributes)])
  • RFC 0049 マッチ腕に属性を使えるようにする
  • RFC 0059 ~T 型と ~x 式を削除し、 Box/box で置き換える
  • RFC 0068 *T 型を *const T にリネーム
  • RFC 0071 const/static 内でも、一定条件下でブロックを使えるようにする
  • RFC 0087 トレイトオブジェクトの追加の境界を &(Foo : Send + Sync) ではなく &(Foo + Send + Sync) のように指定するようにする
  • RFC 0092 iffor などのブロックと紛らわしい場面では構造体の {} を禁止する
  • RFC 0132 UFCS (<T as Trait>::sth / <T>::sth) の導入
  • RFC 0135 where 節の導入 (一部未実装)
  • RFC 0160 if let 構文
  • RFC 0164 スライスパターンをfeature gateにする
  • RFC 0168 {mod, ..} によりモジュール自体とその中身を同時にインポートする (RFC 0532により廃止)
  • RFC 0169 use baz = foo::bar; 構文を廃止し use foo::bar as baz; で置き換える
  • RFC 0179 &p パターンを &p&mut p パターンに分割し、参照のミュータビリティーに応じて使い分けるようにする
  • RFC 0184 foo.0 のように、タプル/タプル構造体のフィールドに整数でアクセスできるようにする
  • RFC 0194 #[cfg(...)] の構文の整理
  • RFC 0198 foo[]/foo[n..m]/foo[n..]/foo[..n] のためのトレイト Slice/SliceMut を導入 (RFC 0439とRFC 0702により廃止: foo[]foo[..] になり、 ..[] と独立な構文になった)
  • RFC 0202 [x, ..ys] パターンを [x, ys..] に変更 (#![feature(slice_patterns)]/#![feature(advanced_slice_patterns)] に注意)
  • RFC 0214 while let 構文
  • RFC 0218 空のレコード構造体 struct A {} を許可
  • RFC 0243 e?(do) catch {} 構文によるエラー処理 (RFC 1859も参照。catch構文は#![feature(catch_expr)])
  • RFC 0339 バイト列リテラルの型を &'static [u8] から &'static [u8; N] に変更
  • RFC 0418 enum のバリアントをレコード形式 (enum Foo { Bar {}}) で宣言する機能を安定化
  • RFC 0438 型における &+ の優先順位を変更し、 &(Foo + Bar) のように書くようにする
  • RFC 0450 RFC 0184 (foo.0), RFC 0160 (if let), RFC 0214 (while let) の安定化, TupleN トレイトの廃止
  • RFC 0469 box p パターンをfeature gateにし、安定化するまで使用を禁止
  • RFC 0490 Sized? T 記法を T: ?Sized に変更
  • RFC 0520 配列型と繰り返しリテラルの構文 [x, ..N][x; N] に変更
  • RFC 0522 Selfimpl 内でも使えるようにする (RFC 1647も参照)
  • RFC 0532 use foo::{self, X}; によりモジュール自体とその中身を同時にインポートする。RFC 0168のキーワード置き換え
  • RFC 0534 #[deriving(Foo)]#[derive(Foo)] にリネーム
  • RFC 0544 int/uintisize/usize にリネーム。対応するリテラル接尾辞を is/us に変更 (リテラル接尾辞 is/usRFC 573で廃止)
  • RFC 0558 比較演算子を非結合的にし、 a == b == c をどうしても書きたい場合は (a == b) == c のように書くようにする
  • RFC 0572 将来の後方互換性のために、未知の属性(#[foo]等) をfeature gateにする(stableでの使用を禁止する)
  • RFC 0702 RangeFull とその構文糖衣 .. の導入。 foo[] 記法を廃止して foo[..] に置き換え
  • RFC 0803 型帰属 (type ascription): e: T による型の明示 (#![feature(type_ascription)])
  • RFC 0809 box (place) expr 構文を廃止して in place { block } に置き換える。かわりに box expr 構文を導入する。 (#![feature(placement_in_syntax)], #![feature(box_syntax)], RFC 1228も参照)
  • RFC 0940 crate名のハイフンを禁止(cargoでは許可)し、 extern crate "foo";extern crate foo; に変更
  • RFC 0968 クロージャの戻り値型を指定したときは本体がブロックであることを要請する (|| -> i32 1 とは書けず、 || -> i32 {1} と書く必要がある)
  • RFC 1192区間のための x ... y / x ..= y 構文 (どちらの構文になるかはまだ決定されていない) (#![feature(inclusive_range_syntax)])
  • RFC 1219 use foo::{bar as baz, Bar as Baz}; のように、 {} による複数インポート構文でのリネームを可能にする
  • RFC 1228 配置構文 in place { block } の別構文 place <- expr (#![feature(placement_in_syntax)])

マクロ

  • RFC 0085 パターンの位置でマクロを使えるようにする
  • RFC 0378 文マクロには {} または ; を必須とし、どちらも持たないマクロは式マクロとして解釈する
  • RFC 0453 マクロのエクスポート (#[macro_export]/#[macro_reexport]/#[macro_use])、 $crate メタ変数、プラグインのための #[plugin] 属性
  • RFC 0550 macro_rules! のマッチャーとして、非曖昧な(おそらくLL(1)な)マッチャーだけを許可する
  • RFC 0873 型の位置でマクロを使えるようにする

モジュール・名前解決・可視性・警告

  • RFC 0001 構造体フィールドの可視性をデフォルトでprivateにする。
  • RFC 0003 未使用の属性のチェック方法を改善する
  • RFC 0026 enum のバリアントの可視性を常にpublicにし、 priv キーワードを廃止する。
  • RFC 0109 バージョン込みでcrateを指定できるcrate idを廃止して、ソースコードレベルではcrateの名前だけを指定するようにする
  • RFC 0116 use/let 等による同レベルシャドウイングの廃止 (現在はglob importの復活により、globのshadowingが可能)
  • RFC 0136 publicな定義の型にprivateな型を使うのを禁止する
  • RFC 0155 固有実装は該当の型と同じモジュールでのみ可能 (RFC 0735により廃止)
  • RFC 0234 enum のバリアントは常に値名前空間と型名前空間の両方に属するようにする
  • RFC 0385 モジュールシステムの整理: use/mod 順の強制を廃止、pub extern crate を許可、 extern crate のブロック内の出現を許可
  • RFC 0390 バリアントを enum名前空間の中に移動する。つまり、 enum Foo { Bar }Bar ではなく Foo::Bar とアクセスする
  • RFC 0459 impl とその中の fn の間での、生存期間変数と型変数のシャドウイングを禁止
  • RFC 0501 #![no_implicit_prelude]#![no_prelude] にリネームし、動作を変更 (RFC 1184も参照)
  • RFC 0735 固有実装は該当の型と異なるモジュールに置いてもよい
  • RFC 0736 構造体の関数型レコード更新記法(FRU) S { x: 42, ..old } において、更新されないフィールドの可視性もチェックする
  • RFC 1023 トレイト実装の一貫性を保つため、orphan規則を厳しくする。 #[fundamental] を導入する
  • RFC 1096 #[static_assert] の廃止 (#[static_assert] は、 bool 型の static アイテムにつけると、その値が false だったときにコンパイルエラーとなる)
  • RFC 1184 #![no_std]#![no_std]#![no_core] に分割した上で、 #![no_std] を安定化する。また libcore の名称を安定化(内容の安定化はしない) (RFC 0501も参照)
  • RFC 1193 #![deny(some_lint)] を設定しているcrateがコンパイラのバージョンアップで破壊された場合に、lint levelを強制的に上書きできるオプション --cap-lints を用意する
  • RFC 1229 static などの定数文脈で、定数式評価の途中でエラーが発生しても、コンパイラは警告を出力して処理を続行する

型システム

  • RFC 0019 既定実装 impl Send for .. {}, 否定実装 impl !Send for T {} により Send/Sync をライブラリレベルで実現する (#![feature(optin_builtin_traits)])
  • RFC 0034/0011 struct/enum の型引数に境界 T: Trait を書けるようにし、それが充足されていることを利用側で検査する。
  • RFC 0048 トレイト周りの整理: self の一般化、coherence条件の整理、トレイト選択アルゴリズムの改善など
  • RFC 0111 IndexIndex/IndexMut に分割する
  • RFC 0112/0033 Box<T> から &mut T への型強制の廃止(DerefMut型強制とは別) (RFC 0139も参照)
  • RFC 0115 整数リテラル型がデフォルトで isize にフォールバックしないようにする (RFC 0212により廃止)
  • RFC 0139 Box<T> から &T への型強制の廃止 (Deref型強制とは別) (RFC 0112も参照)
  • RFC 0195 関連型・関連定数・関連生存期間 (関連生存期間は未実装)
  • RFC 0212 RFC 0115をリバートするが、整数型のデフォルトは isize ではなく i32 にする
  • RFC 0213 fn/impl でもデフォルト型引数を使えるようにする。_ を型引数のデフォルト値の意味で使えるようにする (#![feature(default_type_parameter_fallback)])
  • RFC 0241 Deref型強制: &Rc<T>&T に自動変換等 (RFC 0401も参照)
  • RFC 0255 トレイトにobject-safetyを課すようにする
  • RFC 0341 virtual構造体と継承 virtual struct Foo {} struct Bar : Foo {} の削除
  • RFC 0401 型強制とキャストの整理: スライスへの自動参照の削除、生ポインタ型強制、サブトレイト型強制、unsizedタプル型強制、推移的型強制、ユーザー定義型のunsize型強制など (RFC 0241, RFC 0982, RFC 1558も参照; いくつかの機能は未実装)
  • RFC 0447 未使用だったり、一意でないような impl の型引数を禁止
  • RFC 0495 スライスパターン [x, xs..] の変更: [T] にはマッチするが &[T] にはマッチしない。可変借用の分割に対応 (#![feature(slice_patterns)]/#![feature(advanced_slice_patterns)] に注意)
  • RFC 0546 トレイトをデフォルトで ?Sized にする。 Sized なトレイトをobject-safeから外す。
  • RFC 0982 CoerceUnsized によるユーザー定義スマートポインタの型強制
  • RFC 1210 特殊化。 default 弱キーワードの導入と、特定条件下での重複する実装の許可 (#![feature(specialization)])
  • RFC 1214 型システムをよりよくするための3つの変更: 長命(outlives)関係に関する規則を単純化。射影型の規則を整理。型の適格性(well-formedness)を要求する位置を明確化。 (実装途中)
  • RFC 1216 ! をファーストクラスの型に昇格し、様々な位置で使えるようにする。 (#![feature(never_type)])

クロージャ

  • RFC 0114 クロージャの整理: unboxed closureのための Fn/FnMut/FnOnce トレイトの導入、 proc の削除、クロージャ型を削除して |_| -> _ を構文糖衣に変更(構文糖衣はRFC 0231により廃止)、キャプチャー方式の指定、レシーバモード |:| |&:| |&mut :| の明示(RFC 0231により廃止)
  • RFC 0151 クロージャref を指定しない限りムーブキャプチャーする (RFC 0231により廃止)
  • RFC 0231 キャプチャーモードの推論方式を変更、 ref || を廃止して move || を導入、 |_| -> _ 型構文を廃止、レシーバモード |:| |&:| |&mut :| を廃止
  • RFC 0587 Fn* 系トレイトの戻り値型を型引数ではなく関連型にする

生存期間/ボローチェッカー/部分型付け/const/mut

  • RFC 0066 一時的な値に対する参照を間接的に取った場合も、直接取った場合と同様にそ の生存期間を延長できるようにする
  • RFC 0107 パターンマッチのガード内でムーブ束縛された変数を使う (未実装)
  • RFC 0130 ボローチェッカーにおける Box<T> の特別扱いの廃止
  • RFC 0141 生存期間の省略規則の整理
  • RFC 0192 トレイトオブジェクト型の生存期間 (RFC 0599, RFC 1156も参照)
  • RFC 0246 staticconst/static に分割
  • RFC 0387 高階トレイト境界 T: for<'a> Trait の導入
  • RFC 0533 配列の特定要素からのムーブと要素ごとの初期化を廃止
  • RFC 0599 トレイトオブジェクト型の生存期間の、外側の型にもとづくデフォルト値 (RFC 1156により上書き, RFC 0192も参照)
  • RFC 0738 部分型付けにおける変性(variance)を推論するようにし、変性のためのラッパー型を削除する。未使用の型引数/生存期間引数(=双変 bivariant な引数)はエラーにする。
  • RFC 0769 ドロップチェッカーの導入により、多相型の Drop を安全に実装できるようにする。 (RFC 1238, RFC 1327により上書き)
  • RFC 0911 const fn による定数関数
  • RFC 1066 safeなプログラムでもデストラクタが実行されないことがあることを明記し、 std::mem::forgetunsafe を外す
  • RFC 1156 トレイトオブジェクト型の生存期間のデフォルト値を定めたRFC 0599を上書きし、関数本体内でのbase defaultの規則を変更する (RFC 0192も参照)
  • RFC 1238 RFC 0769が仮定している型のパラメトリシティーが特殊化によって崩れることを念頭に、ドロップチェッカーの動作を安全寄りに倒す (RFC 1327により上書き、 #![feature(dropck_parametricity)])

コード生成/ABI

  • RFC 0008 extern "rust-intrinsic" の廃止 (破棄)
  • RFC 0079 #[repr(C)] などで明示しない限り、構造体レイアウトは入れ替えられる可能性がある
  • RFC 0320 構造体等からdrop flagフィールドを削除、変数ごとのdrop flagに移行 (RFC 0533も参照)
  • RFC 0379 ランタイムリフレクションと、それを用いた {:?} の削除、 libdebug/Poly の削除 ({:?}RFC 0504により復活)
  • RFC 1201 関数プロローグとエピローグを省く #[naked] の追加 (#![feature(naked_functions)])
  • RFC 1240 #[repr(packed)] な構造体のフィールドへの参照の取得は unsafe であると取り決める

ライブラリ全般

  • RFC 0040 libstd の実装を libcore, liballoc, liblibc などのライブラリに分割する。
  • RFC 0042/0007 regex crateの同梱 (現在は同梱されていない)
  • RFC 0050 デバッグモードでのみ有効化される debug_assert!() の導入
  • RFC 0060 StrBufString にリネーム
  • RFC 0093 println!format! から地域化の機能を削除し、構文を整理
  • RFC 0100 PartialOrd::partial_cmp を追加
  • RFC 0123 ShareSync にリネーム
  • RFC 0201 std::error::Error トレイトによるエラーの相互変換
  • RFC 0216 HashMap 等でfindの結果を保持する Entry 型の導入
  • RFC 0221 fail!()panic!() にリネーム
  • RFC 0230 標準ライブラリからグリーンスレッド関係の部分を削除
  • RFC 0235 コレクション関連ライブラリの整理と慣例の確立: Cow を導入、 Deque などの抽象化用トレイトを削除し Iterator を中心にした枠組みを整備、各種関数の命名規則を統一 (RFC 0509により上書き, RFC 0580によりリネーム)
  • RFC 0256 Gc<T>/@T (Rc<T> とは異なり、循環参照も解放される) の削除
  • RFC 0356 型名にモジュール名を含めない慣習を定義し、 io::IoErrorio::Error にリネーム
  • RFC 0369 std::num にあった様々な抽象的な数値型トレイトの削除 (現在は Signed も含め大部分が削除され num crateに移管済み)
  • RFC 0380 std::fmt の安定化
  • RFC 0439 std::cmpstd::ops の整理: 演算子オーバーロードトレイトの整理、ヘテロジェニアスな Eq, Slice/SliceMutを削除してRange*型を導入、IndexSetの導入 (IndexSet は実装されていない模様; RFC issue #997 も参照)
  • RFC 0458 Send: 'static を削除、 &T: Send ←→ T: Sync
  • RFC 0461 タスクローカル領域のための std::local_data を整理してスレッドローカル領域のための std::tls を導入 (RFC 0909により、現在は std::thread に統合)
  • RFC 0474 std::path の整理: 正規化の意味論を変更、UTF-8とは限らないパスのために PathBuf/OsPath 型を新たに導入
  • RFC 0486 std::ascii::Ascii 型を削除して ascii 外部crateに分離
  • RFC 0494 std::c_vec を廃止、 std::c_strstd::ffi にリネーム、 CString の所有権の扱いを変更
  • RFC 0503 std::prelude からいくつかの名前を削除し、安定化
  • RFC 0504 ShowString(現在のDisplay)とShow(現在のDebug)に分割し、新しい Show のために {:?} を割り当て (RFC 0565により現在の名前に変更)
  • RFC 0509 コレクション関連ライブラリの整備、RFC 0235の続き。いくつかのコレクションAPIの削除。コレクションAPIの安定化。 (RFC 0580によりリネーム)
  • RFC 0517 std::iostd::os の大改革。 env fs io net os os_str process への分割。アトミック性に関する意味論の整理。非utf-8文字列のサポート。ブロッキングI/Oに注力しつつ、ノンブロッキング/非同期IOのための前方互換性は確保するようにする。など
  • RFC 0526 任意のバイト列を出力できてしまう std::fmt::Formatter::write 関数を削除することで、UTF-8チェックのコストを削減
  • RFC 0528 文字列のパターン検索のための Pattern トレイトを導入
  • RFC 0529 汎用的な変換トレイト AsRef, AsMut, Into, From の導入
  • RFC 0556 from_raw* 系関数のインターフェースを変更し、誤用を防ぐためドキュメントを充実させる
  • RFC 0560 整数演算オーバーフローの意味論を変更し、条件次第でpanicしうるとする。オーバーフロー時に常に巡回させたい場合のためのメソッド wrapping_* を用意する
  • RFC 0565 std::fmt::Stringstd::fmt::ShowDisplay, Debug にリネーム
  • RFC 0574 Vec::drain, String::drain がバッファの一部だけをドレインできるようにする
  • RFC 0580 コレクション関連ライブラリのリネーム (DListLinkedList, RingBufVecDequeなど)
  • RFC 0592 String/str に対して、 CString の対応物である CStr を導入する
  • RFC 0640 {:#?} によるpretty printingの導入と、 Debug の実装のためのヘルパー型の整備
  • RFC 0771 std::iter::oncestd::iter::empty の追加
  • RFC 0823 std::hash の整理: Hasher トレイトと Writer トレイトの統一 write_u*/write_i* メソッドの導入、 reset メソッドの削除
  • RFC 0832 vec![e; n] 記法のための vec::from_elem 関数 (この関数は確かに追加され、現在は alloc::vec::from_elem で公開されているが、 #[doc(hidden)] で隠されている)
  • RFC 0839 どんなコレクションでも、要素が Copy なら参照イテレータから extend できるように Extend を実装する
  • RFC 0840 CString::from_slice, CString::from_vec はpanicせずに Result を返す (実際のRust PR #22482 ではさらに、これらを CString::new に統一している)
  • RFC 0888 コンパイラ用のメモリフェンス指令 std::intrinsics::atomic_singlethreadfence(_rel|_acq|_acqrel)? を追加
  • RFC 0909 std::thread_localstd::thread に統合
  • RFC 0921 コレクションの Entryget メソッドを or_insert/or_insert_with に置き換え
  • RFC 0953 += など複合代入演算子のためのトレイト AddAssign etc. を追加
  • RFC 0979 SliceExt::splitn, StrExt::splitnn の意味を、セパレーターの最大数ではなく要素の最大数と解釈するようにする
  • RFC 0980定量読むまで繰り返す Read::read_exact を追加
  • RFC 1011 プロセスを即座に終了する std::process::exit (Cの_exit相当)を追加
  • RFC 1014 std::io::stdout, std::io::stderr, std::io::stdin は、対応する入出力ストリームがなかった場合にエラーにせずにダミーを返すようにする
  • RFC 1030 Default, IntoIterator, ToOwned をpreludeに追加
  • RFC 1040 Duration を整理し、一部を安定化
  • RFC 1044 std::fs で、プラットフォーム依存のファイル属性を扱えるように std::os::linux::fs::MetadataExt のような拡張トレイトを追加、 FileType 型の追加など
  • RFC 1047 TcpStream, UdpSocket に、タイムアウトを設定するメソッドを追加
  • RFC 1048 プラットフォーム非依存の soft_link を廃止して、プラットフォームごとのシンボリックリンク作成関数のみを提供する
  • RFC 1054 str::words を廃止して、 std::split_whitespace にリネーム
  • RFC 1057 io::Error のカスタムエラーを error::Error + Send から error::Error + Send + Sync にすることで、 io::Error: Sync にする
  • RFC 1058 失敗時にパニックする [T]::init[T]::tail を廃止し、 Option を返す [T]::split_last, [T]::split_first で置き換える
  • RFC 1102 SliceConcatExt::connect を、多くのプログラミング言語と同じ名称である SliceConcatExt::join にリネーム
  • RFC 1119 Result::expect の追加
  • RFC 1123 str::split_at の追加
  • RFC 1131 std::intrinsics::likelystd::intrinsics::unlikely の追加 (#![feature(core_intrinsics)])
  • RFC 1135 生ポインタ (*const T, *mut T) が fat-pointerの場合でも、これらの比較をできるようにする (RFC中では Eq に限定されているが、実際は一般の Ord の関数が動作するようだ)
  • RFC 1152 str[T] の対称性のために、 str::into_stringString::into_boxed_str を追加
  • RFC 1174 IntoRawFd, IntoRawSocket, IntoRawHandle トレイトを追加
  • RFC 1194 HashSetBTreeSetcontains, remove, insert の一般化(削除/発見した要素を返す)である get, take, replace を追加
  • RFC 1212 str::lines, BufRead::lines などの行処理関数の挙動を変更し、LFだけではなくCRLFも改行として扱うようにする
  • RFC 1236 panic! によるunwindをキャッチする std::thread::catch_panicstd::panic::catch_unwind にリネームし、要請するトレイトを Send から新しく導入する UnwindSafe に変更する。これにより std::panic::catch_unwind を安定化する。

コンパイラ/リンカ/Cargo

  • RFC 0086 手続きマクロの登録処理を一般化して、他のコンパイラプラグインの登録にも使えるようにする
  • RFC 0089 リントをコンパイラプラグインとして追加できるようにする
  • RFC 0131 ターゲットアーキテクチャーの指定の要件を緩める
  • RFC 0403 cargo build とネイティブライブラリとの相性を良くする: rustc -l オプションの追加、Cargoマニフェストのキーの追加、build.rs の導入など
  • RFC 0404 デフォルトで動的リンクよりも静的リンクを優先する
  • RFC 0507 stable/beta/nightlyリリースチャンネルの導入、後方互換性のための #![feature] の強化
  • RFC 0563 ndebug コンフィグを削除し、 debug_assertions コンフィグに移行
  • RFC 1183 アロケーターの実装(システムのmallocまたはjemalloc)をリンク時に選べるようにし、システムのmallocをデフォルトにする
  • RFC 1191 高層中間表現HIRの導入。ASTから直接transせずに、AST→HIR→LLVM IRの順で翻訳する (RFC 1211も参照)
  • RFC 1199 SIMDを外部crateで実現するためのコンパイラ側のサポートを整備する (#[repr(simd)] など)
  • RFC 1200 cargo install, cargo uninstall の追加
  • RFC 1211 中層中間表現MIRを導入し、AST→HIR→MIR→LLVM IRの順で翻訳する (RFC 1191も参照)

RustBelt試行中: get_x の一般化

RustBeltの examples/get_x.v をいじってみた。

From iris.proofmode Require Import tactics.
From lrust.typing Require Import typing.
Set Default Proof Using "Type".

Section get_x.
  Context `{typeG Σ}.

  Definition get_x : val :=
    funrec: <> ["p"] :=
       let: "p'" := !"p" in
       letalloc: "r" <- "p'" +ₗ #0 in
       delete [ #1; "p"] ;; return: ["r"].

  Lemma get_x_type :
    typed_val get_x (fn(∀ α, ∅; &uniq{α} Π[int; int]) → &shr{α} int).
  Proof.
    intros E L. iApply type_fn; [solve_typing..|]. iIntros "/= !#". iIntros (α ϝ ret p).
    inv_vec p=>p. simpl_subst.
    iApply type_deref; [solve_typing..|]. iIntros (p'); simpl_subst.
    iApply (type_letalloc_1 (&shr{α}int)); [solve_typing..|]. iIntros (r). simpl_subst.
    iApply type_delete; [solve_typing..|].
    iApply type_jump; solve_typing.
  Qed.
End get_x.

これはだいたい以下のようなプログラムを表しているようだ。

fn get_x<'a>(p: &'a mut (i32, i32)) -> &'a i32 {
    &p.0
}

ただし、現在のλRustでは整数型はひとつしかなく、無限に大きな整数を保持可能で、サイズは1である (ポインタのサイズも1)。

これを

fn fst<'a, T, U>(p: &'a mut (T, U)) -> &'a T {
    &p.0
}

に一般化してみた。試行錯誤の結果、以下のようにすると上手くいくことがわかった。

From iris.proofmode Require Import tactics.
From lrust.typing Require Import typing.
Set Default Proof Using "Type".

Section get_x.
  Context `{typeG Σ}.

  Definition get_x T U `{!TyWf T} `{!TyWf U} : val :=
    funrec: <> ["p"] :=
       let: "p'" := !"p" in
       letalloc: "r" <- "p'" +ₗ #0 in
       delete [ #1; "p"] ;; return: ["r"].

  Lemma get_x_type T U `{!TyWf T} `{!TyWf U} :
    typed_val (get_x T U) (fn(∀ α, ∅; &uniq{α} Π[T; U]) → &shr{α} T).
  Proof.
    intros E L. iApply type_fn; [solve_typing..|]. iIntros "/= !#". iIntros (α ϝ ret p).
    inv_vec p=>p. simpl_subst.
    iApply type_deref; [solve_typing..|]. iIntros (p'); simpl_subst.
    iApply (type_letalloc_1 (&shr{α}T)); [solve_typing..|]. iIntros (r). simpl_subst.
    iApply type_delete; [solve_typing..|].
    iApply type_jump; solve_typing.
  Qed.
End get_x.

同様に、

fn snd<'a, T, U>(p: &'a mut (T, U)) -> &'a U {
    &p.1
}

は以下のように定義できた。

From iris.proofmode Require Import tactics.
From lrust.typing Require Import typing.
Set Default Proof Using "Type".

Section snd.
  Context `{typeG Σ}.

  Definition snd T U `{!TyWf T} `{!TyWf U} : val :=
    funrec: <> ["p"] :=
       let: "p'" := !"p" in
       letalloc: "r" <- "p'" +ₗ #(T.(ty_size)) in
       delete [ #1; "p"] ;; return: ["r"].

  Lemma snd_type T U `{!TyWf T} `{!TyWf U} :
    typed_val (snd T U) (fn(∀ α, ∅; &uniq{α} Π[T; U]) → &shr{α} U).
  Proof.
    intros E L. iApply type_fn; [solve_typing..|]. iIntros "/= !#". iIntros (α ϝ ret p).
    inv_vec p=>p. simpl_subst.
    iApply type_deref; [solve_typing..|]. iIntros (p'); simpl_subst.
    iApply (type_letalloc_1 (&shr{α}U)); [solve_typing..|]. iIntros (r). simpl_subst.
    iApply type_delete; [solve_typing..|].
    iApply type_jump; solve_typing.
  Qed.
End snd.

わかったこと

  • lrust.typing.typing をインポートするとよくて、 lrust.typing.lib.*Cell 等のライブラリがある
  • lrust.typing.examples に例がある
  • `{typeG Σ} は共通のコンテキストとして出てくる
  • まずMIRもどきを Definition で与え、あとから Lemma で型をつける。
  • ライフタイムの多相性はλRustで扱われているが、型多相性はメタレベルで表現する。
  • funrec は関数定義。
  • ! はメモリを読む。
  • delete はサイズと先頭番地を引数に取りヒープまたはスタックを解放する。 (ヒープとスタックは同等に扱われる)
  • #x は定数リテラル
  • +ₗ はポインタと整数の足し算。
  • 型は type で、これは @type _ H (H は冒頭の Context で宣言されているやつ)
  • 不正な再帰型を避けるために、各型がwell-formedであることの保証を持ち回す必要がある。これは `{!TyWf T} で実現できる。
  • ∀α, ∅; T は生存期間に関する量化で、 は多分境界がないことを意味している。
  • &uniq{α} T&shr{α} T&'a mut T&'a T
  • Π[A; B; C](A, B, C)
  • std::mem::size_of::<T>() が欲しいときは #(T.(ty_size)) と書く
  • unsized typeのサポートは今のところなくて、 type は全部 Sized な型を表す

RustのRFC一覧 (~0900)

概要: RustのRFCの一覧を作ろうとしたが、あまりに多いのでとりあえず0900までで公開することにした。なお、単に全てのRFCを列挙したいならばここを見ればよい

このRFCはRustのコミュニティーが管理しているものであり、 “RFC” の元祖であるIETF RFCとは関係ない。いずれもrequest-for-commentの略である。

メタ

  • RFC 0002 Rust RFCの提出プロセスの説明
  • RFC 0531 Rust RFCが関与する範囲を Rust/Cargo/Crates.io/このRFCプロセス自身 の4つに限定

スタイル/慣習

  • RFC 0199 似たような動作で、所有権/借用の種別だけが異なるようなメソッドの命名規則を定める
  • RFC 0236 panic!/Result の使い分けの慣習を定義する、関連するメソッドの命名規則を定める
  • RFC 0240 unsafe の慣習の整理: unsafe 関数をメソッドにする条件の定義、論理的な不変条件を壊すが未定義動作を引き起こさない関数は unsafe ではなく *_unchecked と命名することを定義、その他 unsafe 関数の命名規則の定義
  • RFC 0344 関数/メソッド名が型名に言及する際の命名規則 (Prelude*RFC 0445により廃止され、Rust PR #23104により完全に不要になった)
  • RFC 0430 命名規則のケーシング(snake_case, CamelCase, etc.) と、 unwrap/into_*命名規則を定義
  • RFC 0445 拡張トレイトパターンに使うトレイトの名前を *Ext とする命名規則
  • RFC 0505 doc-commentの慣習の確立: /// を優先的に使う。Markdownを使う

ソースファイル処理と字句

  • RFC 0063 二重インクルードによる混乱を防ぐため、 mod foo; による外部ファイルの読み込みに制限をつける
  • RFC 0069 バイトリテラル b'x' とバイト列リテラル b"Foo" の導入
  • RFC 0090/0021 字句解析器をより単純にする
  • RFC 0326 文字/文字列リテラルにおいて \x00-\x7F に限定し \x80-\xFF を禁止
  • RFC 0342 abstract, final, override をキーワードとして予約する
  • RFC 0446 文字/文字列リテラル\uXXXX/\UXXXXXXXX を廃止し、 \u{XXXXXX} を導入
  • RFC 0463 将来の互換性のために、リテラル直後の識別子の字句規則を変更
  • RFC 0593 Self をキーワードにする
  • RFC 0601 将来の末尾再帰のための予約キーワード be を廃止し、新たに become を予約
  • RFC 0879 2進/8進リテラル直後の数字を禁止する (0b0120b01 2 に分割せずにエラーにする)

構文

  • RFC 0016 属性を let 文、ブロック、式にも使えるようにする (#![feature(stmt_expr_attributes)])
  • RFC 0049 マッチ腕に属性を使えるようにする
  • RFC 0059 ~T 型と ~x 式を削除し、 Box/box で置き換える
  • RFC 0068 *T 型を *const T にリネーム
  • RFC 0071 const/static 内でも、一定条件下でブロックを使えるようにする
  • RFC 0087 トレイトオブジェクトの追加の境界を &(Foo : Send + Sync) ではなく &(Foo + Send + Sync) のように指定するようにする
  • RFC 0092 iffor などのブロックと紛らわしい場面では構造体の {} を禁止する
  • RFC 0132 UFCS (<T as Trait>::sth / <T>::sth) の導入
  • RFC 0135 where 節の導入 (一部未実装)
  • RFC 0160 if let 構文
  • RFC 0164 スライスパターンをfeature gateにする
  • RFC 0168 {mod, ..} によりモジュール自体とその中身を同時にインポートする (RFC 0532により廃止)
  • RFC 0169 use baz = foo::bar; 構文を廃止し use foo::bar as baz; で置き換える
  • RFC 0179 &p パターンを &p&mut p パターンに分割し、参照のミュータビリティーに応じて使い分けるようにする
  • RFC 0184 foo.0 のように、タプル/タプル構造体のフィールドに整数でアクセスできるようにする
  • RFC 0194 #[cfg(...)] の構文の整理
  • RFC 0198 foo[]/foo[n..m]/foo[n..]/foo[..n] のためのトレイト Slice/SliceMut を導入 (RFC 0439とRFC 0702により廃止: foo[]foo[..] になり、 ..[] と独立な構文になった)
  • RFC 0202 [x, ..ys] パターンを [x, ys..] に変更 (#![feature(slice_patterns)]/#![feature(advanced_slice_patterns)] に注意)
  • RFC 0214 while let 構文
  • RFC 0218 空のレコード構造体 struct A {} を許可
  • RFC 0243 e?(do) catch {} 構文によるエラー処理 (RFC 1859も参照。catch構文は#![feature(catch_expr)])
  • RFC 0339 バイト列リテラルの型を &'static [u8] から &'static [u8; N] に変更
  • RFC 0418 enum のバリアントをレコード形式 (enum Foo { Bar {}}) で宣言する機能を安定化
  • RFC 0438 型における &+ の優先順位を変更し、 &(Foo + Bar) のように書くようにする
  • RFC 0450 RFC 0184 (foo.0), RFC 0160 (if let), RFC 0214 (while let) の安定化, TupleN トレイトの廃止
  • RFC 0469 box p パターンをfeature gateにし、安定化するまで使用を禁止
  • RFC 0490 Sized? T 記法を T: ?Sized に変更
  • RFC 0520 配列型と繰り返しリテラルの構文 [x, ..N][x; N] に変更
  • RFC 0522 Selfimpl 内でも使えるようにする (RFC 1647も参照)
  • RFC 0532 use foo::{self, X}; によりモジュール自体とその中身を同時にインポートする。RFC 0168のキーワード置き換え
  • RFC 0534 #[deriving(Foo)]#[derive(Foo)] にリネーム
  • RFC 0544 int/uintisize/usize にリネーム。対応するリテラル接尾辞を is/us に変更 (リテラル接尾辞 is/usRFC 573で廃止)
  • RFC 0558 比較演算子を非結合的にし、 a == b == c をどうしても書きたい場合は (a == b) == c のように書くようにする
  • RFC 0572 将来の後方互換性のために、未知の属性(#[foo]等) をfeature gateにする(stableでの使用を禁止する)
  • RFC 0702 RangeFull とその構文糖衣 .. の導入。 foo[] 記法を廃止して foo[..] に置き換え
  • RFC 0803 型帰属 (type ascription): e: T による型の明示 (#![feature(type_ascription)])
  • RFC 0809 box (place) expr 構文を廃止して in place { block } に置き換える。かわりに box expr 構文を導入する。 (#[feature(placement_in_syntax)], #[feature(box_syntax)], RFC 1228も参照)

マクロ

  • RFC 0085 パターンの位置でマクロを使えるようにする
  • RFC 0378 文マクロには {} または ; を必須とし、どちらも持たないマクロは式マクロとして解釈する
  • RFC 0453 マクロのエクスポート (#[macro_export]/#[macro_reexport]/#[macro_use])、 $crate メタ変数、プラグインのための #[plugin] 属性
  • RFC 0550 macro_rules! のマッチャーとして、非曖昧な(おそらくLL(1)な)マッチャーだけを許可する
  • RFC 0873 型の位置でマクロを使えるようにする

モジュール・名前解決・可視性

  • RFC 0001 構造体フィールドの可視性をデフォルトでprivateにする。
  • RFC 0003 未使用の属性のチェック方法を改善する
  • RFC 0026 enum のバリアントの可視性を常にpublicにし、 priv キーワードを廃止する。
  • RFC 0109 バージョン込みでcrateを指定できるcrate idを廃止して、ソースコードレベルではcrateの名前だけを指定するようにする
  • RFC 0116 use/let 等による同レベルシャドウイングの廃止 (現在はglob importの復活により、globのshadowingが可能)
  • RFC 0136 publicな定義の型にprivateな型を使うのを禁止する
  • RFC 0155 固有実装は該当の型と同じモジュールでのみ可能 (RFC 0735により廃止)
  • RFC 0234 enum のバリアントは常に値名前空間と型名前空間の両方に属するようにする
  • RFC 0385 モジュールシステムの整理: use/mod 順の強制を廃止、pub extern crate を許可、 extern crate のブロック内の出現を許可
  • RFC 0390 バリアントを enum名前空間の中に移動する。つまり、 enum Foo { Bar }Bar ではなく Foo::Bar とアクセスする
  • RFC 0459 impl とその中の fn の間での、生存期間変数と型変数のシャドウイングを禁止
  • RFC 0501 #![no_implicit_prelude]#![no_prelude] にリネームし、動作を変更
  • RFC 0735 固有実装は該当の型と異なるモジュールに置いてもよい
  • RFC 0736 構造体の関数型レコード更新記法(FRU) S { x: 42, ..old } において、更新されないフィールドの可視性もチェックする

型システム

  • RFC 0019 既定実装 impl Send for .. {}, 否定実装 impl !Send for T {} により Send/Sync をライブラリレベルで実現する (#![feature(optin_builtin_traits)])
  • RFC 0034/0011 struct/enum の型引数に境界 T: Trait を書けるようにし、それが充足されていることを利用側で検査する。
  • RFC 0048 トレイト周りの整理: self の一般化、coherence条件の整理、トレイト選択アルゴリズムの改善など
  • RFC 0111 IndexIndex/IndexMut に分割する
  • RFC 0112/0033 Box<T> から &mut T への型強制の廃止(DerefMut型強制とは別) (RFC 0139も参照)
  • RFC 0115 整数リテラル型がデフォルトで isize にフォールバックしないようにする (RFC 0212により廃止)
  • RFC 0139 Box<T> から &T への型強制の廃止 (Deref型強制とは別) (RFC 0112も参照)
  • RFC 0195 関連型・関連定数・関連生存期間 (関連生存期間は未実装)
  • RFC 0212 RFC 0115をリバートするが、整数型のデフォルトは isize ではなく i32 にする
  • RFC 0213 fn/impl でもデフォルト型引数を使えるようにする。_ を型引数のデフォルト値の意味で使えるようにする (#![feature(default_type_parameter_fallback)])
  • RFC 0241 Deref型強制: &Rc<T>&T に自動変換等
  • RFC 0255 トレイトにobject-safetyを課すようにする
  • RFC 0341 virtual構造体と継承 virtual struct Foo {} struct Bar : Foo {} の削除
  • RFC 0401 型強制とキャストの整理: スライスへの自動参照の削除、生ポインタ型強制、サブトレイト型強制、unsizedタプル型強制、推移的型強制、ユーザー定義型のunsize型強制など (RFC 0982, RFC 1558も参照; いくつかの機能は未実装)
  • RFC 0447 未使用だったり、一意でないような impl の型引数を禁止
  • RFC 0495 スライスパターン [x, xs..] の変更: [T] にはマッチするが &[T] にはマッチしない。可変借用の分割に対応 (#![feature(slice_patterns)]/#![feature(advanced_slice_patterns)] に注意)
  • RFC 0546 トレイトをデフォルトで ?Sized にする。 Sized なトレイトをobject-safeから外す。

クロージャ

  • RFC 0114 クロージャの整理: unboxed closureのための Fn/FnMut/FnOnce トレイトの導入、 proc の削除、クロージャ型を削除して |_| -> _ を構文糖衣に変更(構文糖衣はRFC 0231により廃止)、キャプチャー方式の指定、レシーバモード |:| |&:| |&mut :| の明示(RFC 0231により廃止)
  • RFC 0151 クロージャref を指定しない限りムーブキャプチャーする (RFC 0231により廃止)
  • RFC 0231 キャプチャーモードの推論方式を変更、 ref || を廃止して move || を導入、 |_| -> _ 型構文を廃止、レシーバモード |:| |&:| |&mut :| を廃止
  • RFC 0587 Fn* 系トレイトの戻り値型を型引数ではなく関連型にする

生存期間/ボローチェッカー/部分型付け

  • RFC 0066 一時的な値に対する参照を間接的に取った場合も、直接取った場合と同様にそ の生存期間を延長できるようにする
  • RFC 0107 パターンマッチのガード内でムーブ束縛された変数を使う (未実装)
  • RFC 0130 ボローチェッカーにおける Box<T> の特別扱いの廃止
  • RFC 0141 生存期間の省略規則の整理
  • RFC 0192 トレイトオブジェクト型の生存期間 (RFC 0599, RFC 1156も参照)
  • RFC 0246 staticconst/static に分割
  • RFC 0387 高階トレイト境界 T: for<'a> Trait の導入
  • RFC 0533 配列の特定要素からのムーブと要素ごとの初期化を廃止
  • RFC 0599 トレイトオブジェクト型の生存期間の、外側の型にもとづくデフォルト値 (RFC 1156により上書き, RFC 0192も参照)
  • RFC 0738 部分型付けにおける変性(variance)を推論するようにし、変性のためのラッパー型を削除する。未使用の型引数/生存期間引数(=双変 bivariant な引数)はエラーにする。
  • RFC 0769 ドロップチェッカーの導入により、多相型の Drop を安全に実装できるようにする。 (RFC 1238により上書き)

コード生成/ABI

  • RFC 0008 extern "rust-intrinsic" の廃止 (破棄)
  • RFC 0079 #[repr(C)] などで明示しない限り、構造体レイアウトは入れ替えられる可能性がある
  • RFC 0320 構造体等からdrop flagフィールドを削除、変数ごとのdrop flagに移行 (RFC 0533も参照)
  • RFC 0379 ランタイムリフレクションと、それを用いた {:?} の削除、 libdebug/Poly の削除 ({:?}RFC 0504により復活)

ライブラリ

  • RFC 0040 libstd の実装を libcore, liballoc, liblibc などのライブラリに分割する。
  • RFC 0042/0007 regex crateの同梱 (現在は同梱されていない)
  • RFC 0050 デバッグモードでのみ有効化される debug_assert!() の導入
  • RFC 0060 StrBufString にリネーム
  • RFC 0093 println!format! から地域化の機能を削除し、構文を整理
  • RFC 0100 PartialOrd::partial_cmp を追加
  • RFC 0123 ShareSync にリネーム
  • RFC 0201 std::error::Error トレイトによるエラーの相互変換
  • RFC 0216 HashMap 等でfindの結果を保持する Entry 型の導入
  • RFC 0221 fail!()panic!() にリネーム
  • RFC 0230 標準ライブラリからグリーンスレッド関係の部分を削除
  • RFC 0235 コレクション関連ライブラリの整理と慣例の確立: Cow を導入、 Deque などの抽象化用トレイトを削除し Iterator を中心にした枠組みを整備、各種関数の命名規則を統一 (RFC 0509により上書き, RFC 0580によりリネーム)
  • RFC 0256 Gc<T>/@T (Rc<T> とは異なり、循環参照も解放される) の削除
  • RFC 0356 型名にモジュール名を含めない慣習を定義し、 io::IoErrorio::Error にリネーム
  • RFC 0369 std::num にあった様々な抽象的な数値型トレイトの削除 (現在は Signed も含め大部分が削除され num crateに移管済み)
  • RFC 0380 std::fmt の安定化
  • RFC 0439 std::cmpstd::ops の整理: 演算子オーバーロードトレイトの整理、ヘテロジェニアスな Eq, Slice/SliceMutを削除してRange*型を導入、IndexSetの導入 (IndexSet は実装されていない模様; RFC issue #997 も参照)
  • RFC 0458 Send: 'static を削除、 &T: Send ←→ T: Sync
  • RFC 0461 タスクローカル領域のための std::local_data を整理してスレッドローカル領域のための std::tls を導入 (現在は std::thread に統合)
  • RFC 0474 std::path の整理: 正規化の意味論を変更、UTF-8とは限らないパスのために PathBuf/OsPath 型を新たに導入
  • RFC 0486 std::ascii::Ascii 型を削除して ascii 外部crateに分離
  • RFC 0494 std::c_vec を廃止、 std::c_strstd::ffi にリネーム、 CString の所有権の扱いを変更
  • RFC 0503 std::prelude からいくつかの名前を削除し、安定化
  • RFC 0504 ShowString(現在のDisplay)とShow(現在のDebug)に分割し、新しい Show のために {:?} を割り当て (RFC 0565により現在の名前に変更)
  • RFC 0509 コレクション関連ライブラリの整備、RFC 0235の続き。いくつかのコレクションAPIの削除。コレクションAPIの安定化。 (RFC 0580によりリネーム)
  • RFC 0517 std::iostd::os の大改革。 env fs io net os os_str process への分割。アトミック性に関する意味論の整理。非utf-8文字列のサポート。ブロッキングI/Oに注力しつつ、ノンブロッキング/非同期IOのための前方互換性は確保するようにする。など
  • RFC 0526 任意のバイト列を出力できてしまう std::fmt::Formatter::write 関数を削除することで、UTF-8チェックのコストを削減
  • RFC 0528 文字列のパターン検索のための Pattern トレイトを導入
  • RFC 0529 汎用的な変換トレイト AsRef, AsMut, Into, From の導入
  • RFC 0556 from_raw* 系関数のインターフェースを変更し、誤用を防ぐためドキュメントを充実させる
  • RFC 0560 整数演算オーバーフローの意味論を変更し、条件次第でpanicしうるとする。オーバーフロー時に常に巡回させたい場合のためのメソッド wrapping_* を用意する
  • RFC 0565 std::fmt::Stringstd::fmt::ShowDisplay, Debug にリネーム
  • RFC 0574 Vec::drain, String::drain がバッファの一部だけをドレインできるようにする
  • RFC 0580 コレクション関連ライブラリのリネーム (DListLinkedList, RingBufVecDequeなど)
  • RFC 0592 String/str に対して、 CString の対応物である CStr を導入する
  • RFC 0640 {:#?} によるpretty printingの導入と、 Debug の実装のためのヘルパー型の整備
  • RFC 0771 std::iter::oncestd::iter::empty の追加
  • RFC 0823 std::hash の整理: Hasher トレイトと Writer トレイトの統一 write_u*/write_i* メソッドの導入、 reset メソッドの削除
  • RFC 0832 vec![e; n] 記法のための vec::from_elem 関数 (この関数は確かに追加され、現在は alloc::vec::from_elem で公開されているが、 #[doc(hidden)] で隠されている)
  • RFC 0839 どんなコレクションでも、要素が Copy なら参照イテレータから extend できるように Extend を実装する
  • RFC 0840 CString::from_slice, CString::from_vec はpanicせずに Result を返す (実際のRust PR #22482 ではさらに、これらを CString::new に統一している)
  • RFC 0888 コンパイラ用のメモリフェンス指令 std::intrinsics::atomic_singlethreadfence(_rel|_acq|_acqrel)? を追加

コンパイラ/リンカ/Cargo

RustBeltのビルド (Windows)

概要: Coqと高階分離論理を用いたRustの検証プロジェクトであるRustBeltの論文とCoqの証明ファイルが公開されたので、とりあえずビルドしてみた。

RustBeltはopamを使うと簡単にビルドできるようだが、ここではWindowsでビルドしてみた。

環境

gitとmakeのインストー

$ pacman -S make git

Coqのインストー

CoqのWebサイト から coq-installer-8.6-x86_64.exe をダウンロードし、実行する。今回はデフォルトのディレクトC:\Coq にインストールした。

/c/Coq/bin をPATHに追加する。例えば .zshrc

export PATH="${PATH}:/c/Coq/bin"

と書く。

ssreflect/mathcompのインストー

依存関係: Coq, make

ssreflect/mathcompのWebサイト から ssreflect-mathcomp-installer-1.6.1-win64.exe をダウンロードし、実行する。Coqのインストーディレクトリと同じディレクトC:\Coq を指定する。ssreflectは %COQDIR%\lib\user-contrib\mathcomp にインストールされる。

coq-std++のビルドとインストー

依存関係: Coq, git, make

$ git clone -b ee6200b4d74bfd06034f3cc36d1afdc309427e5c https://gitlab.mpi-sws.org/robbertkrebbers/coq-stdpp.git
$ cd coq-stdpp
$ make && make install

Irisのビルドとインストー

依存関係: Coq, ssreflect/mathcomp, git, make, coq-std++

$ git clone -b 398bae9d092b6568cf8d504ca98d8810979eea33 https://gitlab.mpi-sws.org/FP/iris-coq.git
$ cd iris-coq
$ make && make install

RustBeltのビルド

依存関係: Coq, ssreflect/mathcomp, git, make, coq-std++, iris

RustBeltのWebサイトの “RustBelt: Securing the Foundations of the Rust Programming Language.” という論文のappendixをダウンロードする。 appendix.zip を解凍する。

$ cd appendix/lambdaRust
$ make && make install

以上

RustのRFC一覧 (~0500)

概要: RustのRFCの一覧を作ろうとしたが、あまりに多いのでとりあえず0500までで公開することにした。なお、単に全てのRFCを列挙したいならばここを見ればよい

このRFCはRustのコミュニティーが管理しているものであり、 “RFC” の元祖であるIETF RFCとは関係ない。いずれもrequest-for-commentの略である。

メタ

スタイル/慣習

  • RFC 0199 似たような動作で、所有権/借用の種別だけが異なるようなメソッドの命名規則を定める
  • RFC 0236 panic!/Result の使い分けの慣習を定義する、関連するメソッドの命名規則を定める
  • RFC 0240 unsafe の慣習の整理: unsafe 関数をメソッドにする条件の定義、論理的な不変条件を壊すが未定義動作を引き起こさない関数は unsafe ではなく *_unchecked と命名することを定義、その他 unsafe 関数の命名規則の定義
  • RFC 0344 関数/メソッド名が型名に言及する際の命名規則 (Prelude*RFC 0445により廃止され、Rust PR #23104により完全に不要になった)
  • RFC 0430 命名規則のケーシング(snake_case, CamelCase, etc.) と、 unwrap/into_*命名規則を定義
  • RFC 0445 拡張トレイトパターンに使うトレイトの名前を *Ext とする命名規則

ソースファイル処理と字句

  • RFC 0063 二重インクルードによる混乱を防ぐため、 mod foo; による外部ファイルの読み込みに制限をつける
  • RFC 0069 バイトリテラル b'x' とバイト列リテラル b"Foo" の導入
  • RFC 0090/0021 字句解析器をより単純にする
  • RFC 0326 文字/文字列リテラルにおいて \x00-\x7F に限定し \x80-\xFF を禁止
  • RFC 0342 abstract, final, override をキーワードとして予約する
  • RFC 0446 文字/文字列リテラル\uXXXX/\UXXXXXXXX を廃止し、 \u{XXXXXX} を導入
  • RFC 0463 将来の互換性のために、リテラル直後の識別子の字句規則を変更

構文

  • RFC 0016 属性を let 文、ブロック、式にも使えるようにする (#![feature(stmt_expr_attributes)])
  • RFC 0049 マッチ腕に属性を使えるようにする
  • RFC 0059 ~T 型と ~x 式を削除し、 Box/box で置き換える
  • RFC 0068 *T 型を *const T にリネーム
  • RFC 0071 const/static 内でも、一定条件下でブロックを使えるようにする
  • RFC 0087 トレイトオブジェクトの追加の境界を &(Foo : Send + Sync) ではなく &(Foo + Send + Sync) のように指定するようにする
  • RFC 0092 iffor などのブロックと紛らわしい場面では構造体の {} を禁止する
  • RFC 0132 UFCS (<T as Trait>::sth / <T>::sth) の導入
  • RFC 0135 where 節の導入 (一部未実装)
  • RFC 0160 if let 構文
  • RFC 0164 スライスパターンをfeature gateにする
  • RFC 0168 {mod, ..} によりモジュール自体とその中身を同時にインポートする (RFC 0532により廃止)
  • RFC 0169 use baz = foo::bar; 構文を廃止し use foo::bar as baz; で置き換える
  • RFC 0179 &p パターンを &p&mut p パターンに分割し、参照のミュータビリティーに応じて使い分けるようにする
  • RFC 0184 foo.0 のように、タプル/タプル構造体のフィールドに整数でアクセスできるようにする
  • RFC 0194 #[cfg(...)] の構文の整理
  • RFC 0198 foo[]/foo[n..m]/foo[n..]/foo[..n] のためのトレイト Slice/SliceMut を導入 (RFC 0439により廃止: foo[]foo[..] になり、 ..[] と独立な構文になった)
  • RFC 0202 [x, ..ys] パターンを [x, ys..] に変更 (#![feature(slice_patterns)]/#![feature(advanced_slice_patterns)] に注意)
  • RFC 0214 while let 構文
  • RFC 0218 空のレコード構造体 struct A {} を許可
  • RFC 0243 e?(do) catch {} 構文によるエラー処理 (RFC 1859も参照。catch構文は#![feature(catch_expr)])
  • RFC 0339 バイト列リテラルの型を &'static [u8] から &'static [u8; N] に変更
  • RFC 0418 enum のバリアントをレコード形式 (enum Foo { Bar {}}) で宣言する機能を安定化
  • RFC 0438 型における &+ の優先順位を変更し、 &(Foo + Bar) のように書くようにする
  • RFC 0450 RFC 0184 (foo.0), RFC 0160 (if let), RFC 0214 (while let) の安定化, TupleN トレイトの廃止
  • RFC 0469 box p パターンをfeature gateにし、安定化するまで使用を禁止
  • RFC 0490 Sized? T 記法を T: ?Sized に変更

マクロ

  • RFC 0085 パターンの位置でマクロを使えるようにする
  • RFC 0378 文マクロには {} または ; を必須とし、どちらも持たないマクロは式マクロとして解釈する
  • RFC 0453 マクロのエクスポート (#[macro_export]/#[macro_reexport]/#[macro_use])、 $crate メタ変数、プラグインのための #[plugin] 属性

モジュール・名前解決・可視性

  • RFC 0001 構造体フィールドの可視性をデフォルトでprivateにする。
  • RFC 0003 未使用の属性のチェック方法を改善する
  • RFC 0026 enum のバリアントの可視性を常にpublicにし、 priv キーワードを廃止する。
  • RFC 0109 バージョン込みでcrateを指定できるcrate idを廃止して、ソースコードレベルではcrateの名前だけを指定するようにする
  • RFC 0116 use/let 等による同レベルシャドウイングの廃止 (現在はglob importの復活により、globのshadowingが可能)
  • RFC 0136 publicな定義の型にprivateな型を使うのを禁止する
  • RFC 0155 固有実装は該当の型と同じモジュールでのみ可能 (RFC 0735により廃止)
  • RFC 0234 enum のバリアントは常に値名前空間と型名前空間の両方に属するようにする
  • RFC 0385 モジュールシステムの整理: use/mod 順の強制を廃止、pub extern crate を許可、 extern crate のブロック内の出現を許可
  • RFC 0390 バリアントを enum名前空間の中に移動する。つまり、 enum Foo { Bar }Bar ではなく Foo::Bar とアクセスする
  • RFC 0459 impl とその中の fn の間での、生存期間変数と型変数のシャドウイングを禁止

型システム

  • RFC 0019 既定実装 impl Send for .. {}, 否定実装 impl !Send for T {} により Send/Sync をライブラリレベルで実現する (#![feature(optin_builtin_traits)])
  • RFC 0034/0011 struct/enum の型引数に境界 T: Trait を書けるようにし、それが充足されていることを利用側で検査する。
  • RFC 0048 トレイト周りの整理: self の一般化、coherence条件の整理、トレイト選択アルゴリズムの改善など
  • RFC 0111 IndexIndex/IndexMut に分割する
  • RFC 0112/0033 Box<T> から &mut T への型強制の廃止(DerefMut型強制とは別) (RFC 0139も参照)
  • RFC 0115 整数リテラル型がデフォルトで isize にフォールバックしないようにする (RFC 0212により廃止)
  • RFC 0139 Box<T> から &T への型強制の廃止 (Deref型強制とは別) (RFC 0112も参照)
  • RFC 0195 関連型・関連定数・関連生存期間 (関連生存期間は未実装)
  • RFC 0212 RFC 0115をリバートするが、整数型のデフォルトは isize ではなく i32 にする
  • RFC 0213 fn/impl でもデフォルト型引数を使えるようにする。_ を型引数のデフォルト値の意味で使えるようにする (#![feature(default_type_parameter_fallback)])
  • RFC 0241 Deref型強制: &Rc<T>&T に自動変換等
  • RFC 0255 トレイトにobject-safetyを課すようにする
  • RFC 0341 virtual構造体と継承 virtual struct Foo {} struct Bar : Foo {} の削除
  • RFC 0401 型強制とキャストの整理: スライスへの自動参照の削除、生ポインタ型強制、サブトレイト型強制、unsizedタプル型強制、推移的型強制、ユーザー定義型のunsize型強制など (RFC 0982, RFC 1558も参照; いくつかの機能は未実装)
  • RFC 0447 未使用だったり、一意でないような impl の型引数を禁止
  • RFC 0495 スライスパターン [x, xs..] の変更: [T] にはマッチするが &[T] にはマッチしない。可変借用の分割に対応 (#![feature(slice_patterns)]/#![feature(advanced_slice_patterns)] に注意)

クロージャ

  • RFC 0114 クロージャの整理: unboxed closureのための Fn/FnMut/FnOnce トレイトの導入、 proc の削除、クロージャ型を削除して |_| -> _ を構文糖衣に変更(構文糖衣はRFC 0231により廃止)、キャプチャー方式の指定、レシーバモード |:| |&:| |&mut :| の明示(RFC 0231により廃止)
  • RFC 0151 クロージャref を指定しない限りムーブキャプチャーする (RFC 0231により廃止)
  • RFC 0231 キャプチャーモードの推論方式を変更、 ref || を廃止して move || を導入、 |_| -> _ 型構文を廃止、レシーバモード |:| |&:| |&mut :| を廃止

生存期間/ボローチェッカー

  • RFC 0066 一時的な値に対する参照を間接的に取った場合も、直接取った場合と同様にそ の生存期間を延長できるようにする
  • RFC 0107 パターンマッチのガード内でムーブ束縛された変数を使う (未実装)
  • RFC 0130 ボローチェッカーにおける Box<T> の特別扱いの廃止
  • RFC 0141 生存期間の省略規則の整理
  • RFC 0192 トレイトオブジェクト型の生存期間 (RFC 0599, RFC 1156も参照)
  • RFC 0246 staticconst/static に分割
  • RFC 0387 高階トレイト境界 T: for<'a> Trait の導入

コード生成/ABI

  • RFC 0008 extern "rust-intrinsic" の廃止 (破棄)
  • RFC 0079 #[repr(C)] などで明示しない限り、構造体レイアウトは入れ替えられる可能性がある
  • RFC 0320 構造体等からdrop flagフィールドを削除、変数ごとのdrop flagに移行
  • RFC 0379 ランタイムリフレクションと、それを用いた {:?} の削除、 libdebug/Poly の削除 ({:?}RFC 0504により復活)

ライブラリ

  • RFC 0040 libstd の実装を libcore, liballoc, liblibc などのライブラリに分割する。
  • RFC 0042/0007 regex crateの同梱 (現在は同梱されていない)
  • RFC 0050 デバッグモードでのみ有効化される debug_assert!() の導入
  • RFC 0060 StrBufString にリネーム
  • RFC 0093 println!format! から地域化の機能を削除し、構文を整理
  • RFC 0100 PartialOrd::partial_cmp を追加
  • RFC 0123 ShareSync にリネーム
  • RFC 0201 std::error::Error トレイトによるエラーの相互変換
  • RFC 0216 HashMap 等でfindの結果を保持する Entry 型の導入
  • RFC 0221 fail!()panic!() にリネーム
  • RFC 0230 標準ライブラリからグリーンスレッド関係の部分を削除
  • RFC 0235 コレクション関連ライブラリの整理と慣例の確立: Cow を導入、 Deque などの抽象化用トレイトを削除し Iterator を中心にした枠組みを整備、各種関数の命名規則を統一
  • RFC 0256 Gc<T>/@T (Rc<T> とは異なり、循環参照も解放される) の削除
  • RFC 0356 型名にモジュール名を含めない慣習を定義し、 io::IoErrorio::Error にリネーム
  • RFC 0369 std::num にあった様々な抽象的な数値型トレイトの削除 (現在は Signed も含め大部分が削除され num crateに移管済み)
  • RFC 0380 std::fmt の安定化
  • RFC 0439 std::cmpstd::ops の整理: 演算子オーバーロードトレイトの整理、ヘテロジェニアスな Eq, Slice/SliceMutを削除してRange*型を導入、IndexSetの導入 (IndexSet は実装されていない模様; RFC issue #997 も参照)
  • RFC 0458 Send: 'static を削除、 &T: Send ←→ T: Sync
  • RFC 0461 タスクローカル領域のための std::local_data を整理してスレッドローカル領域のための std::tls を導入 (現在は std::thread に統合)
  • RFC 0474 std::path の整理: 正規化の意味論を変更、UTF-8とは限らないパスのために PathBuf/OsPath 型を新たに導入
  • RFC 0486 std::ascii::Ascii 型を削除して ascii 外部crateに分離
  • RFC 0494 std::c_vec を廃止、 std::c_strstd::ffi にリネーム、 CString の所有権の扱いを変更

コンパイラ/リンカ/Cargo