# 通知設計書 87-warnGlobalVarConstructorTemporary

## 概要

本ドキュメントは、Nimコンパイラの警告通知「warnGlobalVarConstructorTemporary」（グローバル変数コンストラクタ一時変数警告）に関する設計仕様を記載する。

### 本通知の処理概要

本通知は、C++バックエンドでグローバル変数の初期化時に、コンストラクタ呼び出しが直接グローバルスコープで行えず、一時変数を必要とする場合に警告を発行するものである。

**業務上の目的・背景**：Nimはマルチバックエンド対応であり、C++バックエンドではC++のコンストラクタ呼び出しを利用できる。しかし、C++ではグローバル変数の初期化タイミングに制約があり、複雑なコンストラクタ呼び出しをグローバルスコープで直接行えない場合がある。このような場合、Nimコンパイラは一時変数を使用してコンストラクタを呼び出し、その結果をグローバル変数に代入する必要がある。この警告は、この暗黙の動作を開発者に通知し、初期化順序やパフォーマンスへの影響を認識させる。

**通知の送信タイミング**：Cコード生成フェーズ（ccgstmts.nim内）において、グローバル変数の初期化でC++コンストラクタ呼び出しを処理する際に、一時変数が必要となった場合に発行される。

**通知の受信者**：コンパイルを実行している開発者。ターミナルまたはIDEの出力ウィンドウに表示される。

**通知内容の概要**：「global variable '{変数名}' initialization requires a temporary variable」という形式で、一時変数が必要となったグローバル変数名を示す。

**期待されるアクション**：開発者は警告を確認し、必要に応じて初期化方法を見直す。場合によっては、遅延初期化パターンを使用するか、初期化順序に依存しない設計に変更することが推奨される。

## 通知種別

コンパイラ警告（Warning） - ターミナル/IDE出力

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（コンパイル処理中に即座に出力） |
| 優先度 | 中（Warning） |
| リトライ | なし |

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

コンパイラの標準エラー出力（stderr）または設定されたwritelnHookに出力される。`--stdout`オプション指定時は標準出力に出力される。

## 通知テンプレート

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

| 項目 | 内容 |
|-----|------|
| 出力先 | stderr（デフォルト）/ stdout（--stdout指定時） |
| 形式 | テキスト |

### 本文テンプレート

```
{ファイル名}({行番号}, {列番号}) Warning: global variable '{変数名}' initialization requires a temporary variable [GlobalVarConstructorTemporary]
```

### 添付ファイル

なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| $1 | グローバル変数名 | vn.sym.name.s | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| コード生成 | グローバル変数初期化処理 | C++コンストラクタ呼び出しで一時変数が必要 | ccgstmts.nim内でのグローバル変数コード生成時 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| --warning:GlobalVarConstructorTemporary:off | コマンドラインオプションで抑制可能 |
| {.warning[GlobalVarConstructorTemporary]:off.} | プラグマで抑制可能 |
| Cバックエンド使用時 | C++バックエンド特有の警告のため |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[グローバル変数初期化コード生成] --> B{C++コンストラクタ呼び出し?}
    B -->|No| C[通常の初期化処理]
    B -->|Yes| D{隠しポインタを含まない型?}
    D -->|No| C
    D -->|Yes| E[callGlobalVarCppCtor呼び出し]
    E --> F{一時変数が必要?}
    F -->|No| C
    F -->|Yes| G[警告メッセージ発行]
    G --> H[message関数呼び出し]
    H --> I[代替初期化処理実行]
    I --> J[処理継続]
```

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

### 参照テーブル一覧

本通知はデータベースを使用しない。

### 更新テーブル一覧

本通知はデータベースを使用しない。

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| なし | この警告自体はエラーではない | - |

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

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

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

なし。コンパイラ警告メッセージであり、機密情報を含まない。

## 備考

- 警告IDは "GlobalVarConstructorTemporary"
- C++バックエンド特有の警告
- グローバル変数の初期化順序に関わる警告
- 警告発行後も処理は継続される（代替初期化方法を使用）

---

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

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

### 推奨読解順序

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

警告メッセージの種類と定義を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | lineinfos.nim | `compiler/lineinfos.nim` | TMsgKind列挙型でwarnGlobalVarConstructorTemporaryの定義（100行目）、MsgKindToStr配列でメッセージテンプレート（209行目）を確認 |

**読解のコツ**: メッセージテンプレートは "global variable '$1' initialization requires a temporary variable" で、$1に変数名が入る。

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

警告が発行される箇所を特定する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | ccgstmts.nim | `compiler/ccgstmts.nim` | 370-382行目でグローバル変数初期化とC++コンストラクタ呼び出しを処理 |

**主要処理フロー**:
1. **374行目**: isCppCtorCallでC++コンストラクタ呼び出しを判定
2. **375行目**: containsHiddenPointerで型の確認
3. **376行目**: callGlobalVarCppCtor関数呼び出し
4. **377行目**: didGenTempフラグで一時変数生成を確認
5. **378行目**: message関数呼び出しで警告を出力
6. **380-382行目**: 代替の初期化処理を実行

#### Step 3: C++コンストラクタ呼び出し処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | ccgstmts.nim | `compiler/ccgstmts.nim` | callGlobalVarCppCtor関数の実装を確認し、一時変数が必要となる条件を理解する |

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

```
ccgstmts.nim: genVarStmt (変数宣言コード生成)
    │
    ├─ isCppCtorCall (C++コンストラクタ判定)
    │
    ├─ containsHiddenPointer (型チェック)
    │
    ├─ callGlobalVarCppCtor (コンストラクタ呼び出し処理)
    │      │
    │      └─ didGenTemp (一時変数生成フラグ)
    │
    └─ msgs.nim: message (警告発行)
           │
           └─ msgs.nim: liMessage (メッセージ処理)
```

### データフロー図

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

グローバル変数 ───▶ ccgstmts.nim ───▶ C++コンストラクタ判定
   定義AST           genVarStmt          │
                                         ▼
                                  一時変数必要性判定
                                         │
                                         ▼
                                  msgs.nim ───▶ stderr/stdout
                               (message関数)     (警告メッセージ)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| lineinfos.nim | `compiler/lineinfos.nim` | ソース | 警告種別定義とメッセージテンプレート |
| ccgstmts.nim | `compiler/ccgstmts.nim` | ソース | C/C++コード生成（ステートメント）、警告発行トリガー |
| msgs.nim | `compiler/msgs.nim` | ソース | メッセージ出力処理 |
