Bladeren bron

fixed stacked & and *

Kajetan Johannes Hammerle 3 jaren geleden
bovenliggende
commit
09bad2d28a
5 gewijzigde bestanden met toevoegingen van 24 en 2 verwijderingen
  1. 5 1
      Compiler.c
  2. 5 1
      DataType.c
  3. 1 0
      DataType.h
  4. 10 0
      tests/mix
  5. 3 0
      tests/mix.out

+ 5 - 1
Compiler.c

@@ -476,7 +476,11 @@ static DataType cPreUnary() {
             cError("* expects a pointer");
         }
         dt = dtReference(dt);
-        cAddOperation(OP_REFERENCE);
+        if(!dtIsPointer(dt) && !dtIsVariable(dt)) {
+            dt = dtToVariable(dt);
+        } else {
+            cAddOperation(OP_REFERENCE);
+        }
         return dt;
     }
     return cAccess();

+ 5 - 1
DataType.c

@@ -118,8 +118,12 @@ DataType dtToVariable(DataType dt) {
     return dt;
 }
 
+bool dtIsVariable(DataType dt) {
+    return dt.type & 8;
+}
+
 bool dtRemoveVariable(DataType* dt) {
-    if(dt->type & 8) {
+    if(dtIsVariable(*dt)) {
         dt->type &= 7;
         return true;
     }

+ 1 - 0
DataType.h

@@ -51,6 +51,7 @@ DataType dtDereference(DataType dt);
 bool dtIsPointer(DataType dt);
 Struct* dtGetStruct(Structs* sts, DataType dt);
 DataType dtToVariable(DataType dt);
+bool dtIsVariable(DataType dt);
 bool dtRemoveVariable(DataType* dt);
 
 bool dtCompare(DataType a, DataType b);

+ 10 - 0
tests/mix

@@ -1,8 +1,18 @@
+void test() {
+}
+
 void main() {
     int a = 5;
     int b = 6;
+    
+    int* c = &a;
 
     if(a + b < 20 && a > 3) {
         print 1;
     }
+    
+    print *c;
+    print (&a)[0];
+    print *&*&a;
+    a = *&a;
 }

+ 3 - 0
tests/mix.out

@@ -1 +1,4 @@
 1
+5
+5
+5