LoadExpr (CF_NONE, Expr);
/* Emit typecast code */
- g_typecast (TypeOf (NewType), TypeOf (OldType));
+ g_typecast (TypeOf (NewType), TypeOf (OldType) | CF_FORCECHAR);
/* Value is now in primary and an rvalue */
ED_MakeRValExpr (Expr);
Expr->IVal &= (0xFFFFFFFFUL >> (32 - NewBits));
/* If the new type is signed, sign extend the value */
- if (!IsSignUnsigned (NewType)) {
+ if (IsSignSigned (NewType)) {
if (Expr->IVal & (0x01UL << (NewBits-1))) {
/* Beware: Use the safe shift routine here. */
Expr->IVal |= shl_l (~0UL, NewBits);
LoadExpr (CF_NONE, Expr);
/* Emit typecast code. */
- g_typecast (TypeOf (NewType) | CF_FORCECHAR, TypeOf (OldType));
+ g_typecast (TypeOf (NewType), TypeOf (OldType) | CF_FORCECHAR);
/* Value is now a rvalue in the primary */
ED_MakeRValExpr (Expr);
* impossible.
*/
{
+#if 0
+ /* Debugging */
+ printf ("Expr:\n=======================================\n");
+ PrintExprDesc (stdout, Expr);
+ printf ("Type:\n=======================================\n");
+ PrintType (stdout, NewType);
+ printf ("\n");
+ PrintRawType (stdout, NewType);
+#endif
+
/* First, do some type checking */
if (IsTypeVoid (NewType) || IsTypeVoid (Expr->Type)) {
/* If one of the sides are of type void, output a more apropriate
Error ("Illegal type");
}
+ /* If Expr is a function, convert it to pointer to function */
+ if (IsTypeFunc(Expr->Type)) {
+ Expr->Type = PointerTo (Expr->Type);
+ }
+
/* If both types are equal, no conversion is needed */
if (TypeCmp (Expr->Type, NewType) >= TC_EQUAL) {
/* We're already done */
*/
if (!IsTypeVoid (Indirect (NewType)) && !IsTypeVoid (Indirect (Expr->Type))) {
/* Compare the types */
- switch (TypeCmp (NewType, Expr->Type)) {
+ switch (TypeCmp (NewType, Expr->Type)) {
case TC_INCOMPATIBLE:
Error ("Incompatible pointer types");
if (!ED_IsConstAbsInt (Expr) || Expr->IVal != 0) {
Warning ("Converting integer to pointer without a cast");
}
- } else if (IsTypeFuncPtr (NewType) && IsTypeFunc(Expr->Type)) {
- /* Function -> Function pointer. First convert rhs to pointer */
- Expr->Type = PointerTo (Expr->Type);
-
- /* Assignment of function to function pointer is allowed, provided
- * that both functions have the same parameter list.
- */
- if (TypeCmp (NewType, Expr->Type) < TC_EQUAL) {
- Error ("Incompatible types");
- }
} else {
Error ("Incompatible types");
}