structure field annotation strings

R=ken
OCL=18176
CL=18176
diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c
index 649ecdd..f88d2ab 100644
--- a/src/cmd/gc/dcl.c
+++ b/src/cmd/gc/dcl.c
@@ -450,10 +450,12 @@
 	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 @@
 	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 b670be6..a0afb43 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -147,6 +147,7 @@
 
 	// 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 35dbec6..c49c47f 100644
--- a/src/cmd/gc/go.y
+++ b/src/cmd/gc/go.y
@@ -72,6 +72,7 @@
 %type	<type>		non_name_type Anon_fn_type Bnon_fn_type
 %type	<type>		Anon_chan_type Bnon_chan_type
 %type	<type>		indcl fnlitdcl dotdotdot
+%type	<val>		oliteral
 
 %type	<val>		hidden_constant
 %type	<node>		hidden_dcl hidden_structdcl
@@ -1388,10 +1389,11 @@
 		$$ = 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 @@
 		$$ = 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 1a45d4c..d774a8d 100644
--- a/src/cmd/gc/subr.c
+++ b/src/cmd/gc/subr.c
@@ -1078,9 +1078,12 @@
 		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)