[インデックス 12026] ファイルの概要
このコミットは、Go言語のテストスイートから、test/fixedbugs/bug036.go
と test/fixedbugs/bug038.go
という2つのテストファイルを削除するものです。これらのファイルは、変数の再宣言(redeclaration)に関するコンパイルエラーをテストしていましたが、既存の declbad.go
というテストファイルと内容が重複しており、かつ「bad tests」と判断されたため削除されました。
コミット
- コミットハッシュ:
f228ed1a90ad22680a57df85c4796c83e636ef71
- 作者: Ian Lance Taylor iant@golang.org
- 日付: Fri Feb 17 20:35:18 2012 -0800
- コミットメッセージ:
test: remove a couple of bad tests that duplicate declbad.go R=golang-dev, r CC=golang-dev https://golang.org/cl/5673089
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/f228ed1a90ad22680a57df85c4796c83e636ef71
元コミット内容
diff --git a/test/fixedbugs/bug036.go b/test/fixedbugs/bug036.go
deleted file mode 100644
index cc20516ce8..0000000000
--- a/test/fixedbugs/bug036.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// ! $G $D/$F.go >/dev/null
-// # ignoring error messages...
-
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func main() {
- s := float(0);
- s := float(0); // BUG redeclaration
-}
diff --git a/test/fixedbugs/bug038.go b/test/fixedbugs/bug038.go
deleted file mode 100644
index 7585376a36..0000000000
--- a/test/fixedbugs/bug038.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// ! $G $D/$F.go >/dev/null
-// # ignoring error messages...
-
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.\n
-package main
-
-func main() {
- var z [3]byte;
- z := new([3]byte); // BUG redeclaration
-}
変更の背景
このコミットの背景には、Go言語のテストスイートの効率性と品質を維持するという目的があります。bug036.go
と bug038.go
は、Go言語のコンパイラが変数の再宣言を正しく検出するかどうかを検証するためのテストファイルでした。しかし、これらのテストは以下の理由により削除されました。
- 重複: 既に存在する
declbad.go
というテストファイルが、同様の、あるいはより広範な宣言エラーのケースをカバーしていたため、これらのテストは冗長でした。テストの重複は、テストスイートの実行時間を不必要に長くし、メンテナンスコストを増加させます。 - 「bad tests」: コミットメッセージに「bad tests」と明記されていることから、これらのテストファイル自体に何らかの問題があった可能性が示唆されます。例えば、テストの意図が不明確であったり、特定のコンパイラの挙動に過度に依存していたり、あるいはテストの記述方法がGoのテストの慣習に沿っていなかったりしたのかもしれません。
Go言語の開発では、テストの網羅性を保ちつつ、テストスイートを簡潔かつ効率的に保つことが重視されます。このコミットは、その原則に基づき、冗長で問題のあるテストを排除することで、テストスイートの健全性を向上させることを目的としています。
前提知識の解説
Go言語における変数宣言と再宣言
Go言語では、変数を宣言する際に、その型と初期値を指定します。一度宣言された変数は、同じスコープ内で同じ名前で再宣言することはできません。これは、コンパイル時に検出されるエラーであり、Go言語の厳格な型システムとスコープ規則の一部です。
変数の宣言には主に以下の2つの方法があります。
-
var
キーワードによる宣言:var x int = 10 var y string
初期値を指定しない場合、ゼロ値(数値型なら0、文字列型なら""、ブール型ならfalseなど)が割り当てられます。
-
短い変数宣言(
:=
): 関数内でのみ使用でき、変数の宣言と初期化を同時に行います。型は初期値から推論されます。z := 20 name := "Go"
この構文は非常に便利ですが、既に宣言されている変数に対しては使用できません。もし同じスコープ内で既に宣言されている変数に対して
:=
を使用しようとすると、コンパイルエラー(再宣言エラー)が発生します。ただし、複数の変数を宣言する際に、少なくとも1つの新しい変数が含まれていれば、既存の変数も同時に再代入することができます。
Go言語のテストフレームワークとエラーテスト
Go言語には、標準ライブラリとして testing
パッケージが提供されており、これを用いてユニットテストやベンチマークテストを記述します。テストファイルは通常、テスト対象のソースファイルと同じディレクトリに配置され、ファイル名の末尾に _test.go
を付けます。
コンパイルエラーを意図的に発生させるテストは、コンパイラが特定の不正なコードパターンを正しく検出するかどうかを検証するために重要です。これらのテストは、通常、コンパイルが失敗することを期待し、エラーメッセージの内容や形式を検証することもあります。
bug036.go
と bug038.go
の冒頭にあるコメント // ! $G $D/$F.go >/dev/null
は、Goのテストシステムにおける慣習的な記述です。
$G
: Goコンパイラを指します。$D/$F.go
: 現在のテストファイルのパスを指します。>/dev/null
: コンパイル時の標準出力を破棄することを意味します。これは、コンパイルが成功した場合の出力が不要であるか、あるいはコンパイルエラーメッセージ自体をテストの対象としている場合に用いられます。
また、// BUG redeclaration
のようなコメントは、その行が意図的にエラーを引き起こすコードであり、そのエラーが特定のバグ(この場合は再宣言)に関連していることを示すマーカーとして使われます。
declbad.go
の役割(推測)
コミットメッセージから判断すると、declbad.go
はGo言語のコンパイラが検出するべき様々な「不正な宣言(bad declarations)」を網羅的にテストするために設計されたファイルであると推測されます。これには、変数の再宣言、型の不一致、未定義の識別子の使用など、コンパイル時にエラーとなる宣言に関するあらゆるケースが含まれると考えられます。
このような包括的なテストファイルが存在することで、個別のバグ報告に対応して作成された小さなテストファイル(例: bug036.go
, bug038.go
)が冗長になることがあります。declbad.go
が既にこれらのケースをカバーしている場合、重複するテストは削除されるべきです。
技術的詳細
bug036.go
の内容とテスト意図
bug036.go
は、main
関数内で s := float(0);
という短い変数宣言を2回連続で行っています。
func main() {
s := float(0);
s := float(0); // BUG redeclaration
}
Go言語では、:=
は新しい変数を宣言する際に使用されます。したがって、2行目の s := float(0);
は、既に1行目で宣言されている s
を再宣言しようとするため、コンパイルエラーとなります。このテストは、Goコンパイラがこの再宣言エラーを正しく検出することを確認するためのものでした。
bug038.go
の内容とテスト意図
bug038.go
は、main
関数内でまず var z [3]byte;
で配列 z
を宣言し、その直後に z := new([3]byte);
という短い変数宣言で z
を再宣言しようとしています。
func main() {
var z [3]byte;
z := new([3]byte); // BUG redeclaration
}
ここでも、z := ...
は新しい変数を宣言しようとするため、既に var z ...
で宣言されている z
と名前が衝突し、再宣言エラーとなります。このテストも、コンパイラがこの種の再宣言エラーを検出することを確認するためのものでした。
なぜ「bad tests」であり「duplicate declbad.go」だったのか
これらのテストが「bad tests」とされた具体的な理由はコミットメッセージからは読み取れませんが、一般的には以下のような理由が考えられます。
- テストの粒度: 個別のバグ番号に対応するテストファイルは、特定のバグが修正されたことを確認する目的で作成されます。しかし、そのバグがより一般的なカテゴリ(この場合は「宣言エラー」)に属する場合、そのカテゴリを網羅的にテストするファイル(
declbad.go
)に統合される方が、テストスイート全体の管理が容易になります。 - テストの品質: テストコードの記述方法が最適でなかったり、特定のコンパイラの内部実装に過度に依存していたりする可能性も考えられます。より堅牢で汎用的なテストが
declbad.go
に存在したため、これらが不要になったと判断されたのでしょう。 - 冗長性: 最も明確な理由は、
declbad.go
が既にこれらの再宣言エラーのケースをカバーしていたため、これらのテストが冗長であったことです。テストの重複は、テストスイートの実行時間を長くするだけでなく、将来的にコンパイラの挙動が変更された際に、複数の場所でテストを更新する必要が生じるなど、メンテナンスの負担を増やします。
このコミットは、Go言語のテストスイートが進化し、より体系的で効率的なテスト構造へと移行している過程を示しています。個別のバグテストが、より包括的なテストファイルに吸収されることで、テストの重複が排除され、全体的なテストの品質と保守性が向上します。
コアとなるコードの変更箇所
このコミットによるコードの変更は、以下の2つのファイルの削除のみです。
test/fixedbugs/bug036.go
test/fixedbugs/bug038.go
これらのファイルは完全に削除され、新しいコードの追加や既存コードの修正はありません。
コアとなるコードの解説
削除された bug036.go
と bug038.go
は、Go言語のコンパイラが変数の「再宣言」を正しくエラーとして検出するかどうかを検証するためのテストファイルでした。
bug036.go
は、同じスコープ内で同じ名前の変数を :=
演算子を使って2回宣言しようとするケースをテストしていました。
func main() {
s := float(0);
s := float(0); // BUG redeclaration
}
Go言語の :=
は、新しい変数を宣言し、初期化するための構文です。したがって、2行目で s
を再宣言しようとすると、コンパイルエラーが発生します。
bug038.go
は、var
キーワードで宣言された変数と同じ名前の変数を、その直後に :=
演算子を使って再宣言しようとするケースをテストしていました。
func main() {
var z [3]byte;
z := new([3]byte); // BUG redeclaration
}
ここでも同様に、z := ...
は新しい変数を宣言しようとするため、既に var z ...
で宣言されている z
と衝突し、コンパイルエラーとなります。
これらのテストファイルが削除されたのは、Go言語のテストスイート内に既に declbad.go
というファイルが存在し、それがこれらの再宣言エラーのケースを網羅的にテストしていたためです。つまり、これらのテストは冗長であり、テストスイートの効率性を高めるために削除されました。この変更は、Goコンパイラの機能に影響を与えるものではなく、テストスイートの整理と最適化を目的としています。
関連リンク
- Go Gerrit Change-ID: https://golang.org/cl/5673089
参考にした情報源リンク
- Go言語の公式ドキュメント(変数宣言、テストに関する情報)
- Go言語のソースコードリポジトリ(
test/fixedbugs
ディレクトリの構造、declbad.go
の存在に関する一般的な知識) - Go言語のテストに関する一般的な慣習と構文(
// ! $G $D/$F.go
など) - Go言語における再宣言エラーに関する一般的な情報
[インデックス 12026] ファイルの概要
このコミットは、Go言語のテストスイートから、test/fixedbugs/bug036.go
と test/fixedbugs/bug038.go
という2つのテストファイルを削除するものです。これらのファイルは、変数の再宣言(redeclaration)に関するコンパイルエラーをテストしていましたが、既存の declbad.go
というテストファイルと内容が重複しており、かつ「bad tests」と判断されたため削除されました。
コミット
- コミットハッシュ:
f228ed1a90ad22680a57df85c4796c83e636ef71
- 作者: Ian Lance Taylor iant@golang.org
- 日付: Fri Feb 17 20:35:18 2012 -0800
- コミットメッセージ:
test: remove a couple of bad tests that duplicate declbad.go R=golang-dev, r CC=golang-dev https://golang.org/cl/5673089
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/f228ed1a90ad22680a57df85c4796c83e636ef71
元コミット内容
diff --git a/test/fixedbugs/bug036.go b/test/fixedbugs/bug036.go
deleted file mode 100644
index cc20516ce8..0000000000
--- a/test/fixedbugs/bug036.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// ! $G $D/$F.go >/dev/null
-// # ignoring error messages...\n
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func main() {
- s := float(0);
- s := float(0); // BUG redeclaration
-}
diff --git a/test/fixedbugs/bug038.go b/test/fixedbugs/bug038.go
deleted file mode 100644
index 7585376a36..0000000000
--- a/test/fixedbugs/bug038.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// ! $G $D/$F.go >/dev/null
-// # ignoring error messages...\n
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func main() {
- var z [3]byte;
- z := new([3]byte); // BUG redeclaration
-}
変更の背景
このコミットの背景には、Go言語のテストスイートの効率性と品質を維持するという目的があります。bug036.go
と bug038.go
は、Go言語のコンパイラが変数の再宣言(redeclaration)を正しく検出するかどうかを検証するためのテストファイルでした。しかし、これらのテストは以下の理由により削除されました。
- 重複: 既に存在する
declbad.go
というテストファイルが、同様の、あるいはより広範な宣言エラーのケースをカバーしていたため、これらのテストは冗長でした。テストの重複は、テストスイートの実行時間を不必要に長くし、メンテナンスコストを増加させます。 - 「bad tests」: コミットメッセージに「bad tests」と明記されていることから、これらのテストファイル自体に何らかの問題があった可能性が示唆されます。例えば、テストの意図が不明確であったり、特定のコンパイラの挙動に過度に依存していたり、あるいはテストの記述方法がGoのテストの慣習に沿っていなかったりしたのかもしれません。
Go言語の開発では、テストの網羅性を保ちつつ、テストスイートを簡潔かつ効率的に保つことが重視されます。このコミットは、その原則に基づき、冗長で問題のあるテストを排除することで、テストスイートの健全性を向上させることを目的としています。
前提知識の解説
Go言語における変数宣言と再宣言
Go言語では、変数を宣言する際に、その型と初期値を指定します。一度宣言された変数は、同じスコープ内で同じ名前で再宣言することはできません。これは、コンパイル時に検出されるエラーであり、Go言語の厳格な型システムとスコープ規則の一部です。
変数の宣言には主に以下の2つの方法があります。
-
var
キーワードによる宣言:var x int = 10 var y string
初期値を指定しない場合、ゼロ値(数値型なら0、文字列型なら""、ブール型ならfalseなど)が割り当てられます。
-
短い変数宣言(
:=
): 関数内でのみ使用でき、変数の宣言と初期化を同時に行います。型は初期値から推論されます。z := 20 name := "Go"
この構文は非常に便利ですが、既に宣言されている変数に対しては使用できません。もし同じスコープ内で既に宣言されている変数に対して
:=
を使用しようとすると、コンパイルエラー(再宣言エラー)が発生します。ただし、複数の変数を宣言する際に、少なくとも1つの新しい変数が含まれていれば、既存の変数も同時に再代入することができます。
Go言語のテストフレームワークとエラーテスト
Go言語には、標準ライブラリとして testing
パッケージが提供されており、これを用いてユニットテストやベンチマークテストを記述します。テストファイルは通常、テスト対象のソースファイルと同じディレクトリに配置され、ファイル名の末尾に _test.go
を付けます。
コンパイルエラーを意図的に発生させるテストは、コンパイラが特定の不正なコードパターンを正しく検出するかどうかを検証するために重要です。これらのテストは、通常、コンパイルが失敗することを期待し、エラーメッセージの内容や形式を検証することもあります。
bug036.go
と bug038.go
の冒頭にあるコメント // ! $G $D/$F.go >/dev/null
は、Goのテストシステムにおける慣習的な記述です。
$G
: Goコンパイラを指します。$D/$F.go
: 現在のテストファイルのパスを指します。>/dev/null
: コンパイル時の標準出力を破棄することを意味します。これは、コンパイルが成功した場合の出力が不要であるか、あるいはコンパイルエラーメッセージ自体をテストの対象としている場合に用いられます。
また、// BUG redeclaration
のようなコメントは、その行が意図的にエラーを引き起こすコードであり、そのエラーが特定のバグ(この場合は再宣言)に関連していることを示すマーカーとして使われます。
declbad.go
の役割(推測)
コミットメッセージから判断すると、declbad.go
はGo言語のコンパイラが検出するべき様々な「不正な宣言(bad declarations)」を網羅的にテストするために設計されたファイルであると推測されます。これには、変数の再宣言、型の不一致、未定義の識別子の使用など、コンパイル時にエラーとなる宣言に関するあらゆるケースが含まれると考えられます。
このような包括的なテストファイルが存在することで、個別のバグ報告に対応して作成された小さなテストファイル(例: bug036.go
, bug038.go
)が冗長になることがあります。declbad.go
が既にこれらのケースをカバーしている場合、重複するテストは削除されるべきです。
技術的詳細
bug036.go
の内容とテスト意図
bug036.go
は、main
関数内で s := float(0);
という短い変数宣言を2回連続で行っています。
func main() {
s := float(0);
s := float(0); // BUG redeclaration
}
Go言語では、:=
は新しい変数を宣言する際に使用されます。したがって、2行目の s := float(0);
は、既に1行目で宣言されている s
を再宣言しようとするため、コンパイルエラーとなります。このテストは、Goコンパイラがこの再宣言エラーを正しく検出することを確認するためのものでした。
bug038.go
の内容とテスト意図
bug038.go
は、main
関数内でまず var z [3]byte;
で配列 z
を宣言し、その直後に z := new([3]byte);
という短い変数宣言で z
を再宣言しようとしています。
func main() {
var z [3]byte;
z := new([3]byte); // BUG redeclaration
}
ここでも、z := ...
は新しい変数を宣言しようとするため、既に var z ...
で宣言されている z
と名前が衝突し、再宣言エラーとなります。このテストも、コンパイラがこの種の再宣言エラーを検出することを確認するためのものでした。
なぜ「bad tests」であり「duplicate declbad.go」だったのか
これらのテストが「bad tests」とされた具体的な理由はコミットメッセージからは読み取れませんが、一般的には以下のような理由が考えられます。
- テストの粒度: 個別のバグ番号に対応するテストファイルは、特定のバグが修正されたことを確認する目的で作成されます。しかし、そのバグがより一般的なカテゴリ(この場合は「宣言エラー」)に属する場合、そのカテゴリを網羅的にテストするファイル(
declbad.go
)に統合される方が、テストスイート全体の管理が容易になります。 - テストの品質: テストコードの記述方法が最適でなかったり、特定のコンパイラの内部実装に過度に依存していたりする可能性も考えられます。より堅牢で汎用的なテストが
declbad.go
に存在したため、これらが不要になったと判断されたのでしょう。 - 冗長性: 最も明確な理由は、
declbad.go
が既にこれらの再宣言エラーのケースをカバーしていたため、これらのテストが冗長であったことです。テストの重複は、テストスイートの実行時間を長くするだけでなく、将来的にコンパイラの挙動が変更された際に、複数の場所でテストを更新する必要が生じるなど、メンテナンスの負担を増やします。
このコミットは、Go言語のテストスイートが進化し、より体系的で効率的なテスト構造へと移行している過程を示しています。個別のバグテストが、より包括的なテストファイルに吸収されることで、テストの重複が排除され、全体的なテストの品質と保守性が向上します。
コアとなるコードの変更箇所
このコミットによるコードの変更は、以下の2つのファイルの削除のみです。
test/fixedbugs/bug036.go
test/fixedbugs/bug038.go
これらのファイルは完全に削除され、新しいコードの追加や既存コードの修正はありません。
コアとなるコードの解説
削除された bug036.go
と bug038.go
は、Go言語のコンパイラが変数の「再宣言」を正しくエラーとして検出するかどうかを検証するためのテストファイルでした。
bug036.go
は、同じスコープ内で同じ名前の変数を :=
演算子を使って2回宣言しようとするケースをテストしていました。
func main() {
s := float(0);
s := float(0); // BUG redeclaration
}
Go言語の :=
は、新しい変数を宣言し、初期化するための構文です。したがって、2行目で s
を再宣言しようとすると、コンパイルエラーが発生します。
bug038.go
は、var
キーワードで宣言された変数と同じ名前の変数を、その直後に :=
演算子を使って再宣言しようとするケースをテストしていました。
func main() {
var z [3]byte;
z := new([3]byte); // BUG redeclaration
}
ここでも同様に、z := ...
は新しい変数を宣言しようとするため、既に var z ...
で宣言されている z
と衝突し、コンパイルエラーとなります。
これらのテストファイルが削除されたのは、Go言語のテストスイート内に既に declbad.go
というファイルが存在し、それがこれらの再宣言エラーのケースを網羅的にテストしていたためです。つまり、これらのテストは冗長であり、テストスイートの効率性を高めるために削除されました。この変更は、Goコンパイラの機能に影響を与えるものではなく、テストスイートの整理と最適化を目的としています。
関連リンク
- Go Gerrit Change-ID: https://golang.org/cl/5673089
参考にした情報源リンク
- Go言語の公式ドキュメント(変数宣言、テストに関する情報)
- Go言語のソースコードリポジトリ(
test/fixedbugs
ディレクトリの構造、declbad.go
の存在に関する一般的な知識) - Go言語のテストに関する一般的な慣習と構文(
// ! $G $D/$F.go
など) - Go言語における再宣言エラーに関する一般的な情報