if(!is_type_atomic(points_to_left, ATOMIC_TYPE_VOID)
&& !is_type_atomic(points_to_right, ATOMIC_TYPE_VOID)
&& !types_compatible(points_to_left, points_to_right)) {
- return NULL;
+ return type_error_type;
}
return orig_type_left;
}
}
- return NULL;
+ return type_error_type;
}
static expression_t *parse_constant_expression(void)
}
type_t *const res_type = semantic_assign(type, expression, "initializer");
- if (res_type == NULL)
+ if (!is_type_valid(res_type))
return NULL;
initializer_t *const result = allocate_initializer_zero(INITIALIZER_VALUE);
type_t *const res_type = semantic_assign(orig_type_left, expression->right,
"assignment");
- if (res_type == NULL) {
+ if (!is_type_valid(res_type)) {
errorf(expression->expression.source_position,
"cannot assign to '%T' from '%T'",
orig_type_left, expression->right->base.datatype);
expression->right = create_implicit_cast(expression->right, res_type);
}
- expression->expression.datatype = orig_type_left;
+ expression->expression.datatype = res_type;
}
static void semantic_comma(binary_expression_t *expression)
}
expect(';');
- if(return_type == NULL)
+ if(!is_type_valid(return_type))
return (statement_t*) statement;
- if(return_value != NULL && return_value->base.datatype == NULL)
+ if(!is_type_valid(return_value->base.datatype))
return (statement_t*) statement;
return_type = skip_typeref(return_type);
type_t *const res_type = semantic_assign(return_type,
return_value, "'return'");
- if (res_type == NULL) {
+ if (!is_type_valid(res_type)) {
errorf(statement->statement.source_position,
"cannot assign to '%T' from '%T'",
"cannot return something of type '%T' in function returning '%T'",