diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c index 649ecddc807..f88d2ab942a 100644 --- a/src/cmd/gc/dcl.c +++ b/src/cmd/gc/dcl.c @@ -450,10 +450,12 @@ stotype(Node *n, Type **t) Type *f; Iter save; char buf[100]; + String *note; n = listfirst(&save, &n); loop: + note = nil; if(n == N) { *t = T; return t; @@ -471,8 +473,20 @@ loop: if(n->type->etype == TARRAY && n->type->bound < 0) yyerror("type of a structure field cannot be an open array"); + switch(n->val.ctype) { + case CTSTR: + note = n->val.u.sval; + break; + default: + yyerror("structure field annotation must be string"); + case CTxxx: + note = nil; + break; + } + f = typ(TFIELD); f->type = n->type; + f->note = note; if(n->left != N && n->left->op == ONAME) { f->nname = n->left; diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h index b670be685d6..a0afb434dd1 100644 --- a/src/cmd/gc/go.h +++ b/src/cmd/gc/go.h @@ -147,6 +147,7 @@ struct Type // TFIELD Type* down; // also used in TMAP + String* note; // literal string annotation // TARRAY int32 bound; // negative is dynamic array diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y index 35dbec66cf5..c49c47f21e7 100644 --- a/src/cmd/gc/go.y +++ b/src/cmd/gc/go.y @@ -72,6 +72,7 @@ %type non_name_type Anon_fn_type Bnon_fn_type %type Anon_chan_type Bnon_chan_type %type indcl fnlitdcl dotdotdot +%type oliteral %type hidden_constant %type hidden_dcl hidden_structdcl @@ -1388,10 +1389,11 @@ structdcl: $$ = nod(ODCLFIELD, $1, N); $$ = nod(OLIST, $$, $3); } -| new_name type +| new_name type oliteral { $$ = nod(ODCLFIELD, $1, N); $$->type = $2; + $$->val = $3; } | embed | '*' embed @@ -1761,6 +1763,12 @@ oexport: $$ = 1; } +oliteral: + { + $$.ctype = CTxxx; + } +| LLITERAL + /* * import syntax from header of * an output package diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c index 1a45d4ce53a..d774a8d8349 100644 --- a/src/cmd/gc/subr.c +++ b/src/cmd/gc/subr.c @@ -1078,9 +1078,12 @@ Tpretty(Fmt *fp, Type *t) if(t->sym == S || t->embedded) { if(exporting) fmtprint(fp, "? "); - return fmtprint(fp, "%T", t->type); - } - return fmtprint(fp, "%hS %T", t->sym, t->type); + fmtprint(fp, "%T", t->type); + } else + fmtprint(fp, "%hS %T", t->sym, t->type); + if(t->note) + fmtprint(fp, " \"%Z\"", t->note); + return 0; case TFORW: if(exporting)