diff options
Diffstat (limited to 'lang/egcs/files/patch-fa')
-rw-r--r-- | lang/egcs/files/patch-fa | 183 |
1 files changed, 21 insertions, 162 deletions
diff --git a/lang/egcs/files/patch-fa b/lang/egcs/files/patch-fa index b4cc8fd420bd..7f5e0e611ae8 100644 --- a/lang/egcs/files/patch-fa +++ b/lang/egcs/files/patch-fa @@ -1,15 +1,15 @@ ---- gcc/c-common.c.orig Tue Sep 7 01:11:16 1999 -+++ gcc/c-common.c Sun Nov 26 15:35:38 2000 -@@ -64,7 +64,7 @@ +--- gcc/c-common.c.orig Mon Feb 15 16:40:05 1999 ++++ gcc/c-common.c Tue Mar 30 03:35:22 1999 +@@ -61,7 +61,7 @@ int, int, int)); static void init_attributes PROTO((void)); static void record_function_format PROTO((tree, tree, enum format_type, - int, int)); + int, int, int)); static void record_international_format PROTO((tree, tree, int)); - static tree c_find_base_decl PROTO((tree)); - static int default_valid_lang_attribute PROTO ((tree, tree, tree, tree)); -@@ -715,6 +715,7 @@ + + /* Keep a stack of if statements. We record the number of compound +@@ -669,6 +669,7 @@ = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (args))); int format_num; int first_arg_num; @@ -17,7 +17,7 @@ enum format_type format_type; tree argument; int arg_num; -@@ -728,7 +729,7 @@ +@@ -682,7 +683,7 @@ if (TREE_CODE (format_type_id) != IDENTIFIER_NODE) { @@ -26,8 +26,8 @@ continue; } else -@@ -736,12 +737,26 @@ - const char *p = IDENTIFIER_POINTER (format_type_id); +@@ -690,12 +691,26 @@ + char *p = IDENTIFIER_POINTER (format_type_id); if (!strcmp (p, "printf") || !strcmp (p, "__printf__")) + { @@ -52,8 +52,8 @@ + } else { - warning ("`%s' is an unrecognized format function type", p); -@@ -812,7 +827,8 @@ + error ("`%s' is an unrecognized format function type", p); +@@ -766,7 +781,8 @@ record_function_format (DECL_NAME (decl), DECL_ASSEMBLER_NAME (decl), @@ -63,7 +63,7 @@ break; } -@@ -1090,6 +1106,11 @@ +@@ -1010,6 +1026,11 @@ } format_char_info; static format_char_info print_char_table[] = { @@ -75,7 +75,7 @@ { "di", 0, T_I, T_I, T_I, T_L, T_LL, T_LL, T_ST, "-wp0 +" }, { "oxX", 0, T_UI, T_UI, T_UI, T_UL, T_ULL, T_ULL, T_ST, "-wp0#" }, { "u", 0, T_UI, T_UI, T_UI, T_UL, T_ULL, T_ULL, T_ST, "-wp0" }, -@@ -1150,6 +1171,7 @@ +@@ -1070,6 +1091,7 @@ tree name; /* identifier such as "printf" */ tree assembler_name; /* optional mangled identifier (for C++) */ enum format_type format_type; /* type of format (printf, scanf, etc.) */ @@ -83,7 +83,7 @@ int format_num; /* number of format argument */ int first_arg_num; /* number of first arg (zero for varargs) */ } function_format_info; -@@ -1182,25 +1204,25 @@ +@@ -1102,25 +1124,25 @@ init_function_format_info () { record_function_format (get_identifier ("printf"), NULL_TREE, @@ -119,7 +119,7 @@ record_international_format (get_identifier ("gettext"), NULL_TREE, 1); record_international_format (get_identifier ("dgettext"), NULL_TREE, 2); -@@ -1217,11 +1239,12 @@ +@@ -1137,11 +1159,12 @@ (e.g. for varargs such as vfprintf). */ static void @@ -133,7 +133,7 @@ int format_num; int first_arg_num; { -@@ -1245,6 +1268,7 @@ +@@ -1165,6 +1188,7 @@ } info->format_type = format_type; @@ -141,150 +141,17 @@ info->format_num = format_num; info->first_arg_num = first_arg_num; } -@@ -1292,6 +1316,21 @@ - warning ("too few arguments for format"); - } - -+static function_format_info * -+find_function_format (name, assembler_name) -+ tree name; -+ tree assembler_name; -+{ -+ function_format_info *info; -+ -+ for (info = function_format_list; info; info = info->next) -+ if (info->assembler_name -+ ? (info->assembler_name == assembler_name) -+ : (info->name == name)) -+ return info; -+ return 0; -+} -+ - /* Check the argument list of a call to printf, scanf, etc. - NAME is the function identifier. - ASSEMBLER_NAME is the function's assembler identifier. -@@ -1307,17 +1346,10 @@ - function_format_info *info; - - /* See if this function is a format function. */ -- for (info = function_format_list; info; info = info->next) -- { -- if (info->assembler_name -- ? (info->assembler_name == assembler_name) -- : (info->name == name)) -- { -- /* Yup; check it. */ -- check_format_info (info, params); -- break; -- } -- } -+ info = find_function_format (name, assembler_name); -+ -+ if (info) -+ check_format_info (info, params); - } - - /* Check the argument list of a call to printf, scanf, etc. -@@ -1361,6 +1393,7 @@ - return; +@@ -1314,7 +1338,8 @@ - /* We can only check the format if it's a string constant. */ -+ again: - while (TREE_CODE (format_tree) == NOP_EXPR) - format_tree = TREE_OPERAND (format_tree, 0); /* strip coercion */ - -@@ -1396,16 +1429,73 @@ - } - } - -+ if (TREE_CODE (format_tree) == COND_EXPR) -+ { -+ format_tree = TREE_OPERAND(format_tree, 1); -+ goto again; -+ } -+ if (integer_zerop (format_tree)) { - warning ("null format string"); + if (!info->null_format_ok) + warning ("null format string"); -+ return; -+ } -+ if (TREE_CODE (format_tree) != ADDR_EXPR) -+ { -+ if ((info->first_arg_num == 0) && -+ (TREE_CODE(format_tree) == PARM_DECL)) -+ { -+ function_format_info *i2; -+ tree p; -+ int n; -+ -+ /* Now, we need to determine if the current function is printf-like, -+ and, if so, if the parameter we have here is as a parameter of -+ the current function and is in the argument slot declared to -+ contain the format argument. */ -+ -+ p = current_function_decl; -+ -+ i2 = find_function_format (p->decl.name, p->decl.assembler_name); -+ -+ if (i2 == NULL) -+ { -+ if (warn_format > 1) -+ warning("non-constant format parameter"); -+ } -+ else -+ { -+ for (n = 1, p = current_function_decl->decl.arguments; -+ (n < i2->format_num) && (p != NULL); -+ n++, p = TREE_CHAIN(p)) -+ ; -+ if ((p == NULL) || (n != i2->format_num)) -+ warning("can't find format arg for current format function"); -+ else if (p != format_tree) -+ warning("format argument passed here is not declared as format argument"); -+ } -+ } -+ else if ((info->format_type != strftime_format_type) && -+ (warn_format > 1)) -+ warning("non-constant format parameter"); return; } -- if (TREE_CODE (format_tree) != ADDR_EXPR) -- return; - format_tree = TREE_OPERAND (format_tree, 0); -- if (TREE_CODE (format_tree) != STRING_CST) -- return; -+ if (warn_format > 1 && -+ (TREE_CODE (format_tree) == VAR_DECL) && -+ TREE_READONLY(format_tree) && -+ (DECL_INITIAL(format_tree) != NULL) && -+ TREE_CODE(DECL_INITIAL(format_tree)) == STRING_CST) -+ format_tree = DECL_INITIAL(format_tree); -+ -+ if (TREE_CODE (format_tree) != STRING_CST) -+ { -+ if ((info->format_type != strftime_format_type) && -+ (warn_format > 1)) -+ warning("non-constant format parameter"); -+ return; -+ } - format_chars = TREE_STRING_POINTER (format_tree); - format_length = TREE_STRING_LENGTH (format_tree); - if (format_length <= 1) -@@ -1433,7 +1523,10 @@ - if (format_chars - TREE_STRING_POINTER (format_tree) != format_length) - warning ("embedded `\\0' in format"); - if (info->first_arg_num != 0 && params != 0 && ! has_operand_number) -- warning ("too many arguments for format"); -+ { -+ if (warn_format_extra_args) -+ warning ("too many arguments for format"); -+ } - return; - } - if (*format_chars++ != '%') -@@ -1569,12 +1662,13 @@ + if (TREE_CODE (format_tree) != ADDR_EXPR) +@@ -1485,12 +1510,13 @@ It will work on most machines, because size_t and int have the same mode. But might as well warn anyway, since it will fail on other machines. */ @@ -299,7 +166,7 @@ } } else -@@ -1619,6 +1713,53 @@ +@@ -1535,6 +1561,53 @@ } } } @@ -353,7 +220,7 @@ aflag = 0; -@@ -1688,7 +1829,8 @@ +@@ -1604,7 +1677,8 @@ switch (info->format_type) { case printf_format_type: @@ -363,11 +230,3 @@ break; case scanf_format_type: fci = scan_char_table; -@@ -1787,7 +1929,6 @@ - warning ("use of `%c' length character with `%c' type character", - length_char, format_char); - -- /* Finally. . .check type of argument against desired type! */ - if (info->first_arg_num == 0) - continue; - if (fci->pointer_count == 0 && wanted_type == void_type_node) |