summaryrefslogtreecommitdiff
path: root/lang/egcs/files/patch-fa
diff options
context:
space:
mode:
Diffstat (limited to 'lang/egcs/files/patch-fa')
-rw-r--r--lang/egcs/files/patch-fa183
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)