@@ -96,16 +96,16 @@ func typekind(t *Type) string {
96
96
return fmt .Sprintf ("etype=%d" , et )
97
97
}
98
98
99
- // sprint_depchain prints a dependency chain of nodes into fmt .
99
+ // sprint_depchain prints a dependency chain of nodes into trace .
100
100
// It is used by typecheck in the case of OLITERAL nodes
101
101
// to print constant definition loops.
102
- func sprint_depchain (fmt_ * string , stack []* Node , cur * Node , first * Node ) {
102
+ func sprint_depchain (trace * string , stack []* Node , cur * Node , first * Node ) {
103
103
for i := len (stack ) - 1 ; i >= 0 ; i -- {
104
104
if n := stack [i ]; n .Op == cur .Op {
105
105
if n != first {
106
- sprint_depchain (fmt_ , stack [:i ], n , first )
106
+ sprint_depchain (trace , stack [:i ], n , first )
107
107
}
108
- * fmt_ += fmt .Sprintf ("\n \t %v: %v uses %v" , n .Line (), n , cur )
108
+ * trace += fmt .Sprintf ("\n \t %v: %v uses %v" , n .Line (), n , cur )
109
109
return
110
110
}
111
111
}
@@ -152,30 +152,37 @@ func typecheck(n *Node, top int) *Node {
152
152
if n .Typecheck == 2 {
153
153
// Typechecking loop. Trying printing a meaningful message,
154
154
// otherwise a stack trace of typechecking.
155
- var fmt_ string
156
155
switch n .Op {
157
156
// We can already diagnose variables used as types.
158
157
case ONAME :
159
158
if top & (Erv | Etype ) == Etype {
160
159
yyerror ("%v is not a type" , n )
161
160
}
162
161
162
+ case OTYPE :
163
+ if top & Etype == Etype {
164
+ var trace string
165
+ sprint_depchain (& trace , typecheck_tcstack , n , n )
166
+ yyerrorl (n .Lineno , "invalid recursive type alias %v%s" , n , trace )
167
+ }
168
+
163
169
case OLITERAL :
164
170
if top & (Erv | Etype ) == Etype {
165
171
yyerror ("%v is not a type" , n )
166
172
break
167
173
}
168
- sprint_depchain (& fmt_ , typecheck_tcstack , n , n )
169
- yyerrorl (n .Lineno , "constant definition loop%s" , fmt_ )
174
+ var trace string
175
+ sprint_depchain (& trace , typecheck_tcstack , n , n )
176
+ yyerrorl (n .Lineno , "constant definition loop%s" , trace )
170
177
}
171
178
172
179
if nsavederrors + nerrors == 0 {
173
- fmt_ = ""
180
+ var trace string
174
181
for i := len (typecheck_tcstack ) - 1 ; i >= 0 ; i -- {
175
182
x := typecheck_tcstack [i ]
176
- fmt_ += fmt .Sprintf ("\n \t %v %v" , x .Line (), x )
183
+ trace += fmt .Sprintf ("\n \t %v %v" , x .Line (), x )
177
184
}
178
- yyerror ("typechecking loop involving %v%s" , n , fmt_ )
185
+ yyerror ("typechecking loop involving %v%s" , n , trace )
179
186
}
180
187
181
188
lineno = lno
0 commit comments