mirror of https://github.com/golang/go.git
bug181 - type T *struct { T } is an invalid embedded type
R=ken OCL=32886 CL=32886
This commit is contained in:
parent
99eca57d43
commit
6c2738eb43
|
|
@ -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
|
||||||
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)
|
||||||
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)
|
||||||
// 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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
// 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"
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue