xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/config/i386/msformat-c.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg /* Check calls to formatted I/O functions (-Wformat).
2*8feb0f0bSmrg    Copyright (C) 1992-2020 Free Software Foundation, Inc.
31debfc3dSmrg 
41debfc3dSmrg This file is part of GCC.
51debfc3dSmrg 
61debfc3dSmrg GCC is free software; you can redistribute it and/or modify it under
71debfc3dSmrg the terms of the GNU General Public License as published by the Free
81debfc3dSmrg Software Foundation; either version 3, or (at your option) any later
91debfc3dSmrg version.
101debfc3dSmrg 
111debfc3dSmrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
121debfc3dSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
131debfc3dSmrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
141debfc3dSmrg for more details.
151debfc3dSmrg 
161debfc3dSmrg You should have received a copy of the GNU General Public License
171debfc3dSmrg along with GCC; see the file COPYING3.  If not see
181debfc3dSmrg <http://www.gnu.org/licenses/>.  */
191debfc3dSmrg 
20a2dc1f3fSmrg #define IN_TARGET_CODE 1
21a2dc1f3fSmrg 
221debfc3dSmrg #include "config.h"
231debfc3dSmrg #include "system.h"
241debfc3dSmrg #include "coretypes.h"
251debfc3dSmrg #include "tm.h"
261debfc3dSmrg #include "c-family/c-common.h"
271debfc3dSmrg #include "intl.h"
281debfc3dSmrg #include "c-family/c-format.h"
291debfc3dSmrg 
301debfc3dSmrg /* Mingw specific format attributes ms_printf, ms_scanf, and ms_strftime.  */
311debfc3dSmrg 
321debfc3dSmrg static format_length_info ms_printf_length_specs[] =
331debfc3dSmrg {
341debfc3dSmrg   { "h", FMT_LEN_h, STD_C89, NULL, FMT_LEN_none, STD_C89, 0 },
351debfc3dSmrg   { "l", FMT_LEN_l, STD_C89, NULL, FMT_LEN_none, STD_C89, 0 },
361debfc3dSmrg   { "I32", FMT_LEN_l, STD_EXT, NULL, FMT_LEN_none, STD_C89, 1 },
371debfc3dSmrg   { "I64", FMT_LEN_ll, STD_EXT, NULL, FMT_LEN_none, STD_C89, 1 },
381debfc3dSmrg   { "I", FMT_LEN_L, STD_EXT, NULL, FMT_LEN_none, STD_C89, 1 },
391debfc3dSmrg   { NULL, FMT_LEN_none, STD_C89, NULL, FMT_LEN_none, STD_C89, 0 }
401debfc3dSmrg };
411debfc3dSmrg 
421debfc3dSmrg static const format_flag_spec ms_printf_flag_specs[] =
431debfc3dSmrg {
44a2dc1f3fSmrg   { ' ',  0, 0, 0, N_("' ' flag"),        N_("the ' ' printf flag"),              STD_C89 },
45a2dc1f3fSmrg   { '+',  0, 0, 0, N_("'+' flag"),        N_("the '+' printf flag"),              STD_C89 },
46a2dc1f3fSmrg   { '#',  0, 0, 0, N_("'#' flag"),        N_("the '#' printf flag"),              STD_C89 },
47a2dc1f3fSmrg   { '0',  0, 0, 0, N_("'0' flag"),        N_("the '0' printf flag"),              STD_C89 },
48a2dc1f3fSmrg   { '-',  0, 0, 0, N_("'-' flag"),        N_("the '-' printf flag"),              STD_C89 },
49a2dc1f3fSmrg   { '\'', 0, 0, 0, N_("''' flag"),        N_("the ''' printf flag"),              STD_EXT },
50a2dc1f3fSmrg   { 'w',  0, 0, 0, N_("field width"),     N_("field width in printf format"),     STD_C89 },
51a2dc1f3fSmrg   { 'p',  0, 0, 0, N_("precision"),       N_("precision in printf format"),       STD_C89 },
52a2dc1f3fSmrg   { 'L',  0, 0, 0, N_("length modifier"), N_("length modifier in printf format"), STD_C89 },
53a2dc1f3fSmrg   { 0, 0, 0, 0, NULL, NULL, STD_C89 }
541debfc3dSmrg };
551debfc3dSmrg 
561debfc3dSmrg static const format_flag_pair ms_printf_flag_pairs[] =
571debfc3dSmrg {
581debfc3dSmrg   { ' ', '+', 1, 0   },
591debfc3dSmrg   { '0', '-', 1, 0   }, { '0', 'p', 1, 'i' },
601debfc3dSmrg   { 0, 0, 0, 0 }
611debfc3dSmrg };
621debfc3dSmrg 
631debfc3dSmrg static const format_flag_spec ms_scanf_flag_specs[] =
641debfc3dSmrg {
65a2dc1f3fSmrg   { '*',  0, 0, 0, N_("assignment suppression"), N_("the assignment suppression scanf feature"), STD_C89 },
66a2dc1f3fSmrg   { 'a',  0, 0, 0, N_("'a' flag"),               N_("the 'a' scanf flag"),                       STD_EXT },
67a2dc1f3fSmrg   { 'w',  0, 0, 0, N_("field width"),            N_("field width in scanf format"),              STD_C89 },
68a2dc1f3fSmrg   { 'L',  0, 0, 0, N_("length modifier"),        N_("length modifier in scanf format"),          STD_C89 },
69a2dc1f3fSmrg   { '\'', 0, 0, 0, N_("''' flag"),               N_("the ''' scanf flag"),                       STD_EXT },
70a2dc1f3fSmrg   { 0, 0, 0, 0, NULL, NULL, STD_C89 }
711debfc3dSmrg };
721debfc3dSmrg 
731debfc3dSmrg static const format_flag_pair ms_scanf_flag_pairs[] =
741debfc3dSmrg {
751debfc3dSmrg   { '*', 'L', 0, 0 },
761debfc3dSmrg   { 0, 0, 0, 0 }
771debfc3dSmrg };
781debfc3dSmrg 
791debfc3dSmrg static const format_flag_spec ms_strftime_flag_specs[] =
801debfc3dSmrg {
81a2dc1f3fSmrg   { '#', 0,   0, 0, N_("'#' flag"),     N_("the '#' strftime flag"),          STD_EXT },
82a2dc1f3fSmrg   { 0, 0, 0, 0, NULL, NULL, STD_C89 }
831debfc3dSmrg };
841debfc3dSmrg 
851debfc3dSmrg static const format_flag_pair ms_strftime_flag_pairs[] =
861debfc3dSmrg {
871debfc3dSmrg   { 0, 0, 0, 0 }
881debfc3dSmrg };
891debfc3dSmrg 
901debfc3dSmrg static const format_char_info ms_print_char_table[] =
911debfc3dSmrg {
921debfc3dSmrg   /* C89 conversion specifiers.  */
931debfc3dSmrg   { "di",  0, STD_C89, { T89_I,   BADLEN,  T89_S,   T89_L,   T9L_LL,  T99_SST,  BADLEN, BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "-wp0 +'",  "i",  NULL },
941debfc3dSmrg   { "oxX", 0, STD_C89, { T89_UI,  BADLEN,  T89_US,  T89_UL,  T9L_ULL, T99_ST, BADLEN, BADLEN, BADLEN, BADLEN,  BADLEN,  BADLEN }, "-wp0#",     "i",  NULL },
951debfc3dSmrg   { "u",   0, STD_C89, { T89_UI,  BADLEN,  T89_US,  T89_UL,  T9L_ULL, T99_ST, BADLEN, BADLEN, BADLEN, BADLEN,  BADLEN,  BADLEN }, "-wp0'",    "i",  NULL },
961debfc3dSmrg   { "fgG", 0, STD_C89, { T89_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN, BADLEN, BADLEN }, "-wp0 +#'", "",   NULL },
971debfc3dSmrg   { "eE",  0, STD_C89, { T89_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN, BADLEN, BADLEN }, "-wp0 +#",  "",   NULL },
981debfc3dSmrg   { "c",   0, STD_C89, { T89_I,   BADLEN,  T89_S,  T94_WI,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "-w",        "",   NULL },
991debfc3dSmrg   { "s",   1, STD_C89, { T89_C,   BADLEN,  T89_S,  T94_W,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "-wp",       "cR", NULL },
1001debfc3dSmrg   { "p",   1, STD_C89, { T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "-w",        "c",  NULL },
1011debfc3dSmrg   { "n",   1, STD_C89, { T89_I,   BADLEN,  T89_S,   T89_L,   T9L_LL,  BADLEN,  BADLEN, BADLEN,  T99_IM,  BADLEN,  BADLEN,  BADLEN }, "",          "W",  NULL },
1021debfc3dSmrg   /* X/Open conversion specifiers.  */
1031debfc3dSmrg   { "C",   0, STD_EXT, { TEX_WI,  BADLEN,  T89_S,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "-w",        "",   NULL },
1041debfc3dSmrg   { "S",   1, STD_EXT, { TEX_W,   BADLEN,  T89_S,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "-wp",       "R",  NULL },
1051debfc3dSmrg   { NULL,  0, STD_C89, NOLENGTHS, NULL, NULL, NULL }
1061debfc3dSmrg };
1071debfc3dSmrg 
1081debfc3dSmrg static const format_char_info ms_scan_char_table[] =
1091debfc3dSmrg {
1101debfc3dSmrg   /* C89 conversion specifiers.  */
1111debfc3dSmrg   { "di",    1, STD_C89, { T89_I,   BADLEN,  T89_S,   T89_L,   T9L_LL,  T99_SST,  BADLEN, BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "*w'", "W",   NULL },
1121debfc3dSmrg   { "u",     1, STD_C89, { T89_UI,  BADLEN,  T89_US,  T89_UL,  T9L_ULL, T99_ST, BADLEN,  BADLEN, BADLEN, BADLEN,  BADLEN,  BADLEN }, "*w'", "W",   NULL },
1131debfc3dSmrg   { "oxX",   1, STD_C89, { T89_UI,  BADLEN,  T89_US,  T89_UL,  T9L_ULL, T99_ST, BADLEN,  BADLEN, BADLEN, BADLEN,  BADLEN,  BADLEN }, "*w",   "W",   NULL },
1141debfc3dSmrg   { "efgEG", 1, STD_C89, { T89_F,   BADLEN,  BADLEN,  T89_D,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN, BADLEN, BADLEN }, "*w'",  "W",   NULL },
1151debfc3dSmrg   { "c",     1, STD_C89, { T89_C,   BADLEN,  T89_S,  T94_W,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "*w",   "cW",  NULL },
1161debfc3dSmrg   { "s",     1, STD_C89, { T89_C,   BADLEN,  T89_S,  T94_W,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "*aw",  "cW",  NULL },
1171debfc3dSmrg   { "[",     1, STD_C89, { T89_C,   BADLEN,  BADLEN,  T94_W,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "*aw",  "cW[", NULL },
1181debfc3dSmrg   { "p",     2, STD_C89, { T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "*w",   "W",   NULL },
1191debfc3dSmrg   { "n",     1, STD_C89, { T89_I,   BADLEN,  T89_S,   T89_L,   T9L_LL,  BADLEN,  BADLEN, BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "",     "W",   NULL },
1201debfc3dSmrg   /* X/Open conversion specifiers.  */
1211debfc3dSmrg   { "C",     1, STD_EXT, { TEX_W,   BADLEN,  T89_S,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "*w",   "W",   NULL },
1221debfc3dSmrg   { "S",     1, STD_EXT, { TEX_W,   BADLEN,  T89_S,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "*aw",  "W",   NULL },
1231debfc3dSmrg   { NULL, 0, STD_C89, NOLENGTHS, NULL, NULL, NULL }
1241debfc3dSmrg };
1251debfc3dSmrg 
1261debfc3dSmrg static const format_char_info ms_time_char_table[] =
1271debfc3dSmrg {
1281debfc3dSmrg   /* C89 conversion specifiers.  */
1291debfc3dSmrg   { "ABZab",		0, STD_C89, NOLENGTHS, "#",     "",   NULL },
1301debfc3dSmrg   { "cx",		0, STD_C89, NOLENGTHS, "#",      "3",  NULL },
1311debfc3dSmrg   { "HIMSUWdmw",	0, STD_C89, NOLENGTHS, "#",  "",   NULL },
1321debfc3dSmrg   { "j",		0, STD_C89, NOLENGTHS, "#",  "",  NULL },
1331debfc3dSmrg   { "p",		0, STD_C89, NOLENGTHS, "#",      "",   NULL },
1341debfc3dSmrg   { "X",		0, STD_C89, NOLENGTHS, "#",      "",   NULL },
1351debfc3dSmrg   { "y",		0, STD_C89, NOLENGTHS, "#", "4",  NULL },
1361debfc3dSmrg   { "Y",		0, STD_C89, NOLENGTHS, "#", "",  NULL },
1371debfc3dSmrg   { "%",		0, STD_C89, NOLENGTHS, "",       "",   NULL },
1381debfc3dSmrg   /* C99 conversion specifiers.  */
1391debfc3dSmrg   { "z",		0, STD_C99, NOLENGTHS, "#",      "",  NULL },
1401debfc3dSmrg   { NULL,		0, STD_C89, NOLENGTHS, NULL, NULL, NULL }
1411debfc3dSmrg };
1421debfc3dSmrg 
1431debfc3dSmrg EXPORTED_CONST format_kind_info mingw_format_attributes[3] =
1441debfc3dSmrg {
1451debfc3dSmrg   { "ms_printf",   ms_printf_length_specs,  ms_print_char_table, " +#0-'", NULL,
1461debfc3dSmrg     ms_printf_flag_specs, ms_printf_flag_pairs,
1471debfc3dSmrg     FMT_FLAG_ARG_CONVERT|FMT_FLAG_DOLLAR_MULTIPLE|FMT_FLAG_USE_DOLLAR|FMT_FLAG_EMPTY_PREC_OK,
1481debfc3dSmrg     'w', 0, 'p', 0, 'L', 0,
1491debfc3dSmrg     &integer_type_node, &integer_type_node
1501debfc3dSmrg   },
1511debfc3dSmrg   { "ms_scanf",    ms_printf_length_specs,   ms_scan_char_table,  "*'", NULL,
1521debfc3dSmrg     ms_scanf_flag_specs, ms_scanf_flag_pairs,
1531debfc3dSmrg     FMT_FLAG_ARG_CONVERT|FMT_FLAG_SCANF_A_KLUDGE|FMT_FLAG_USE_DOLLAR|FMT_FLAG_ZERO_WIDTH_BAD|FMT_FLAG_DOLLAR_GAP_POINTER_OK,
1541debfc3dSmrg     'w', 0, 0, '*', 'L', 0,
1551debfc3dSmrg     NULL, NULL
1561debfc3dSmrg   },
1571debfc3dSmrg   { "ms_strftime", NULL,                 ms_time_char_table,  "", "#",
1581debfc3dSmrg     ms_strftime_flag_specs, ms_strftime_flag_pairs,
1591debfc3dSmrg     FMT_FLAG_FANCY_PERCENT_OK, 0, 0, 0, 0, 0, 0,
1601debfc3dSmrg     NULL, NULL
1611debfc3dSmrg   }
1621debfc3dSmrg };
1631debfc3dSmrg 
1641debfc3dSmrg /* Default overrides for printf, scanf and strftime.  */
1651debfc3dSmrg EXPORTED_CONST target_ovr_attr mingw_format_attribute_overrides[4] =
1661debfc3dSmrg {
1671debfc3dSmrg   { "ms_printf", "printf" },
1681debfc3dSmrg   { "ms_scanf", "scanf" },
1691debfc3dSmrg   { "ms_strftime", "strftime" }
1701debfc3dSmrg };
1711debfc3dSmrg 
1721debfc3dSmrg /* Setup for option Wpedantic-ms-format.  */
1731debfc3dSmrg 
1741debfc3dSmrg #ifdef TARGET_OVERRIDES_FORMAT_INIT
1751debfc3dSmrg 
1761debfc3dSmrg /* Make sure TARGET_OVERRIDES_FORMAT_INIT is prototyped.  */
1771debfc3dSmrg extern void TARGET_OVERRIDES_FORMAT_INIT (void);
1781debfc3dSmrg 
1791debfc3dSmrg /* Helper.  */
1801debfc3dSmrg #define C89_OR_EXT (warn_pedantic_ms_format ? STD_EXT : STD_C89)
1811debfc3dSmrg 
1821debfc3dSmrg void
TARGET_OVERRIDES_FORMAT_INIT(void)1831debfc3dSmrg TARGET_OVERRIDES_FORMAT_INIT (void)
1841debfc3dSmrg {
1851debfc3dSmrg   ms_printf_length_specs[2].std = C89_OR_EXT; /* I32 */
1861debfc3dSmrg   ms_printf_length_specs[3].std = C89_OR_EXT; /* I64 */
1871debfc3dSmrg   ms_printf_length_specs[4].std = C89_OR_EXT; /* I */
1881debfc3dSmrg }
1891debfc3dSmrg 
1901debfc3dSmrg #undef C89_OR_EXT
1911debfc3dSmrg 
1921debfc3dSmrg #endif
193