]> git.sur5r.net Git - cc65/commitdiff
Fixed an error: If an expression is loaded into the primary, a function must
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 28 Jul 2009 18:56:16 +0000 (18:56 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 28 Jul 2009 18:56:16 +0000 (18:56 +0000)
be converted to pointer-to-function and an array to pointer-to-member resp.

git-svn-id: svn://svn.cc65.org/cc65/trunk@3977 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/cc65/datatype.c
src/cc65/datatype.h
src/cc65/loadexpr.c

index 418ecfc46cdc41675e56e4849f4076d617fe733f..5cbcb792d2d110799180e7f8e7a735d8b0fff248 100644 (file)
@@ -548,14 +548,11 @@ Type* Indirect (Type* T)
 
 
 
-Type* ArrayToPtr (const Type* T)
+Type* ArrayToPtr (Type* T)
 /* Convert an array to a pointer to it's first element */
 {
-    /* Function must only be called for an array */
-    CHECK (IsTypeArray (T));
-
     /* Return pointer to first element */
-    return PointerTo (T + 1);
+    return PointerTo (GetElementType (T));
 }
 
 
@@ -703,8 +700,10 @@ Type* PtrConversion (Type* T)
  * return T.
  */
 {
-    if (IsTypeFunc (T) || IsTypeArray (T)) {
+    if (IsTypeFunc (T)) {
                return PointerTo (T);
+    } else if (IsTypeArray (T)) {
+        return ArrayToPtr (T);
     } else {
         return T;
     }
index 4a6a95cb0be3d7a7468e244c64a2311fa93f0d05..ea211777207619df799905a532bd73a5cdb7cb35 100644 (file)
@@ -288,7 +288,7 @@ Type* Indirect (Type* T);
  * given type points to.
  */
 
-Type* ArrayToPtr (const Type* T);
+Type* ArrayToPtr (Type* T);
 /* Convert an array to a pointer to it's first element */
 
 #if defined(HAVE_INLINE)
@@ -467,7 +467,7 @@ INLINE int IsClassStruct (const Type* T)
 {
     return (GetClass (T) == T_CLASS_STRUCT);
 }
-#else                                
+#else
 #  define IsClassStruct(T)      (GetClass (T) == T_CLASS_STRUCT)
 #endif
 
index b39506a004efb1c513fa0821bbaeee52365220e7..6e3a9b6fdfcb8052752dfc7c81ae8c0b241cd525 100644 (file)
@@ -171,6 +171,11 @@ void LoadExpr (unsigned Flags, struct ExprDesc* Expr)
             ED_TestDone (Expr);
         }
     }
+
+    /* Do standard pointer conversions since the expression is now in the 
+     * primary.
+     */
+    Expr->Type = PtrConversion (Expr->Type);
 }