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

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

このコミットは、Go言語のテストファイル test/bugs/bug126.go におけるコメントの調整に関するものです。具体的には、gccgo コンパイラがこのテストを正しく処理できるように、エラーメッセージの期待値とコメントの記述方法が変更されました。

コミット

commit 48e5110151579f1d8491b798cbd923ca8df62141
Author: Ian Lance Taylor <iant@golang.org>
Date:   Mon Dec 8 11:31:55 2008 -0800

    Tweak comments so that this test passes with gccgo.
    
    bug126.go:7:7: error: redefinition of 'none'
    bug126.go:6:7: note: previous definition of 'none' was here
    
    R=gri
    DELTA=3  (1 added, 0 deleted, 2 changed)
    OCL=20563
    CL=20723

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/48e5110151579f1d8491b798cbd923ca8df62141

元コミット内容

このコミットは、test/bugs/bug126.go というテストファイル内のコメントを修正し、gccgo コンパイラでこのテストが正しくパスするように調整しています。元の問題は、none という定数が二重に宣言されていることによる再定義エラーが gccgo で発生し、テストが期待通りに動作しなかったことにあります。

変更の背景

Go言語のテストスイートには、特定のコンパイルエラーや実行時エラーを意図的に発生させ、それが期待通りに検出されるかを検証するテストが含まれています。bug126.go は、同じ定数識別子 none が二度宣言された場合にコンパイラがエラーを出すことを確認するためのテストです。

しかし、Go言語の公式コンパイラ(gc)と gccgo(GCCをバックエンドとするGoコンパイラ)では、エラーメッセージの形式や、テストファイル内のエラー期待値の指定方法に差異がある場合があります。このコミットの背景には、gccgobug126.go のエラーメッセージを正しく認識できず、テストが失敗していたという問題があります。

具体的には、gccgobug126.go:7:7: error: redefinition of 'none' というエラーと、その前の定義が bug126.go:6:7: note: previous definition of 'none' was here であるという注記を出力していました。Goのテストフレームワークは、テストファイル内のコメントに特定のキーワード(例: ERROR)と正規表現を記述することで、期待されるエラーメッセージを定義します。gccgo の出力するエラーメッセージの形式が、既存の ERROR ディレクティブと一致しなかったため、テストが失敗していました。

このコミットは、gccgo が出力するエラーメッセージのパターンに合わせて、テストファイル内のコメントを調整することで、この互換性の問題を解決することを目的としています。

前提知識の解説

Go言語の定数宣言

Go言語では、const キーワードを使用して定数を宣言します。同じスコープ内で同じ名前の定数を複数回宣言することはできません。これはコンパイルエラーとなります。

package main

const myConst = 10 // 最初の宣言
const myConst = 20 // エラー: myConst は既に宣言されています

Go言語のテストフレームワークとエラーテスト

Go言語のテストフレームワークは、go test コマンドで実行されます。特定のコンパイルエラーをテストする場合、Goのテストファイル(通常は .go 拡張子を持つが、テスト専用のディレクトリや命名規則を持つこともある)のコメント内に特別なディレクティブを記述することが一般的です。

  • ERROR "regexp": このディレクティブは、その行またはその周辺で、指定された正規表現に一致するエラーメッセージがコンパイラから出力されることを期待します。テストランナーは、コンパイラの出力を解析し、この正規表現に一致するエラーが見つかればテストをパスとします。
  • GCCGO_ERROR "regexp": これは ERROR と同様ですが、特に gccgo コンパイラが使用された場合にのみ適用されるエラー期待値です。これは、gcgccgo でエラーメッセージの形式が異なる場合に役立ちます。

gccgogc コンパイラ

Go言語には主に2つの主要なコンパイラ実装があります。

  1. gc (Go Compiler): これはGoプロジェクトの公式コンパイラであり、Go言語のリリースとともに提供されます。Go言語の標準的なツールチェーンの一部です。
  2. gccgo: これはGCC (GNU Compiler Collection) のフロントエンドとして実装されたGoコンパイラです。gccgo はGCCの最適化バックエンドを利用できるため、特定のプラットフォームや最適化のニーズにおいて gc とは異なる特性を持つことがあります。また、エラーメッセージの形式や内部的な挙動が gc とは異なる場合があります。

テストスイートは、これら両方のコンパイラでGoコードが正しく動作することを確認するために、両方でテストを実行することがあります。そのため、コンパイラ固有の挙動に対応するためのディレクティブが必要になることがあります。

技術的詳細

このコミットの技術的な核心は、gccgo が出力するエラーメッセージのパターンと、Goテストフレームワークがエラーを検出するために使用する正規表現との間の不一致を解消することにあります。

元の bug126.go ファイルでは、定数 none の再定義に対して、以下のようなコメントが付けられていました。

const none = 0  // same const identifier declared twice should not be accepted
const none = 1  // ERROR "redeclared"

ここで、2行目の // ERROR "redeclared" は、コンパイラが「redeclared」という文字列を含むエラーメッセージを出力することを期待していました。しかし、gccgo は、再定義エラーが発生した際に、最初の定義箇所を示す「note」メッセージも出力していました。

bug126.go:7:7: error: redefinition of 'none'
bug126.go:6:7: note: previous definition of 'none' was here

この「note」メッセージが gccgo の出力に含まれることで、Goのテストランナーが ERROR ディレクティブを評価する際に、期待されるエラーメッセージのパターンと合致しない状況が発生していました。

このコミットでは、以下の2つの主要な変更が行われました。

  1. GCCGO_ERROR ディレクティブの導入: const none = 0 の行に // GCCGO_ERROR "previous" というコメントが追加されました。これは、gccgo がこの行で「previous」という文字列を含むエラー(この場合は「previous definition of 'none' was here」というnoteメッセージ)を出力することを期待するという意味です。これにより、gccgo が出力するnoteメッセージもテストの期待値として扱われるようになります。

  2. ERROR ディレクティブの正規表現の強化: const none = 1 の行のコメントが // ERROR "redeclared|redef" に変更されました。これは、gc または gccgo のいずれかが「redeclared」または「redef」のいずれかの文字列を含むエラーメッセージを出力することを期待するという意味です。これにより、gccgo が「redef」のようなバリエーションのエラーメッセージを出力した場合でも、テストが正しくエラーを検出できるようになります。

これらの変更により、gcgccgo の両方で bug126.go テストが期待通りにパスするようになりました。これは、異なるコンパイラ実装間での互換性を確保し、テストスイートの堅牢性を高めるための典型的なアプローチです。

コアとなるコードの変更箇所

--- a/test/bugs/bug126.go
+++ b/test/bugs/bug126.go
@@ -6,5 +6,6 @@
 
 package main
 
-const none = 0  // same const identifier declared twice should not be accepted
-const none = 1  // ERROR "redeclared"\n
+// same const identifier declared twice should not be accepted
+const none = 0  // GCCGO_ERROR "previous"
+const none = 1  // ERROR "redeclared|redef"

コアとなるコードの解説

変更された test/bugs/bug126.go ファイルのコアとなる変更は以下の通りです。

  1. const none = 0 の行:

    • 元のコメント // same const identifier declared twice should not be accepted はそのまま残されています。これはコードの意図を説明する通常のコメントです。
    • 新しく // GCCGO_ERROR "previous" が追加されました。これは、gccgo コンパイラがこの行に関連して「previous」という文字列を含むエラーまたは警告(この場合は「previous definition of 'none' was here」という注記)を出すことをテストフレームワークに伝えます。これにより、gccgo の出力する詳細なエラー情報もテストの期待値として扱われるようになります。
  2. const none = 1 の行:

    • 元のコメント // ERROR "redeclared"// ERROR "redeclared|redef" に変更されました。
    • ERROR ディレクティブは、コンパイラがこの行でエラーを出すことを期待します。
    • 正規表現が "redeclared" から "redeclared|redef" に拡張されました。これは、コンパイラが「redeclared」または「redef」のいずれかの文字列を含むエラーメッセージを出力した場合に、テストがパスすることを示します。この変更は、gccgo が「redef」のような異なる形式で再定義エラーを報告する可能性に対応するためのものです。

これらの変更により、bug126.gogcgccgo の両方のコンパイラで、定数再定義エラーが正しく検出されることを検証できるようになりました。これは、Go言語のテストスイートが複数のコンパイラ実装をサポートし、それぞれのコンパイラの特性に対応するための一般的なパターンを示しています。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • GCCのドキュメント
  • Go言語のソースコード内のテストファイルの慣習(特に test/ ディレクトリ内のファイル)
  • go help test コマンドの出力 (テストディレクティブに関する情報)

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

このコミットは、Go言語のテストファイル test/bugs/bug126.go におけるコメントの調整に関するものです。具体的には、gccgo コンパイラがこのテストを正しく処理できるように、エラーメッセージの期待値とコメントの記述方法が変更されました。

コミット

commit 48e5110151579f1d8491b798cbd923ca8df62141
Author: Ian Lance Taylor <iant@golang.org>
Date:   Mon Dec 8 11:31:55 2008 -0800

    Tweak comments so that this test passes with gccgo.
    
    bug126.go:7:7: error: redefinition of 'none'
    bug126.go:6:7: note: previous definition of 'none' was here
    
    R=gri
    DELTA=3  (1 added, 0 deleted, 2 changed)
    OCL=20563
    CL=20723

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/48e5110151579f1d8491b798cbd923ca8df62141

元コミット内容

このコミットは、test/bugs/bug126.go というテストファイル内のコメントを修正し、gccgo コンパイラでこのテストが正しくパスするように調整しています。元の問題は、none という定数が二重に宣言されていることによる再定義エラーが gccgo で発生し、テストが期待通りに動作しなかったことにあります。

変更の背景

Go言語のテストスイートには、特定のコンパイルエラーや実行時エラーを意図的に発生させ、それが期待通りに検出されるかを検証するテストが含まれています。bug126.go は、同じ定数識別子 none が二度宣言された場合にコンパイラがエラーを出すことを確認するためのテストです。

しかし、Go言語の公式コンパイラ(gc)と gccgo(GCCをバックエンドとするGoコンパイラ)では、エラーメッセージの形式や、テストファイル内のエラー期待値の指定方法に差異がある場合があります。このコミットの背景には、gccgobug126.go のエラーメッセージを正しく認識できず、テストが失敗していたという問題があります。

具体的には、gccgobug126.go:7:7: error: redefinition of 'none' というエラーと、その前の定義が bug126.go:6:7: note: previous definition of 'none' was here であるという注記を出力していました。Goのテストフレームワークは、テストファイル内のコメントに特定のキーワード(例: ERROR)と正規表現を記述することで、期待されるエラーメッセージを定義します。gccgo の出力するエラーメッセージの形式が、既存の ERROR ディレクティブと一致しなかったため、テストが失敗していました。

このコミットは、gccgo が出力するエラーメッセージのパターンに合わせて、テストファイル内のコメントを調整することで、この互換性の問題を解決することを目的としています。

前提知識の解説

Go言語の定数宣言

Go言語では、const キーワードを使用して定数を宣言します。同じスコープ内で同じ名前の定数を複数回宣言することはできません。これはコンパイルエラーとなります。

package main

const myConst = 10 // 最初の宣言
const myConst = 20 // エラー: myConst は既に宣言されています

Go言語のテストフレームワークとエラーテスト

Go言語のテストフレームワークは、go test コマンドで実行されます。特定のコンパイルエラーをテストする場合、Goのテストファイル(通常は .go 拡張子を持つが、テスト専用のディレクトリや命名規則を持つこともある)のコメント内に特別なディレクティブを記述することが一般的です。

  • ERROR "regexp": このディレクティブは、その行またはその周辺で、指定された正規表現に一致するエラーメッセージがコンパイラから出力されることを期待します。テストランナーは、コンパイラの出力を解析し、この正規表現に一致するエラーが見つかればテストをパスとします。
  • GCCGO_ERROR "regexp": これはGo言語の標準的なビルドディレクティブやビルドタグではありませんが、Goのテストスイート内で gccgo コンパイラに特化したエラーメッセージの期待値を指定するために使用される慣習的なパターンです。gcgccgo でエラーメッセージの形式が異なる場合に、gccgo が出力する特定のエラーパターンをテストフレームワークが認識できるようにするために用いられます。

gccgogc コンパイラ

Go言語には主に2つの主要なコンパイラ実装があります。

  1. gc (Go Compiler): これはGoプロジェクトの公式コンパイラであり、Go言語のリリースとともに提供されます。Go言語の標準的なツールチェーンの一部です。
  2. gccgo: これはGCC (GNU Compiler Collection) のフロントエンドとして実装されたGoコンパイラです。gccgo はGCCの最適化バックエンドを利用できるため、特定のプラットフォームや最適化のニーズにおいて gc とは異なる特性を持つことがあります。また、エラーメッセージの形式や内部的な挙動が gc とは異なる場合があります。

テストスイートは、これら両方のコンパイラでGoコードが正しく動作することを確認するために、両方でテストを実行することがあります。そのため、コンパイラ固有の挙動に対応するためのディレクティブが必要になることがあります。

技術的詳細

このコミットの技術的な核心は、gccgo が出力するエラーメッセージのパターンと、Goテストフレームワークがエラーを検出するために使用する正規表現との間の不一致を解消することにあります。

元の bug126.go ファイルでは、定数 none の再定義に対して、以下のようなコメントが付けられていました。

const none = 0  // same const identifier declared twice should not be accepted
const none = 1  // ERROR "redeclared"

ここで、2行目の // ERROR "redeclared" は、コンパイラが「redeclared」という文字列を含むエラーメッセージを出力することを期待していました。しかし、gccgo は、再定義エラーが発生した際に、最初の定義箇所を示す「note」メッセージも出力していました。

bug126.go:7:7: error: redefinition of 'none'
bug126.go:6:7: note: previous definition of 'none' was here

この「note」メッセージが gccgo の出力に含まれることで、Goのテストランナーが ERROR ディレクティブを評価する際に、期待されるエラーメッセージのパターンと合致しない状況が発生していました。

このコミットでは、以下の2つの主要な変更が行われました。

  1. GCCGO_ERROR ディレクティブの導入: const none = 0 の行に // GCCGO_ERROR "previous" というコメントが追加されました。これは、gccgo がこの行に関連して「previous」という文字列を含むエラー(この場合は「previous definition of 'none' was here」というnoteメッセージ)を出力することを期待するという意味です。これにより、gccgo が出力するnoteメッセージもテストの期待値として扱われるようになります。

  2. ERROR ディレクティブの正規表現の強化: const none = 1 の行のコメントが // ERROR "redeclared|redef" に変更されました。これは、gc または gccgo のいずれかが「redeclared」または「redef」のいずれかの文字列を含むエラーメッセージを出力することを期待するという意味です。これにより、gccgo が「redef」のようなバリエーションのエラーメッセージを出力した場合でも、テストが正しくエラーを検出できるようになります。

これらの変更により、gcgccgo の両方で bug126.go テストが期待通りにパスするようになりました。これは、異なるコンパイラ実装間での互換性を確保し、テストスイートの堅牢性を高めるための典型的なアプローチです。

コアとなるコードの変更箇所

--- a/test/bugs/bug126.go
+++ b/test/bugs/bug126.go
@@ -6,5 +6,6 @@
 
 package main
 
-const none = 0  // same const identifier declared twice should not be accepted
-const none = 1  // ERROR "redeclared"\n
+// same const identifier declared twice should not be accepted
+const none = 0  // GCCGO_ERROR "previous"
+const none = 1  // ERROR "redeclared|redef"

コアとなるコードの解説

変更された test/bugs/bug126.go ファイルのコアとなる変更は以下の通りです。

  1. const none = 0 の行:

    • 元のコメント // same const identifier declared twice should not be accepted はそのまま残されています。これはコードの意図を説明する通常のコメントです。
    • 新しく // GCCGO_ERROR "previous" が追加されました。これは、gccgo コンパイラがこの行に関連して「previous」という文字列を含むエラーまたは警告(この場合は「previous definition of 'none' was here」という注記)を出すことをテストフレームワークに伝えます。これにより、gccgo の出力する詳細なエラー情報もテストの期待値として扱われるようになります。
  2. const none = 1 の行:

    • 元のコメント // ERROR "redeclared"// ERROR "redeclared|redef" に変更されました。
    • ERROR ディレクティブは、コンパイラがこの行でエラーを出すことを期待します。
    • 正規表現が "redeclared" から "redeclared|redef" に拡張されました。これは、コンパイラが「redeclared」または「redef」のいずれかの文字列を含むエラーメッセージを出力した場合に、テストがパスすることを示します。この変更は、gccgo が「redef」のような異なる形式で再定義エラーを報告する可能性に対応するためのものです。

これらの変更により、bug126.gogcgccgo の両方のコンパイラで、定数再定義エラーが正しく検出されることを検証できるようになりました。これは、Go言語のテストスイートが複数のコンパイラ実装をサポートし、それぞれのコンパイラの特性に対応するための一般的なパターンを示しています。

関連リンク

参考にした情報源リンク