Commit 6c2738eb authored by Russ Cox's avatar Russ Cox

bug181 - type T *struct { T } is an invalid embedded type

R=ken
OCL=32886
CL=32886
parent 99eca57d
...@@ -900,8 +900,10 @@ stotype(NodeList *l, int et, Type **t) ...@@ -900,8 +900,10 @@ stotype(NodeList *l, int et, Type **t)
t1 = n->type; t1 = n->type;
if(t1->sym == S && isptr[t1->etype]) if(t1->sym == S && isptr[t1->etype])
t1 = t1->type; t1 = t1->type;
if(t1 != T && isptr[t1->etype]) if(isptr[t1->etype])
yyerror("embedded type cannot be a pointer"); yyerror("embedded type cannot be a pointer");
else if(t1->etype == TFORW && t1->embedlineno == 0)
t1->embedlineno = lineno;
} }
} }
......
...@@ -175,6 +175,7 @@ struct Type ...@@ -175,6 +175,7 @@ struct Type
int32 bound; // negative is dynamic array int32 bound; // negative is dynamic array
int32 maplineno; // first use of TFORW as map key int32 maplineno; // first use of TFORW as map key
int32 embedlineno; // first use of TFORW as embedded type
}; };
#define T ((Type*)0) #define T ((Type*)0)
......
...@@ -111,7 +111,7 @@ walkdeflist(NodeList *l) ...@@ -111,7 +111,7 @@ walkdeflist(NodeList *l)
void void
walkdef(Node *n) walkdef(Node *n)
{ {
int lno, maplineno; int lno, maplineno, embedlineno;
NodeList *init; NodeList *init;
Node *e; Node *e;
Type *t; Type *t;
...@@ -210,6 +210,7 @@ walkdef(Node *n) ...@@ -210,6 +210,7 @@ walkdef(Node *n)
// copy new type and clear fields // copy new type and clear fields
// that don't come along // that don't come along
maplineno = n->type->maplineno; maplineno = n->type->maplineno;
embedlineno = n->type->embedlineno;
*n->type = *t; *n->type = *t;
t = n->type; t = n->type;
t->sym = n->sym; t->sym = n->sym;
...@@ -226,6 +227,11 @@ walkdef(Node *n) ...@@ -226,6 +227,11 @@ walkdef(Node *n)
lineno = maplineno; lineno = maplineno;
maptype(n->type, types[TBOOL]); maptype(n->type, types[TBOOL]);
} }
if(embedlineno) {
lineno = embedlineno;
if(isptr[t->etype])
yyerror("embedded type cannot be a pointer");
}
break; break;
} }
......
// errchk $G $D/$F.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.
package main
type T *struct {
T; // ERROR "embed.*pointer"
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment