Skip to content

Commit 1137947

Browse files
committed
C++26 : 「プリプロセッサ仕様での「未定義動作」を不適格 (診断不要) に変更」を追加 (close #1496)
1 parent 4a4afa5 commit 1137947

File tree

3 files changed

+41
-2
lines changed

3 files changed

+41
-2
lines changed

implementation-status.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@
329329
| P2996R13: [静的リフレクション](/lang/cpp26/reflection.md.nolink) | リフレクション演算子`^^``std::meta::info`型によりコンパイル時にさまざまな情報を取得できる | | | | |
330330
| P1306R5: [コンパイル時のタプルやリストを展開処理する`template for`](/lang/cpp26/expansion_statements.md.nolink) | クラス・タプル・Range・パラメータパックなどを展開してすべての要素をコンパイル時の処理する`template for`文を追加 | 16 | | | |
331331
| P3533R2: [`constexpr`仮想継承を許可](/lang/cpp26/constexpr_virtual_inheritance.md) | 定数式の文脈での仮想継承を許可 | 16 | | | |
332-
| P2843R3: [プリプロセッサ仕様での「未定義動作」を不適格 (診断不要) に変更](/lang/cpp26/preprocessing_is_never_undefined.md.nolink) | プリプロセッサとレキサーの文脈での「未定義動作」用語を不適格 (診断不要) に変更 | 16 | | | |
332+
| P2843R3: [プリプロセッサ仕様での「未定義動作」を不適格 (診断不要) に変更](/lang/cpp26/preprocessing_is_never_undefined.md) | プリプロセッサとレキサーの文脈での「未定義動作」用語を不適格 (診断不要) に変更 | 16 | | | |
333333
| P3868R1: [モジュール宣言より前での`#line`ディレクティブの使用を許可する](/lang/cpp26/allow_line_before_module_declarations.md) | モジュール宣言より前での`#line`ディレクティブの使用を禁止していたのは過度な制限だった | | | | |
334334

335335

lang/cpp26.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ C++26とは、2026年中に改訂される予定の、C++バージョンの通
8989
| 言語機能 | 説明 |
9090
|----------|------|
9191
| [ファイルを読み込む`#embed`命令を追加](/lang/cpp26/embed.md) | バイナリファイルをインクルードするメカニズム。`#include`とちがって読み出しサイズなどの柔軟な指定ができる |
92-
| [プリプロセッサ仕様での「未定義動作」を不適格 (診断不要) に変更](/lang/cpp26/preprocessing_is_never_undefined.md.nolink) | プリプロセッサとレキサーの文脈での「未定義動作」用語を不適格 (診断不要) に変更 |
92+
| [プリプロセッサ仕様での「未定義動作」を不適格 (診断不要) に変更](/lang/cpp26/preprocessing_is_never_undefined.md) | プリプロセッサとレキサーの文脈での「未定義動作」用語を不適格 (診断不要) に変更 |
9393

9494

9595
### ソースコード
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# プリプロセッサ仕様での「未定義動作」を不適格 (診断不要) に変更 [P2843R3]
2+
* cpp26[meta cpp]
3+
4+
<!-- start lang caution -->
5+
6+
このページはC++26に採用される見込みの言語機能の変更を解説しています。
7+
8+
のちのC++規格でさらに変更される場合があるため[関連項目](#relative-page)を参照してください。
9+
10+
<!-- last lang caution -->
11+
12+
## 概要
13+
C++26では、プリプロセッサおよびレキサーの仕様において「未定義動作 (undefined behavior)」と規定されていたすべてのケースを「不適格、診断不要 (ill-formed, no diagnostic required; IFNDR)」に変更する。
14+
15+
さらに、各ケースを個別に分析し、多くのケースで診断 (コンパイルエラー) を要求するか、適格なプログラムとして受理するよう仕様を改善する。
16+
17+
未定義動作は本来、適格なプログラムの実行時の動作に対する概念である。プリプロセッサはソースコードをコンパイル前に変換する処理であり、実行時の動作ではないため、「未定義動作」という用語は不適切であった。不適格 (診断不要) への変更は、コンパイラの振る舞いを実質的に変えるものではないが、仕様の正確性を向上させる。
18+
19+
20+
## 変更の対象
21+
22+
以下のプリプロセッサ機能において、従来「未定義動作」とされていた規定が変更される。
23+
24+
| 対象 | C++23までの規定 | C++26での変更 |
25+
|------|---------------|-------------|
26+
| `defined`演算子のマクロ展開による生成 | 未定義動作 | 不適格 (診断不要) |
27+
| `#include`ディレクティブのマクロ展開後の不正な形式 | 未定義動作 | 不適格 (診断不要) |
28+
| マクロ引数内のプリプロセッシングディレクティブ | 未定義動作 | 不適格 (診断不要) |
29+
| `#`演算子の結果が不正な文字列リテラル | 未定義動作 | 不適格 (診断不要) |
30+
| `##`演算子の結果が不正なプリプロセッシングトークン | 未定義動作 | 不適格 (診断不要) |
31+
| `#line`ディレクティブの不正な値 (0や2147483647超) | 未定義動作 | 不適格 |
32+
| 定義済みマクロ名の`#define`/`#undef` | 未定義動作 | 不適格 (診断不要) |
33+
| キーワードと同名のマクロの`#define` | 未定義動作 | 不適格 |
34+
35+
「不適格 (診断不要)」は、そのプログラムが規格に適合しないことを意味するが、コンパイラが診断メッセージ (エラーや警告) を出す義務はない。「不適格」は、コンパイラが診断メッセージを出す義務がある。
36+
37+
38+
## 参照
39+
- [P2843R3 Preprocessing is never undefined](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2843r3.pdf)

0 commit comments

Comments
 (0)