Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 17984] ファイルの概要

このコミットは、Go言語のテストスイート内の複数のファイル、具体的にはtest/fixedbugs/issue5957.dir/c.gotest/import1.gotest/import4.dir/empty.gotest/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コンパイラ)の間でのエラーメッセージの差異があります。特に、未使用のインポートに関するエラーメッセージにおいて、gccgogcと同じようにファイル名とパッケージ名を扱わないため、生成されるエラーメッセージが異なっていました。

Goのテストスイートでは、特定のコードが特定のエラーメッセージを生成することを期待するテストケースが多数存在します。しかし、コンパイラの実装が異なると、同じコードでも異なるエラーメッセージを生成する可能性があります。このコミットは、gccgoが生成するエラーメッセージに合わせてテストケースを調整し、両方のコンパイラでテストがパスするようにすることを目的としています。これにより、gccgoの互換性とテストの信頼性が向上します。

前提知識の解説

Go言語のコンパイラ: gcgccgo

  • 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": gcgccgoの両方で、pattern1またはpattern2のいずれかのエラーメッセージが期待される場合に使用されます。
  • // GC_ERROR "pattern": gccgoコンパイラでのみ、指定されたpatternのエラーメッセージが期待される場合に使用されます。gcコンパイラでは、この行は通常のERRORディレクティブとして扱われるか、または無視される可能性があります(このコミットの文脈では、GC_ERRORgcでは無視され、gccgoでのみ評価されることを示唆しています)。

技術的詳細

このコミットの技術的詳細は、gcコンパイラとgccgoコンパイラが、未使用のインポートに関するエラーメッセージを生成する際に、パッケージの「ファイル名」と「パッケージ名」の扱いが異なる点に集約されます。

gcコンパイラは、インポートパス(例: "./a")から導出されるファイル名や、パッケージ宣言(例: package p)で指定されるパッケージ名をエラーメッセージに含める傾向があります。一方、gccgoは、これらの情報の一部を異なる形式で、あるいは異なる優先順位でエラーメッセージに含めることがあります。

具体的には、gcはインポートされたパッケージのパスをそのまま引用符で囲んで表示することが多いのに対し、gccgoはより簡潔なパッケージ名のみを表示したり、あるいは異なる文言を使用したりする可能性があります。

この差異を吸収するため、テストファイル内の// ERRORコメントは、複数の可能なエラーメッセージパターンを|(パイプ)で区切って指定するように変更されています。これにより、gcが生成するメッセージとgccgoが生成するメッセージのどちらにも対応できるようになります。

また、GC_ERRORという新しい(または既存の)ディレクティブが導入され、これはgccgoに特有のエラーメッセージパターンを指定するために使用されます。これにより、gcgccgoの両方でテストがパスするように、よりきめ細やかな制御が可能になります。

例えば、"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つのテストファイルが変更されています。

  1. test/fixedbugs/issue5957.dir/c.go:

    • 未使用のインポートに関する// ERRORコメントが修正され、gcgccgoの両方のエラーメッセージパターンに対応するために|(パイプ)で区切られた複数のパターンが追加されました。
    • 例: // ERROR "imported and not used: \"a\" as surprise"// ERROR "imported and not used: \"a\" as surprise|imported and not used: surprise" に変更。
    • ./bのインポート行では、GC_ERRORディレクティブが追加されました。
  2. test/import1.go:

    • . "math"のインポート行で、// ERROR// GC_ERRORに変更されました。これは、この特定のエラーメッセージがgccgoに特有であることを示唆しています。
  3. test/import4.dir/empty.go:

    • パッケージ名がPからemptyに変更されました。これは、インポートエラーメッセージのテストにおいて、より具体的なパッケージ名を使用することで、テストの意図を明確にするため、またはgccgoの挙動に合わせるための変更である可能性があります。
  4. test/import4.dir/import4.go:

    • "./empty"およびZ "./empty"のインポート行で、// ERROR// GC_ERRORに変更されました。これもgccgoに特有のエラーメッセージパターンに対応するためです。

コアとなるコードの解説

変更の核心は、Goのテストフレームワークがエラーメッセージを検証する方法にあります。Goのテストでは、特定の行がコンパイルエラーを発生させることを期待する場合、その行の末尾に// ERROR "expected error message"という形式のコメントを記述します。コンパイラがその行でエラーを検出し、かつエラーメッセージが指定されたパターンに一致すれば、テストは成功します。

このコミットでは、gcgccgoという異なるコンパイラが、同じGoコードに対して異なるエラーメッセージを生成する可能性があるという問題に対処しています。特に、未使用のインポートに関するエラーメッセージは、コンパイラの実装によって、インポートされたパッケージのパス、ファイル名、または単なるパッケージ名のいずれを強調するかが異なることがあります。

  • test/fixedbugs/issue5957.dir/c.go の変更:

    • このファイルでは、複数の未使用インポートがテストされています。例えば、import ("./a") の行では、gcimported and not used: "a" as surprise のようなメッセージを生成するのに対し、gccgoimported and not used: surprise のようなより簡潔なメッセージを生成する可能性があります。
    • これを解決するために、// ERRORコメントのパターンが \"pattern1|pattern2\" の形式に変更されました。これにより、テストはどちらのコンパイラが生成したメッセージでもパスするようになります。
    • GC_ERRORの導入は、特定のケースでgccgoのみが生成するエラーメッセージに特化してテストを行うためのものです。
  • test/import1.go および test/import4.dir/import4.go の変更:

    • これらのファイルでは、. "math"./empty のような特殊なインポート形式(ドットインポートや相対パスインポート)に関するエラーがテストされています。
    • // ERROR// GC_ERROR に変更することで、これらのテスト行がgccgoコンパイラに特化したエラーメッセージの検証を行うことを明示しています。これは、gcgccgoの間でこれらのインポート形式に関するエラーメッセージの挙動が大きく異なる場合に特に有効です。
  • test/import4.dir/empty.go のパッケージ名変更:

    • package P から package empty への変更は、test/import4.dir/import4.go でこのemptyパッケージがインポートされる際のテストの整合性を保つため、またはgccgoがパッケージ名をどのように扱うかという点に合わせた調整であると考えられます。パッケージ名がより具体的になることで、エラーメッセージのテストがより正確になる可能性があります。

これらの変更は、Goのテストスイートが異なるコンパイラ実装(特にgcgccgo)間での互換性を維持し、両方のコンパイラで期待されるエラーメッセージが正しく生成されることを検証するための重要な調整です。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント (Goコンパイラ、パッケージ、テストに関する情報)
  • GCCGoのドキュメント (GCCGoの特性とgcとの違いに関する情報)
  • Go言語のテストフレームワークに関する情報 (特に// ERRORディレクティブの挙動)
  • Go言語のソースコードリポジトリ (テストファイルの構造と慣習)

[インデックス 17984] ファイルの概要

このコミットは、Go言語のテストスイート内の複数のファイル、具体的にはtest/fixedbugs/issue5957.dir/c.gotest/import1.gotest/import4.dir/empty.gotest/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コンパイラ)の間でのエラーメッセージの差異があります。特に、未使用のインポートに関するエラーメッセージにおいて、gccgogcと同じようにファイル名とパッケージ名を扱わないため、生成されるエラーメッセージが異なっていました。

Goのテストスイートでは、特定のコードが特定のエラーメッセージを生成することを期待するテストケースが多数存在します。しかし、コンパイラの実装が異なると、同じコードでも異なるエラーメッセージを生成する可能性があります。このコミットは、gccgoが生成するエラーメッセージに合わせてテストケースを調整し、両方のコンパイラでテストがパスするようにすることを目的としています。これにより、gccgoの互換性とテストの信頼性が向上します。

前提知識の解説

Go言語のコンパイラ: gcgccgo

  • 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_ERRORgcでは無視され、gccgoでのみ評価されることを示唆しています)。

  • // ERROR "pattern1|pattern2": gcgccgoの両方で、pattern1またはpattern2のいずれかのエラーメッセージが期待される場合に使用されます。
  • // GC_ERROR "pattern": gccgoコンパイラでのみ、指定されたpatternのエラーメッセージが期待される場合に使用されます。

技術的詳細

このコミットの技術的詳細は、gcコンパイラとgccgoコンパイラが、未使用のインポートに関するエラーメッセージを生成する際に、パッケージの「ファイル名」と「パッケージ名」の扱いが異なる点に集約されます。

gcコンパイラは、インポートパス(例: "./a")から導出されるファイル名や、パッケージ宣言(例: package p)で指定されるパッケージ名をエラーメッセージに含める傾向があります。一方、gccgoは、これらの情報の一部を異なる形式で、あるいは異なる優先順位でエラーメッセージに含めることがあります。

具体的には、gcはインポートされたパッケージのパスをそのまま引用符で囲んで表示することが多いのに対し、gccgoはより簡潔なパッケージ名のみを表示したり、あるいは異なる文言を使用したりする可能性があります。

この差異を吸収するため、テストファイル内の// ERRORコメントは、複数の可能なエラーメッセージパターンを|(パイプ)で区切って指定するように変更されています。これにより、gcが生成するメッセージとgccgoが生成するメッセージのどちらにも対応できるようになります。

また、GC_ERRORという新しい(または既存の)ディレクティブが導入され、これはgccgoに特有のエラーメッセージパターンを指定するために使用されます。これにより、gcgccgoの両方でテストがパスするように、よりきめ細やかな制御が可能になります。

例えば、"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つのテストファイルが変更されています。

  1. test/fixedbugs/issue5957.dir/c.go:

    • 未使用のインポートに関する// ERRORコメントが修正され、gcgccgoの両方のエラーメッセージパターンに対応するために|(パイプ)で区切られた複数のパターンが追加されました。
    • 例: // ERROR "imported and not used: \"a\" as surprise"// ERROR "imported and not used: \"a\" as surprise|imported and not used: surprise" に変更。
    • ./bのインポート行では、GC_ERRORディレクティブが追加されました。
  2. test/import1.go:

    • . "math"のインポート行で、// ERROR// GC_ERRORに変更されました。これは、この特定のエラーメッセージがgccgoに特有であることを示唆しています。
  3. test/import4.dir/empty.go:

    • パッケージ名がPからemptyに変更されました。これは、インポートエラーメッセージのテストにおいて、より具体的なパッケージ名を使用することで、テストの意図を明確にするため、またはgccgoの挙動に合わせるための変更である可能性があります。
  4. test/import4.dir/import4.go:

    • "./empty"およびZ "./empty"のインポート行で、// ERROR// GC_ERRORに変更されました。これもgccgoに特有のエラーメッセージパターンに対応するためです。

コアとなるコードの解説

変更の核心は、Goのテストフレームワークがエラーメッセージを検証する方法にあります。Goのテストでは、特定の行がコンパイルエラーを発生させることを期待する場合、その行の末尾に// ERROR "expected error message"という形式のコメントを記述します。コンパイラがその行でエラーを検出し、かつエラーメッセージが指定されたパターンに一致すれば、テストは成功します。

このコミットでは、gcgccgoという異なるコンパイラが、同じGoコードに対して異なるエラーメッセージを生成する可能性があるという問題に対処しています。特に、未使用のインポートに関するエラーメッセージは、コンパイラの実装によって、インポートされたパッケージのパス、ファイル名、または単なるパッケージ名のいずれを強調するかが異なることがあります。

  • test/fixedbugs/issue5957.dir/c.go の変更:

    • このファイルでは、複数の未使用インポートがテストされています。例えば、import ("./a") の行では、gcimported and not used: "a" as surprise のようなメッセージを生成するのに対し、gccgoimported and not used: surprise のようなより簡潔なメッセージを生成する可能性があります。
    • これを解決するために、// ERRORコメントのパターンが \"pattern1|pattern2\" の形式に変更されました。これにより、テストはどちらのコンパイラが生成したメッセージでもパスするようになります。
    • GC_ERRORの導入は、特定のケースでgccgoのみが生成するエラーメッセージに特化してテストを行うためのものです。
  • test/import1.go および test/import4.dir/import4.go の変更:

    • これらのファイルでは、. "math"./empty のような特殊なインポート形式(ドットインポートや相対パスインポート)に関するエラーがテストされています。
    • // ERROR// GC_ERROR に変更することで、これらのテスト行がgccgoコンパイラに特化したエラーメッセージの検証を行うことを明示しています。これは、gcgccgoの間でこれらのインポート形式に関するエラーメッセージの挙動が大きく異なる場合に特に有効です。
  • test/import4.dir/empty.go のパッケージ名変更:

    • package P から package empty への変更は、test/import4.dir/import4.go でこのemptyパッケージがインポートされる際のテストの整合性を保つため、またはgccgoがパッケージ名をどのように扱うかという点に合わせた調整であると考えられます。パッケージ名がより具体的になることで、エラーメッセージのテストがより正確になる可能性があります。

これらの変更は、Goのテストスイートが異なるコンパイラ実装(特にgcgccgo)間での互換性を維持し、両方のコンパイラで期待されるエラーメッセージが正しく生成されることを検証するための重要な調整です。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント (Goコンパイラ、パッケージ、テストに関する情報)
  • GCCGoのドキュメント (GCCGoの特性とgcとの違いに関する情報)
  • Go言語のテストフレームワークに関する情報 (特に// ERRORディレクティブの挙動)
  • Go言語のソースコードリポジトリ (テストファイルの構造と慣習)