points_to = skip_typeref(points_to);
if (is_type_incomplete(points_to) &&
- (! (c_mode & _GNUC)
- || !is_type_atomic(points_to, ATOMIC_TYPE_VOID))) {
+ !((c_mode & _GNUC)
+ && is_type_atomic(points_to, ATOMIC_TYPE_VOID))) {
errorf(source_position,
- "arithmetic with pointer to incomplete type '%T' not allowed",
- orig_pointer_type);
+ "arithmetic with pointer to incomplete type '%T' not allowed",
+ orig_pointer_type);
return false;
- } else if (is_type_function(points_to)) {
+ } else if (!(c_mode & _GNUC) && is_type_function(points_to)) {
errorf(source_position,
- "arithmetic with pointer to function type '%T' not allowed",
- orig_pointer_type);
+ "arithmetic with pointer to function type '%T' not allowed",
+ orig_pointer_type);
return false;
}
+ if (warning.pointer_arith) {
+ if (is_type_atomic(points_to, ATOMIC_TYPE_VOID)) {
+ warningf(source_position,
+ "pointer of type '%T' used in arithmetic",
+ orig_pointer_type);
+ } else if (is_type_function(points_to)) {
+ warningf(source_position,
+ "pointer to a function '%T' used in arithmetic",
+ orig_pointer_type);
+ }
+ }
return true;
}