Skip to content

Commit 5a13343

Browse files
committed
C front-end: hide our use of single-bit bool within sizeof
In C, Boolean operations are of type int. Rejecting sizeof expressions of Boolean operations breaks building the Linux kernel.
1 parent 932599e commit 5a13343

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

regression/ansi-c/sizeof4/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG
1+
CORE
22
main.c
33

44
^EXIT=0$

src/ansi-c/c_typecheck_expr.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -931,7 +931,24 @@ void c_typecheck_baset::typecheck_expr_sizeof(exprt &expr)
931931
}
932932
else
933933
{
934-
type.swap(to_unary_expr(expr).op().type());
934+
const exprt &op = to_unary_expr(as_const(expr)).op();
935+
// This is one of the few places where it's detectable
936+
// that we are using "bool" for boolean operators instead
937+
// of "int". We convert for this reason.
938+
if(op.type().id() == ID_bool && (
939+
op.id() == ID_not ||
940+
op.id()==ID_equal ||
941+
op.id()==ID_notequal ||
942+
op.id()==ID_lt ||
943+
op.id()==ID_le ||
944+
op.id()==ID_gt ||
945+
op.id()==ID_ge ||
946+
op.id() == ID_if))
947+
{
948+
type = signed_int_type();
949+
}
950+
else
951+
type = op.type();
935952
}
936953

937954
exprt new_expr;

0 commit comments

Comments
 (0)