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

[インデックス 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関数のシグネチャ変更と、それに伴う型チェックロジックの追加です。

  1. stotype関数のシグネチャ変更:

    • 変更前: Type** stotype(Node *n, Type **t)
    • 変更後: Type** stotype(Node *n, int et, Type **t)
    • 新しい引数 int et が追加されました。この et は "element type" または "expected type" の略であり、stotypeが処理している現在のコンテキスト(例えば、構造体フィールドの型を処理しているのか、関数の引数を処理しているのかなど)を示すための情報を提供します。これにより、stotype関数はよりコンテキストに応じた型チェックを行うことが可能になります。
  2. 構造体フィールドにおける関数型の禁止:

    • 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"というエラーメッセージを出力します。これにより、構造体フィールドに関数型が誤って宣言されることを防ぎます。
  3. linenoの管理:

    • stotype関数内で、lineno(現在のソースコードの行番号)の保存と復元が行われるようになりました。これは、エラーメッセージの正確な行番号を報告するために重要です。stotypeが再帰的に呼び出される場合や、リストを処理する際に、正しい行番号が保持されるようにします。
  4. エラーメッセージの改善:

    • 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.cstotype 関数

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関数のシグネチャ変更と、それに伴う型チェックロジックの追加です。

  1. stotype関数のシグネチャ変更:

    • 変更前: Type** stotype(Node *n, Type **t)
    • 変更後: Type** stotype(Node *n, int et, Type **t)
    • 新しい引数 int et が追加されました。この et は "element type" または "expected type" の略であり、stotypeが処理している現在のコンテキスト(例えば、構造体フィールドの型を処理しているのか、関数の引数を処理しているのかなど)を示すための情報を提供します。これにより、stotype関数はよりコンテキストに応じた型チェックを行うことが可能になります。
  2. 構造体フィールドにおける関数型の禁止:

    • 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"というエラーメッセージを出力します。これにより、構造体フィールドに関数型が誤って宣言されることを防ぎます。
  3. linenoの管理:

    • stotype関数内で、lineno(現在のソースコードの行番号)の保存と復元が行われるようになりました。これは、エラーメッセージの正確な行番号を報告するために重要です。stotypeが再帰的に呼び出される場合や、リストを処理する際に、正しい行番号が保持されるようにします。
  4. エラーメッセージの改善:

    • 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.cstotype 関数

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はアーカイブされているか、検索が難しい場合があります。)