Partially implement -Wdeprecated-declarations.
[cparser] / format_check.c
index 394f792..f572d14 100644 (file)
@@ -145,7 +145,8 @@ static bool atend(vchar_t *self) {
 /**
  * Check printf-style format.
  */
-static void check_format_arguments(const call_argument_t *arg, unsigned idx_fmt, unsigned idx_param)
+static void check_format_arguments(const call_argument_t *arg, unsigned idx_fmt,
+               unsigned idx_param)
 {
        const call_argument_t *fmt_arg;
        unsigned idx = 0;
@@ -177,7 +178,7 @@ static void check_format_arguments(const call_argument_t *arg, unsigned idx_fmt,
                return;
        }
        /* find the real args */
-       for(; idx < idx_fmt; ++idx)
+       for(; idx < idx_param; ++idx)
                arg = arg->next;
 
        const source_position_t *pos = &fmt_expr->base.source_position;
@@ -355,7 +356,7 @@ break_fmt_flags:
                        break;
                }
 
-               const type_t      *expected_type;
+               type_t            *expected_type;
                type_qualifiers_t  expected_qual = TYPE_QUALIFIER_NONE;
                format_flags_t     allowed_flags;
                switch (fmt) {
@@ -520,11 +521,12 @@ eval_fmt_mod_unsigned:
                }
 
                {       /* create a scope here to prevent warning about the jump to next_arg */
-                       type_t *const arg_type = arg->expression->base.type;
-                       if (is_type_pointer(expected_type)) {
+                       type_t *const arg_type           = arg->expression->base.type;
+                       type_t *const expected_type_skip = skip_typeref(expected_type);
+                       if (is_type_pointer(expected_type_skip)) {
                                type_t *const arg_skip = skip_typeref(arg_type);
                                if (is_type_pointer(arg_skip)) {
-                                       type_t *const exp_to = skip_typeref(expected_type->pointer.points_to);
+                                       type_t *const exp_to = skip_typeref(expected_type_skip->pointer.points_to);
                                        type_t *const arg_to = skip_typeref(arg_skip->pointer.points_to);
                                        if ((arg_to->base.qualifiers & ~expected_qual) == 0 &&
                                                get_unqualified_type(arg_to) == exp_to) {
@@ -532,7 +534,7 @@ eval_fmt_mod_unsigned:
                                        }
                                }
                        } else {
-                               if (get_unqualified_type(skip_typeref(arg_type)) == expected_type) {
+                               if (get_unqualified_type(skip_typeref(arg_type)) == expected_type_skip) {
                                        goto next_arg;
                                }
                        }
@@ -631,8 +633,8 @@ void check_format(const call_expression_t *const call)
                        if(strcmp(name, builtin_table[i].name) == 0) {
                                if(builtin_table[i].fmt_kind == FORMAT_PRINTF) {
                                        check_format_arguments(arg,
-                                                                                  builtin_table[i].fmt_idx,
-                                                                                  builtin_table[i].arg_idx);
+                                                              builtin_table[i].fmt_idx,
+                                                              builtin_table[i].arg_idx);
                                }
                                break;
                        }