Skip to content

Commit 3cfec66

Browse files
authored
Merge pull request diffblue#2106 from diffblue/ptrmember_on_array
fix array->f typechecking
2 parents bf4c39c + a0ca0ba commit 3cfec66

File tree

3 files changed

+36
-12
lines changed

3 files changed

+36
-12
lines changed
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
struct some_struct
2+
{
3+
int some_field;
4+
} array[10];
5+
6+
int main()
7+
{
8+
array[0].some_field=1;
9+
array->some_field=1;
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
main.c
3+
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
--
7+
^warning: ignoring
8+
^CONVERSION ERROR$

src/ansi-c/c_typecheck_expr.cpp

+18-12
Original file line numberDiff line numberDiff line change
@@ -1431,25 +1431,31 @@ void c_typecheck_baset::typecheck_expr_ptrmember(exprt &expr)
14311431

14321432
const typet &final_op0_type=follow(expr.op0().type());
14331433

1434-
if(final_op0_type.id()!=ID_pointer &&
1435-
final_op0_type.id()!=ID_array)
1434+
if(final_op0_type.id()==ID_array)
1435+
{
1436+
// a->f is the same as a[0].f
1437+
exprt zero=from_integer(0, index_type());
1438+
index_exprt index_expr(expr.op0(), zero, final_op0_type.subtype());
1439+
index_expr.set(ID_C_lvalue, true);
1440+
expr.op0().swap(index_expr);
1441+
}
1442+
else if(final_op0_type.id()==ID_pointer)
1443+
{
1444+
// turn x->y into (*x).y
1445+
dereference_exprt deref_expr(expr.op0());
1446+
deref_expr.add_source_location()=expr.source_location();
1447+
typecheck_expr_dereference(deref_expr);
1448+
expr.op0().swap(deref_expr);
1449+
}
1450+
else
14361451
{
14371452
err_location(expr);
1438-
error() << "ptrmember operator requires pointer type "
1453+
error() << "ptrmember operator requires pointer or array type "
14391454
"on left hand side, but got `"
14401455
<< to_string(expr.op0().type()) << "'" << eom;
14411456
throw 0;
14421457
}
14431458

1444-
// turn x->y into (*x).y
1445-
1446-
dereference_exprt deref(expr.op0());
1447-
deref.add_source_location()=expr.source_location();
1448-
1449-
typecheck_expr_dereference(deref);
1450-
1451-
expr.op0().swap(deref);
1452-
14531459
expr.id(ID_member);
14541460
typecheck_expr_member(expr);
14551461
}

0 commit comments

Comments
 (0)