tinycc-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Tinycc-devel] tcc grammar problems


From: Thomas Preud'homme
Subject: Re: [Tinycc-devel] tcc grammar problems
Date: Fri, 08 Aug 2014 21:10:02 +0800
User-agent: KMail/4.12.4 (Linux/3.14-2-amd64; KDE/4.13.3; x86_64; ; )

Le mercredi 06 août 2014, 22:41:18 Thomas Preud'homme a écrit :

[SNIP review part 2]

And here is the final part (part 3)

@@ -3605,7 +3643,7 @@ static void vpush_tokc(int t)
 
 ST_FUNC void unary(void)
 {
-    int n, t, align, size, r, sizeof_caller;
+    int n, t, align, size, r, sizeof_caller, save_ctrl;
     CType type;
     Sym *s;
     AttributeDef ad;
@@ -3714,7 +3752,10 @@ ST_FUNC void unary(void)
                     return;
                 }
                 unary();
+                save_ctrl = gen_ctrl;
+                gen_ctrl = CTRL_FOCE;
                 gen_cast(&type);
+                gen_ctrl = save_ctrl;


I think it would be better to add a parameter "explicit" of type bool to 
gen_cast(). CTRL_INIT looks weird and you only need to know if it's an 
implicit cast or not.


             }
         } else if (tok == '{') {
             /* save all registers */
@@ -5127,7 +5168,7 @@ static void decl_designator(CType *type, Section *sec, 
unsigned long c,
 static void init_putv(CType *type, Section *sec, unsigned long c, 
                       int v, int expr_type)
 {
-    int saved_global_expr, bt, bit_pos, bit_size;
+    int saved_global_expr, bt, bit_pos, bit_size, save_ctrl;
     void *ptr;
     unsigned long long bit_mask;
     CType dtype;
@@ -5147,7 +5188,10 @@ static void init_putv(CType *type, Section *sec, 
unsigned long c,
             tcc_error("initializer element is not constant");
         break;
     case EXPR_ANY:
+        save_ctrl = gen_ctrl;
+        gen_ctrl = CTRL_INIT;
         expr_eq();
+        gen_ctrl = save_ctrl;
         break;
     }


I don't see why this is needed. The code you moved in vstore() didn't need it 
before.
     

diff --git a/tests/tests2/03_struct.c b/tests/tests2/03_struct.c
index c5d48c5..e06d20d 100644
--- a/tests/tests2/03_struct.c
+++ b/tests/tests2/03_struct.c
@@ -27,5 +27,36 @@ 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;
+
+   int ii = ps->a = ps->b = ps->c = n + 4;
+   printf("%d / %d / %d\n", ps->a, ps->b, ps->c);
+   printf("%d\n", ii);
+   
+   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..6b90186 100644
--- a/tests/tests2/03_struct.expect
+++ b/tests/tests2/03_struct.expect
@@ -1,6 +1,12 @@
+03_struct.c:39: warning: overflow in implicit constant conversion
 12
 34
 12
 34
 56
 78
+-1 -1 3 3 3
+3 / 3 / 3
+30 / 30 / 126
+30
+254 / 30 / 126


The added code in 03_struct.c don't exercise the explicit cast. Is it exercise 
somewhere else? If not you should add something for this.

Best regards,

Thomas

Attachment: signature.asc
Description: This is a digitally signed message part.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]