Skip to content

Commit 81234d3

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 8a28135 commit 81234d3

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-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: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -950,7 +950,21 @@ void c_typecheck_baset::typecheck_expr_sizeof(exprt &expr)
950950
}
951951
else
952952
{
953-
type.swap(to_unary_expr(expr).op().type());
953+
const exprt &op = to_unary_expr(as_const(expr)).op();
954+
// This is one of the few places where it's detectable
955+
// that we are using "bool" for boolean operators instead
956+
// of "int". We convert for this reason.
957+
if(
958+
op.type().id() == ID_bool &&
959+
(op.id() == ID_not || op.id() == ID_and || op.id() == ID_or ||
960+
op.id() == ID_equal || op.id() == ID_notequal || op.id() == ID_lt ||
961+
op.id() == ID_le || op.id() == ID_gt || op.id() == ID_ge ||
962+
op.id() == ID_if))
963+
{
964+
type = signed_int_type();
965+
}
966+
else
967+
type = op.type();
954968
}
955969

956970
exprt new_expr;

0 commit comments

Comments
 (0)