[インデックス 17984] ファイルの概要
このコミットは、Go言語のテストスイート内の複数のファイル、具体的にはtest/fixedbugs/issue5957.dir/c.go
、test/import1.go
、test/import4.dir/empty.go
、test/import4.dir/import4.go
に変更を加えています。これらのファイルは、Goコンパイラが生成するエラーメッセージのテストに関連しており、特に未使用のインポートに関するエラーメッセージの挙動を検証しています。
コミット
- コミットハッシュ:
d270e6f28c803cc9fb53f5adc2b935f73b146f86
- Author: Ian Lance Taylor iant@golang.org
- Date: Thu Dec 12 19:02:11 2013 -0800
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/d270e6f28c803cc9fb53f5adc2b935f73b146f86
元コミット内容
test: match gccgo import error messages
Gccgo doesn't have the same equivalent of file name and
package as the gc compiler, so the error messages are
necessarily different.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/40510048
変更の背景
この変更の背景には、Go言語の2つの主要なコンパイラ実装、gc
(公式のGoコンパイラ)とgccgo
(GCCベースのGoコンパイラ)の間でのエラーメッセージの差異があります。特に、未使用のインポートに関するエラーメッセージにおいて、gccgo
がgc
と同じようにファイル名とパッケージ名を扱わないため、生成されるエラーメッセージが異なっていました。
Goのテストスイートでは、特定のコードが特定のエラーメッセージを生成することを期待するテストケースが多数存在します。しかし、コンパイラの実装が異なると、同じコードでも異なるエラーメッセージを生成する可能性があります。このコミットは、gccgo
が生成するエラーメッセージに合わせてテストケースを調整し、両方のコンパイラでテストがパスするようにすることを目的としています。これにより、gccgo
の互換性とテストの信頼性が向上します。
前提知識の解説
Go言語のコンパイラ: gc
と gccgo
gc
(Go Compiler): Goプロジェクトによって開発・メンテナンスされている公式のGoコンパイラです。Go言語のリリースサイクルに合わせて更新され、Go言語の最新の機能と最適化をサポートします。通常、Goのソースコードをビルドする際にデフォルトで使用されるコンパイラです。gccgo
: GCC (GNU Compiler Collection) のフロントエンドとして実装されたGoコンパイラです。gc
とは異なるコードベースで開発されており、GCCの最適化インフラストラクチャを利用します。gccgo
は、特に既存のGCCベースのツールチェーンとの統合が必要な環境や、特定のアーキテクチャでのサポートが必要な場合に使用されることがあります。
これら二つのコンパイラは、Go言語の仕様に準拠していますが、内部実装やエラーメッセージの生成方法には差異が生じることがあります。
Goのインポートメカニズムと未使用インポートのエラー
Go言語では、パッケージをインポートする際に、そのパッケージ内のエクスポートされた識別子を使用しないと、コンパイル時に「imported and not used」(インポートされたが使用されていない)というエラーが発生します。これは、不要な依存関係を排除し、コードのクリーンさを保つためのGoの設計思想の一部です。
例:
package main
import (
"fmt"
"strings" // stringsパッケージはインポートされたが、このコードでは使用されていない
)
func main() {
fmt.Println("Hello")
}
このコードは、strings
パッケージがインポートされているにもかかわらず使用されていないため、コンパイルエラーになります。
Goのテストにおけるエラーメッセージの検証 (// ERROR
と // GC_ERROR
)
Goのテストスイートでは、特定の行がコンパイルエラーになることを期待する場合、その行の末尾に// ERROR "expected error message"
のようなコメントを記述します。コンパイラがこの行でエラーを検出し、かつ指定されたエラーメッセージ(またはその正規表現パターン)と一致する場合、テストは成功します。
このコミットで導入された、または既存のテストで利用されているGC_ERROR
は、gc
コンパイラとgccgo
コンパイラでエラーメッセージが異なる場合に、gccgo
に特化したエラーメッセージのパターンを指定するために使用されます。
// ERROR "pattern1|pattern2"
:gc
とgccgo
の両方で、pattern1
またはpattern2
のいずれかのエラーメッセージが期待される場合に使用されます。// GC_ERROR "pattern"
:gccgo
コンパイラでのみ、指定されたpattern
のエラーメッセージが期待される場合に使用されます。gc
コンパイラでは、この行は通常のERROR
ディレクティブとして扱われるか、または無視される可能性があります(このコミットの文脈では、GC_ERROR
はgc
では無視され、gccgo
でのみ評価されることを示唆しています)。
技術的詳細
このコミットの技術的詳細は、gc
コンパイラとgccgo
コンパイラが、未使用のインポートに関するエラーメッセージを生成する際に、パッケージの「ファイル名」と「パッケージ名」の扱いが異なる点に集約されます。
gc
コンパイラは、インポートパス(例: "./a"
)から導出されるファイル名や、パッケージ宣言(例: package p
)で指定されるパッケージ名をエラーメッセージに含める傾向があります。一方、gccgo
は、これらの情報の一部を異なる形式で、あるいは異なる優先順位でエラーメッセージに含めることがあります。
具体的には、gc
はインポートされたパッケージのパスをそのまま引用符で囲んで表示することが多いのに対し、gccgo
はより簡潔なパッケージ名のみを表示したり、あるいは異なる文言を使用したりする可能性があります。
この差異を吸収するため、テストファイル内の// ERROR
コメントは、複数の可能なエラーメッセージパターンを|
(パイプ)で区切って指定するように変更されています。これにより、gc
が生成するメッセージとgccgo
が生成するメッセージのどちらにも対応できるようになります。
また、GC_ERROR
という新しい(または既存の)ディレクティブが導入され、これはgccgo
に特有のエラーメッセージパターンを指定するために使用されます。これにより、gc
とgccgo
の両方でテストがパスするように、よりきめ細やかな制御が可能になります。
例えば、"imported and not used: \"a\" as surprise|imported and not used: surprise"
というパターンは、gc
が"imported and not used: \"a\" as surprise"
のようなメッセージを生成し、gccgo
が"imported and not used: surprise"
のようなメッセージを生成する場合に対応します。
コアとなるコードの変更箇所
このコミットでは、以下の4つのテストファイルが変更されています。
-
test/fixedbugs/issue5957.dir/c.go
:- 未使用のインポートに関する
// ERROR
コメントが修正され、gc
とgccgo
の両方のエラーメッセージパターンに対応するために|
(パイプ)で区切られた複数のパターンが追加されました。 - 例:
// ERROR "imported and not used: \"a\" as surprise"
が// ERROR "imported and not used: \"a\" as surprise|imported and not used: surprise"
に変更。 ./b
のインポート行では、GC_ERROR
ディレクティブが追加されました。
- 未使用のインポートに関する
-
test/import1.go
:. "math"
のインポート行で、// ERROR
が// GC_ERROR
に変更されました。これは、この特定のエラーメッセージがgccgo
に特有であることを示唆しています。
-
test/import4.dir/empty.go
:- パッケージ名が
P
からempty
に変更されました。これは、インポートエラーメッセージのテストにおいて、より具体的なパッケージ名を使用することで、テストの意図を明確にするため、またはgccgo
の挙動に合わせるための変更である可能性があります。
- パッケージ名が
-
test/import4.dir/import4.go
:"./empty"
およびZ "./empty"
のインポート行で、// ERROR
が// GC_ERROR
に変更されました。これもgccgo
に特有のエラーメッセージパターンに対応するためです。
コアとなるコードの解説
変更の核心は、Goのテストフレームワークがエラーメッセージを検証する方法にあります。Goのテストでは、特定の行がコンパイルエラーを発生させることを期待する場合、その行の末尾に// ERROR "expected error message"
という形式のコメントを記述します。コンパイラがその行でエラーを検出し、かつエラーメッセージが指定されたパターンに一致すれば、テストは成功します。
このコミットでは、gc
とgccgo
という異なるコンパイラが、同じGoコードに対して異なるエラーメッセージを生成する可能性があるという問題に対処しています。特に、未使用のインポートに関するエラーメッセージは、コンパイラの実装によって、インポートされたパッケージのパス、ファイル名、または単なるパッケージ名のいずれを強調するかが異なることがあります。
-
test/fixedbugs/issue5957.dir/c.go
の変更:- このファイルでは、複数の未使用インポートがテストされています。例えば、
import ("./a")
の行では、gc
がimported and not used: "a" as surprise
のようなメッセージを生成するのに対し、gccgo
はimported and not used: surprise
のようなより簡潔なメッセージを生成する可能性があります。 - これを解決するために、
// ERROR
コメントのパターンが\"pattern1|pattern2\"
の形式に変更されました。これにより、テストはどちらのコンパイラが生成したメッセージでもパスするようになります。 GC_ERROR
の導入は、特定のケースでgccgo
のみが生成するエラーメッセージに特化してテストを行うためのものです。
- このファイルでは、複数の未使用インポートがテストされています。例えば、
-
test/import1.go
およびtest/import4.dir/import4.go
の変更:- これらのファイルでは、
. "math"
や./empty
のような特殊なインポート形式(ドットインポートや相対パスインポート)に関するエラーがテストされています。 // ERROR
を// GC_ERROR
に変更することで、これらのテスト行がgccgo
コンパイラに特化したエラーメッセージの検証を行うことを明示しています。これは、gc
とgccgo
の間でこれらのインポート形式に関するエラーメッセージの挙動が大きく異なる場合に特に有効です。
- これらのファイルでは、
-
test/import4.dir/empty.go
のパッケージ名変更:package P
からpackage empty
への変更は、test/import4.dir/import4.go
でこのempty
パッケージがインポートされる際のテストの整合性を保つため、またはgccgo
がパッケージ名をどのように扱うかという点に合わせた調整であると考えられます。パッケージ名がより具体的になることで、エラーメッセージのテストがより正確になる可能性があります。
これらの変更は、Goのテストスイートが異なるコンパイラ実装(特にgc
とgccgo
)間での互換性を維持し、両方のコンパイラで期待されるエラーメッセージが正しく生成されることを検証するための重要な調整です。
関連リンク
- Go CL 40510048: https://golang.org/cl/40510048
参考にした情報源リンク
- Go言語の公式ドキュメント (Goコンパイラ、パッケージ、テストに関する情報)
- GCCGoのドキュメント (GCCGoの特性と
gc
との違いに関する情報) - Go言語のテストフレームワークに関する情報 (特に
// ERROR
ディレクティブの挙動) - Go言語のソースコードリポジトリ (テストファイルの構造と慣習)
[インデックス 17984] ファイルの概要
このコミットは、Go言語のテストスイート内の複数のファイル、具体的にはtest/fixedbugs/issue5957.dir/c.go
、test/import1.go
、test/import4.dir/empty.go
、test/import4.dir/import4.go
に変更を加えています。これらのファイルは、Goコンパイラが生成するエラーメッセージのテストに関連しており、特に未使用のインポートに関するエラーメッセージの挙動を検証しています。
コミット
- コミットハッシュ:
d270e6f28c803cc9fb53f5adc2b935f73b146f86
- Author: Ian Lance Taylor iant@golang.org
- Date: Thu Dec 12 19:02:11 2013 -0800
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/d270e6f28c803cc9fb53f5adc2b935f73b146f86
元コミット内容
test: match gccgo import error messages
Gccgo doesn't have the same equivalent of file name and
package as the gc compiler, so the error messages are
necessarily different.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/40510048
変更の背景
この変更の背景には、Go言語の2つの主要なコンパイラ実装、gc
(公式のGoコンパイラ)とgccgo
(GCCベースのGoコンパイラ)の間でのエラーメッセージの差異があります。特に、未使用のインポートに関するエラーメッセージにおいて、gccgo
がgc
と同じようにファイル名とパッケージ名を扱わないため、生成されるエラーメッセージが異なっていました。
Goのテストスイートでは、特定のコードが特定のエラーメッセージを生成することを期待するテストケースが多数存在します。しかし、コンパイラの実装が異なると、同じコードでも異なるエラーメッセージを生成する可能性があります。このコミットは、gccgo
が生成するエラーメッセージに合わせてテストケースを調整し、両方のコンパイラでテストがパスするようにすることを目的としています。これにより、gccgo
の互換性とテストの信頼性が向上します。
前提知識の解説
Go言語のコンパイラ: gc
と gccgo
gc
(Go Compiler): Goプロジェクトによって開発・メンテナンスされている公式のGoコンパイラです。Go言語のリリースサイクルに合わせて更新され、Go言語の最新の機能と最適化をサポートします。通常、Goのソースコードをビルドする際にデフォルトで使用されるコンパイラです。gccgo
: GCC (GNU Compiler Collection) のフロントエンドとして実装されたGoコンパイラです。gc
とは異なるコードベースで開発されており、GCCの最適化インフラストラクチャを利用します。gccgo
は、特に既存のGCCベースのツールチェーンとの統合が必要な環境や、特定のアーキテクチャでのサポートが必要な場合に使用されることがあります。
これら二つのコンパイラは、Go言語の仕様に準拠していますが、内部実装やエラーメッセージの生成方法には差異が生じることがあります。
Goのインポートメカニズムと未使用インポートのエラー
Go言語では、パッケージをインポートする際に、そのパッケージ内のエクスポートされた識別子を使用しないと、コンパイル時に「imported and not used」(インポートされたが使用されていない)というエラーが発生します。これは、不要な依存関係を排除し、コードのクリーンさを保つためのGoの設計思想の一部です。
例:
package main
import (
"fmt"
"strings" // stringsパッケージはインポートされたが、このコードでは使用されていない
)
func main() {
fmt.Println("Hello")
}
このコードは、strings
パッケージがインポートされているにもかかわらず使用されていないため、コンパイルエラーになります。
Goのテストにおけるエラーメッセージの検証 (// ERROR
と // GC_ERROR
)
Goのテストスイートでは、特定の行がコンパイルエラーになることを期待する場合、その行の末尾に// ERROR "expected error message"
のようなコメントを記述します。コンパイラがこの行でエラーを検出し、かつ指定されたエラーメッセージ(またはその正規表現パターン)と一致する場合、テストは成功します。
このコミットで導入された、または既存のテストで利用されているGC_ERROR
は、gccgo
コンパイラでのみ、指定されたpattern
のエラーメッセージが期待される場合に使用されます。gc
コンパイラでは、この行は通常のERROR
ディレクティブとして扱われるか、または無視される可能性があります(このコミットの文脈では、GC_ERROR
はgc
では無視され、gccgo
でのみ評価されることを示唆しています)。
// ERROR "pattern1|pattern2"
:gc
とgccgo
の両方で、pattern1
またはpattern2
のいずれかのエラーメッセージが期待される場合に使用されます。// GC_ERROR "pattern"
:gccgo
コンパイラでのみ、指定されたpattern
のエラーメッセージが期待される場合に使用されます。
技術的詳細
このコミットの技術的詳細は、gc
コンパイラとgccgo
コンパイラが、未使用のインポートに関するエラーメッセージを生成する際に、パッケージの「ファイル名」と「パッケージ名」の扱いが異なる点に集約されます。
gc
コンパイラは、インポートパス(例: "./a"
)から導出されるファイル名や、パッケージ宣言(例: package p
)で指定されるパッケージ名をエラーメッセージに含める傾向があります。一方、gccgo
は、これらの情報の一部を異なる形式で、あるいは異なる優先順位でエラーメッセージに含めることがあります。
具体的には、gc
はインポートされたパッケージのパスをそのまま引用符で囲んで表示することが多いのに対し、gccgo
はより簡潔なパッケージ名のみを表示したり、あるいは異なる文言を使用したりする可能性があります。
この差異を吸収するため、テストファイル内の// ERROR
コメントは、複数の可能なエラーメッセージパターンを|
(パイプ)で区切って指定するように変更されています。これにより、gc
が生成するメッセージとgccgo
が生成するメッセージのどちらにも対応できるようになります。
また、GC_ERROR
という新しい(または既存の)ディレクティブが導入され、これはgccgo
に特有のエラーメッセージパターンを指定するために使用されます。これにより、gc
とgccgo
の両方でテストがパスするように、よりきめ細やかな制御が可能になります。
例えば、"imported and not used: \"a\" as surprise|imported and not used: surprise"
というパターンは、gc
が"imported and not used: \"a\" as surprise"
のようなメッセージを生成し、gccgo
が"imported and not used: surprise"
のようなメッセージを生成する場合に対応します。
コアとなるコードの変更箇所
このコミットでは、以下の4つのテストファイルが変更されています。
-
test/fixedbugs/issue5957.dir/c.go
:- 未使用のインポートに関する
// ERROR
コメントが修正され、gc
とgccgo
の両方のエラーメッセージパターンに対応するために|
(パイプ)で区切られた複数のパターンが追加されました。 - 例:
// ERROR "imported and not used: \"a\" as surprise"
が// ERROR "imported and not used: \"a\" as surprise|imported and not used: surprise"
に変更。 ./b
のインポート行では、GC_ERROR
ディレクティブが追加されました。
- 未使用のインポートに関する
-
test/import1.go
:. "math"
のインポート行で、// ERROR
が// GC_ERROR
に変更されました。これは、この特定のエラーメッセージがgccgo
に特有であることを示唆しています。
-
test/import4.dir/empty.go
:- パッケージ名が
P
からempty
に変更されました。これは、インポートエラーメッセージのテストにおいて、より具体的なパッケージ名を使用することで、テストの意図を明確にするため、またはgccgo
の挙動に合わせるための変更である可能性があります。
- パッケージ名が
-
test/import4.dir/import4.go
:"./empty"
およびZ "./empty"
のインポート行で、// ERROR
が// GC_ERROR
に変更されました。これもgccgo
に特有のエラーメッセージパターンに対応するためです。
コアとなるコードの解説
変更の核心は、Goのテストフレームワークがエラーメッセージを検証する方法にあります。Goのテストでは、特定の行がコンパイルエラーを発生させることを期待する場合、その行の末尾に// ERROR "expected error message"
という形式のコメントを記述します。コンパイラがその行でエラーを検出し、かつエラーメッセージが指定されたパターンに一致すれば、テストは成功します。
このコミットでは、gc
とgccgo
という異なるコンパイラが、同じGoコードに対して異なるエラーメッセージを生成する可能性があるという問題に対処しています。特に、未使用のインポートに関するエラーメッセージは、コンパイラの実装によって、インポートされたパッケージのパス、ファイル名、または単なるパッケージ名のいずれを強調するかが異なることがあります。
-
test/fixedbugs/issue5957.dir/c.go
の変更:- このファイルでは、複数の未使用インポートがテストされています。例えば、
import ("./a")
の行では、gc
がimported and not used: "a" as surprise
のようなメッセージを生成するのに対し、gccgo
はimported and not used: surprise
のようなより簡潔なメッセージを生成する可能性があります。 - これを解決するために、
// ERROR
コメントのパターンが\"pattern1|pattern2\"
の形式に変更されました。これにより、テストはどちらのコンパイラが生成したメッセージでもパスするようになります。 GC_ERROR
の導入は、特定のケースでgccgo
のみが生成するエラーメッセージに特化してテストを行うためのものです。
- このファイルでは、複数の未使用インポートがテストされています。例えば、
-
test/import1.go
およびtest/import4.dir/import4.go
の変更:- これらのファイルでは、
. "math"
や./empty
のような特殊なインポート形式(ドットインポートや相対パスインポート)に関するエラーがテストされています。 // ERROR
を// GC_ERROR
に変更することで、これらのテスト行がgccgo
コンパイラに特化したエラーメッセージの検証を行うことを明示しています。これは、gc
とgccgo
の間でこれらのインポート形式に関するエラーメッセージの挙動が大きく異なる場合に特に有効です。
- これらのファイルでは、
-
test/import4.dir/empty.go
のパッケージ名変更:package P
からpackage empty
への変更は、test/import4.dir/import4.go
でこのempty
パッケージがインポートされる際のテストの整合性を保つため、またはgccgo
がパッケージ名をどのように扱うかという点に合わせた調整であると考えられます。パッケージ名がより具体的になることで、エラーメッセージのテストがより正確になる可能性があります。
これらの変更は、Goのテストスイートが異なるコンパイラ実装(特にgc
とgccgo
)間での互換性を維持し、両方のコンパイラで期待されるエラーメッセージが正しく生成されることを検証するための重要な調整です。
関連リンク
- Go CL 40510048: https://golang.org/cl/40510048
参考にした情報源リンク
- Go言語の公式ドキュメント (Goコンパイラ、パッケージ、テストに関する情報)
- GCCGoのドキュメント (GCCGoの特性と
gc
との違いに関する情報) - Go言語のテストフレームワークに関する情報 (特に
// ERROR
ディレクティブの挙動) - Go言語のソースコードリポジトリ (テストファイルの構造と慣習)