# 通知設計書 70-warnAnyEnumConv

## 概要

本ドキュメントは、Nimコンパイラの警告メッセージ `warnAnyEnumConv` の設計仕様を定義する。この警告は、任意の値から列挙型への変換が検出された場合に出力される。

### 本通知の処理概要

この警告は、意味解析の後のエフェクトトラッキングフェーズにおいて、整数値や他の型から列挙型への変換を検出し、潜在的な問題を開発者に通知する機能を提供する。

**業務上の目的・背景**：列挙型は、定義された有限の値セットを表現するために使用される。整数値から列挙型への変換は、列挙型の範囲外の値を設定してしまうリスクがある。特に、穴のない列挙型への変換でも、範囲外の整数が指定される可能性があり、予期しない動作の原因となる。この警告により、開発者は列挙型への変換を認識し、値の妥当性を確認できる。

**通知の送信タイミング**：コンパイラのエフェクトトラッキングフェーズ（`sempass2.nim`）で、隠し変換（`nkHiddenStdConv`）の変換先が列挙型（`tyEnum`）である場合に警告が発生する。

**通知の受信者**：Nimコンパイラを使用してソースコードをコンパイルしている開発者。コンパイル時の警告メッセージとして標準エラー出力またはビルドログに表示される。

**通知内容の概要**：「enum conversion: {変換式}」（列挙型変換：{変換式}）というメッセージが出力される。

**期待されるアクション**：開発者は該当箇所のコードを確認し、列挙型への変換が安全であることを確認する。必要に応じて範囲チェックを追加するか、列挙型の値を直接使用するようにコードを修正する。

## 通知種別

コンパイラ警告メッセージ（stderr/ビルドログ出力）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（コンパイル処理中に即座に出力） |
| 優先度 | 低（Warning - デフォルト無効） |
| リトライ | 無（コンパイル時の一度きりの出力） |

### 送信先決定ロジック

警告は、コンパイラオプションで `warnAnyEnumConv`（短縮形: `AnyEnumConv`）が有効になっている場合に出力される。ただし、**デフォルトでは無効**であり、明示的に有効化する必要がある（NotesVerbosityから除外されている）。

## 通知テンプレート

### コンパイラ警告出力の場合

| 項目 | 内容 |
|-----|------|
| 出力先 | stderr |
| メッセージ種別 | Warning |
| 形式 | テキスト |

### 本文テンプレート

```
{ファイルパス}({行番号}, {カラム番号}) Warning: enum conversion: {変換式} [AnyEnumConv]
```

### 添付ファイル

なし（コンパイラ出力のため）

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| $1 | 変換に関するメッセージ（"enum conversion: {式}"） | sempass2.nimで生成 | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| コンパイル処理 | nkHiddenStdConv処理 | n.typ.skipTypes(abstractInst).kind == tyEnum かつ tfEnumHasHoles not in flags | 穴のない列挙型への変換 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| --warning:AnyEnumConv:off | コマンドラインオプションで無効化（デフォルト状態） |
| {.warning[AnyEnumConv]:off.} | プラグマで無効化 |
| tfEnumHasHoles in t.flags | 穴のある列挙型（warnHoleEnumConvが使用される） |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[nkHiddenStdConv処理] --> B[型情報取得]
    B --> C{t.kind == tyEnum?}
    C -->|No| D[処理継続]
    C -->|Yes| E{tfEnumHasHoles?}
    E -->|Yes| F[warnHoleEnumConv出力]
    E -->|No| G[warnAnyEnumConv出力]
    F --> D
    G --> D
```

## データベース参照・更新仕様

本警告はコンパイラ内部処理であり、データベースは使用しない。

### 参照テーブル一覧

なし

### 更新テーブル一覧

なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 該当なし | 警告メッセージのため、エラーは発生しない | - |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（リトライなし） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし（コンパイル実行時に即座に出力）

## セキュリティ考慮事項

列挙型への不正な変換は、予期しない状態値を生成し、セキュリティ上の脆弱性につながる可能性がある。特に、権限レベルや状態遷移を表す列挙型への変換は慎重に行う必要がある。

## 備考

- この警告はデフォルトで無効であり、`--warning:AnyEnumConv:on`で明示的に有効化が必要
- verbosity level 3（最大詳細度）でも自動的には有効化されない（NotesVerbosity[3]から除外）
- 関連する警告として`warnSuspiciousEnumConv`（No.69）と`warnHoleEnumConv`（No.71）がある
- 穴のある列挙型への変換では、より危険性が高いため`warnHoleEnumConv`が使用される

---

## コードリーディングガイド

本通知を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

まず、警告メッセージの種別と列挙型の属性を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | lineinfos.nim | `compiler/lineinfos.nim` | TMsgKind列挙型でwarnAnyEnumConvの定義（83行目）とメッセージテンプレート（192行目）を確認 |
| 1-2 | lineinfos.nim | `compiler/lineinfos.nim` | NotesVerbosity定義（265行目）でデフォルト無効であることを確認 |
| 1-3 | types.nim | `compiler/types.nim` | tfEnumHasHolesフラグの意味を確認 |

**読解のコツ**: tfEnumHasHolesは、列挙型が連続した値を持たない（「穴」がある）ことを示すフラグ。例えば `type A = enum a=0, b=2` のような列挙型。

#### Step 2: エントリーポイントを理解する

エフェクトトラッキングでの変換処理の起点を特定する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sempass2.nim | `compiler/sempass2.nim` | track関数内のnkHiddenStdConv処理（1545-1551行目付近）を確認 |

**主要処理フロー**:
1. **1545行目付近**: `let t = n.typ.skipTypes(abstractInst)` - 変換先の型を取得
2. **1546行目**: `if t.kind == tyEnum:` - 列挙型かどうかの判定
3. **1547-1548行目**: `if tfEnumHasHoles in t.flags:` - 穴のある列挙型の場合はwarnHoleEnumConv
4. **1549-1550行目**: `else: message(..., warnAnyEnumConv, ...)` - そうでない場合はwarnAnyEnumConv

#### Step 3: 関連する警告を理解する

列挙型変換に関する3つの警告の関係を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | lineinfos.nim | `compiler/lineinfos.nim` | warnSuspiciousEnumConv、warnAnyEnumConv、warnHoleEnumConvの関係を確認 |

**警告の使い分け**:
- warnSuspiciousEnumConv: 列挙型から列挙型への変換
- warnAnyEnumConv: 任意の値から穴のない列挙型への変換（デフォルト無効）
- warnHoleEnumConv: 任意の値から穴のある列挙型への変換

### プログラム呼び出し階層図

```
sempass2.nim::track（エフェクトトラッキング）
    │
    ├─ nkHiddenStdConv処理
    │      │
    │      ├─ 型情報取得（skipTypes）
    │      │
    │      ├─ 列挙型判定（tyEnum?）
    │      │
    │      ├─ tfEnumHasHoles判定
    │      │      │
    │      │      ├─Yes─▶ warnHoleEnumConv出力
    │      │      │
    │      │      └─No──▶ warnAnyEnumConv出力
    │      │
    │      └─ msgs.nim::message（警告出力）
    │
    └─ 他のトラッキング処理
```

### データフロー図

```
[入力]                    [処理]                        [出力]

nkHiddenStdConv ───▶ track
AST                   │
                      ▼
              ┌─────────────────┐
              │ skipTypes       │
              │ (abstractInst)  │
              └────────┬────────┘
                       │
                       ▼
              ┌─────────────────┐
              │ tyEnum?         │
              └────────┬────────┘
                       │Yes
                       ▼
              ┌─────────────────────┐
              │ tfEnumHasHoles?     │
              └──────────┬──────────┘
                  │            │
                  │No          │Yes
                  ▼            ▼
         warnAnyEnumConv  warnHoleEnumConv
                  │            │
                  └──────┬─────┘
                         ▼
                   message ───▶ stderr（警告出力）
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| lineinfos.nim | `compiler/lineinfos.nim` | ソース | TMsgKind定義、メッセージテンプレート、NotesVerbosity |
| sempass2.nim | `compiler/sempass2.nim` | ソース | エフェクトトラッキング、track関数 |
| types.nim | `compiler/types.nim` | ソース | 型システム、tfEnumHasHolesフラグ |
| msgs.nim | `compiler/msgs.nim` | ソース | メッセージ出力関数 |
