Fix several errors: The address operator on functions (resulting in a
pointer-to-function type) was not possible. It is redundant but allowed. A cast with a function on the right side resulted in an internal compiler error, since the implicit cast from function to pointer-to-function was missing in this case. An assignment of a function to a void pointer was not possible because the same implicit conversion was missing. git-svn-id: svn://svn.cc65.org/cc65/trunk@482 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
0333dbbd85
commit
f6768466be
1 changed files with 27 additions and 14 deletions
|
@ -198,8 +198,13 @@ unsigned assignadjust (type* lhst, struct expent* rhs)
|
||||||
* set to the type of the left hand side.
|
* set to the type of the left hand side.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
/* Get the type of the right hand side */
|
/* Get the type of the right hand side. Treat function types as
|
||||||
|
* pointer-to-function
|
||||||
|
*/
|
||||||
type* rhst = rhs->e_tptr;
|
type* rhst = rhs->e_tptr;
|
||||||
|
if (IsTypeFunc (rhst)) {
|
||||||
|
rhst = PointerTo (rhst);
|
||||||
|
}
|
||||||
|
|
||||||
/* After calling this function, rhs will have the type of the lhs */
|
/* After calling this function, rhs will have the type of the lhs */
|
||||||
rhs->e_tptr = lhst;
|
rhs->e_tptr = lhst;
|
||||||
|
@ -1421,7 +1426,12 @@ static int typecast (struct expent* lval)
|
||||||
/* Read the expression we have to cast */
|
/* Read the expression we have to cast */
|
||||||
k = hie10 (lval);
|
k = hie10 (lval);
|
||||||
|
|
||||||
/* Check for a const expression */
|
/* If the expression is a function, treat it as pointer-to-function */
|
||||||
|
if (IsTypeFunc (lval->e_tptr)) {
|
||||||
|
lval->e_tptr = PointerTo (lval->e_tptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check for a constant on the right side */
|
||||||
if (k == 0 && lval->e_flags == E_MCONST) {
|
if (k == 0 && lval->e_flags == E_MCONST) {
|
||||||
|
|
||||||
/* A cast of a constant to something else. If the new type is an int,
|
/* A cast of a constant to something else. If the new type is an int,
|
||||||
|
@ -1544,7 +1554,10 @@ static int hie10 (struct expent* lval)
|
||||||
case TOK_AND:
|
case TOK_AND:
|
||||||
NextToken ();
|
NextToken ();
|
||||||
k = hie10 (lval);
|
k = hie10 (lval);
|
||||||
if (k == 0) {
|
/* The & operator may be applied to any lvalue, and it may be
|
||||||
|
* applied to functions, even if they're no lvalues.
|
||||||
|
*/
|
||||||
|
if (k == 0 && !IsTypeFunc (lval->e_tptr)) {
|
||||||
/* Allow the & operator with an array */
|
/* Allow the & operator with an array */
|
||||||
if (!IsTypeArray (lval->e_tptr)) {
|
if (!IsTypeArray (lval->e_tptr)) {
|
||||||
Error ("Illegal address");
|
Error ("Illegal address");
|
||||||
|
|
Loading…
Add table
Reference in a new issue