type_t *orig_type = declaration->type;
type_t *type = skip_typeref(orig_type);
- if(is_type_valid(type) &&
- type->kind != TYPE_FUNCTION && declaration->is_inline) {
+ if (type->kind != TYPE_FUNCTION &&
+ declaration->is_inline &&
+ is_type_valid(type)) {
warningf(declaration->source_position,
"variable '%Y' declared 'inline'\n", declaration->symbol);
}
conditional->condition = expression;
/* 6.5.15.2 */
- type_t *condition_type_orig = expression->base.datatype;
- if(is_type_valid(condition_type_orig)) {
- type_t *condition_type = skip_typeref(condition_type_orig);
- if(condition_type->kind != TYPE_ERROR && !is_type_scalar(condition_type)) {
- type_error("expected a scalar type in conditional condition",
- expression->base.source_position, condition_type_orig);
- }
+ type_t *const condition_type_orig = expression->base.datatype;
+ type_t *const condition_type = skip_typeref(condition_type_orig);
+ if (!is_type_scalar(condition_type) && is_type_valid(condition_type)) {
+ type_error("expected a scalar type in conditional condition",
+ expression->base.source_position, condition_type_orig);
}
expression_t *true_expression = parse_expression();
conditional->true_expression = true_expression;
conditional->false_expression = false_expression;
- type_t *orig_true_type = true_expression->base.datatype;
- type_t *orig_false_type = false_expression->base.datatype;
- if(!is_type_valid(orig_true_type) || !is_type_valid(orig_false_type))
- return result;
-
- type_t *true_type = skip_typeref(orig_true_type);
- type_t *false_type = skip_typeref(orig_false_type);
+ type_t *const orig_true_type = true_expression->base.datatype;
+ type_t *const orig_false_type = false_expression->base.datatype;
+ type_t *const true_type = skip_typeref(orig_true_type);
+ type_t *const false_type = skip_typeref(orig_false_type);
/* 6.5.15.3 */
type_t *result_type;
static void semantic_incdec(unary_expression_t *expression)
{
- type_t *orig_type = expression->value->base.datatype;
- if(!is_type_valid(orig_type))
- return;
-
- type_t *type = skip_typeref(orig_type);
+ type_t *const orig_type = expression->value->base.datatype;
+ type_t *const type = skip_typeref(orig_type);
if(!is_type_arithmetic(type) && type->kind != TYPE_POINTER) {
- /* TODO: improve error message */
- errorf(HERE, "operation needs an arithmetic or pointer type");
+ if (is_type_valid(type)) {
+ /* TODO: improve error message */
+ errorf(HERE, "operation needs an arithmetic or pointer type");
+ }
return;
}
static void semantic_unexpr_arithmetic(unary_expression_t *expression)
{
- type_t *orig_type = expression->value->base.datatype;
- if(!is_type_valid(orig_type))
- return;
-
- type_t *type = skip_typeref(orig_type);
+ type_t *const orig_type = expression->value->base.datatype;
+ type_t *const type = skip_typeref(orig_type);
if(!is_type_arithmetic(type)) {
- /* TODO: improve error message */
- errorf(HERE, "operation needs an arithmetic type");
+ if (is_type_valid(type)) {
+ /* TODO: improve error message */
+ errorf(HERE, "operation needs an arithmetic type");
+ }
return;
}
static void semantic_unexpr_scalar(unary_expression_t *expression)
{
- type_t *orig_type = expression->value->base.datatype;
- if(!is_type_valid(orig_type))
- return;
-
- type_t *type = skip_typeref(orig_type);
+ type_t *const orig_type = expression->value->base.datatype;
+ type_t *const type = skip_typeref(orig_type);
if (!is_type_scalar(type)) {
- errorf(HERE, "operand of ! must be of scalar type");
+ if (is_type_valid(type)) {
+ errorf(HERE, "operand of ! must be of scalar type");
+ }
return;
}
static void semantic_unexpr_integer(unary_expression_t *expression)
{
- type_t *orig_type = expression->value->base.datatype;
- if(!is_type_valid(orig_type))
- return;
-
- type_t *type = skip_typeref(orig_type);
+ type_t *const orig_type = expression->value->base.datatype;
+ type_t *const type = skip_typeref(orig_type);
if (!is_type_integer(type)) {
- errorf(HERE, "operand of ~ must be of integer type");
+ if (is_type_valid(type)) {
+ errorf(HERE, "operand of ~ must be of integer type");
+ }
return;
}
static void semantic_dereference(unary_expression_t *expression)
{
- type_t *orig_type = expression->value->base.datatype;
- if(!is_type_valid(orig_type))
- return;
-
- type_t *type = skip_typeref(orig_type);
+ type_t *const orig_type = expression->value->base.datatype;
+ type_t *const type = skip_typeref(orig_type);
if(!is_type_pointer(type)) {
- errorf(HERE, "Unary '*' needs pointer or arrray type, but type '%T' given", orig_type);
+ if (is_type_valid(type)) {
+ errorf(HERE, "Unary '*' needs pointer or arrray type, but type '%T' given", orig_type);
+ }
return;
}