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

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

このコミットは、Go言語のコンパイラであるgccgoの内部的な改善に対応するため、テストコード内の型定義を修正するものです。具体的には、Go言語の組み込み型ではないfloatという記述を、正しい浮動小数点型であるfloat32に置き換えています。

コミット

commit cc5682dcc5aefca37974818b9695a424e8eea368
Author: Ian Lance Taylor <iant@golang.org>
Date:   Thu Dec 13 15:11:31 2012 -0800

    test: s/float/float32/
    
    I just committed a patch to gccgo that notices that float was
    never defined, causing an additional unmatched error message.
    Rename the type to avoid that message.
    
    R=golang-dev, minux.ma
    CC=golang-dev
    https://golang.org/cl/6947049

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

https://github.com/golang/go/commit/cc5682dcc5aefca37974818b9695a424e8eea368

元コミット内容

このコミットの目的は、testディレクトリ内のファイルにおいて、floatという型指定をfloat32に置換することです。これは、gccgoコンパイラへのパッチが適用された結果、floatが未定義であることを検出し、予期せぬエラーメッセージが発生するようになったためです。この変更により、テストが本来意図するエラーチェックに集中できるようになります。

変更の背景

この変更の背景には、Go言語のコンパイラであるgccgoの内部的な改善があります。コミットメッセージによると、gccgoに新しいパッチが適用され、その結果、floatという型がGo言語の組み込み型として定義されていないことを正確に検出するようになりました。

Go言語の仕様では、浮動小数点型はfloat32(単精度)とfloat64(倍精度)として明示的に定義されており、単にfloatという型は存在しません。しかし、以前のgccgoのバージョンでは、この未定義のfloat型がテストコード内で使用されていても、それが特定のコンパイルエラーを引き起こす文脈でなければ、追加のエラーとして報告されていなかった可能性があります。

新しいgccgoのパッチが適用されたことで、floatが未定義の型であることが厳密にチェックされるようになり、test/fixedbugsディレクトリ内のテストファイルが、本来意図しない「floatが未定義」というエラーを報告するようになりました。これらのテストファイルは、特定のバグやエラーメッセージをテストするために意図的に不正なコードを含んでいることが多いため、この予期せぬエラーはテストの目的を妨げます。

したがって、このコミットは、テストファイルが本来テストしようとしていたエラー(例:可変引数リストの誤用)に集中できるように、floatを正しい型であるfloat32に修正することを目的としています。これにより、テストの意図が明確になり、gccgoの新しい厳密な型チェックが正しく機能していることを確認できます。

前提知識の解説

このコミットを理解するためには、以下のGo言語およびコンパイラに関する前提知識が役立ちます。

  1. Go言語の数値型: Go言語には、整数型(int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr)と浮動小数点型(float32, float64)、複素数型(complex64, complex128)があります。

    • float32: IEEE 754単精度浮動小数点数(32ビット)。
    • float64: IEEE 754倍精度浮動小数点数(64ビット)。 C言語などとは異なり、Goには単にfloatという型は存在せず、使用する精度に応じてfloat32またはfloat64を明示的に指定する必要があります。
  2. Universe Scope (ユニバーススコープ): Go言語において、universe scopeは、プログラム全体で常に利用可能な組み込みの識別子(型、関数、定数など)が定義されている最も外側のスコープです。これには、int, bool, stringなどの基本型、len, cap, make, new, panic, recoverなどの組み込み関数、true, false, ``iota, nilなどの組み込み定数が含まれます。 このコミットで変更されたtest/fixedbugs/bug085.goのコメントは、このuniverse scopeに含まれる識別子の例を記述しており、以前は誤ってfloatが含まれていましたが、実際にはfloat32`が正しい組み込み型でした。

  3. gccgo: gccgoは、GCC(GNU Compiler Collection)のフロントエンドとして実装されたGo言語コンパイラです。Go言語の公式コンパイラであるgc(Go toolchainに含まれるコンパイラ)とは異なる実装であり、GoプログラムをGCCのバックエンドを通じてコンパイルします。gccgoは、Go言語の仕様に準拠しつつ、GCCの最適化機能やクロスコンパイル能力を活用できるという特徴があります。 このコミットは、gccgoの内部的な改善が、Go言語の型システムに関するより厳密なチェックを導入した結果として発生しました。

  4. Go言語のテストフレームワークとtest/fixedbugsディレクトリ: Go言語には、標準ライブラリとしてtestingパッケージが提供されており、ユニットテストやベンチマークテストを簡単に記述できます。 test/fixedbugsディレクトリは、Go言語のコンパイラやランタイムにおける特定のバグ(fixed bugs)をテストするために用意された特殊なテストケース群です。これらのテストファイルは、意図的にコンパイルエラーやランタイムエラーを引き起こすようなコードを含んでおり、特定のバグが修正されたことを確認したり、特定の誤ったコードが正しくエラーとして報告されることを検証したりするために使用されます。

技術的詳細

このコミットの技術的な核心は、Go言語の厳密な型システムと、コンパイラ(特にgccgo)がその型システムをどのように解釈し、適用するかという点にあります。

Go言語の設計思想の一つに「明示性」があります。これは、型定義においても顕著で、浮動小数点数型はfloat32float64として明確に区別されています。これは、C言語のようにfloatが単精度、doubleが倍精度を意味するような暗黙的な型定義とは異なります。Goでは、開発者が使用する浮動小数点数の精度を意識的に選択することを求めています。

以前のgccgoのバージョンでは、test/fixedbugs/bug228.goのようなテストファイル内でfloatという未定義の型が使用されていても、それが特定のコンパイルエラーを引き起こす文脈(例えば、可変引数リストの誤用)に埋もれていたり、コンパイラの型チェックがその特定のケースでfloatの未定義を厳密に報告していなかったりした可能性があります。これは、コンパイラの最適化やエラー報告の優先順位付け、あるいは単にその時点での実装の不完全さに起因するかもしれません。

しかし、コミットメッセージにあるように、gccgoに適用された新しいパッチは、型チェックのロジックを改善し、floatがGo言語の組み込み型ではないことをより正確かつ厳密に検出するようになりました。この改善により、bug228.goのようなファイルが、本来テストしようとしていたエラー(例:可変引数リストの誤用)に加えて、「floatが未定義の型である」という予期せぬエラーメッセージを報告するようになりました。

この「unmatched error message」(予期せぬエラーメッセージ)は、テストの意図を曖昧にし、テストが本来検証すべきバグ以外の問題で失敗する原因となります。したがって、このコミットでは、テストの目的を維持しつつ、gccgoの新しい厳密な型チェックに適合させるために、floatをGo言語で正しく定義されているfloat32に修正しました。これにより、テストは引き続き可変引数の誤用に関するエラーを正確にテストでき、同時にgccgoの型チェックの改善も確認できます。

また、test/fixedbugs/bug085.goの変更は、universe scopeに関するコメントの修正であり、Go言語の組み込み型に関する正確な情報を提供するためのものです。これは、コードのドキュメントとしての正確性を高めるための変更であり、gccgoの型チェックの厳密化という背景と整合しています。

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

このコミットでは、以下の2つのファイルが変更されています。

  1. test/fixedbugs/bug085.go

    --- a/test/fixedbugs/bug085.go
    +++ b/test/fixedbugs/bug085.go
    @@ -20,7 +20,7 @@ Bus error
     
     /* expected scope hierarchy (outermost to innermost)
     
    -universe scope (contains predeclared identifiers int, float, int32, len, etc.)
    +universe scope (contains predeclared identifiers int, float32, int32, len, etc.)
      "solar" scope (just holds the package name P so it can be found but doesn't conflict)
      global scope (the package global scope)
      local scopes (function scopes)
    
    • 20行目のコメント内のfloatfloat32に修正されました。
  2. test/fixedbugs/bug228.go

    --- a/test/fixedbugs/bug228.go
    +++ b/test/fixedbugs/bug228.go
    @@ -8,11 +8,11 @@ package main
     
     func f(x int, y ...int)	// ok
     
    -func g(x int, y float) (...)	// ERROR "[.][.][.]" "final argument"
    +func g(x int, y float32) (...)	// ERROR "[.][.][.]" "final argument"
     
     func h(x, y ...int)		// ERROR "[.][.][.]"
     
    -func i(x int, y ...int, z float)	// ERROR "[.][.][.]"
    +func i(x int, y ...int, z float32)	// ERROR "[.][.][.]"
     
     var x ...int;		// ERROR "[.][.][.]|syntax|type"
     
    
    • 10行目のfunc gの引数リスト内のfloatfloat32に修正されました。
    • 14行目のfunc iの引数リスト内のfloatfloat32に修正されました。

コアとなるコードの解説

test/fixedbugs/bug085.goの変更

このファイルは、Go言語のスコープ階層に関するテストまたはドキュメントの一部です。変更された行は、universe scopeに含まれる組み込み識別子の例を説明するコメントです。 Go言語の組み込み型にはfloatは存在せず、float32float64が明示的に定義されています。したがって、このコメントの修正は、Go言語の型システムに関する正確な情報を提供するためのものです。これは、gccgofloatを未定義として扱うようになったという背景と整合しており、ドキュメントと実装の整合性を保つための重要な変更です。

test/fixedbugs/bug228.goの変更

このファイルは、Go言語の関数定義における可変引数(...)の誤った使用方法がコンパイルエラーを引き起こすことをテストするためのものです。具体的には、可変引数が引数リストの最後の要素でなければならないというルールを検証しています。

  • func g(x int, y float) (...) から func g(x int, y float32) (...) への変更: この関数定義は、可変引数(...)が引数リストの途中に現れているため、Go言語の仕様に違反しており、コンパイルエラーが期待されます。元のコードではy floatと記述されていましたが、floatはGo言語で未定義の型です。gccgoの新しい型チェックがfloatの未定義を検出するようになったため、このテストは本来意図する「可変引数の位置に関するエラー」に加えて、「floatが未定義である」というエラーも報告するようになりました。これを避けるため、floatを正しい型であるfloat32に修正することで、テストは引き続き可変引数の誤用に関するエラーを正確にテストできます。

  • func i(x int, y ...int, z float) から func i(x int, y ...int, z float32) への変更: この関数定義も同様に、可変引数y ...intの後に別の引数z floatが続いているため、Go言語の仕様に違反しており、コンパイルエラーが期待されます。func gのケースと同様に、floatfloat32に修正することで、テストが意図しない「floatが未定義」というエラーで失敗するのを防ぎ、本来のテスト目的(可変引数の位置に関するエラー)を維持しています。

これらの変更により、test/fixedbugs内のテストは、gccgoの新しい厳密な型チェックに適合し、Go言語の特定の文法規則やエラーケースを正確に検証し続けることができます。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のソースコード(特にtest/fixedbugsディレクトリ)
  • GCCのドキュメント