changeset 546:9cdd602cc050

SFDINIT will not define local symbol
author kono
date Mon, 02 Jan 2006 17:37:15 +0900
parents 2f577690bcfb
children 9defd9459016
files Changes mc-parse.c
diffstat 2 files changed, 13 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Mon Jan 02 14:38:51 2006 +0900
+++ b/Changes	Mon Jan 02 17:37:15 2006 +0900
@@ -7754,7 +7754,7 @@
 decl_data のINTの場合にcorret_typeするとsigned/byteの情報が
 失われてしまう。
 
-local struct init の場合に式を使うことができない。
+local struct init の場合に式を使うことができない。やっぱり、まずいか。
 local struct static を切ればいいんだけど。式があったら、
 代入するようにすれば良いんだが。(ま、いいか?)
 
@@ -7770,9 +7770,10 @@
 adpt_ps2/ot.c:    ot_Init_node();
 adpt_ps2/ot.h:inline char ot_Init_node( void );
 
-あぁ、ひどい。inline っていう嘘」をつくことが可能なのか。しかも、
+あぁ、ひどい。inline っていう嘘をつくことが可能なのか。しかも、
 Warning さえ出ないのか。でも、動いてはいるのか。
 
 n->sc にFUNCTIONが入るのは間違い?
 
-
+linux が通らなくなってるね。struct field のネストね。通したはずなんだが。
+
--- a/mc-parse.c	Mon Jan 02 14:38:51 2006 +0900
+++ b/mc-parse.c	Mon Jan 02 17:37:15 2006 +0900
@@ -694,8 +694,8 @@
 	    error(DCERR);
 	break;
     case REGISTER:
-	if(mode!=LDECL)
-	    error(DCERR);
+	//if(mode!=LDECL)
+	//    error(DCERR);
 	stmode=REGISTER;
 	getsym(0);
 	conv->register_();
@@ -769,7 +769,7 @@
 	    error(DCERR); return;
 	}
     }
-    while (sym==ATTRIBUTE) { getsym(0); attributes(); }
+    while (sym==ATTRIBUTE||sym==ASM) { getsym(0); attributes(); }
     if(sym==LC || ( sym!=SM && sym!=COMMA && sym!=ASS)) {
 	/* function body */
 	if (mode!=GDECL) error(DCERR);
@@ -1325,7 +1325,7 @@
     a[] = {,,,,};
  */
 
-#define LOCAL_STRUCT_INIT_STATIC 1
+#define LOCAL_STRUCT_INIT_STATIC 0
 
 static void
 decl_data_field(int type,NMTBL *n,int offset)
@@ -1489,7 +1489,7 @@
  	offset = assign_data(e,t,n,offset);
  	type=t;
 	return offset;
-    } else if (t1==STRUCT) {
+    } else if (t1==STRUCT||t1==UNION) {
         if (sym==LC) lc=1; 
 	conv->lc_(); conv->decl_data_begin_();
 	mode = mode_save;
@@ -4085,9 +4085,10 @@
 	sym = IDENT;
 	gnptr=nptr=nptr0;
 
-	if (mode==ADECL && nptr0->sc ==TYPE) return sym;
-	if (mode==GDECL || mode==GSDECL || mode==GUDECL ||
-	    mode==GTDECL || mode==TOP || mode==GEDECL) {
+	switch(mode) {
+	case ADECL: if (nptr0->sc ==TYPE) return sym; break;
+	case GDECL: case GSDECL: case GUDECL: 
+	case GTDECL: case TOP: case GEDECL: case SFDINIT:
 	    return sym;
 	}
 	if (nptr->sc == TYPE) return sym;