issue #169 Apply upstream fixes

master
Dibyendu Majumdar 3 years ago
parent 3efaddee6b
commit 4bfc061a2a

@ -6572,7 +6572,7 @@ static struct decl_spec check_decl_spec (c2m_ctx_t c2m_ctx, node_t r, node_t dec
int neg_p = FALSE;
n->attr = enum_type = reg_malloc (c2m_ctx, sizeof (struct enum_type));
enum_type->enum_basic_type = TP_INT;
enum_type->enum_basic_type = TP_INT; // ???
for (node_t en = NL_HEAD (enum_list->u.ops); en != NULL; en = NL_NEXT (en)) { // ??? id
node_t id, const_expr;
symbol_t sym;
@ -6662,7 +6662,7 @@ static struct decl_spec check_decl_spec (c2m_ctx_t c2m_ctx, node_t r, node_t dec
error (c2m_ctx, POS (op), "constant value in _Alignas is not of an integer type");
} else if (!signed_integer_type_p (cexpr->type)
|| !supported_alignment_p (cexpr->u.i_val)) {
error (c2m_ctx, POS (op), "constant value in _Alignas specifies unspported alignment");
error (c2m_ctx, POS (op), "constant value in _Alignas specifies unsupported alignment");
} else if (invalid_alignment (cexpr->u.i_val)) {
error (c2m_ctx, POS (op), "unsupported alignmnent");
} else {
@ -7089,6 +7089,11 @@ static void check_assignment_types (c2m_ctx_t c2m_ctx, struct type *left, struct
: "assignment discards a type qualifier from a pointer");
(c2m_options->pedantic_p ? error : warning) (c2m_ctx, POS (assign_node), "%s", msg);
}
} else {
msg = (code == N_CALL ? "passing assign incompatible value"
: code == N_RETURN ? "returning assign incompatible value"
: "assignment of incompatible value");
error (c2m_ctx, POS (assign_node), "%s", msg);
}
}
@ -7658,9 +7663,9 @@ static void create_decl (c2m_ctx_t c2m_ctx, node_t scope, node_t decl_node,
error (c2m_ctx, POS (initializer), "initialization of incomplete type variable");
return;
}
if (decl->decl_spec.linkage != N_IGNORE && scope != top_scope) {
error (c2m_ctx, POS (initializer),
"initialization of %s in block scope with external or internal linkage", id->u.s.s);
if (decl->decl_spec.linkage == N_EXTERN && scope != top_scope) {
error (c2m_ctx, POS (initializer), "initialization of %s in block scope with external linkage",
id->u.s.s);
return;
}
check (c2m_ctx, initializer, decl_node);
@ -8679,8 +8684,8 @@ static void check (c2m_ctx_t c2m_ctx, node_t r, node_t context) {
*e->type = *t2;
} else if ((t2->mode == TM_PTR && null_const_p (e3, t3))
|| (t3->mode == TM_PTR && null_const_p (e2, t2))) {
e->type = null_const_p (e3, t2) ? t3 : t2;
} else if (t2->mode != TM_PTR && t3->mode != TM_PTR) {
e->type = null_const_p (e2, t2) ? t3 : t2;
} else if (t2->mode != TM_PTR || t3->mode != TM_PTR) {
error (c2m_ctx, POS (r), "incompatible types in true and false parts of cond-expression");
break;
} else if (compatible_types_p (t2, t3, TRUE)) {
@ -8700,18 +8705,14 @@ static void check (c2m_ctx_t c2m_ctx, node_t r, node_t context) {
e->type->pos_node = r;
e->type->u.ptr_type = create_type (c2m_ctx, NULL);
e->type->u.ptr_type->pos_node = r;
if (null_const_p (e2, t2)) {
e->type->u.ptr_type = e2->type->u.ptr_type;
} else if (null_const_p (e3, t3)) {
e->type->u.ptr_type = e3->type->u.ptr_type;
} else {
if (t2->u.ptr_type->type_qual.atomic_p || t3->u.ptr_type->type_qual.atomic_p) {
error (c2m_ctx, POS (r),
"pointer to atomic type in true or false parts of cond-expression");
}
e->type->u.ptr_type->mode = TM_BASIC;
e->type->u.ptr_type->u.basic_type = TP_VOID;
assert (!null_const_p (e2, t2) && !null_const_p (e3, t3));
e->type->u.ptr_type = e3->type->u.ptr_type;
if (t2->u.ptr_type->type_qual.atomic_p || t3->u.ptr_type->type_qual.atomic_p) {
error (c2m_ctx, POS (r),
"pointer to atomic type in true or false parts of cond-expression");
}
e->type->u.ptr_type->mode = TM_BASIC;
e->type->u.ptr_type->u.basic_type = TP_VOID;
e->type->u.ptr_type->type_qual
= type_qual_union (&t2->u.ptr_type->type_qual, &t3->u.ptr_type->type_qual);
} else {

Loading…
Cancel
Save