Browse Source

Fixed a bug with local character arrays initialized with a string

ceriel 29 years ago
parent
commit
c97f79454d
2 changed files with 6 additions and 3 deletions
  1. 3 2
      lang/cem/cemcom.ansi/code.c
  2. 3 1
      lang/cem/cemcom.ansi/idf.c

+ 3 - 2
lang/cem/cemcom.ansi/code.c

@@ -37,6 +37,7 @@
 #include	"atw.h"
 #include	"assert.h"
 #include	"LLlex.h"
+#include	"align.h"
 #ifdef	LINT
 #include	"l_lint.h"
 #endif	/* LINT */
@@ -559,7 +560,7 @@ loc_init(expr, id)
 			C_df_dlb((label)df->df_address);
 		} else {
 			C_lae_dlb((label)df->df_address, (arith)0);
-			load_block(tp->tp_size, 1);
+			load_block(tp->tp_size, word_align);
 			if (unknownsize) {
 				/* tmpoffset += tp->tp_size; */
 				unknownsize = 0;
@@ -570,7 +571,7 @@ loc_init(expr, id)
 						    , df->df_sc);
 			}
 			C_lal(tmpoffset);
-			store_block(tp->tp_size, 1);
+			store_block(tp->tp_size, tmpoffset % word_align ? 1 : word_align);
 			df->df_address = tmpoffset;
 			tmpoffset = 0;
 		}

+ 3 - 1
lang/cem/cemcom.ansi/idf.c

@@ -235,11 +235,13 @@ declare_idf(ds, dc, lvl)
 						idf->id_text);
 				/** type = idf->id_def->df_type = int_type; **/
 				}
-				newdef->df_address =
+				if (type->tp_size != (arith) -1) {
+				    newdef->df_address =
 					NewLocal(type->tp_size,
 						 type->tp_align,
 						 regtype(type),
 						 sc);
+				}
 				break;
 			case STATIC:
 				newdef->df_address = (arith) data_label();