From 32348f57784f273a22be8f78885fd913f8ce5904 Mon Sep 17 00:00:00 2001 From: uz Date: Tue, 28 Jul 2009 18:56:16 +0000 Subject: [PATCH] Fixed an error: If an expression is loaded into the primary, a function must 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 | 11 +++++------ src/cc65/datatype.h | 4 ++-- src/cc65/loadexpr.c | 5 +++++ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/cc65/datatype.c b/src/cc65/datatype.c index 418ecfc46..5cbcb792d 100644 --- a/src/cc65/datatype.c +++ b/src/cc65/datatype.c @@ -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; } diff --git a/src/cc65/datatype.h b/src/cc65/datatype.h index 4a6a95cb0..ea2117772 100644 --- a/src/cc65/datatype.h +++ b/src/cc65/datatype.h @@ -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 diff --git a/src/cc65/loadexpr.c b/src/cc65/loadexpr.c index b39506a00..6e3a9b6fd 100644 --- a/src/cc65/loadexpr.c +++ b/src/cc65/loadexpr.c @@ -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); }