fixed memory fault, adapted mechanism code_scope
authorceriel <none@none>
Wed, 1 Nov 1989 15:41:06 +0000 (15:41 +0000)
committerceriel <none@none>
Wed, 1 Nov 1989 15:41:06 +0000 (15:41 +0000)
lang/cem/cemcom/code.c
lang/cem/cemcom/expr.c
lang/cem/cemcom/ival.g

index 157f76f..3ccd4b2 100644 (file)
@@ -382,11 +382,6 @@ code_declaration(idf, expr, lvl, sc)
                return;
        if (sc == EXTERN && expr && !is_anon_idf(idf))
                error("%s is extern; cannot initialize", idf->id_text);
-#ifndef PREPEND_SCOPES
-       if (def->df_type->tp_fund == FUNCTION) {
-               code_scope(idf->id_text, def);
-       }
-#endif PREPEND_SCOPES
        if (lvl == L_GLOBAL)    {       /* global variable      */
                /* is this an allocating declaration? */
                if (    (sc == 0 || sc == STATIC)
@@ -429,9 +424,6 @@ code_declaration(idf, expr, lvl, sc)
                case GLOBAL:
                case IMPLICIT:
                        /* we are sure there is no expression */
-#ifndef        PREPEND_SCOPES
-                       code_scope(idf->id_text, def);
-#endif PREPEND_SCOPES
                        break;
                case AUTO:
                case REGISTER:
index a96521d..3d0b246 100644 (file)
@@ -22,6 +22,7 @@
 #include       "sizes.h"
 #include       "level.h"
 #include       "noRoption.h"
+#include       "use_tmp.h"
 
 extern char *symbol2str();
 extern char options[];
@@ -183,7 +184,12 @@ idf2expr(expr)
        }
        else {
 #ifndef        LINT
-               def->df_used = 1;
+               if (! def->df_used) {
+                       def->df_used = 1;
+#ifndef PREPEND_SCOPES
+                       code_scope(idf->id_text, def);
+#endif PREPEND_SCOPES
+               }
 #endif LINT
                expr->ex_type = def->df_type;
                if (expr->ex_type == error_type)
index 02a1feb..e3738d6 100644 (file)
@@ -38,6 +38,7 @@ char *long2str();
 char *strncpy();
 extern char options[];
 static int gen_error;
+static int pack_level;
 struct type **gen_tphead(), **gen_tpmiddle();
 struct sdef *gen_align_to_next();
 struct e_stack *p_stack;
@@ -69,7 +70,6 @@ initial_value(register struct type **tpp; register struct expr **expp;) :
 ;
 
 initial_value_pack(struct type **tpp; struct expr **expp;)
-       { static int pack_level; }
 :
        '{'
                        { if (pack_level == 0) gen_error = 0; pack_level++; }
@@ -83,6 +83,7 @@ initial_value_pack(struct type **tpp; struct expr **expp;)
                                        p_stack = p;
                                }
                          }
+                         if (pack_level < gen_error) gen_error = 0;
                        }
        '}'
 ;
@@ -115,20 +116,20 @@ gen_tpcheck(tpp, union_allowed)
        switch((tp = *tpp)->tp_fund) {
        case ARRAY:
                if (! valid_type(tp->tp_up, "array element"))
-                       gen_error = 1;
+                       gen_error = pack_level;
                break;
        case STRUCT:
                if (! valid_type(tp, "struct"))
-                       gen_error = 1;
+                       gen_error = pack_level;
                break;
        case UNION:
                if (! union_allowed) {
                        error("union initialisation not allowed");
-                       gen_error = 1;
+                       gen_error = pack_level;
                        break;
                }
                if (! valid_type(tp, "union"))
-                       gen_error = 1;
+                       gen_error = pack_level;
                break;
        }
 }
@@ -152,7 +153,7 @@ gen_simple_exp(tpp, expp)
                check_and_pad(expp, tpp);
                break;
        case ERRONEOUS:
-               gen_error = 1;
+               gen_error = pack_level;
                break;
        default:
                check_ival(expp, tp);
@@ -200,7 +201,7 @@ gen_tphead(tpp, nest)
        register struct sdef *sd;
 
        if (tpp && *tpp == error_type) {
-               gen_error = 1;
+               gen_error = pack_level;
                return 0;
        }
        if (gen_error) return tpp;
@@ -229,7 +230,7 @@ gen_tphead(tpp, nest)
 #endif
                if (! sd) {
                        /* something wrong with this struct */
-                       gen_error = 1;
+                       gen_error = pack_level;
                        p_stack = p->next;
                        free_e_stack(p);
                        return 0;
@@ -358,7 +359,6 @@ gen_tpend()
            free_e_stack(p_stack);
            p_stack = p;
        }
-       gen_error = 0;
 }
 
 /*     check_and_pad() is given a simple initialisation expression
@@ -687,12 +687,12 @@ illegal_init_cst(ex)
        struct expr *ex;
 {
        expr_error(ex, "illegal initialisation constant");
-       gen_error = 1;
+       gen_error = pack_level;
 }
 
 too_many_initialisers()
 {
        error("too many initialisers");
-       gen_error = 1;
+       gen_error = pack_level;
 }
 }