---
title: Rust の型システムを (ほんのちょっとだけ) 直した話
tags: 
author: [Shina](https://www.docswell.com/user/s7tya)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/47ZL5M9NJ3.jpg?width=480
description: コンパイラのコンパの部分 #03
published: October 02, 26
canonical: https://www.docswell.com/s/s7tya/KX2NG7-2026-10-02-142453
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/47ZL5M9NJ3.jpg)

Rust の型システムを
(ほんのちょっとだけ) 直した話
椎名 @s7tya


# Page. 2

![Page Image](https://bcdn.docswell.com/page/YJ6W9NK9JV.jpg)

Sized
コンパイル時にサイズが決まる型
Copy, Send, Sync と同じくトレイトとして扱われる
型パラメータには暗黙的に Sized 制約が付く
?Sized を付けると Sized 制約が外れ、Sized でない型も許容できる


# Page. 3

![Page Image](https://bcdn.docswell.com/page/GJ5MN5PDJ4.jpg)

Sized
コンパイル時にサイズが決まる型
Copy, Send, Sync と同じくトレイトとして扱われる
型パラメータには暗黙的に Sized 制約が付く
?Sized を付けると Sized 制約が外れ、Sized でない型も許容できる
配列の要素型は Sized である必要がある
構造体やタプルは、最後の要素以外 Sized である必要がある


# Page. 4

![Page Image](https://bcdn.docswell.com/page/LE3W2N6QE5.jpg)

Q. このプログラムは typecheck するべきか？


# Page. 5

![Page Image](https://bcdn.docswell.com/page/8EDKZWVW7G.jpg)

Q. このプログラムは typecheck するべきか？
ref キーワード
パターンマッチで、 ref x と書いた
場合、書かれた場所にマッチする 
値への参照を x に代入する


# Page. 6

![Page Image](https://bcdn.docswell.com/page/V7PKD9VXJ8.jpg)

Q. このプログラムは typecheck するべきか？
a の型は &amp;str


# Page. 7

![Page Image](https://bcdn.docswell.com/page/2JVV1MZ3JQ.jpg)

Q. このプログラムは typecheck するべきか？
このパターン部分にマッチするのは
&amp;str から参照をとったもの
str


# Page. 8

![Page Image](https://bcdn.docswell.com/page/5EGL2G4YJL.jpg)

Q. このプログラムは typecheck するべきか？
(str, i32)
destruct する途中にしか現れないが概念的には
!Sized な型がタプルの最後以外の要素の型として出現


# Page. 9

![Page Image](https://bcdn.docswell.com/page/4JQYPXG67P.jpg)

Q. このプログラムは typecheck するべきか？
(str, i32)


# Page. 10

![Page Image](https://bcdn.docswell.com/page/K74WY65ME1.jpg)

Q. このプログラムは typecheck するべきか？
(str, i32)
A. 型エラーになるべき


# Page. 11

![Page Image](https://bcdn.docswell.com/page/LJ1Y6VWYEG.jpg)

Q. このプログラムは typecheck するべきか？
(str, i32)
A. 型エラーになるべき
実際: Internal Compiler Error (ICE)


# Page. 12

![Page Image](https://bcdn.docswell.com/page/GJWGWL6172.jpg)

原因
通常 rustc の型チェックでは、型が Well-Formed であることを確認する
その中で構造体やタプルの最後の要素以外の要素、配列の要素の型が 
Sized であることを確かめる
let PAT; という記法では PAT 全体の WF チェックが行われていなかった
現実的なユースケースでは右辺を省略した形のパターンマッチは稀


# Page. 13

![Page Image](https://bcdn.docswell.com/page/4EZL5MYX73.jpg)

修正


# Page. 14

![Page Image](https://bcdn.docswell.com/page/Y76W9NDP7V.jpg)

おまけ
ちょっと待って！それって 
𝓑𝓻𝓮𝓪𝓴𝓲𝓷𝓰 𝓒𝓱𝓪𝓷𝓰𝓮 じゃないですか？


# Page. 15

![Page Image](https://bcdn.docswell.com/page/G75MN53P74.jpg)

おまけ
ちょっと待って！それって 
𝓑𝓻𝓮𝓪𝓴𝓲𝓷𝓰 𝓒𝓱𝓪𝓷𝓰𝓮 じゃないですか？
rustc 1.98 まででこのコード片を含むプログラムを使っていた人は
rustc 1.99 にアップデートしたことでエラーが出るようになるので
厳密には ✨ 𝓑𝓻𝓮𝓪𝓴𝓲𝓷𝓰 𝓒𝓱𝓪𝓷𝓰𝓮 ✨


# Page. 16

![Page Image](https://bcdn.docswell.com/page/9J295NZZER.jpg)

crates.io の全クレートと GitHub 上のいくつかのリポジトリを
コンパイル &amp; テストするツール


# Page. 17

![Page Image](https://bcdn.docswell.com/page/DEY4KPRNJM.jpg)

crates.io の全クレートと GitHub 上のいくつかのリポジトリを
コンパイル &amp; テストするツール
テスト結果


# Page. 18

![Page Image](https://bcdn.docswell.com/page/VJNYR5DV78.jpg)

crates.io の全クレートと GitHub 上のいくつかのリポジトリを
コンパイル &amp; テストするツール
2 クレートのコンパイル&amp;テストがこの変更で変化してしまった


# Page. 19

![Page Image](https://bcdn.docswell.com/page/YE9PMYGVJ3.jpg)



# Page. 20

![Page Image](https://bcdn.docswell.com/page/GE8DL6V4ED.jpg)



# Page. 21

![Page Image](https://bcdn.docswell.com/page/LELML95V7R.jpg)



# Page. 22

![Page Image](https://bcdn.docswell.com/page/4JMYMZ3NJW.jpg)



# Page. 23

![Page Image](https://bcdn.docswell.com/page/PJR9V6Q479.jpg)



# Page. 24

![Page Image](https://bcdn.docswell.com/page/PEXQZM5ZJX.jpg)

㊗️ リリース


# Page. 25

![Page Image](https://bcdn.docswell.com/page/3EK98G6VED.jpg)

㊗️ リリース
Rust の型システムを(ほんのちょっとだけ) 直した話
椎名
@s7tya


