- BugFix: GCC allows arithmetic on function pointers
[cparser] / parser.c
index f9920b8..e751e1d 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -6998,18 +6998,29 @@ static bool check_pointer_arithmetic(const source_position_t *source_position,
        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;
 }