Skip to content

Feature/v0.17.2 - #39

Merged
shadowlink0122 merged 25 commits into
mainfrom
feature/v0.17.2
Aug 15, 2026
Merged

Feature/v0.17.2#39
shadowlink0122 merged 25 commits into
mainfrom
feature/v0.17.2

Conversation

@shadowlink0122

@shadowlink0122 shadowlink0122 commented Aug 15, 2026

Copy link
Copy Markdown
Owner

Cm v0.17.2 リリースノート

前バージョン: v0.17.1

各項目は「何が問題だったか→どうなったか」の要約です。

🎯 テーマ: セルフホスティング向け標準ライブラリ整備

Cmコンパイラ自身をCmで記述するための土台として、コンパイラ実装が要求する標準ライブラリを整備する(設計文書)。

✨ 新機能

スマートポインタ(std::mem::smart — UniquePtr / SharedPtr)

ヒープ確保した値の解放を自動化する手段がなく、alloc/dealloc の手動対応が必要だった。
コンパイラ変更なしのセルフホストライブラリ(Cm実装)として、RAIIベースのスマートポインタを追加した。

import std::mem::smart::*;

UniquePtr<int> u(42);          // 単独所有。スコープを抜けると自動解放
UniquePtr<int> v = move u;     // 所有権の移動は必ずmove

SharedPtr<int> a(100);
SharedPtr<int> b = a.clone();  // 共有は必ずclone()(参照カウント+1)
println("rc={a.use_count()}"); // 2
  • API: get/set/raw/is_null、UniquePtrは release/reset、SharedPtrは clone/use_count
  • 確保は std::mem::alloc/dealloc 経由でカスタムアロケータ差し替えが効く。
  • 対応はnative系(jit/native/wasm/uefi/baremetal)。JS/TSはポインタ禁止(GCのため不要)、SVは対象外。
  • 所有規律: 暗黙コピー(b = a;)は両dtorが走り二重解放になるため、移動は move・共有は clone()・所有型の返却は return move を必須とする。

WeakPtr - 弱参照(std::mem::smart)

SharedPtrだけでは相互参照する構造(親子リンク等)が参照カウントの循環で解放されなかった。
SharedPtr.downgrade() で作る弱参照 WeakPtr<T> を追加し、循環参照を切断できるようにした。

SharedPtr<int> a(42);
WeakPtr<int> w = a.downgrade();  // strongは増えない
SharedPtr<int> up = w.upgrade(); // 生存中はSharedPtrへ昇格、死後はnull
println("alive={w.is_alive()}");
  • API: is_alive/upgrade/clone。制御ブロックはstrong=0でペイロード解放後もweakが残る限り維持され、最後のWeakPtr破棄で解放される。
  • 併せてSharedPtrへ weak_count()reset() を追加した(move はエイリアスで破棄タイミングが移動元スコープ末尾のため、決定的に手放す手段として reset() を使う)。

AtomicSharedPtr - スレッド安全な参照カウント(std::mem::smart::atomic)

SharedPtrの参照カウントは非アトミックで、clone済みインスタンスを別スレッドへ渡すと増減が競合し得た。
参照カウントの増減をアトミック命令(ネイティブC++ランタイムの<atomic>)で行う AtomicSharedPtr<T> を追加した。
API・所有規律はSharedPtrと同一で、対応はnative/jitのみ(ペイロード自体の同期は別途Mutex等で守る)。

Arenaアロケータ(std::mem::arena)

短命な大量オブジェクト(パーサのAST等)を1件ずつ alloc/dealloc すると管理コストが支配的だった。
「まとめて確保・まとめて解放」のバンプアロケータ Arena を追加した(ベンチマークで個別alloc/dealloc比 約4倍)。

Arena a();                          // 既定チャンク4096バイト
int* x = a.alloc_bytes(4) as int*;  // 8バイト整列のバンプ確保
a.reset();                          // 全チャンク一括解放
  • チャンク不足時は自動拡張し、チャンク超の大型要求は専用チャンクで受ける。
  • allocated_bytes() で総確保バイトを取得できる。

集合型 TreeSet / HashSet(std::collections)

重複しない値の集まりを扱うには TreeMap/HashMap へダミー値を詰める必要があった。
順序付き集合 TreeSet<T>(平衡二分木=AVL木ベース)と順序なし集合 HashSet<T>(ハッシュ表ベース)を追加した。

TreeSet<int> s();
s.insert(30); s.insert(10); s.insert(10);  // 重複は無視
int[] xs = s.values_in_order();            // 昇順走査 [10, 30]

HashSet<int> h();
h.insert(100);
println("{h.contains(100)}");              // 平均O(1)
  • TreeSetは insert/contains/remove/len/is_empty/clear/values_in_order(全てO(log n)・走査はO(n))。
  • 20000要素で木高15(log2(20000)≈14.3)となり平衡を維持することをテストで確認済み。
  • HashSetは平均O(1)の insert/contains/remove を提供する。

TreeMapの削除・順序走査・clear(std::collections::treemap)

TreeMapは挿入・探索のみで、削除や全キーの順序取得ができなかった。
AVL削除(回転による平衡維持)・in-order走査・clearを追加した。

  • remove(key): 葉・子1・子2の全ケースをO(log n)で削除し、空きスロットはfree listで再利用する。
  • keys_in_order(): 全キーを昇順の K[] で返す。
  • clear(): 全要素を削除する。

文字分類(std::strings::chars)

字句解析に必要な文字種判定が標準ライブラリになく、セルフホスティングの前提を満たせなかった。
is_digit/is_alpha/is_alnum/is_space/is_upper/is_lower/is_hex_digit/is_ident_start/is_ident_continue/to_upper/to_lower/digit_value(c, base) を追加した。

数値解析の移設と基数対応(std::strings::parse)

parse_int 等の数値解析が入出力モジュール(std::io)に同居しており、文字列処理として独立していなかった。
std::strings::parse へ移設し、基数指定版 parse_int_radix/parse_long_radix(2〜36進)を追加した。
import std::io::*; 経由の既存コードは再エクスポートで引き続き動作する。

Vectorの強化(reserve / last / sortBy)

Vectorは容量の事前確保・末尾参照・任意順序のソートができなかった。
reserve(n)(縮小なしの事前拡張)・last()(popせず末尾参照)・sortBy(cmp)(比較関数int*(T, T)によるソート)を追加した。

v.sortBy((int a, int b) => b - a);  // 降順

文字列キーの連想配列と集合 StringMap / StringSet(std::collections)

HashMap<string, V> はハッシュが key as int(文字列では実質ポインタ値)のため、実行時生成キーのルックアップが外れる正しさ問題があった(実測2000件中ヒット1件。リテラル同士はintern共有で偶然一致するため既存テストでは顕在化しない)。
キーを文字列に固定し内容ハッシュ(FNV-1a)で探索する StringMap<V> / StringSet を追加した(設計判断の記録)。

StringMap<int> m();
m.insert("symbol_{i}", i);            // 実行時生成キーで
int v = m.get_or("symbol_{i}", -1);   // 正しくヒットする
  • スライスバックでdtorを持たない構造(dtor持ち構造体の暗黙コピー問題を構造的に回避)。密配列+墓石方式の削除・スロット再利用・負荷率50%自動成長。
  • insert/get/get_or/contains/remove/len/is_empty/clear/keys_in_order(StringSetは values_in_order)。
  • HashMap/HashSetは「intへキャスト可能なキー専用」としてヘッダとチュートリアルに制約を明記した。
  • ジェネリックHashMap内での型分岐(K=stringで内容ハッシュへ)は現行言語では書けないことを確認し(フリー関数オーバーロード非対応・__typename__(T)のmono時解決なし)、言語側の設計課題として記録した。

文字列の内容ハッシュ(std::strings::hash)

export int hash_string(string s) — FNV-1a 32bitの内容ハッシュ(非負int)。StringMap/Internerの基礎部品で、単体でも利用できる。

数値→基数文字列(std::strings::format)

数値解析(parse)の逆方向が無く、コード生成の16進出力・桁揃えができなかった。
to_radix(v, base)(2〜36進・負数対応・long最小値も正確)・to_hex/to_bin/to_octpad_left/pad_right を追加した。

to_hex(255)                          // "ff"
pad_left(to_hex(255), 4, '0')        // "00ff"
to_radix(-9223372036854775807 - 1, 16)  // "-8000000000000000"

ソートのO(n log n)化とスライスソート(std::slices / Vector)

Vectorのsort/sortByは挿入ソート(O(n²))で大規模入力に弱く、スライスにはソートAPI自体が無かった。
両者をヒープソート(in-place・追加確保なし・非安定)へ統一し、スライス向けに std::slices を新設した。

import std::slices::*;
int[] xs = [5, 1, 4];
sort(xs);                             // 昇順
sort_by(xs, (int a, int b) => b - a); // 比較関数

20000要素の逆順ソート(挿入ソートでは約2億比較で退化する規模)のパフォーマンステストで担保する。

文字列interning Interner(std::strings::intern)

コンパイラのシンボルテーブルの基礎部品として、同一内容の文字列へ一意な整数idを割り当てる Interner を追加した(intern/contains/name_of/len)。
idの比較は整数比較になり、name_of で内容を引き戻せる。

ファイルの行読み(std::fs::read_lines)

ファイルを行単位で処理するには read_file + lines の組み合わせを毎回書く必要があった。
read_lines(path) を追加した(LF/CRLF対応・失敗時は空スライス)。

dtor持ち構造体の暗黙コピー診断とmove代入

構造体代入は浅いコピーのため、デストラクタ持ち構造体を値でコピーすると両方のインスタンスでdtorが走り二重解放になる(HashSetコンストラクタで実際に発生した非決定的SIGABRTの真因。設計文書)。
恒久対策として、受理サイト(let初期化・代入・return・構造体リテラルのフィールド初期化)でのmoveなしの場所式コピーを検出する診断を追加した(通常は警告、--strict ではエラー。Z5の縮小変換と同じ段階導入方式)。

Res a;
Res b = a;        // 警告: 暗黙コピー(二重解放)
Res c = move a;   // OK: 所有権移動(aのdtorは抑止される)
self.map = move m; // OK: move代入も初期化と同様に機能する

move代入(self.f = move x;)は既存のmove機構(HIRのis_moved_from→MIRのdtor登録解除)で既に機能することを確認し、HashSetコンストラクタの「代入後にポインタを手動無効化する」回避策を self.map = move m; へ置き換えた。
一時値(コンストラクタ呼び出し・メソッド戻り値)の代入や、dtorを持たない構造体のコピーは診断対象外。

🐛 コンパイラバグ修正(標準ライブラリ実装で顕在化)

新しい標準ライブラリが最初の実利用者となり、計5件の潜在コンパイラバグを発見・修正した(ジェネリック特殊化まわり3件の記録DCE誤削除の記録総称ヘルパー連鎖の記録)。

フィールドレシーバのメソッド呼び出しがコピーに実行される

w.c.bump() のようにフィールドをレシーバにすると、メソッド内の self 変異が呼び出し元へ反映されなかった(HashSet/TreeSetのようなラッパー型が全滅する問題)。
MIRのself引数処理へ場所化分岐(lower_place)を追加し、実体のアドレスを渡すようにした。

ジェネリック関数の関数ポインタ引数が未置換

<T> 関数の int*(T, T) 引数がmono特殊化で置換されず、LLVM検証エラーになった(Vector<T>.sortBy が顕在化点)。
型置換の2実装(正準API・mono側)へFunction型の再帰を追加した。

ジェネリックメソッドが返すスライスの要素幅ずれ

ジェネリックメソッドから K[] を返すと要素読みが交互にゴミ値になった(TreeMap.keys_in_order が顕在化点)。
mono特殊化でターミネータにも型置換を適用し、スライス生成の要素サイズ定数を置換後の型から再計算するようにした。

総称ヘルパー連鎖が既定intの偽特殊化で汚染される

importしたモジュール内の総称関数(sort<T>)から別の総称ヘルパーを呼ぶと、ヘルパーがint版として特殊化されソートが無言で無効になった(記録)。
総称本体のスキャンが型未確定の呼び出しへ「既定int」の偽リクエストを作り、生成直後の即時書き換えがclone前の総称本体を汚染していた(同一ファイルでは特殊化名の辞書順の偶然で動いていた)。
モノモーフィゼーションの不動点ループで総称本体をスキャン対象から外して修正した(呼び出し元の特殊化後に正しい実型で要求される)。

ポインタ経由参照のみの構造体がAOTで消え不正IRになる

cm run では動くプログラムが cm compile だけ「Load operand must be a pointer」の検証エラーで失敗した(AtomicSharedPtr の制御ブロックが顕在化点。記録)。
AOT限定のプログラムDCEが使用中構造体の収集でポインタ・型引数を辿らず、Ctr* のようにポインタでしか参照されない構造体定義を削除し、codegenのフィールド投影が型解決失敗で命令を黙って落としていた。
DCEの収集を型ノードの再帰走査(ポインタ・配列・型引数)に改めて修正した。

🐛 標準ライブラリのバグ修正

native::io::file の open フラグがmacOS固有値だった

write_fileO_WRONLY|O_CREAT|O_TRUNC としてmacOS/BSDの値 0x0601 を直書きしており、Linuxでは O_CREAT(Linuxでは 0x0040)が立たず新規ファイルへの書き込みが失敗していた。
#ifdef __linux__ でLinux値 0x0241 に分岐するようにした。同じ値を使っていた fs/write_perf テスト(CIのubuntuでjit/nativeともにOutput mismatch)は、std::fs::write_file で空ファイルを先に作成し両OSで同値の O_WRONLY(=1) だけでopenする移植可能な形へ修正した。

HashSetの非決定的クラッシュ(二重解放)

HashSet を使うプログラムが実行ごとに完走・SIGABRTが揺れる非決定的クラッシュを起こした(記録)。
コンストラクタの self.map = m; が浅いコピーで、ローカル m のデストラクタが entries を解放してdanglingになるのが真因(ハング中プロセスのスタック採取でmallocの二重解放検出を直接確認)。
所有権移動後にローカルの保持ポインタを無効化して修正した。
恒久対策として「dtor持ち構造体の暗黙コピーへの警告」「move代入」を言語側の設計課題に記録した。

JSバックエンドのスライスポインタ引数の制限回避(TreeMap走査)

K[]* 引数を再帰ヘルパーへ引き回す TreeMap.keys_in_order() がJSバックエンドだけ実行時エラーになった(記録)。
JSのポインタ表現(配列+添字のセル参照)がスライスポインタのデリファレンスで壊れる既知制限のため、明示スタックの反復in-order走査へ書き換えて回避した(バックエンド側の修正は残課題として記録)。

ユーザ定義Optionとプレリュード衝突のライブラリ波及

ローカルで enum Option を再定義しているプログラムが、importしていない std::strings::parse の型エラーでコンパイル不能になった(記録)。
選択import(::{名前})が対象関数本体を即時型検査する挙動と、ユーザ定義Optionのフラット名前空間上書きの合成が真因。
ライブラリ内部の利用をワイルドカードimport(検査が利用時まで遅延)へ変更して回避し、型解決のモジュール分離を言語側の設計課題に記録した。

🔧 ツーリング

フォーマッタ: メソッドチェーンのTS風折り返し

cm fmt の折り返し候補はカンマと二項演算子のみで、文レベルのメソッドチェーンが最大行幅(100桁)を超えると最後の呼び出しの引数リスト内で折れてしまい、チェーン構造が読めない整形になっていた(設計文書)。
.method(...) の呼び出しが2つ以上連なる超過行は、カンマ・演算子折り返しより優先して各チェーンの . 直前で折り返すようにした(TypeScript/Prettier風。継続行は1段インデント)。

return template_text()
    .replace("{0}", first_argument)
    .replace("{1}", second_argument)
    .replace("{2}", third_argument);

フィールド参照の . や数値リテラルの小数点、if (...) ヘッダなど括弧内のチェーンは対象にせず、従来の折り返しを維持する。

CIからインタプリタ実行ジョブを削除

統合テストのmatrixにあったinterpreterスイート(MIRインタプリタ・O3)はjit系ジョブと検証範囲が重複するため、CIジョブから外した。
ローカルの make test には引き続き含まれる。

makeターゲット名の統一(install-vscode-extension)

操作系ターゲットは動詞先頭(install / test-* / update-docs-version)、成果物ターゲットは名詞(release / dist / vscode-extension)という命名規約に対し、vscode-extension-install だけが操作なのに名詞先頭だった。
make install-vscode-extension へ改名した。

📦 サンプル

セルフホストパーサ(examples/08_selfhost_parser)

v0.17.2で整備した標準ライブラリの実証として、Cmで書いたCmソースの宣言レベルパーサを追加した。
成功なら定義一覧(module/import/use/typedef/const/struct/enum/impl/関数)を、失敗ならエラー箇所(行:桁・キャレット付きソース行)を出力し、失敗し得る解析関数はすべてOption型で失敗を伝播する。
段階別ディレクトリ(diag/lexer/parser/decl/samples)へ分割し、#[test] ディレクティブの単体テストはソースと混在しないよう tests/ フォルダへ集約した。トークン種別はenum、バイト値は文字キャストの定数で定義し、エラーメッセージはコンパイラ本体と同じi18n構成(enum MsgId×Langのテンプレート表・{0}プレースホルダ・CM_LANG切替)で診断モジュールへ分離している。
プレースホルダ埋めは引数数別の関数や診断ビルダーを設けず、C++側 i18n::msgf と同じ方式の msgf(MsgId, string[]) 1本へ集約し、呼び出し側が msgf(MsgId::ExpectedButFound, [expected, found]) のようにIDと引数配列を直接渡す。
パーサ自身の全ソースを自己解析でき、CIが単体テスト・正常/エラーサンプル・自己解析を検証する。

🧪 テスト

  • 機能テスト: スマートポインタ4件+WeakPtr/Atomic、TreeSet/HashSet/TreeMap削除、chars/parse、Arena、Vector強化、fs行読みを追加。
  • パフォーマンステスト: HashSet 10000件の挿入・参照・削除スモーク(修正前の非決定的クラッシュの回帰検知を兼ねる)、Arenaのチャーン耐性。
  • ベンチマーク: 08_treeset_ops(20000要素・木高検証)、09_hashset_ops(50000要素)、10_arena_vs_alloc(200000確保の対alloc比較)を追加。

…17.2セルフホスティングstdlib整備計画を作成

RAII(スコープ末尾デストラクタ)でヒープ解放を自動化するUniquePtr<T>(単独所有・move専用、get/set/raw/release/reset/is_null)とSharedPtr<T>(参照カウント共有・明示clone、use_count)をコンパイラ変更なしのCm実装で追加した。
確保はstd::mem::alloc/dealloc経由でカスタムアロケータ差し替えが効く。対応はnative系(jit/native/wasm/uefi/baremetal)で、JS/TSはポインタ禁止(GC)・SVは対象外。
所有規律(移動はmove・共有はclone・所有型の返却はreturn move。暗黙コピーは二重解放)はプロトタイプ実測に基づき設計文書とチュートリアルja/enに明記した。
integrationテスト4件(unique基本・move移動/factory/関数渡し・shared clone/参照カウント/可視性・構造体ペイロード)をtests/common/stdlib/smartへ追加し、jit/native/wasmで検証した(platform: !js|sv)。
セルフホスティングに向けた標準ライブラリの棚卸しとv0.17.2計画(Arenaアロケータ・文字分類・数値parse集約・HashSet/TreeSet・Vector強化・fs行読み・Stopwatch・WeakPtr/Atomic版、および言語側課題としてdtor持ちstruct暗黙コピー警告とreturn move検出)をdocs/design/v0.17.2/selfhosting-stdlib.mdへまとめた。
スマートポインタの設計文書は実装完了としてdocs/archive/v0.17.1/へ収載した。新しい構文・キーワードは追加していないためVSCode拡張の変更はない。
スマートポインタはv0.17.1タグ後の実装のためv0.17.2の収載へ変更し、設計文書のarchive位置(archive/v0.17.2)と各所のバージョン表記を追従した。
リリース一覧にv0.17.2(開発中)を追加し、v0.17.1をリリース済み(2026-08-14)へ更新した。
標準ライブラリの追加・強化:
- 集合型を追加: TreeSet<T>(平衡二分木=AVL木ベース・昇順走査対応)と HashSet<T>(ハッシュ表ベース・平均O(1))
- TreeMapへAVL削除(回転による平衡維持・空きスロット再利用)・keys_in_order(明示スタックの反復in-order走査)・clearを追加
- std::mem::arena を新設(バンプアロケータ・8バイト整列・チャンク自動拡張・reset一括解放、ベンチで個別alloc/dealloc比約4倍)
- std::mem::smart へ WeakPtr(downgrade/upgrade/is_alive・循環参照の切断)と SharedPtr.reset()/weak_count() を追加し、smart.cm を smart/mod.cm へ再構成
- std::mem::smart::atomic を新設(AtomicSharedPtr<T>・参照カウントをアトミック命令で増減、native/jit専用)
- std::strings::chars を新設(is_digit等の文字分類・to_upper/to_lower・digit_value(c, base))
- 数値解析を std::io から std::strings::parse へ移設し、基数指定版 parse_int_radix/parse_long_radix(2〜36進)を追加(io側は再エクスポートで互換維持)
- Vectorへ reserve/last/sortBy(比較関数ソート)を追加、sortは挿入ソート化
- std::fs::read_lines(行単位読み・LF/CRLF対応)を追加

コンパイラバグ修正(新stdlibが最初の実利用者となり顕在化した潜在バグ、記録はdocs/archive/v0.17.2/):
- フィールドレシーバのメソッド呼び出しが一時コピーに実行され変異が消える問題を修正(self引数処理へlower_placeによる場所化分岐を追加)
- ジェネリック関数の関数ポインタ引数 int*(T, T) が型置換されずLLVM検証エラーになる問題を修正(正準API・mono側の両実装へFunction型再帰を追加)
- ジェネリックメソッドが返す K[] スライスの要素幅がずれる問題を修正(mono特殊化でターミネータにも型置換を適用し、cm_slice_new/cm_array_to_sliceの要素サイズ定数を置換後の型から再計算)
- ポインタ経由でしか参照されない構造体がプログラムDCEで削除されAOTだけ不正IRになる問題を修正(使用中struct収集を型ノードの再帰走査に変更)

ライブラリバグ修正:
- HashSetコンストラクタの二重解放(dtor持ちHashMapの暗黙コピー)による非決定的SIGABRTを修正し、所有権移動後のポインタ無効化で対処
- ユーザ定義Optionとの衝突がlibs内部の選択importの即時型検査で無関係なプログラムへ波及する問題を、ワイルドカードimportへの変更で回避
- JSバックエンドのスライスポインタ引数(K[]*)未対応をTreeMap走査の反復化で回避(バックエンド側は残課題として記録)

テスト・ドキュメント:
- 機能テスト(Set/TreeMap削除/chars/parse/Arena/Vector強化/fs行読み/WeakPtr/Atomic)とバグ修正回帰4件を追加
- パフォーマンステスト(HashSet 10000件スモーク・Arenaチャーン・TreeSet平衡性の高さ検証)とベンチマーク3本(TreeSet/HashSet/Arena)を追加
- チュートリアル(ja/en)へ集合・文字分類/数値解析ページを新設し、mem/treemap/vector/io/索引を更新
- リリースノートを完成させ、設計文書とバグ記録6件を docs/archive/v0.17.2/ へ移動
- 全スイート通過を確認: interpreter 742・llvm 783・js 682・sv 147・wasm 729・unit/regression

VSCode拡張の更新は新構文の追加がないため非該当(ライブラリAPIの追加のみで文法・ハイライト対象の変更なし)
- TreeMap: AVL内部ヘルパー11個(rotate/alloc_node/insert_at/remove_at等)と全フィールド(keys/vals/left/right/height/free_slots/count/live/root)をprivate化
- HashMap: grow()とcap/sizeをprivate化(entriesはHashSetコンストラクタの所有権移動処理が直接触るためpublic維持を理由コメント付きで明記)
- HashSet/TreeSet: 内包マップフィールドをprivate化
- Vector: data/size/capをprivate化
- Arena: grow()とhead/chunk_size/totalをprivate化
- UniquePtr: ptrをprivate化、AtomicSharedPtr: ptr/countをprivate化
- SharedPtr/WeakPtr/SharedCount/AtomicSharedCountのフィールドは相互構築(downgrade/upgrade)や制御ブロック共有で他型implから直接アクセスされるためpublic維持とし、理由コメントを追加(privateはimpl粒度の検査のため)
- 全バックエンドスイートで通過を確認: interpreter 747・llvm 791・js 756・wasm 747(いずれもFailed 0)

ライブラリ内部の可視性変更のみで公開APIと文法に変更はないため、チュートリアル・VSCode拡張・リリースノートの更新は非該当
…加、mono総称ヘルパー連鎖の型汚染を修正

充足度評価(native/jit)で見つかった不足の実装(P0=正しさ→P1=性能・欠落API→P2=周辺整備、計画docはarchive/v0.17.2/stdlib-hardening.md):

P0(正しさ):
- HashMap<string, V>はハッシュがkey as int(文字列では実質ポインタ値)のため実行時生成キーが外れる(実測2000件中ヒット1件)。キーを文字列に固定し内容ハッシュ(FNV-1a)で探索するStringMap<V>/StringSetを新設した(std::collections::strmap/strset)
- スライスバックでdtorを持たない構造(dtor持ち暗黙コピー問題を構造的に回避)。密配列+墓石削除・スロット再利用・負荷率50%成長。実行時生成キー10000件全ヒットのパフォーマンステストで担保
- ジェネリックHashMap内での型分岐が現行言語で書けないこと(フリー関数オーバーロード非対応・__typename__(T)のmono時解決なし・デッドブランチが型検査不能)を実験で確認し、設計判断と言語側課題として記録
- std::strings::hashにhash_string(FNV-1a 32bit)を公開
- HashMap/HashSetはintキャスト可能キー専用の制約をヘッダ・チュートリアルに明記

P1(性能・欠落API):
- std::strings::formatを新設: to_radix(2〜36進・負数・long最小値も正確)/to_hex/to_bin/to_oct/pad_left/pad_right(parseの逆方向。コード生成の16進出力・桁揃え用)
- Vector.sort/sortByを挿入ソート(O(n²))からヒープソート(O(n log n)・in-place・非安定)へ変更し、スライス向けstd::slices(sort/sort_by)を新設。20000要素逆順のパフォーマンステストで担保

P2(周辺整備):
- std::strings::internにInterner(文字列→一意id・name_of逆引き)を追加(シンボルテーブルの基礎部品)
- 大出力の書き込み経路(StringBuilder一括→write_fileとBufWriter逐次追記)のパフォーマンステストを追加

コンパイラバグ修正(6件目・記録はarchive/v0.17.2/bugfix-mono-generic-helper.md):
- importモジュール内の総称free関数から総称ヘルパーを呼ぶとint版が呼ばれソートが無言で無効になる問題を修正
- 真因は総称本体スキャンの推論不能→既定intの偽特殊化リクエストと、生成直後の即時書き換えによるclone前本体の汚染、特殊化名の辞書順による発現(同一ファイルでは偶然無事)
- mono不動点ループで総称本体をスキャン対象から外した(呼び出し元の特殊化後に正しい実型で要求される既存機構に委ねる)

テスト・ドキュメント:
- 機能テスト8件(strmap/strset/hash/format/intern/slices sort/総称ヘルパー連鎖回帰)とパフォーマンステスト3件(strmap 10000件・ソート20000件・書き込み8000行×2経路)を追加
- チュートリアル(ja/en)へStringMap/StringSet・format/hash/intern・ソート変更を反映、リリースノートへ新機能5節とバグ修正1節を追記
- 全スイート通過: interpreter 757・llvm 801・js 766・wasm 757・sv 147・unit/regression

VSCode拡張の更新は新構文の追加がないため非該当(ライブラリAPIの追加のみ)
Copilot AI lite review requested due to automatic review settings August 15, 2026 05:38

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

v0.17.2 向けにセルフホスティングを見据えた標準ライブラリ拡充(スマートポインタ/Arena/集合/文字列ユーティリティ等)を追加し、それに伴い顕在化したコンパイラ不具合(MIR mono・DCE・型置換・フィールドレシーバ)を修正、広範な回帰テスト・ドキュメント・リリースノート・バージョン更新を行うPRです。

Changes:

  • 標準ライブラリの新規モジュール追加/拡張(mem smart/arena、collections set/strmap、strings chars/parse/format/hash/intern、slices sort 等)
  • コンパイラ内部の修正(型パラメータ置換、MIR mono の特殊化/型置換、AOT DCE の使用struct収集、フィールドレシーバ呼び出し lowering)
  • 新機能・バグ修正に対応する大量の回帰テスト/ベンチマーク/チュートリアル/リリースノート更新と v0.17.2 へのバージョン更新

Reviewed changes

Copilot reviewed 132 out of 132 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
vscode-extension/package.json VSCode拡張のバージョンを0.17.2へ更新
VERSION リポジトリバージョンを0.17.2へ更新
tests/common/structs/ptr_only_struct.expect プログラムDCE回帰テストの期待出力追加
tests/common/structs/ptr_only_struct.cm ポインタ経由のみ参照されるstructのDCE回帰テスト追加
tests/common/structs/field_receiver.expect フィールドレシーバ回帰テストの期待出力追加
tests/common/structs/field_receiver.cm フィールドレシーバ変異が反映される回帰テスト追加
tests/common/stdlib/strings/parse_radix.expect parse_radixテストの期待出力追加
tests/common/stdlib/strings/parse_radix.cm strings::parse(基数指定含む)機能テスト追加
tests/common/stdlib/strings/intern_basic.expect internerテストの期待出力追加
tests/common/stdlib/strings/intern_basic.cm strings::intern 機能テスト追加
tests/common/stdlib/strings/hash_fnv.expect hash_stringテストの期待出力追加
tests/common/stdlib/strings/hash_fnv.cm strings::hash(FNV-1a)機能テスト追加
tests/common/stdlib/strings/format_radix.expect formatテストの期待出力追加
tests/common/stdlib/strings/format_radix.cm strings::format(基数/パディング/境界)テスト追加
tests/common/stdlib/strings/chars_classify.expect chars分類テストの期待出力追加
tests/common/stdlib/strings/chars_classify.cm strings::chars 機能テスト追加
tests/common/stdlib/smart/weak.expect WeakPtrテストの期待出力追加
tests/common/stdlib/smart/weak.cm WeakPtr downgrade/upgrade/reset 連動テスト追加
tests/common/stdlib/smart/unique.expect UniquePtrテストの期待出力追加
tests/common/stdlib/smart/unique.cm UniquePtr 基本操作/所有権操作テスト追加
tests/common/stdlib/smart/struct_payload.expect スマートポインタ構造体payloadテスト期待出力追加
tests/common/stdlib/smart/struct_payload.cm UniquePtr/SharedPtrの構造体payload操作テスト追加
tests/common/stdlib/smart/shared.expect SharedPtrテストの期待出力追加
tests/common/stdlib/smart/shared.cm SharedPtr clone/use_count/段階解放テスト追加
tests/common/stdlib/smart/move_transfer.expect move所有権移動テストの期待出力追加
tests/common/stdlib/smart/move_transfer.cm UniquePtrのmove代入/関数渡し/return moveテスト追加
tests/common/stdlib/smart/atomic_shared.expect AtomicSharedPtrテストの期待出力追加
tests/common/stdlib/smart/atomic_shared.cm AtomicSharedPtr(単一スレッド機能)テスト追加
tests/common/stdlib/slices/sort.expect slices sortテスト期待出力追加
tests/common/stdlib/slices/sort.cm std::slices sort/sort_by 機能テスト追加
tests/common/stdlib/slices/sort_load.expect sort負荷テスト期待出力追加
tests/common/stdlib/slices/sort_load.cm 20000要素ソートのパフォーマンススモーク追加
tests/common/stdlib/mem/arena_churn.expect arenaチャーンテスト期待出力追加
tests/common/stdlib/mem/arena_churn.cm Arenaの大量確保/reset再利用のスモーク追加
tests/common/stdlib/mem/arena_alloc.expect arena基本テスト期待出力追加
tests/common/stdlib/mem/arena_alloc.cm Arenaの基本確保/整列/拡張/resetテスト追加
tests/common/stdlib/fs/write_perf.expect fs書き込み性能テスト期待出力追加
tests/common/stdlib/fs/write_perf.cm 大量出力のwrite_file/BufWriterスモーク追加
tests/common/stdlib/fs/lines.expect read_linesテスト期待出力追加
tests/common/stdlib/fs/lines.cm std::fs::read_lines の機能テスト追加
tests/common/stdlib/core/parse_option_test.cm parse系import移設に追随(strings::parseへ)
tests/common/stdlib/collections/vector_enhance.expect Vector拡張テスト期待出力追加
tests/common/stdlib/collections/vector_enhance.cm Vector reserve/last/sortBy のテスト追加
tests/common/stdlib/collections/treeset_basic.expect TreeSet基本テスト期待出力追加
tests/common/stdlib/collections/treeset_basic.cm TreeSet insert/contains/remove/values_in_order テスト追加
tests/common/stdlib/collections/treeset_balance.expect TreeSet平衡性テスト期待出力追加
tests/common/stdlib/collections/treeset_balance.cm AVL高さ上界の決定的検証テスト追加
tests/common/stdlib/collections/treemap_remove.expect TreeMap remove/clearテスト期待出力追加
tests/common/stdlib/collections/treemap_remove.cm TreeMap削除/順序/clear/再利用テスト追加
tests/common/stdlib/collections/strset_basic.expect StringSetテスト期待出力追加
tests/common/stdlib/collections/strset_basic.cm StringSet基本操作テスト追加
tests/common/stdlib/collections/strmap_load.expect StringMap負荷テスト期待出力追加
tests/common/stdlib/collections/strmap_load.cm StringMap大量挿入/全ヒット/削除スモーク追加
tests/common/stdlib/collections/strmap_basic.expect StringMap基本テスト期待出力追加
tests/common/stdlib/collections/strmap_basic.cm StringMap挿入/上書き/墓石再利用/成長/keys順テスト追加
tests/common/stdlib/collections/hashset_load.expect HashSet負荷テスト期待出力追加
tests/common/stdlib/collections/hashset_load.cm HashSet大量操作スモーク(回帰)追加
tests/common/stdlib/collections/hashset_basic.expect HashSet基本テスト期待出力追加
tests/common/stdlib/collections/hashset_basic.cm HashSet基本操作テスト追加
tests/common/generics/slices/method_return.expect ジェネリックslice返却回帰テスト期待出力追加
tests/common/generics/slices/method_return.cm ジェネリックメソッドのK[]要素幅回帰テスト追加
tests/common/generics/functions/module_helper_chain.expect 総称ヘルパー連鎖回帰テスト期待出力追加
tests/common/generics/functions/module_helper_chain.cm importモジュール内総称連鎖の回帰テスト追加
tests/common/generics/functions/fnptr_param.expect 関数ポインタ引数回帰テスト期待出力追加
tests/common/generics/functions/fnptr_param.cm ジェネリック関数/メソッドの関数ポインタ引数回帰テスト追加
tests/benchmarks/cm/10_arena_vs_alloc.cm Arena vs alloc/dealloc ベンチ追加
tests/benchmarks/cm/09_hashset_ops.cm HashSet ops ベンチ追加
tests/benchmarks/cm/08_treeset_ops.cm TreeSet ops ベンチ追加
src/internal/syntax/ast/types.cpp AST型置換で関数型param/returnも再帰置換
src/internal/mir/passes/cleanup/program_dce.cpp AOT Program DCEの使用struct収集を型再帰走査に拡張
src/internal/mir/lowering/mono/specialize.cpp mono特殊化でターミネータ型置換+slice elem_size再計算
src/internal/mir/lowering/mono/internal.cpp mono側型置換でFunction型param/return再帰を追加
src/internal/mir/lowering/mono/driver.cpp 総称本体スキャン回避で偽特殊化汚染を防止
src/internal/mir/lowering/expr/call.cpp フィールド等のレシーバをplace化して実体参照を渡す修正
libs/std/strings/parse.cm strings::parse新設(移設+基数指定版追加)
libs/std/strings/mod.cm stringsモジュールのexport拡充(chars/parse/hash/format/intern等)
libs/std/strings/intern.cm Interner(文字列interning)追加
libs/std/strings/hash.cm 文字列内容ハッシュ(FNV-1a)追加
libs/std/strings/format.cm to_radix/to_hex/pad等のフォーマット追加
libs/std/strings/chars.cm ASCII文字分類/変換+digit_value追加
libs/std/slices/mod.cm スライスのheap sort(sort/sort_by)追加
libs/std/mem/smart/mod.cm UniquePtr/SharedPtr/WeakPtr 実装追加
libs/std/mem/smart/atomic.cm AtomicSharedPtr 実装追加
libs/std/mem/arena.cm Arenaアロケータ実装追加
libs/std/io/console/input.cm parse系をstrings::parseへ移設し再エクスポート維持
libs/std/fs/mod.cm std::fs::read_lines を追加
libs/std/collections/vector.cm Vector reserve/last/sortBy追加+sortをO(n log n)化
libs/std/collections/treeset.cm TreeSet実装追加(TreeMapラッパー)
libs/std/collections/treemap.cm TreeMap remove/keys_in_order/clear+free list再利用追加
libs/std/collections/strset.cm StringSet実装追加(StringMapラッパー)
libs/std/collections/strmap.cm StringMap実装追加(内容ハッシュ)
libs/std/collections/mod.cm collections export拡充(set/strmap等)
libs/std/collections/hashset.cm HashSet実装追加(HashMapラッパー)
libs/std/collections/hashmap.cm HashMapにキー制約注記+フィールド可視性調整
docs/tutorials/ja/stdlib/strings/chars-parse.md strings新機能(chars/parse/format/hash/intern)チュートリアル追加
docs/tutorials/ja/stdlib/mem.md smart pointers/Arenaの日本語チュートリアル追加
docs/tutorials/ja/stdlib/json.md ナビゲーション更新(setsページ追加に追随)
docs/tutorials/ja/stdlib/io.md read_lines項目をドキュメントへ追加
docs/tutorials/ja/stdlib/index.md stdlib一覧へv0.17.2機能を反映
docs/tutorials/ja/stdlib/collections/vector.md Vector拡張(reserve/last/sortBy等)を追記
docs/tutorials/ja/stdlib/collections/treemap.md TreeMap remove/keys_in_order/clear等を追記
docs/tutorials/ja/stdlib/collections/sets.md TreeSet/HashSetチュートリアル追加
docs/tutorials/ja/stdlib/collections/hashmap.md StringMap節追加+文字列キー制約を明記
docs/tutorials/ja/index.md チュートリアルの対象/更新バージョンを0.17.2へ更新
docs/tutorials/ja/compiler/wasm/index.md バージョン表記を0.17.2へ更新
docs/tutorials/ja/compiler/native/uefi.md 対象バージョンを0.17.2へ更新
docs/tutorials/ja/compiler/native/index.md バージョン表記を0.17.2へ更新
docs/tutorials/ja/compiler/js/index.md テスト結果セクションのバージョン表記更新
docs/tutorials/ja/basics/index.md ナビゲーションのバージョン表記更新
docs/tutorials/en/stdlib/strings/chars-parse.md strings新機能の英語チュートリアル追加
docs/tutorials/en/stdlib/mem.md smart pointers/Arenaの英語チュートリアル追加
docs/tutorials/en/stdlib/collections/treemap.md TreeMap拡張の英語ドキュメント更新
docs/tutorials/en/stdlib/collections/sets.md TreeSet/HashSet英語チュートリアル追加
docs/tutorials/en/index.md チュートリアルの対象/更新バージョンを0.17.2へ更新
docs/tutorials/en/compiler/native/uefi.md 対象バージョンを0.17.2へ更新
docs/tutorials/en/compiler/js/index.md テスト結果セクションのバージョン表記更新
docs/tutorials/en/basics/index.md ナビゲーションのバージョン表記更新
docs/releases/v0.17.2.md v0.17.2リリースノート新規追加
docs/releases/README.md リリース一覧へv0.17.2を追加
docs/releases/index.md リリース一覧へv0.17.2を追加
docs/index.md 最終更新バージョン表記を0.17.2へ更新
docs/en/index.md Last Updated表記を0.17.2へ更新
docs/design/index.md v0.17.2設計文書(アーカイブ)への索引追加
docs/archive/v0.17.2/stdlib-hardening.md stdlib補強計画のアーカイブ文書追加
docs/archive/v0.17.2/smart-pointers.md スマートポインタ設計のアーカイブ文書追加
docs/archive/v0.17.2/selfhosting-stdlib.md セルフホスティング向けstdlib計画のアーカイブ追加
docs/archive/v0.17.2/bugfix-option-namespace-collision.md Option衝突問題の記録追加
docs/archive/v0.17.2/bugfix-mono-generic-helper.md 総称ヘルパー汚染バグ修正記録追加
docs/archive/v0.17.2/bugfix-js-slice-pointer-arg.md JSのスライスポインタ制限の記録追加
docs/archive/v0.17.2/bugfix-hashset-double-free.md HashSet二重解放の記録追加
docs/archive/v0.17.2/bugfix-generic-mir.md ジェネリック/MIR関連バグ修正記録追加
docs/archive/v0.17.2/bugfix-aot-struct-dce.md AOT DCEのstruct誤削除バグ修正記録追加

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread libs/std/mem/smart/mod.cm
Comment thread libs/std/mem/smart/atomic.cm
Comment thread tests/common/structs/ptr_only_struct.cm
shadowlink0122 and others added 19 commits August 15, 2026 17:26
v0.17.2で整備した標準ライブラリの実証として、Cmで書いたCmソースの宣言レベルパーサを追加した。

動作:
- コンパイル可能な構文なら各種定義一覧(module/import/use/typedef/const/struct/enum/impl/関数)を出力する
- 構文エラーならエラー箇所(メッセージ・ファイル:行:桁・キャレット付きソース行)を出力して終了コード1を返す
- 失敗し得る解析関数はすべてOption型で失敗を伝播し、診断(メッセージ/行/桁)はLexer/Parser状態に保持する(最初のエラーのみ保持)

構成(機能・定義ごとにファイル分割):
- token.cm(トークン種別+TokenStream)/ lexer.cm(字句解析・StringSetキーワード表・::融合・コメント/文字列/文字/数値)
- parser/state.cm(状態・基本操作・レコーダ)/ modules.cm(module/import/use)/ types.cm(struct/enum・ネスト型・無名宣言子)/ impls.cm(impl/interface・self/~self/private/static)/ funcs.cm(関数/typedef/const/extern)/ decl.cm(ディスパッチ)
- 各ファイルに#[test]ディレクティブの単体テスト(*_test.cm・8ファイル38テスト)を付属

検証:
- パーサ自身の全9ソースを自己解析できることを確認
- 正常サンプル(全宣言種別)とエラーサンプル(メソッド本体欠落を13行目として報告)を同梱
- CI(check_examples.sh)へ単体テスト・正常/エラーサンプル・自己解析の検証を追加(sample_error.cmは意図的に不正なためcm check対象から除外)

計画doc・チュートリアル・VSCode拡張は非該当(言語機能の追加ではなくサンプル実装のため。examples/README.mdとリリースノートのサンプル節で案内)
フラットに置かれていたモジュールを処理段階ごとのディレクトリへ再配置した:
- lexer/(token.cm=トークン定義・scan.cm=字句解析器、旧lexer.cmを改名)
- parser/state.cm(解析器の状態・基本操作)
- parser/decl/(宣言種別ごとの解析: modules・types・impls・funcs・dispatch、旧decl.cmはディレクトリ名との重複を避けdispatch.cmへ改名)
- samples/(ok.cm・error.cm、旧sample_*.cmはフォルダ名の重複を避け改名)
- 各*_test.cmは対象モジュールと同じディレクトリへ同伴

モジュール宣言(module lexer.scan等)と相対importを新パスへ追従し、READMEのディレクトリ構成表とCI(check_examples.sh)の単体テスト・サンプル・自己解析パスを更新した。
再配置後も全単体テスト38件・正常/エラーサンプル・自己解析9ファイルの通過を確認済み
- エラーメッセージをdiag/messages.cmへ分離(Cmコンパイラのi18nメッセージ表と同様に文面をロジックから一元化。テストも同じビルダーを参照するため文面変更に自動追従)
- トークン種別をint定数からenum TokenKind(Eof/Ident/Keyword/Number/StringLit/CharLit/Symbol)へ変更し、TokenStreamの格納・比較も型付きにした
- キーワード定義をstring[]リテラルの一覧宣言とStringSetへの登録ループに分離した
- 字句解析のバイト値マジックナンバーを全廃し、文字リテラルのキャスト(const int BYTE_LF = '\n' as int等)による定数定義へ置き換えた。main.cmの表示幅・基数も定数化
- テストを38件から56件へ拡充: キーワード前方一致の識別子判定・単独コロン・空入力・エスケープ付き文字リテラルの桁追跡・最初のエラー保持・EOFでのexpect・空struct/末尾カンマenum・フィールド属性・overloadコンストラクタ・空impl・関数ポインタ引数の括弧対応・非constグローバル・再エクスポート宣言列・2宣言目のエラー位置・メッセージカタログ整合
- 検証: 全56テスト・正常/エラーサンプル・自己解析・CI 3項目すべて通過
- Cmコンパイラ本体と同じ構成(enum MsgId×enum Langの2次元テンプレート表)でdiag/messages.cmを再構成した
- テンプレートは{0}〜{2}プレースホルダを持つ完結した1文とし、語順が言語ごとに異なるため断片連結による文組み立てを廃止した(msgf1/msgf2/msgf3が置換で埋める)
- 言語は環境変数CM_LANGで切替(ja=日本語、既定は英語)。日本語は語順に合わせてプレースホルダ位置を入れ替えたテンプレートを持つ
- main.cmの見出し(構文エラー/字句エラー/ファイル不在)もカタログ経由へ統一した
- diag/messages_test.cmを追加(既定英語・CM_LANG=ja切替・言語ごとの語順・見出しのローカライズ、4テスト)し、CIの単体テスト対象へ組み込んだ(計9ファイル60テスト)
- READMEへi18n構成とCM_LANG=jaの実行例を追記
- diag/messages.cmのテンプレート表: 言語→IDの二重if連鎖をmatch (Lang)×match (MsgId)の二段matchへ変更(網羅が構文上明示され、ID追加漏れが読み取りやすくなる)
- parser/decl/dispatch.cmの宣言分岐: 先頭字句の12連ifをswitch (p->text())のcase("struct")等へ変更
- lexer/scan.cmのバイト分岐はifを維持し、理由をコメントで明記(switchのcase(const変数)は現状値が解決されず全て0として重複caseの誤コンパイルになるため、リテラル以外をcaseに使えない。範囲判定・2バイト先読みもifが適切)
- 全60テスト・正常/エラーサンプル・CM_LANG=ja出力・自己解析・CI 3項目の通過を確認
…テラル1つで全対訳を管理。添字はLangのタグ値で、対訳未整備の言語は英語へフォールバック)
…e-extension-installは非推奨エイリアスとして案内メッセージ付きで残す)
wrap_long_linesの折り返し候補はカンマ直後と二項演算子直前のみで、文レベルのメソッドチェーンが最大行幅を超えると最後の呼び出しの引数リスト内カンマで折れてチェーン構造が読めない整形になっていた。
.method(...)の呼び出しが2つ以上連なる超過行は、カンマ・演算子折り返しより優先して各チェーンの.直前で折り返すようにした(TypeScript/Prettier風・継続行1段インデント)。
フィールド参照の.や数値リテラルの小数点、括弧内のチェーンは候補にせず、折り返し後もなお長いセグメントは再帰適用でカンマ折り返しへ委ねる(各セグメントのチェーン.は高々1つなので停止する)。
回帰テスト(wrap/method_chain: チェーン折り返し・フィールド参照のみの行は従来のカンマ折り返し・冪等性)とチュートリアル(ja/en 2.2.1節)・リリースノートを追加し、設計文書はarchiveへ収めた。
VSCode拡張は構文追加がないため対象外。
引数数ごとのmsgf1/msgf2/msgf3は本質的に同じ置換処理の重複で、msgf3はチェーン式の折り返しも読みにくかった。
C++側i18n::msgfと同じ方式で、テンプレート中の{i}をargsの各要素で順に置換するmsgf(MsgId, string[]) 1本に統一し、診断ビルダーは配列リテラルで呼び出す形にした。
プレースホルダ番号はstd::strings::formatのto_radixで組み立てるため引数数の上限がない。
新フォーマッタ適用で100バイト超のテンプレート対訳配列は1要素1行へ展開した。cm test(diag/messages_test 4件)とscripts/ci/check_examples.shの通過を確認済み。
チュートリアル・VSCode拡張は例の内部整理のため対象外。
msg_expected等の診断ビルダーはmsgfへの引数固定だけの薄い転送で、msgf(MsgId, string[])一本化後は不要になった。
ビルダーを全廃し、呼び出し側がmsgf(MsgId::ExpectedButFound, [expected, found])のようにIDと引数配列を直接渡す形に統一した(MsgIdのenumコメントがプレースホルダ対応を文書化する)。
また各モジュールの隣に並んでいた*_test.cmはフォルダを雑然とさせるため、tests/フォルダへ集約して相対importを張り替えた(対象モジュール名+_test.cmで命名)。
scripts/ci/check_examples.shはtests/配下のグロブ実行へ変更し、README・リリースノートを追従した。全60テスト・正常/エラーサンプル・自己解析の通過を確認済み。
チュートリアル・VSCode拡張は例の内部整理のため対象外。
O_WRONLY|O_CREAT|O_TRUNCとしてmacOS/BSD固有値0x0601を直書きしており、LinuxではO_CREAT(0x0040)が立たずopenが失敗していた(CIのubuntuでcommon/stdlib/fs/write_perfがjit/nativeともにOutput mismatch)。
libs/native/io/file.cmのwrite_fileは#ifdef __linux__でLinux値0x0241へ分岐し、write_perfテストはwrite_fileで空ファイルを先に作成して両OS同値のO_WRONLY(=1)だけでopenする移植可能な形へ修正した。
jit/nativeの実行と期待値一致をローカル(macOS)で確認済み。バグ修正のためチュートリアル・VSCode拡張は対象外。
interpreterスイート(MIRインタプリタ・O3)はjit系ジョブと検証範囲が重複するため、CIのジョブ数削減として統合テストmatrixから外した。
ローカルのmake testには引き続き含まれ、必要になれば1行の復元で戻せる。
CI構成変更のためテスト・チュートリアル・VSCode拡張は対象外。
Cmの採用判断・設計判断の材料として、C++・Rustに対する現状評価をliving documentとして整理した。
マルチバックエンド出力(特にSV/HDL)とツールチェーン一体型を強みに、メモリ安全性の静的保証の不在・ジェネリクスの表現力制約・エコシステム不在をデメリットとして、リポジトリ内の記録(二重解放バグ・StringMap設計経緯・ロードマップ)へのリンク付きで記載した。
docs/design/index.mdのliving documents表へ掲載。ドキュメント追加のためテスト・チュートリアル・VSCode拡張・リリースノートは対象外。
構造体代入は浅いコピーのため、デストラクタ持ち構造体を値でコピーすると両方のインスタンスでdtorが走り二重解放になる(HashSetコンストラクタで実際に発生した非決定的SIGABRTの真因。bugfix-hashset-double-free.mdの設計課題)。
受理サイト(let初期化・代入・return・構造体リテラルのフィールド初期化)でmoveなしの場所式コピーを検出するcheck_dtor_copy_policyを追加した(通常は警告、--strictではエラー。Z5縮小変換と同じ段階導入方式)。
dtor持ち型はimpl登録時にベース名を記録し、typedef解決・ジェネリック特殊化サフィックス・名前空間修飾を剥いで判定する。一時値(コンストラクタ・メソッド戻り値)とdtor無し構造体は対象外。
move代入(self.f = move x)は既存のmove機構(HIRのis_moved_from→MIRのdtor登録解除)で機能することを実験で確認し、HashSetコンストラクタのポインタ手動無効化の回避策をself.map = move mへ置き換えた。
回帰テスト(dtor_copy_diag: 4サイト警告・move/一時値/dtor無しの非警告)と統合テスト(destructor/move_assign: dtorが移動先の1回だけ走る)を追加し、libs/tests/examples全ツリーで新規警告ゼロを確認した。
チュートリアル(ja/en ownership)・リリースノート・言語比較ドキュメントを更新し、設計文書はarchiveへ収録、バグ記録のフォローアップ節を実装済みへ更新した。
VSCode拡張は新構文なし(moveは既存キーワード)のため対象外。
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 188 out of 188 changed files in this pull request and generated 1 comment.

Suppressed comments (2)

libs/std/collections/hashmap.cm:22

  • The comment says entries is public because HashSet's constructor needs to null it out, but HashSet now uses move and no longer touches entries directly. This rationale is outdated/misleading; please update the comment (or remove it).
    examples/README.md:40
  • Typo in the section title: "宣言リスタ" should be "宣言リスト".

Comment thread src/internal/mir/passes/cleanup/program_dce.cpp Outdated
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@shadowlink0122
shadowlink0122 merged commit c994fb1 into main Aug 15, 2026
48 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants