OSDN Git Service

* config/arm/arm.c (arm_promote_prototypes): Use TARGET_AAPCS_BASED.
[pf3gnuchains/gcc-fork.git] / gcc / c-format.c
index 0b3fa2f..3a51c6b 100644 (file)
@@ -1,6 +1,6 @@
 /* Check calls to formatted I/O functions (-Wformat).
    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003 Free Software Foundation, Inc.
+   2001, 2002, 2003, 2004 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -37,13 +37,13 @@ void
 set_Wformat (int setting)
 {
   warn_format = setting;
-  warn_format_y2k = setting;
   warn_format_extra_args = setting;
   warn_format_zero_length = setting;
   if (setting != 1)
     {
       warn_format_nonliteral = setting;
       warn_format_security = setting;
+      warn_format_y2k = setting;
     }
   /* Make sure not to disable -Wnonnull if -Wformat=0 is specified.  */
   if (setting)
@@ -755,23 +755,23 @@ static const format_flag_pair strfmon_flag_pairs[] =
 static const format_char_info print_char_table[] =
 {
   /* C89 conversion specifiers.  */
-  { "di",  0, STD_C89, { T89_I,   T99_SC,  T89_S,   T89_L,   T9L_LL,  TEX_LL,  T99_SST, T99_PD,  T99_IM  }, "-wp0 +'I", "i"  },
-  { "oxX", 0, STD_C89, { T89_UI,  T99_UC,  T89_US,  T89_UL,  T9L_ULL, TEX_ULL, T99_ST,  T99_UPD, T99_UIM }, "-wp0#",    "i"  },
-  { "u",   0, STD_C89, { T89_UI,  T99_UC,  T89_US,  T89_UL,  T9L_ULL, TEX_ULL, T99_ST,  T99_UPD, T99_UIM }, "-wp0'I",   "i"  },
-  { "fgG", 0, STD_C89, { T89_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T89_LD,  BADLEN,  BADLEN,  BADLEN  }, "-wp0 +#'", ""   },
-  { "eE",  0, STD_C89, { T89_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T89_LD,  BADLEN,  BADLEN,  BADLEN  }, "-wp0 +#",  ""   },
-  { "c",   0, STD_C89, { T89_I,   BADLEN,  BADLEN,  T94_WI,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "-w",       ""   },
-  { "s",   1, STD_C89, { T89_C,   BADLEN,  BADLEN,  T94_W,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "-wp",      "cR" },
-  { "p",   1, STD_C89, { T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "-w",       "c"  },
-  { "n",   1, STD_C89, { T89_I,   T99_SC,  T89_S,   T89_L,   T9L_LL,  BADLEN,  T99_SST, T99_PD,  T99_IM  }, "",         "W"  },
+  { "di",  0, STD_C89, { T89_I,   T99_SC,  T89_S,   T89_L,   T9L_LL,  TEX_LL,  T99_SST, T99_PD,  T99_IM  }, "-wp0 +'I",  "i"  },
+  { "oxX", 0, STD_C89, { T89_UI,  T99_UC,  T89_US,  T89_UL,  T9L_ULL, TEX_ULL, T99_ST,  T99_UPD, T99_UIM }, "-wp0#",     "i"  },
+  { "u",   0, STD_C89, { T89_UI,  T99_UC,  T89_US,  T89_UL,  T9L_ULL, TEX_ULL, T99_ST,  T99_UPD, T99_UIM }, "-wp0'I",    "i"  },
+  { "fgG", 0, STD_C89, { T89_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T89_LD,  BADLEN,  BADLEN,  BADLEN  }, "-wp0 +#'I", ""   },
+  { "eE",  0, STD_C89, { T89_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T89_LD,  BADLEN,  BADLEN,  BADLEN  }, "-wp0 +#I",  ""   },
+  { "c",   0, STD_C89, { T89_I,   BADLEN,  BADLEN,  T94_WI,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "-w",        ""   },
+  { "s",   1, STD_C89, { T89_C,   BADLEN,  BADLEN,  T94_W,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "-wp",       "cR" },
+  { "p",   1, STD_C89, { T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "-w",        "c"  },
+  { "n",   1, STD_C89, { T89_I,   T99_SC,  T89_S,   T89_L,   T9L_LL,  BADLEN,  T99_SST, T99_PD,  T99_IM  }, "",          "W"  },
   /* C99 conversion specifiers.  */
-  { "F",   0, STD_C99, { T99_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T99_LD,  BADLEN,  BADLEN,  BADLEN  }, "-wp0 +#'", ""   },
-  { "aA",  0, STD_C99, { T99_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T99_LD,  BADLEN,  BADLEN,  BADLEN  }, "-wp0 +#",  ""   },
+  { "F",   0, STD_C99, { T99_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T99_LD,  BADLEN,  BADLEN,  BADLEN  }, "-wp0 +#'I", ""   },
+  { "aA",  0, STD_C99, { T99_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T99_LD,  BADLEN,  BADLEN,  BADLEN  }, "-wp0 +#",   ""   },
   /* X/Open conversion specifiers.  */
-  { "C",   0, STD_EXT, { TEX_WI,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "-w",       ""   },
-  { "S",   1, STD_EXT, { TEX_W,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "-wp",      "R"  },
+  { "C",   0, STD_EXT, { TEX_WI,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "-w",        ""   },
+  { "S",   1, STD_EXT, { TEX_W,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "-wp",       "R"  },
   /* GNU conversion specifiers.  */
-  { "m",   0, STD_EXT, { T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "-wp",      ""   },
+  { "m",   0, STD_EXT, { T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "-wp",       ""   },
   { NULL,  0, 0, NOLENGTHS, NULL, NULL }
 };
 
@@ -810,6 +810,9 @@ static const format_char_info gcc_diag_char_table[] =
   /* %H will require "location_t" at runtime.  */
   { "H",   0, STD_C89, { T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "",   ""   },
 
+  /* These will require a "tree" at runtime.  */
+  { "J", 0, STD_C89, { T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "",   ""   },
+
   { "m",   0, STD_C89, NOARGUMENTS, "",      ""   },
   { NULL,  0, 0, NOLENGTHS, NULL, NULL }
 };
@@ -830,7 +833,7 @@ static const format_char_info gcc_cdiag_char_table[] =
   { "H",   0, STD_C89, { T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "",   ""   },
 
   /* These will require a "tree" at runtime.  */
-  { "DFT", 0, STD_C89, { T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "",   ""   },
+  { "DEFJT", 0, STD_C89, { T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "",   ""   },
 
   { "m",   0, STD_C89, NOARGUMENTS, "",      ""   },
   { NULL,  0, 0, NOLENGTHS, NULL, NULL }
@@ -852,7 +855,7 @@ static const format_char_info gcc_cxxdiag_char_table[] =
   { "H",   0, STD_C89, { T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "",   ""   },
 
   /* These will require a "tree" at runtime.  */
-  { "ADEFTV",0,STD_C89,{ T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "+#",   ""   },
+  { "ADEFJTV",0,STD_C89,{ T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "+#",   ""   },
 
   /* These accept either an `int' or an `enum tree_code' (which is handled as an `int'.)  */
   { "CLOPQ",0,STD_C89, { T89_I,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "",   ""   },
@@ -2283,7 +2286,7 @@ check_format_types (int *status, format_wanted_type *types)
        abort ();
 
       if (types->pointer_count == 0)
-       wanted_type = (*lang_hooks.types.type_promotes_to) (wanted_type);
+       wanted_type = lang_hooks.types.type_promotes_to (wanted_type);
 
       STRIP_NOPS (cur_param);
 
@@ -2387,7 +2390,7 @@ check_format_types (int *status, format_wanted_type *types)
       if (TREE_CODE (wanted_type) == INTEGER_TYPE
          && TREE_CODE (cur_type) == INTEGER_TYPE
          && (! pedantic || i == 0 || (i == 1 && char_type_flag))
-         && (TREE_UNSIGNED (wanted_type)
+         && (TYPE_UNSIGNED (wanted_type)
              ? wanted_type == c_common_unsigned_type (cur_type)
              : wanted_type == c_common_signed_type (cur_type)))
        continue;
@@ -2401,19 +2404,24 @@ check_format_types (int *status, format_wanted_type *types)
       {
        const char *this;
        const char *that;
+       tree tmp;
+
+       tmp = TYPE_NAME (wanted_type);
+       if (TREE_CODE (tmp) == TYPE_DECL)
+         tmp = DECL_NAME (tmp);
+       this = IDENTIFIER_POINTER (tmp);
 
-       this = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (wanted_type)));
        that = 0;
        if (TYPE_NAME (orig_cur_type) != 0
            && TREE_CODE (orig_cur_type) != INTEGER_TYPE
            && !(TREE_CODE (orig_cur_type) == POINTER_TYPE
                 && TREE_CODE (TREE_TYPE (orig_cur_type)) == INTEGER_TYPE))
          {
-           if (TREE_CODE (TYPE_NAME (orig_cur_type)) == TYPE_DECL
-               && DECL_NAME (TYPE_NAME (orig_cur_type)) != 0)
-             that = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (orig_cur_type)));
-           else
-             that = IDENTIFIER_POINTER (TYPE_NAME (orig_cur_type));
+           tmp = TYPE_NAME (orig_cur_type);
+           if (TREE_CODE (tmp) == TYPE_DECL)
+             tmp = DECL_NAME (tmp);
+           if (tmp)
+             that = IDENTIFIER_POINTER (tmp);
          }
 
        /* A nameless type can't possibly match what the format wants.
@@ -2471,7 +2479,6 @@ find_char_info_specifier_index (const format_char_info *fci, int c)
   
   /* We shouldn't be looking for a non-existent specifier.  */
   abort ();
-  
 }
 
 /* Given a format_length_info array FLI, and a character C, this
@@ -2604,6 +2611,12 @@ init_dynamic_diag_info (void)
          diag_fci[i].types[0].type = &loc;
          diag_fci[i].pointer_count = 1;
        }
+      if (t)
+        {
+         i = find_char_info_specifier_index (diag_fci, 'J');
+         diag_fci[i].types[0].type = &t;
+         diag_fci[i].pointer_count = 1;
+       }
 
       /* Handle the __gcc_cdiag__ format specifics.  */
       if (! cdiag_fci)
@@ -2619,10 +2632,13 @@ init_dynamic_diag_info (void)
        }
       if (t)
         {
-         /* All specifiers taking a tree share the same struct. */
+         /* All specifiers taking a tree share the same struct.  */
          i = find_char_info_specifier_index (cdiag_fci, 'D');
          cdiag_fci[i].types[0].type = &t;
          cdiag_fci[i].pointer_count = 1;
+         i = find_char_info_specifier_index (cdiag_fci, 'J');
+         cdiag_fci[i].types[0].type = &t;
+         cdiag_fci[i].pointer_count = 1;
        }
 
       /* Handle the __gcc_cxxdiag__ format specifics.  */
@@ -2639,10 +2655,13 @@ init_dynamic_diag_info (void)
        }
       if (t)
         {
-         /* All specifiers taking a tree share the same struct. */
+         /* All specifiers taking a tree share the same struct.  */
          i = find_char_info_specifier_index (cxxdiag_fci, 'D');
          cxxdiag_fci[i].types[0].type = &t;
          cxxdiag_fci[i].pointer_count = 1;
+         i = find_char_info_specifier_index (cxxdiag_fci, 'J');
+         cxxdiag_fci[i].types[0].type = &t;
+         cxxdiag_fci[i].pointer_count = 1;
        }
     }
 }