Here is a patch to push
I hope to help you.

jiang
commit 512947a3cc497cee5e4f5c0aa3f17f81fa2bb18b
Author: jiang <30155...@qq.com>
Date:   Mon Jun 16 16:43:40 2014 +0800

    #define bug fixes
    bug:
    #define hexCh(c (c >= 10 ? 'a' + c - 10 : '0' + c)
    hexCh(c);

diff --git a/tccpp.c b/tccpp.c
index 053fd57..dfbc857 100644
--- a/tccpp.c
+++ b/tccpp.c
@@ -1253,16 +1253,15 @@ ST_FUNC void parse_define(void)
                 next_nomacro();
             }
             if (varg < TOK_IDENT)
-                tcc_error("badly punctuated parameter list");
+                tcc_error("may not appear in macro parameter list: \"%s\"", 
get_tok_str(varg, NULL));
             s = sym_push2(&define_stack, varg | SYM_FIELD, is_vaargs, 0);
             *ps = s;
             ps = &s->next;
             if (tok != ',')
-                break;
+                continue;
             next_nomacro();
         }
-        if (tok == ')')
-            next_nomacro_spc();
+        next_nomacro_spc();
         t = MACRO_FUNC;
     }
     tok_str_new(&str);
commit 588794e66871c1042ab96a644b0da19681268e78
Author: jiang <30155...@qq.com>
Date:   Sun Jun 22 15:28:34 2014 +0800

    Add warning

diff --git a/libtcc.c b/libtcc.c
index d761582..0f8477c 100644
--- a/libtcc.c
+++ b/libtcc.c
@@ -1404,8 +1404,9 @@ static const FlagDef warning_defs[] = {
     { offsetof(TCCState, warn_unsupported), 0, "unsupported" },
     { offsetof(TCCState, warn_write_strings), 0, "write-strings" },
     { offsetof(TCCState, warn_error), 0, "error" },
-    { offsetof(TCCState, warn_implicit_function_declaration), WD_ALL,
-      "implicit-function-declaration" },
+    { offsetof(TCCState, warn_implicit_function_declaration), WD_ALL, 
"implicit-function-declaration" },
+    { offsetof(TCCState, warn_return_type), WD_ALL, "return-type" },
+    { offsetof(TCCState, warn_char_subscripts), WD_ALL, "char-subscripts" },
 };
 
 ST_FUNC int set_flag(TCCState *s, const FlagDef *flags, int nb_flags,
diff --git a/tcc.h b/tcc.h
index d0859d3..5cf639f 100644
--- a/tcc.h
+++ b/tcc.h
@@ -601,6 +601,8 @@ struct TCCState {
     int warn_error;
     int warn_none;
     int warn_implicit_function_declaration;
+    int warn_return_type;
+    int warn_char_subscripts;
 
     /* compile with debug symbol (and use them if error during execution) */
     int do_debug;
diff --git a/tccgen.c b/tccgen.c
index b2a7717..f134586 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -2927,13 +2927,12 @@ static void struct_decl(CType *type, int u, int tdef)
                     if (tok != ':') {
                         type_decl(&type1, &ad, &v, TYPE_DIRECT | 
TYPE_ABSTRACT);
                         if (v == 0 && (type1.t & VT_BTYPE) != VT_STRUCT)
-                            expect("identifier");
+                            expect("specifier-qualifier-list at end of input");
                         if (type_size(&type1, &align) < 0) {
-                           if ((a == TOK_STRUCT) && (type1.t & VT_ARRAY))
-                               flexible = 1;
-                           else
-                               tcc_error("field '%s' has incomplete type",
-                                      get_tok_str(v, NULL));
+                            if ((a == TOK_STRUCT) && (type1.t & VT_ARRAY))
+                                flexible = 1;
+                            else
+                                tcc_error("field '%s' has incomplete type", 
get_tok_str(v, NULL));
                         }
                         if ((type1.t & VT_BTYPE) == VT_FUNC ||
                             (type1.t & (VT_TYPEDEF | VT_STATIC | VT_EXTERN | 
VT_INLINE)))
@@ -2945,13 +2944,14 @@ static void struct_decl(CType *type, int u, int tdef)
                         bit_size = expr_const();
                         /* XXX: handle v = 0 case for messages */
                         if (bit_size < 0)
-                            tcc_error("negative width in bit-field '%s'", 
-                                  get_tok_str(v, NULL));
+                            tcc_error("negative width in bit-field '%s'", 
get_tok_str(v, NULL));
                         if (v && bit_size == 0)
-                            tcc_error("zero width for bit-field '%s'", 
-                                  get_tok_str(v, NULL));
+                            tcc_error("zero width for bit-field '%s'", 
get_tok_str(v, NULL));
                     }
-                    size = type_size(&type1, &align);
+                    if(type1.t & VT_VLA)
+                        size = 0, align = 1;
+                    else
+                        size = type_size(&type1, &align);
                     if (ad.a.aligned) {
                         if (align < ad.a.aligned)
                             align = ad.a.aligned;
@@ -3041,13 +3041,18 @@ static void struct_decl(CType *type, int u, int tdef)
                         *ps = ss;
                         ps = &ss->next;
                     }
-                    if (tok == ';' || tok == TOK_EOF)
+                    if (tok == ';' || tok == '}')
                         break;
-                    skip(',');
+                    if(tok == ',')
+                        next();
                 }
-                skip(';');
+                if(tok == '}'){
+                    tcc_warning("no ';' at end of struct or union");
+                    break;
+                }else
+                    skip(';');
             }
-            skip('}');
+            next();
             if (!c && flexible)
                 tcc_error("flexible array member '%s' in otherwise empty 
struct", get_tok_str(v, NULL));
             /* store size and alignment */
@@ -4061,6 +4066,8 @@ ST_FUNC void unary(void)
         } else if (tok == '[') {
             next();
             gexpr();
+            if(tcc_state->warn_char_subscripts && (vtop->type.t & 
(VT_BTYPE|VT_UNSIGNED)) == VT_BYTE)
+                tcc_warning("array subscript has type 'char'");
             gen_op('+');
             indir();
             skip(']');
@@ -5542,6 +5549,8 @@ static void decl_initializer_alloc(CType *type, 
AttributeDef *ad, int r,
 
     flexible_array = NULL;
     is_putz = 0;
+    if (has_init && (type->t & VT_VLA))
+        tcc_error("Variable length array cannot be initialized");
     if ((type->t & VT_BTYPE) == VT_STRUCT) {
         Sym *field = type->ref->next;
         if (field) {
@@ -5969,10 +5978,15 @@ static int decl0(int l, int is_for_loop_init)
                 break;
             btype.t = VT_INT;
         }
-        if (((btype.t & VT_BTYPE) == VT_ENUM ||
-             (btype.t & VT_BTYPE) == VT_STRUCT) && 
-            tok == ';') {
+        if (tok == ';') {
+            int bt = btype.t & VT_BTYPE;
             /* we accept no variable after */
+            if(btype.t & (VT_CONSTANT|VT_VOLATILE))
+                tcc_warning("useless type qualifier in empty 
declaration.'%s'before", get_tok_str(tok, NULL));
+            if(bt != VT_STRUCT && bt != VT_ENUM)
+                tcc_warning("useless type name in empty declaration '%s'", 
get_tok_str(tok, NULL));
+            if((bt == VT_STRUCT) && ((btype.ref->v & ~SYM_STRUCT) >= 
SYM_FIRST_ANOM))
+                tcc_warning("unnamed struct/union that defines no instances");
             next();
             continue;
         }
@@ -6143,8 +6157,6 @@ static int decl0(int l, int is_for_loop_init)
                         r |= lvalue_type(type.t);
                     }
                     has_init = (tok == '=');
-                    if (has_init && (type.t & VT_VLA))
-                        tcc_error("Variable length array cannot be 
initialized");
                     if ((btype.t & VT_EXTERN) || ((type.t & VT_BTYPE) == 
VT_FUNC) ||
                         ((type.t & VT_ARRAY) && (type.t & VT_STATIC) &&
                          !has_init && l == VT_CONST && type.ref->c < 0)) {
commit 498bcc6f4a07514d28d7867e27c94a1f642fe2bc
Author: jiang <30155...@qq.com>
Date:   Sun Jun 22 15:24:18 2014 +0800

    bug:
    struct { unsigned a:9, b:7, c:5; } s;
                s.a = s.b = s.c = 3;
     printf("%d / %d / %d\n", s.a, s.b, s.c);
    
    out:
    0 / 0 / 3
    
    and:
    
    struct {
      unsigned a:9, b:5, c:7;
     } _s, *s = &_s;
     int n = 250;
    
     s->a = s->b = s->c = n + 4;
      printf("--> %d / %d / %d\n", s->a, s->b, s->c);
    out:
    -> 0 / 0 / 126

diff --git a/tccgen.c b/tccgen.c
index f134586..83a7752 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -2549,6 +2549,15 @@ ST_FUNC void vstore(void)
         /* bitfield store handling */
         bit_pos = (ft >> VT_STRUCT_SHIFT) & 0x3f;
         bit_size = (ft >> (VT_STRUCT_SHIFT + 6)) & 0x3f;
+
+        vpushv(&vtop[0]);
+        if(((vtop->r & (VT_VALMASK | VT_LVAL)) < VT_CONST) && (vtop > (vstack 
+ 2))){
+            int r = get_reg(RC_INT);
+            load(r, vtop);
+            vtop->r = r;
+        }
+        vrott(3);
+
         /* remove bit field info to avoid loops */
         vtop[-1].type.t = ft & ~(VT_BITFIELD | (-1 << VT_STRUCT_SHIFT));
 
@@ -2583,6 +2592,7 @@ ST_FUNC void vstore(void)
         gen_op('|');
         /* store result */
         vstore();
+        vtop--;
     } else {
 #ifdef CONFIG_TCC_BCHECK
         /* bound check case */
@@ -4066,7 +4076,7 @@ ST_FUNC void unary(void)
         } else if (tok == '[') {
             next();
             gexpr();
-            if(tcc_state->warn_char_subscripts && (vtop->type.t & 
(VT_BTYPE|VT_UNSIGNED)) == VT_BYTE)
+            if(tcc_state->warn_char_subscripts && (vtop->type.t & 
(VT_BTYPE|VT_DEFSIGN|VT_UNSIGNED)) == VT_BYTE)
                 tcc_warning("array subscript has type 'char'");
             gen_op('+');
             indir();
diff --git a/tests/tests2/03_struct.c b/tests/tests2/03_struct.c
index c5d48c5..070c8d2 100644
--- a/tests/tests2/03_struct.c
+++ b/tests/tests2/03_struct.c
@@ -27,5 +27,35 @@ int main()
    printf("%d\n", jones[1].boris);
    printf("%d\n", jones[1].natasha);
 
+   struct sbf1 {
+        int f1 : 3;
+        int : 2;
+        int f2 : 1;
+        int : 0;
+        int f3 : 5;
+        int f4 : 7;
+        unsigned int f5 : 7;
+   } st1;
+   st1.f1 = st1.f2 = st1.f3 = st1.f4 = st1.f5 = 3;
+   printf("%d %d %d %d %d\n",
+         st1.f1, st1.f2, st1.f3, st1.f4, st1.f5);
+
+   struct { unsigned a:9, b:7, c:5; } s1;
+            s1.a = s1.b = s1.c = 3;
+   printf("%d / %d / %d\n", s1.a, s1.b, s1.c);
+
+   struct {
+        unsigned a:9, b:5, c:7;
+   } s2, *ps = &s2;
+   int n = 250;
+
+   ps->a = ps->b = ps->c = n + 4;
+   printf("%d / %d / %d\n", ps->a, ps->b, ps->c);
+   
+   ps->a = n + 4;
+   ps->b = n + 4;
+   ps->c = n + 4;
+   printf("%d / %d / %d\n", ps->a, ps->b, ps->c);
+
    return 0;
 }
diff --git a/tests/tests2/03_struct.expect b/tests/tests2/03_struct.expect
index ecbf589..ac7d10d 100644
--- a/tests/tests2/03_struct.expect
+++ b/tests/tests2/03_struct.expect
@@ -4,3 +4,7 @@
 34
 56
 78
+3 -1 3 3 3
+3 / 3 / 3
+254 / 30 / 126
+254 / 30 / 126
_______________________________________________
Tinycc-devel mailing list
Tinycc-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/tinycc-devel

Reply via email to