[インデックス 1563] ファイルの概要
コミット
このコミット f1fe21a08fe1e96d1fad5633b3689274c139a21f
は、Goコンパイラの宣言処理に関連するバグ修正を目的としています。具体的には、構造体フィールドの型が不正な場合に適切なエラーを報告するように変更が加えられています。
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/f1fe21a08fe1e96d1fad5633b3689274c139a21f
元コミット内容
commit f1fe21a08fe1e96d1fad5633b3689274c139a21f
Author: Russ Cox <rsc@golang.org>
Date: Mon Jan 26 17:06:20 2009 -0800
bug134
R=ken
OCL=23532
CL=23532
---
src/cmd/gc/dcl.c | 19 +++++++++++++------
src/cmd/gc/go.h | 2 +-\
test/fixedbugs/bug134.go | 11 +++++++++++
3 files changed, 25 insertions(+), 7 deletions(-)
diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c
index a60637c258..edac4ca2c0 100644
--- a/src/cmd/gc/dcl.c
+++ b/src/cmd/gc/dcl.c
@@ -313,9 +313,9 @@ addmethod(Node *n, Type *t, int local)\n }\n \n if(d == T)\n-\t\tstotype(n, &pa->method);\n+\t\tstotype(n, 0, &pa->method);\n else\n-\t\tstotype(n, &d->down);\n+\t\tstotype(n, 0, &d->down);\n \n if(dflag())\n \tprint(\"method %S of type %T\\n\", sf, pa);\n@@ -472,36 +472,43 @@ funcbody(Node *n)\n * turn a parsed struct into a type\n */\n Type**\n-stotype(Node *n, Type **t)\n+stotype(Node *n, int et, Type **t)\n {\n Type *f;\n Iter save;\n String *note;\n+\tint lno;\n \n+\tlno = lineno;\n \tn = listfirst(&save, &n);\n \n loop:\n \tnote = nil;\n \tif(n == N) {\n \t\t*t = T;\n+\t\tlineno = lno;\n \t\treturn t;\n \t}\n \n+\tlineno = n->lineno;\n \tif(n->op == OLIST) {\n \t\t// recursive because it can be lists of lists\n-\t\tt = stotype(n, t);\n+\t\tt = stotype(n, et, t);\n \t\tgoto next;\n \t}\n \n \tif(n->op != ODCLFIELD || n->type == T)\n \t\tfatal(\"stotype: oops %N\\n\", n);\n \n+\tif(et == TSTRUCT && n->type->etype == TFUNC)\n+\t\tyyerror(\"bad structure field type: %T\", n->type);\n+\n \tswitch(n->val.ctype) {\n \tcase CTSTR:\n \t\tnote = n->val.u.sval;\n \t\tbreak;\n \tdefault:\n-\t\tyyerror(\"structure field annotation must be string\");\n+\t\tyyerror(\"field annotation must be string\");\n \tcase CTxxx:\n \t\tnote = nil;\n \t\tbreak;\n@@ -546,7 +553,7 @@ dostruct(Node *n, int et)\n \t}\n \tt = typ(et);\n \tt->funarg = funarg;\n-\tstotype(n, &t->type);\n+\tstotype(n, et, &t->type);\n \tif(!funarg)\n \t\tcheckwidth(t);\n \treturn t;\ndiff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index e1f64b5424..461c00b217 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -707,7 +707,7 @@ void funchdr(Node*);\n void funcargs(Type*);\n void funcbody(Node*);\n Type*\tdostruct(Node*, int);\n-Type**\tstotype(Node*, Type**);\n+Type**\tstotype(Node*, int, Type**);\n Type*\tsortinter(Type*);\n void markdcl(void);\n void popdcl(void);\ndiff --git a/test/fixedbugs/bug134.go b/test/fixedbugs/bug134.go
new file mode 100644
index 0000000000..e0817a41e8
--- /dev/null
+++ b/test/fixedbugs/bug134.go
@@ -0,0 +1,11 @@
+// Copyright 2009 The Go Authors. All rights reserved.\n+// Use of this source code is governed by a BSD-style\n+// license that can be found in the LICENSE file.\n+\n+// errchk $G $D/$F.go\n+\n+package main\n+\n+type T struct {\n+\tv (); // ERROR \"field type\"\n+}\n```
## 変更の背景
このコミットは、Go言語のコンパイラにおけるバグ `bug134` を修正するために作成されました。Go言語の初期段階では、構造体のフィールドとして関数型を宣言できてしまうという問題がありました。これはGo言語の設計意図に反するものであり、コンパイラがこれをエラーとして検出・報告する必要がありました。
具体的には、以下のようなコードがコンパイルできてしまう状況を修正することが目的でした。
```go
type T struct {
v (); // 関数型を構造体フィールドとして宣言
}
Go言語では、構造体フィールドはデータ型であるべきであり、関数型を直接フィールドとして持つことはできません(メソッドはレシーバを持つ関数であり、フィールドとは異なります)。このバグは、コンパイラが構造体フィールドの型チェックを適切に行っていなかったことに起因します。
前提知識の解説
このコミットを理解するためには、以下のGoコンパイラの基本的な概念とC言語のポインタに関する知識が必要です。
- Goコンパイラの構造: Goコンパイラは、ソースコードを解析し、抽象構文木(AST)を構築し、型チェックを行い、最終的に実行可能なバイナリを生成します。
src/cmd/gc
はGoコンパイラのフロントエンド部分であり、構文解析、型チェック、中間コード生成などを担当します。 dcl.c
: このファイルは、Goコンパイラにおける宣言(declarations)の処理を担当します。変数、関数、型などの宣言がどのように解析され、内部表現に変換されるかを定義しています。go.h
: Goコンパイラの内部で使用される共通の型定義、マクロ、関数プロトタイプなどが含まれるヘッダーファイルです。Node
: Goコンパイラがソースコードを解析して構築する抽象構文木のノードを表す構造体です。各ノードは、識別子、リテラル、式、文、宣言など、プログラムの要素に対応します。Type
: Goコンパイラが扱う型情報を表す構造体です。プリミティブ型、構造体型、関数型など、Go言語のあらゆる型がこの構造体で表現されます。stotype
関数: この関数は、Goコンパイラの内部で、パースされた構造体(Node
)をGoの型システムが理解できるType
構造体に変換する役割を担っています。特に、構造体フィールドの型を処理する際に使用されます。yyerror
関数: Goコンパイラがエラーメッセージを出力するために使用する関数です。コンパイルエラーが発生した場合に、ユーザーに分かりやすいメッセージを表示します。- C言語のポインタとポインタのポインタ (
Type**
):Type*
:Type
構造体へのポインタです。メモリ上のType
構造体のアドレスを保持します。Type**
:Type
構造体へのポインタへのポインタです。これは、Type*
型の変数のアドレスを保持します。stotype
関数がType**
を引数に取るのは、関数内で*t
を介して呼び出し元のType*
変数の値を直接変更するためです。これにより、新しい型情報を呼び出し元に「書き戻す」ことができます。
技術的詳細
このコミットの主要な変更点は、stotype
関数のシグネチャ変更と、それに伴う型チェックロジックの追加です。
-
stotype
関数のシグネチャ変更:- 変更前:
Type** stotype(Node *n, Type **t)
- 変更後:
Type** stotype(Node *n, int et, Type **t)
- 新しい引数
int et
が追加されました。このet
は "element type" または "expected type" の略であり、stotype
が処理している現在のコンテキスト(例えば、構造体フィールドの型を処理しているのか、関数の引数を処理しているのかなど)を示すための情報を提供します。これにより、stotype
関数はよりコンテキストに応じた型チェックを行うことが可能になります。
- 変更前:
-
構造体フィールドにおける関数型の禁止:
stotype
関数内に以下の新しいチェックが追加されました。if(et == TSTRUCT && n->type->etype == TFUNC) yyerror("bad structure field type: %T", n->type);
- このコードは、
stotype
が構造体(et == TSTRUCT
)のフィールドを処理しており、かつそのフィールドの型(n->type->etype
)が関数型(TFUNC
)である場合に、"bad structure field type"
というエラーメッセージを出力します。これにより、構造体フィールドに関数型が誤って宣言されることを防ぎます。
-
lineno
の管理:stotype
関数内で、lineno
(現在のソースコードの行番号)の保存と復元が行われるようになりました。これは、エラーメッセージの正確な行番号を報告するために重要です。stotype
が再帰的に呼び出される場合や、リストを処理する際に、正しい行番号が保持されるようにします。
-
エラーメッセージの改善:
stotype
関数内のyyerror
メッセージが"structure field annotation must be string"
から"field annotation must be string"
に変更されました。これは、より汎用的なエラーメッセージにするための改善です。
これらの変更により、Goコンパイラは構造体フィールドの型チェックを強化し、不正な型宣言を早期に検出できるようになりました。
コアとなるコードの変更箇所
src/cmd/gc/dcl.c
addmethod
関数とdostruct
関数におけるstotype
関数の呼び出しが、新しい引数0
(またはet
に対応する値)を追加するように変更されました。これは、stotype
のシグネチャ変更に対応するためです。stotype
関数自体のシグネチャが変更され、int et
引数が追加されました。stotype
関数内に、構造体フィールドが関数型である場合のチェックロジックが追加されました。stotype
関数内で、lineno
の保存と復元が行われるようになりました。stotype
関数内のエラーメッセージが修正されました。
src/cmd/gc/go.h
stotype
関数のプロトタイプ宣言が、新しい引数int
を追加するように変更されました。
test/fixedbugs/bug134.go
- 新しいテストファイルが追加されました。このテストは、構造体
T
のフィールドv
が関数型として宣言されている不正なケースを意図的に記述し、コンパイラが"field type"
というエラーを報告することを確認します。// ERROR "field type"
というコメントは、この行で期待されるエラーメッセージを示しています。
コアとなるコードの解説
src/cmd/gc/dcl.c
の stotype
関数
Type**
stotype(Node *n, int et, Type **t) // et 引数が追加
{
Type *f;
Iter save;
String *note;
int lno; // lineno を保存するための変数
lno = lineno; // 現在の行番号を保存
n = listfirst(&save, &n);
loop:
note = nil;
if(n == N) {
*t = T;
lineno = lno; // 処理終了時に行番号を復元
return t;
}
lineno = n->lineno; // ノードの行番号に設定
if(n->op == OLIST) {
// recursive because it can be lists of lists
t = stotype(n, et, t); // 再帰呼び出しでも et を渡す
goto next;
}
if(n->op != ODCLFIELD || n->type == T)
fatal("stotype: oops %N\\n", n);
// ★ここが今回のバグ修正の核心部分★
if(et == TSTRUCT && n->type->etype == TFUNC)
yyerror("bad structure field type: %T", n->type); // 構造体フィールドに関数型が指定された場合にエラー
switch(n->val.ctype) {
case CTSTR:
note = n->val.u.sval;
break;
default:
yyerror("field annotation must be string"); // エラーメッセージの修正
case CTxxx:
note = nil;
break;
}
// ... (後続の処理)
}
このstotype
関数の変更は、Goコンパイラの型システムが構造体フィールドの型をどのように解釈し、検証するかを根本的に改善しています。et
引数によって、関数が呼び出されたコンテキスト(この場合はTSTRUCT
、つまり構造体)を認識し、そのコンテキストに特有の制約(構造体フィールドは関数型であってはならない)を適用できるようになりました。
test/fixedbugs/bug134.go
// 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.
// errchk $G $D/$F.go // コンパイルエラーをチェックするテストであることを示す
package main
type T struct {
v (); // ERROR "field type" // この行で "field type" というエラーが期待される
}
このテストファイルは、Goコンパイラがtype T struct { v (); }
という不正な構造体宣言に対して、期待通りにエラーメッセージ"field type"
を出力するかどうかを検証します。errchk
ディレクティブは、Goのテストフレームワークがコンパイルエラーをチェックするための特別な指示です。
関連リンク
- Go言語のIssueトラッカー (Go Bug Tracker): Go言語のバグ報告や機能要望が管理されている場所です。
bug134
に関する詳細な議論や経緯が残っている可能性があります。 - Go言語のコンパイラソースコード:
src/cmd/gc
ディレクトリはGoコンパイラのフロントエンドのソースコードを含んでいます。
参考にした情報源リンク
- Go言語の公式ドキュメント
- Go言語のソースコード (特に
src/cmd/gc
ディレクトリ) - Go言語のIssueトラッカー (もし
bug134
に関する公開情報があれば)
(注:bug134
に関する具体的なGo Issueへのリンクは、現在の情報からは特定できませんでした。Goの初期のバグトラッカーは現在のGitHubとは異なるシステムであった可能性があり、古いIssueはアーカイブされているか、検索が難しい場合があります。)
# [インデックス 1563] ファイルの概要
## コミット
このコミット `f1fe21a08fe1e96d1fad5633b3689274c139a21f` は、Goコンパイラの宣言処理に関連するバグ修正を目的としています。具体的には、構造体フィールドの型が不正な場合に適切なエラーを報告するように変更が加えられています。
## GitHub上でのコミットページへのリンク
[https://github.com/golang/go/commit/f1fe21a08fe1e96d1fad5633b3689274c139a21f](https://github.com/golang.go/commit/f1fe21a08fe1e96d1fad5633b3689274c139a21f)
## 元コミット内容
commit f1fe21a08fe1e96d1fad5633b3689274c139a21f Author: Russ Cox rsc@golang.org Date: Mon Jan 26 17:06:20 2009 -0800
bug134
R=ken
OCL=23532
CL=23532
src/cmd/gc/dcl.c | 19 +++++++++++++------
src/cmd/gc/go.h | 2 +-
test/fixedbugs/bug134.go | 11 +++++++++++
3 files changed, 25 insertions(+), 7 deletions(-)\n
diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c
index a60637c258..edac4ca2c0 100644
--- a/src/cmd/gc/dcl.c
+++ b/src/cmd/gc/dcl.c
@@ -313,9 +313,9 @@ addmethod(Node n, Type t, int local)\n }\n \n if(d == T)\n-\t\tstotype(n, &pa->method);\n+\t\tstotype(n, 0, &pa->method);\n else\n-\t\tstotype(n, &d->down);\n+\t\tstotype(n, 0, &d->down);\n \n if(dflag())\n \tprint("method %S of type %T\n", sf, pa);\n@@ -472,36 +472,43 @@ funcbody(Node n)\n * turn a parsed struct into a type\n /\n Type\n-stotype(Node n, Type t)\n+stotype(Node n, int et, Type t)\n {\n Type f;\n Iter save;\n String note;\n+\tint lno;\n \n+\tlno = lineno;\n \tn = listfirst(&save, &n);\n \n loop:\n \tnote = nil;\n \tif(n == N) {\n \t\tt = T;\n+\t\tlineno = lno;\n \t\treturn t;\n \t}\n \n+\tlineno = n->lineno;\n \tif(n->op == OLIST) {\n \t\t// recursive because it can be lists of lists\n-\t\tt = stotype(n, t);\n+\t\tt = stotype(n, et, t);\n \t\tgoto next;\n \t}\n \n \tif(n->op != ODCLFIELD || n->type == T)\n \t\tfatal("stotype: oops %N\n", n);\n \n+\tif(et == TSTRUCT && n->type->etype == TFUNC)\n+\t\tyyerror("bad structure field type: %T", n->type);\n+\n \tswitch(n->val.ctype) {\n \tcase CTSTR:\n \t\tnote = n->val.u.sval;\n \t\tbreak;\n \tdefault:\n-\t\tyyerror("structure field annotation must be string");\n+\t\tyyerror("field annotation must be string");\n \tcase CTxxx:\n \t\tnote = nil;\n \t\tbreak;\n@@ -546,7 +553,7 @@ dostruct(Node n, int et)\n \t}\n \tt = typ(et);\n \tt->funarg = funarg;\n-\tstotype(n, &t->type);\n+\tstotype(n, et, &t->type);\n \tif(!funarg)\n \t\tcheckwidth(t);\n \treturn t;\ndiff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index e1f64b5424..461c00b217 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -707,7 +707,7 @@ void funchdr(Node);\n void funcargs(Type);\n void funcbody(Node);\n Type\tdostruct(Node, int);\n-Type\tstotype(Node, Type);\n+Type**\tstotype(Node*, int, Type**);\n Type*\tsortinter(Type*);\n void\tmarkdcl(void);\n void\tpopdcl(void);\ndiff --git a/test/fixedbugs/bug134.go b/test/fixedbugs/bug134.go
new file mode 100644
index 0000000000..e0817a41e8
--- /dev/null
+++ b/test/fixedbugs/bug134.go
@@ -0,0 +1,11 @@
+// Copyright 2009 The Go Authors. All rights reserved.\n+// Use of this source code is governed by a BSD-style\n+// license that can be found in the LICENSE file.\n+\n+// errchk $G $D/$F.go\n+\n+package main\n+\n+type T struct {\n+\tv (); // ERROR "field type"\n+}\n```
変更の背景
このコミットは、Go言語のコンパイラにおけるバグ bug134
を修正するために作成されました。Go言語の初期段階では、構造体のフィールドとして関数型を宣言できてしまうという問題がありました。これはGo言語の設計意図に反するものであり、コンパイラがこれをエラーとして検出・報告する必要がありました。
具体的には、以下のようなコードがコンパイルできてしまう状況を修正することが目的でした。
type T struct {
v (); // 関数型を構造体フィールドとして宣言
}
Go言語では、構造体フィールドはデータ型であるべきであり、関数型を直接フィールドとして持つことはできません(メソッドはレシーバを持つ関数であり、フィールドとは異なります)。このバグは、コンパイラが構造体フィールドの型チェックを適切に行っていなかったことに起因します。
前提知識の解説
このコミットを理解するためには、以下のGoコンパイラの基本的な概念とC言語のポインタに関する知識が必要です。
- Goコンパイラの構造: Goコンパイラは、ソースコードを解析し、抽象構文木(AST)を構築し、型チェックを行い、最終的に実行可能なバイナリを生成します。
src/cmd/gc
はGoコンパイラのフロントエンド部分であり、構文解析、型チェック、中間コード生成などを担当します。 dcl.c
: このファイルは、Goコンパイラにおける宣言(declarations)の処理を担当します。変数、関数、型などの宣言がどのように解析され、内部表現に変換されるかを定義しています。go.h
: Goコンパイラの内部で使用される共通の型定義、マクロ、関数プロトタイプなどが含まれるヘッダーファイルです。Node
: Goコンパイラがソースコードを解析して構築する抽象構文木のノードを表す構造体です。各ノードは、識別子、リテラル、式、文、宣言など、プログラムの要素に対応します。Type
: Goコンパイラが扱う型情報を表す構造体です。プリミティブ型、構造体型、関数型など、Go言語のあらゆる型がこの構造体で表現されます。stotype
関数: この関数は、Goコンパイラの内部で、パースされた構造体(Node
)をGoの型システムが理解できるType
構造体に変換する役割を担っています。特に、構造体フィールドの型を処理する際に使用されます。yyerror
関数: Goコンパイラがエラーメッセージを出力するために使用する関数です。コンパイルエラーが発生した場合に、ユーザーに分かりやすいメッセージを表示します。- C言語のポインタとポインタのポインタ (
Type**
):Type*
:Type
構造体へのポインタです。メモリ上のType
構造体のアドレスを保持します。Type**
:Type
構造体へのポインタへのポインタです。これは、Type*
型の変数のアドレスを保持します。stotype
関数がType**
を引数に取るのは、関数内で*t
を介して呼び出し元のType*
変数の値を直接変更するためです。これにより、新しい型情報を呼び出し元に「書き戻す」ことができます。
技術的詳細
このコミットの主要な変更点は、stotype
関数のシグネチャ変更と、それに伴う型チェックロジックの追加です。
-
stotype
関数のシグネチャ変更:- 変更前:
Type** stotype(Node *n, Type **t)
- 変更後:
Type** stotype(Node *n, int et, Type **t)
- 新しい引数
int et
が追加されました。このet
は "element type" または "expected type" の略であり、stotype
が処理している現在のコンテキスト(例えば、構造体フィールドの型を処理しているのか、関数の引数を処理しているのかなど)を示すための情報を提供します。これにより、stotype
関数はよりコンテキストに応じた型チェックを行うことが可能になります。
- 変更前:
-
構造体フィールドにおける関数型の禁止:
stotype
関数内に以下の新しいチェックが追加されました。if(et == TSTRUCT && n->type->etype == TFUNC) yyerror("bad structure field type: %T", n->type);
- このコードは、
stotype
が構造体(et == TSTRUCT
)のフィールドを処理しており、かつそのフィールドの型(n->type->etype
)が関数型(TFUNC
)である場合に、"bad structure field type"
というエラーメッセージを出力します。これにより、構造体フィールドに関数型が誤って宣言されることを防ぎます。
-
lineno
の管理:stotype
関数内で、lineno
(現在のソースコードの行番号)の保存と復元が行われるようになりました。これは、エラーメッセージの正確な行番号を報告するために重要です。stotype
が再帰的に呼び出される場合や、リストを処理する際に、正しい行番号が保持されるようにします。
-
エラーメッセージの改善:
stotype
関数内のyyerror
メッセージが"structure field annotation must be string"
から"field annotation must be string"
に変更されました。これは、より汎用的なエラーメッセージにするための改善です。
これらの変更により、Goコンパイラは構造体フィールドの型チェックを強化し、不正な型宣言を早期に検出できるようになりました。
コアとなるコードの変更箇所
src/cmd/gc/dcl.c
addmethod
関数とdostruct
関数におけるstotype
関数の呼び出しが、新しい引数0
(またはet
に対応する値)を追加するように変更されました。これは、stotype
のシグネチャ変更に対応するためです。stotype
関数自体のシグネチャが変更され、int et
引数が追加されました。stotype
関数内に、構造体フィールドが関数型である場合のチェックロジックが追加されました。stotype
関数内で、lineno
の保存と復元が行われるようになりました。stotype
関数内のエラーメッセージが修正されました。
src/cmd/gc/go.h
stotype
関数のプロトタイプ宣言が、新しい引数int
を追加するように変更されました。
test/fixedbugs/bug134.go
- 新しいテストファイルが追加されました。このテストは、構造体
T
のフィールドv
が関数型として宣言されている不正なケースを意図的に記述し、コンパイラが"field type"
というエラーを報告することを確認します。// ERROR "field type"
というコメントは、この行で期待されるエラーメッセージを示しています。
コアとなるコードの解説
src/cmd/gc/dcl.c
の stotype
関数
Type**
stotype(Node *n, int et, Type **t) // et 引数が追加
{
Type *f;
Iter save;
String *note;
int lno; // lineno を保存するための変数
lno = lineno; // 現在の行番号を保存
n = listfirst(&save, &n);
loop:
note = nil;
if(n == N) {
*t = T;
lineno = lno; // 処理終了時に行番号を復元
return t;
}
lineno = n->lineno; // ノードの行番号に設定
if(n->op == OLIST) {
// recursive because it can be lists of lists
t = stotype(n, et, t); // 再帰呼び出しでも et を渡す
goto next;
}
if(n->op != ODCLFIELD || n->type == T)
fatal("stotype: oops %N\\n", n);
// ★ここが今回のバグ修正の核心部分★
if(et == TSTRUCT && n->type->etype == TFUNC)
yyerror("bad structure field type: %T", n->type); // 構造体フィールドに関数型が指定された場合にエラー
switch(n->val.ctype) {
case CTSTR:
note = n->val.u.sval;
break;
default:
yyerror("field annotation must be string"); // エラーメッセージの修正
case CTxxx:
note = nil;
break;
}
// ... (後続の処理)
}
このstotype
関数の変更は、Goコンパイラの型システムが構造体フィールドの型をどのように解釈し、検証するかを根本的に改善しています。et
引数によって、関数が呼び出されたコンテキスト(この場合はTSTRUCT
、つまり構造体)を認識し、そのコンテキストに特有の制約(構造体フィールドは関数型であってはならない)を適用できるようになりました。
test/fixedbugs/bug134.go
// 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.
// errchk $G $D/$F.go // コンパイルエラーをチェックするテストであることを示す
package main
type T struct {
v (); // ERROR "field type" // この行で "field type" というエラーが期待される
}
このテストファイルは、Goコンパイラがtype T struct { v (); }
という不正な構造体宣言に対して、期待通りにエラーメッセージ"field type"
を出力するかどうかを検証します。errchk
ディレクティブは、Goのテストフレームワークがコンパイルエラーをチェックするための特別な指示です。
関連リンク
- Go言語のIssueトラッカー (Go Bug Tracker): Go言語のバグ報告や機能要望が管理されている場所です。
bug134
に関する詳細な議論や経緯が残っている可能性があります。 - Go言語のコンパイラソースコード:
src/cmd/gc
ディレクトリはGoコンパイラのフロントエンドのソースコードを含んでいます。
参考にした情報源リンク
- Go言語の公式ドキュメント
- Go言語のソースコード (特に
src/cmd/gc
ディレクトリ) - Go言語のIssueトラッカー (もし
bug134
に関する公開情報があれば)
(注:bug134
に関する具体的なGo Issueへのリンクは、現在の情報からは特定できませんでした。Goの初期のバグトラッカーは現在のGitHubとは異なるシステムであった可能性があり、古いIssueはアーカイブされているか、検索が難しい場合があります。)