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

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

このコミットは、Go言語のテストスイート内の bug086.go ファイルを更新し、gccgo (GCCベースのGoコンパイラ) の現在の挙動に合わせるものです。具体的には、関数が値を返す必要があるにもかかわらず return ステートメントがない場合に発生するエラーの期待値を調整しています。

コミット

commit 58845656e8d0e64e2a7a29d6633682ce6b0df2d8
Author: Ian Lance Taylor <iant@golang.org>
Date:   Fri Aug 9 08:43:19 2013 -0700

    test: update bug086.go for current gccgo behaviour
    
    bug086.go:14:1: error: missing return at end of function
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/12697043

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

https://github.com/golang/go/commit/58845656e8d0e64e2a7a29d6633682ce6b0df2d8

元コミット内容

test: update bug086.go for current gccgo behaviour bug086.go:14:1: error: missing return at end of function

このコミットは、bug086.go というテストファイルが、gccgo の現在の動作に合わせて更新されたことを示しています。特に、bug086.go の14行目1列目で「関数の終わりに return がない」というエラーが発生することに対応しています。

変更の背景

Go言語には、主に2つの主要なコンパイラ実装が存在します。一つはGoチームが開発している公式のコンパイラ(gc と呼ばれることが多い)、もう一つはGCCのフロントエンドとして開発されている gccgo です。これら2つのコンパイラは、Go言語の仕様に準拠していますが、エラーメッセージの形式や、特定のコーナーケースにおける挙動の細部が異なることがあります。

bug086.go は、Go言語のコンパイラが特定のバグやエッジケースを正しく処理するかどうかを検証するためのテストファイルです。このコミットの背景には、gccgo の進化に伴い、以前は gccgo 特有のエラーとしてマークされていた挙動が、より一般的なコンパイラエラーとして扱われるようになった、あるいはエラーメッセージの形式が変更されたという事実があります。

具体的には、値を返す関数において、すべての実行パスで return ステートメントが存在しない場合にコンパイラがエラーを出すべきですが、そのエラーの報告方法が gccgo で変更されたため、テストファイル側の期待値を更新する必要が生じました。これにより、テストが gccgo の最新の挙動と一致し、誤った失敗を避けることができます。

前提知識の解説

Go言語のコンパイラ

  • gc (Go Compiler): Go言語の公式ツールチェインに含まれる標準コンパイラです。Goチームによって開発され、Go言語のリリースサイクルに合わせて更新されます。高速なコンパイルと最適化が特徴です。
  • gccgo: GCC (GNU Compiler Collection) のフロントエンドとして実装されたGoコンパイラです。GCCのバックエンドを利用するため、GCCがサポートする多様なアーキテクチャに対応できる利点があります。gc とは異なるコードベースで開発されており、一部の挙動やエラーメッセージが異なることがあります。

Go言語の関数の戻り値とエラー

Go言語では、関数が戻り値を宣言している場合、その関数のすべての実行パスにおいて戻り値を返す必要があります。もし、戻り値を宣言しているにもかかわらず、特定のパスで return ステートメントがない場合、コンパイラは「missing return at end of function」のようなエラーを報告します。これは、プログラムの論理的な誤りを早期に検出するための重要なコンパイラチェックです。

例:

func myFunc() int {
    if false {
        return 1
    }
    // ここに return がないとコンパイルエラー
}

テストファイルにおけるエラー期待値のコメント

Go言語のテストスイートでは、特定のコードがコンパイルエラーや実行時エラーを引き起こすことを期待する場合、そのエラーメッセージや種類をコメントとしてコード内に記述することがあります。これは、テストがコンパイラの挙動を検証する際に非常に役立ちます。

  • // ERROR "...": 一般的なコンパイラエラーを期待する場合に用いられます。
  • // GC_ERROR "...": gc コンパイラ特有のエラーを期待する場合に用いられます。
  • // GCCGO_ERROR "...": gccgo コンパイラ特有のエラーを期待する場合に用いられます。

これらのコメントは、テストフレームワークがコンパイル結果を解析し、期待されるエラーが出力されたかどうかを検証するために使用されます。

技術的詳細

このコミットの技術的詳細は、gccgo コンパイラが、値を返す関数における return ステートメントの欠如をどのように検出・報告するかという点に集約されます。

元の bug086.go ファイルでは、f() 関数が int 型の戻り値を宣言しているにもかかわらず、if false ブロックの外側には return ステートメントがありませんでした。このようなコードは、Go言語の仕様上、コンパイルエラーとなるべきです。

変更前のコードでは、このエラーが gccgo 特有の挙動として // GCCGO_ERROR "control" とマークされ、さらに gc コンパイラに対しては // GC_ERROR "return" とマークされていました。これは、過去のある時点では gccgo がこの種の「制御フロー」に関するエラーを異なる形で報告していたか、あるいは gcgccgo の間でエラーメッセージの厳密な一致がなかったことを示唆しています。

このコミットでは、func f() int { // GCCGO_ERROR "control" の行から // GCCGO_ERROR "control" コメントが削除され、// GC_ERROR "return"// ERROR "return" に変更されました。

これは以下のことを意味します。

  1. GCCGO_ERROR の削除: gccgo が、もはやこの特定のケースで「control」というメッセージを含む独自のエラーを報告しなくなったことを示します。これは、gccgo のエラー報告が gc のそれに近づいたか、あるいはこの特定のエラーが gccgo の内部でより一般的なエラーとして扱われるようになったことを示唆しています。
  2. GC_ERROR から ERROR への変更: gc コンパイラだけでなく、すべてのGoコンパイラ(gccgo を含む)が、この「missing return」エラーを共通の形式で報告するようになったことを示唆しています。これにより、テストはコンパイラの実装に依存せず、より汎用的なエラーチェックを行うことができます。

この変更は、Goコンパイラのエラー報告の一貫性が向上したことを反映しており、開発者が異なるコンパイラを使用しても同様のエラーメッセージを受け取ることを期待できるようになります。

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

変更は test/fixedbugs/bug086.go ファイルにのみ行われています。

--- a/test/fixedbugs/bug086.go
+++ b/test/fixedbugs/bug086.go
@@ -6,12 +6,12 @@
 
 package main
 
-func f() int {	// GCCGO_ERROR "control"
+func f() int {
 	if false {
 		return 0;
 	}
 	// we should not be able to return successfully w/o a return statement
-} // GC_ERROR "return"
+} // ERROR "return"
 
 func main() {
 	print(f(), "\n");

コアとなるコードの解説

変更されたのは以下の2行です。

  1. func f() int { // GCCGO_ERROR "control" から func f() int {:

    • 元のコードでは、f() 関数の定義行に // GCCGO_ERROR "control" というコメントが付与されていました。これは、gccgo コンパイラがこの行で「control」という文字列を含む特定のエラーを出すことを期待していることを示していました。
    • このコミットにより、// GCCGO_ERROR "control" コメントが削除されました。これは、gccgo がこの特定の制御フローエラーに対して、もはや特別なエラーメッセージを出力しないか、あるいはそのエラーメッセージが他のコンパイラと共通になったため、gccgo 特有の期待値を指定する必要がなくなったことを意味します。
  2. } // GC_ERROR "return" から } // ERROR "return":

    • 元のコードでは、f() 関数の閉じ括弧の行に // GC_ERROR "return" というコメントが付与されていました。これは、gc コンパイラがこの行で「return」という文字列を含むエラーを出すことを期待していることを示していました。
    • このコミットにより、// GC_ERROR "return"// ERROR "return" に変更されました。GC_ERRORgc コンパイラに特化したエラー期待値ですが、ERROR はGo言語のすべてのコンパイラに共通のエラー期待値です。この変更は、gccgo も含め、すべてのGoコンパイラがこの「missing return」エラーを共通の形式で報告するようになったため、より汎用的なテストコメントで十分になったことを示しています。

これらの変更は、gccgo のエラー報告の挙動が gc に近づき、Goコンパイラ全体のエラーメッセージの一貫性が向上したことを反映しています。これにより、テストの保守性が向上し、異なるコンパイラ実装間での挙動の差異が減少したことを示唆しています。

関連リンク

  • Go言語の公式ウェブサイト: https://golang.org/
  • GCCGoプロジェクトページ (GCCの一部として): https://gcc.gnu.org/go/
  • Go言語のテストに関するドキュメント (Goのソースコード内): Goのソースコードリポジトリには、テストの書き方やコメントの慣習に関するドキュメントが含まれている場合があります。

参考にした情報源リンク

  • Go言語のソースコード (特に test/fixedbugs ディレクトリ): https://github.com/golang/go
  • Go言語のコンパイラに関する議論やメーリングリスト (golang-dev): https://groups.google.com/g/golang-dev
  • Go言語のコードレビューシステム (Gerrit): https://go-review.googlesource.com/ (コミットメッセージに記載されている https://golang.org/cl/12697043 は、このGerritシステムへのリンクです。)
  • GCCのドキュメント: GCCのGoフロントエンドに関する詳細な情報が含まれている可能性があります。# [インデックス 17124] ファイルの概要

このコミットは、Go言語のテストスイート内の bug086.go ファイルを更新し、gccgo (GCCベースのGoコンパイラ) の現在の挙動に合わせるものです。具体的には、関数が値を返す必要があるにもかかわらず return ステートメントがない場合に発生するエラーの期待値を調整しています。

コミット

commit 58845656e8d0e64e2a7a29d6633682ce6b0df2d8
Author: Ian Lance Taylor <iant@golang.org>
Date:   Fri Aug 9 08:43:19 2013 -0700

    test: update bug086.go for current gccgo behaviour
    
    bug086.go:14:1: error: missing return at end of function
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/12697043

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

https://github.com/golang/go/commit/58845656e8d0e64e2a7a29d6633682ce6b0df2d8

元コミット内容

test: update bug086.go for current gccgo behaviour bug086.go:14:1: error: missing return at end of function

このコミットは、bug086.go というテストファイルが、gccgo の現在の動作に合わせて更新されたことを示しています。特に、bug086.go の14行目1列目で「関数の終わりに return がない」というエラーが発生することに対応しています。

変更の背景

Go言語には、主に2つの主要なコンパイラ実装が存在します。一つはGoチームが開発している公式のコンパイラ(gc と呼ばれることが多い)、もう一つはGCCのフロントエンドとして開発されている gccgo です。これら2つのコンパイラは、Go言語の仕様に準拠していますが、エラーメッセージの形式や、特定のコーナーケースにおける挙動の細部が異なることがあります。

bug086.go は、Go言語のコンパイラが特定のバグやエッジケースを正しく処理するかどうかを検証するためのテストファイルです。このコミットの背景には、gccgo の進化に伴い、以前は gccgo 特有のエラーとしてマークされていた挙動が、より一般的なコンパイラエラーとして扱われるようになった、あるいはエラーメッセージの形式が変更されたという事実があります。

具体的には、値を返す関数において、すべての実行パスで return ステートメントが存在しない場合にコンパイラがエラーを出すべきですが、そのエラーの報告方法が gccgo で変更されたため、テストファイル側の期待値を更新する必要が生じました。これにより、テストが gccgo の最新の挙動と一致し、誤った失敗を避けることができます。

前提知識の解説

Go言語のコンパイラ

  • gc (Go Compiler): Go言語の公式ツールチェインに含まれる標準コンパイラです。Goチームによって開発され、Go言語のリリースサイクルに合わせて更新されます。高速なコンパイルと最適化が特徴です。
  • gccgo: GCC (GNU Compiler Collection) のフロントエンドとして実装されたGoコンパイラです。GCCのバックエンドを利用するため、GCCがサポートする多様なアーキテクチャに対応できる利点があります。gc とは異なるコードベースで開発されており、一部の挙動やエラーメッセージが異なることがあります。

Go言語の関数の戻り値とエラー

Go言語では、関数が戻り値を宣言している場合、その関数のすべての実行パスにおいて戻り値を返す必要があります。もし、戻り値を宣言しているにもかかわらず、特定のパスで return ステートメントがない場合、コンパイラは「missing return at end of function」のようなエラーを報告します。これは、プログラムの論理的な誤りを早期に検出するための重要なコンパイラチェックです。

例:

func myFunc() int {
    if false {
        return 1
    }
    // ここに return がないとコンパイルエラー
}

テストファイルにおけるエラー期待値のコメント

Go言語のテストスイートでは、特定のコードがコンパイルエラーや実行時エラーを引き起こすことを期待する場合、そのエラーメッセージや種類をコメントとしてコード内に記述することがあります。これは、テストがコンパイラの挙動を検証する際に非常に役立ちます。

  • // ERROR "...": 一般的なコンパイラエラーを期待する場合に用いられます。
  • // GC_ERROR "...": gc コンパイラ特有のエラーを期待する場合に用いられます。
  • // GCCGO_ERROR "...": gccgo コンパイラ特有のエラーを期待する場合に用いられます。

これらのコメントは、テストフレームワークがコンパイル結果を解析し、期待されるエラーが出力されたかどうかを検証するために使用されます。

技術的詳細

このコミットの技術的詳細は、gccgo コンパイラが、値を返す関数における return ステートメントの欠如をどのように検出・報告するかという点に集約されます。

元の bug086.go ファイルでは、f() 関数が int 型の戻り値を宣言しているにもかかわらず、if false ブロックの外側には return ステートメントがありませんでした。このようなコードは、Go言語の仕様上、コンパイルエラーとなるべきです。

変更前のコードでは、このエラーが gccgo 特有の挙動として // GCCGO_ERROR "control" とマークされ、さらに gc コンパイラに対しては // GC_ERROR "return" とマークされていました。これは、過去のある時点では gccgo がこの種の「制御フロー」に関するエラーを異なる形で報告していたか、あるいは gcgccgo の間でエラーメッセージの厳密な一致がなかったことを示唆しています。

このコミットでは、func f() int { // GCCGO_ERROR "control" の行から // GCCGO_ERROR "control" コメントが削除され、// GC_ERROR "return"// ERROR "return" に変更されました。

これは以下のことを意味します。

  1. GCCGO_ERROR の削除: gccgo が、もはやこの特定のケースで「control」というメッセージを含む独自のエラーを報告しなくなったことを示します。これは、gccgo のエラー報告が gc のそれに近づいたか、あるいはこの特定のエラーが gccgo の内部でより一般的なエラーとして扱われるようになったことを示唆しています。
  2. GC_ERROR から ERROR への変更: gc コンパイラだけでなく、すべてのGoコンパイラ(gccgo を含む)が、この「missing return」エラーを共通の形式で報告するようになったことを示唆しています。これにより、テストはコンパイラの実装に依存せず、より汎用的なエラーチェックを行うことができます。

この変更は、Goコンパイラのエラー報告の一貫性が向上したことを反映しており、開発者が異なるコンパイラを使用しても同様のエラーメッセージを受け取ることを期待できるようになります。

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

変更は test/fixedbugs/bug086.go ファイルにのみ行われています。

--- a/test/fixedbugs/bug086.go
+++ b/test/fixedbugs/bug086.go
@@ -6,12 +6,12 @@
 
 package main
 
-func f() int {	// GCCGO_ERROR "control"
+func f() int {
 	if false {
 		return 0;
 	}
 	// we should not be able to return successfully w/o a return statement
-} // GC_ERROR "return"
+} // ERROR "return"
 
 func main() {
 	print(f(), "\n");

コアとなるコードの解説

変更されたのは以下の2行です。

  1. func f() int { // GCCGO_ERROR "control" から func f() int {:

    • 元のコードでは、f() 関数の定義行に // GCCGO_ERROR "control" というコメントが付与されていました。これは、gccgo コンパイラがこの行で「control」という文字列を含む特定のエラーを出すことを期待していることを示していました。
    • このコミットにより、// GCCGO_ERROR "control" コメントが削除されました。これは、gccgo がこの特定の制御フローエラーに対して、もはや特別なエラーメッセージを出力しないか、あるいはそのエラーメッセージが他のコンパイラと共通になったため、gccgo 特有の期待値を指定する必要がなくなったことを意味します。
  2. } // GC_ERROR "return" から } // ERROR "return":

    • 元のコードでは、f() 関数の閉じ括弧の行に // GC_ERROR "return" というコメントが付与されていました。これは、gc コンパイラがこの行で「return」という文字列を含むエラーを出すことを期待していることを示していました。
    • このコミットにより、// GC_ERROR "return"// ERROR "return" に変更されました。GC_ERRORgc コンパイラに特化したエラー期待値ですが、ERROR はGo言語のすべてのコンパイラに共通のエラー期待値です。この変更は、gccgo も含め、すべてのGoコンパイラがこの「missing return」エラーを共通の形式で報告するようになったため、より汎用的なテストコメントで十分になったことを示しています。

これらの変更は、gccgo のエラー報告の挙動が gc に近づき、Goコンパイラ全体のエラーメッセージの一貫性が向上したことを反映しています。これにより、テストの保守性が向上し、異なるコンパイラ実装間での挙動の差異が減少したことを示唆しています。

関連リンク

  • Go言語の公式ウェブサイト: https://golang.org/
  • GCCGoプロジェクトページ (GCCの一部として): https://gcc.gnu.org/go/
  • Go言語のテストに関するドキュメント (Goのソースコード内): Goのソースコードリポジトリには、テストの書き方やコメントの慣習に関するドキュメントが含まれている場合があります。

参考にした情報源リンク

  • Go言語のソースコード (特に test/fixedbugs ディレクトリ): https://github.com/golang/go
  • Go言語のコンパイラに関する議論やメーリングリスト (golang-dev): https://groups.google.com/g/golang-dev
  • Go言語のコードレビューシステム (Gerrit): https://go-review.googlesource.com/ (コミットメッセージに記載されている https://golang.org/cl/12697043 は、このGerritシステムへのリンクです。)
  • GCCのドキュメント: GCCのGoフロントエンドに関する詳細な情報が含まれている可能性があります。