]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
Update gcc-internal-format for GCC 15.
authorBruno Haible <bruno@clisp.org>
Thu, 19 Jun 2025 11:35:46 +0000 (13:35 +0200)
committerBruno Haible <bruno@clisp.org>
Thu, 19 Jun 2025 11:35:46 +0000 (13:35 +0200)
Reported by Roland Illig, Andrew Pinski, Jakub Jelinek in
<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119684>.
Also reported by Roland Illig in
<https://savannah.gnu.org/bugs/?50450>, <https://savannah.gnu.org/bugs/?50461>.

* gettext-tools/src/format-gcc-internal.c: Update for GCC 15.
* gettext-tools/tests/format-gcc-internal-1: Likewise.
* gettext-tools/tests/format-gcc-internal-2: Likewise.
* gettext-tools/doc/gettext.texi (gcc-internal-format): Likewise.

gettext-tools/doc/gettext.texi
gettext-tools/src/format-gcc-internal.c
gettext-tools/tests/format-gcc-internal-1
gettext-tools/tests/format-gcc-internal-2

index b53440fd8c0d85271826ba4de74364ea24716e8a..ec09e5ef309e491981397c56618e56b4bee17bdc 100644 (file)
@@ -10389,20 +10389,78 @@ PHP format strings are described in the documentation of the PHP function
 @node gcc-internal-format
 @subsection GCC internal Format Strings
 
-These format strings are used inside the GCC sources.  In such a format
-string, a directive starts with @samp{%}, is optionally followed by a
-size specifier @samp{l}, an optional flag @samp{+}, another optional flag
-@samp{#}, and is finished by a specifier: @samp{%} denotes a literal
-percent sign, @samp{c} denotes a character, @samp{s} denotes a string,
-@samp{i} and @samp{d} denote an integer, @samp{o}, @samp{u}, @samp{x}
-denote an unsigned integer, @samp{.*s} denotes a string preceded by a
-width specification, @samp{H} denotes a @samp{location_t *} pointer,
-@samp{D} denotes a general declaration, @samp{F} denotes a function
-declaration, @samp{T} denotes a type, @samp{A} denotes a function argument,
-@samp{C} denotes a tree code, @samp{E} denotes an expression, @samp{L}
-denotes a programming language, @samp{O} denotes a binary operator,
-@samp{P} denotes a function parameter, @samp{Q} denotes an assignment
-operator, @samp{V} denotes a const/volatile qualifier.
+These format strings are used inside the GCC sources.
+In such a format string,
+a directive starts with @samp{%},
+is optionally followed by a size specifier @samp{l} or @samp{ll}
+or @samp{w} or @samp{z} or @samp{t},
+an optional flag @samp{q} (indicates quotes),
+another optional flag @samp{+},
+another optional flag @samp{#},
+and is finished by a specifier:
+@itemize @bullet
+@item
+@samp{%} denotes a literal percent sign,
+@item
+@samp{<} denotes an opening quote,
+@item
+@samp{>} or @samp{'} denotes a closing quote,
+@item
+@samp{r} denotes the beginning of a colored text segment,
+@item
+@samp{R} denotes the end of a colored text segment,
+@item
+@samp{@{} denotes the beginning of a clickable text segment,
+@item
+@samp{@}} denotes the end of a clickable text segment,
+@item
+@samp{c} denotes a character,
+@item
+@samp{s} denotes a string,
+@item
+@samp{i} and @samp{d} denote an integer,
+@item
+@samp{o}, @samp{u}, @samp{x} denote an unsigned integer,
+@item
+@samp{f} denotes a floating-point number,
+@item
+@samp{.*s} denotes a string preceded by a width specification,
+@item
+@samp{D} denotes a general declaration,
+@item
+@samp{E} denotes an expression,
+@item
+@samp{F} denotes a function declaration,
+@item
+@samp{T} denotes a type,
+@item
+@samp{A} denotes a function argument,
+@item
+@samp{H} denotes the first type in a type difference,
+@item
+@samp{I} denotes the second type in a type difference,
+@item
+@samp{O} denotes a binary operator,
+@item
+@samp{P} denotes a function parameter index,
+@item
+@samp{Q} denotes an assignment operator,
+@item
+@samp{S} denotes a substitution,
+@item
+@samp{X} denotes an exception,
+@item
+@samp{V} or @samp{v} denotes a list of const/volatile qualifiers,
+@item
+@samp{C} denotes a tree code or the current locus,
+@item
+@samp{L} denotes a programming language or a locus,
+@item
+@samp{p}, @samp{@@}, @samp{e} denote
+various other types of compiler-internal objects,
+@item
+@samp{Z} denotes an array of integers.
+@end itemize
 
 @node gfc-internal-format
 @subsection GFC internal Format Strings
index 4e7335b1ea27918f948c6c1008b827bed56098e9..535a0005ca028b1466efdb9d329f5a1b7eda78a7 100644 (file)
 #define _(str) gettext (str)
 
 /* GCC internal format strings consist of language frontend independent
-   format directives, implemented in gcc-4.3.0/gcc/pretty-print.c (function
-   pp_base_format), plus some frontend dependent extensions:
+   format directives, implemented in gcc-15.1.0/gcc/pretty-print.cc (method
+   pretty_printer::format), plus some frontend dependent extensions, activated
+   through set_format_decoder invocations:
+     - for frontend independent diagnostics
+       in gcc-15.1.0/gcc/tree-diagnostic.cc (function default_tree_printer)
      - for the C/ObjC frontend
-       in gcc-4.3.0/gcc/c-objc-common.c (function c_tree_printer)
+       in gcc-15.1.0/gcc/c/c-objc-common.cc (function c_tree_printer)
      - for the C++ frontend
-       in gcc-4.3.0/gcc/cp/error.c (function cp_printer)
+       in gcc-15.1.0/gcc/cp/error.cc (function cp_printer)
+     - for the Fortran frontend
+       in gcc-15.1.0/gcc/fortran/error.cc (function gfc_format_decoder)
    Taking these together, GCC internal format strings are specified as follows.
 
    A directive
    - starts with '%',
    - either is finished by one of these:
-       - '%', '<', '>', "'", that need no argument,
+       - '%', '<', '>', '}', "'", 'R', that need no argument,
        - 'm', that needs no argument but looks at an err_no variable,
    - or is continued like this:
        - optionally 'm$' where m is a positive integer,
        - optionally any number of flags:
          'q' (once only),
-         'l' (up to twice) or 'w' (once only) (exclusive),
+         'l' (up to twice) or 'w' (once only) or 'z' (once only)
+             or 't' (once only) (exclusive),
          '+' (once only),
          '#' (once only),
        - finished by a specifier
 
+           - 'r', that needs a color argument and expects a '%R' later,
+           - '{', that needs a URL argument and expects a '%}' later,
            - 'c', that needs a character argument,
            - 's', that needs a string argument,
            - '.NNNs', where NNN is a nonempty digit sequence, that needs a
              size,
            - 'o', 'u', 'x', that need an unsigned integer argument of the
              specified size,
+           - 'f', that needs a floating-point argument,
            - 'p', that needs a 'void *' argument,
-           - 'H', that needs a 'location_t *' argument,
-           - 'J', that needs a general declaration argument,
-           - 'K', that needs a statement argument,
-             [see gcc/pretty-print.c]
+           - '@', that needs a 'diagnostic_event_id_t *' argument,
+           - 'e', that needs a 'pp_element *' argument,
+           - 'Z', that needs an 'int *' argument and an 'unsigned int' argument,
+             [see gcc/pretty-print.cc]
 
            - 'D', that needs a general declaration argument,
+           - 'E', that needs an expression argument,
            - 'F', that needs a function declaration argument,
            - 'T', that needs a type argument,
-           - 'E', that needs an expression argument,
-             [see gcc/c-objc-common.c and gcc/cp/error.c]
+             [see gcc/tree-diagnostic.cc and gcc/c/c-objc-common.cc and
+              gcc/cp/error.cc]
+
+           - 'V', that needs a tree argument with a list of type qualifiers,
+             [see gcc/c/c-objc-common.cc and gcc/cp/error.cc]
+
+           - 'v', that needs a list of type qualifiers,
+             [see gcc/c/c-objc-common.cc]
 
            - 'A', that needs a function argument list argument,
-           - 'C', that needs a tree code argument,
-           - 'L', that needs a language argument,
+           - 'H', that needs a type argument and prints it specially
+                  (as first type of a type difference),
+           - 'I', that needs a type argument and prints it specially
+                  (as second type of a type difference),
            - 'O', that needs a binary operator argument,
-           - 'P', that needs a function parameter argument,
+           - 'P', that needs a function parameter index argument,
            - 'Q', that needs an assignment operator argument,
-           - 'V', that needs a const/volatile qualifier argument.
-             [see gcc/cp/error.c]
+           - 'S', that needs a substitution,
+           - 'X', that needs an exception,
+             [see gcc/cp/error.cc]
+
+           - 'C', that needs a tree code argument in the cp/ front end [IGNORE!]
+                  but no argument in the fortran/ front end,
+           - 'L', that needs a language identifier argument in the cp/ front end
+                  or a locus argument in the fortran/ front end,
+             [see gcc/cp/error.cc and gcc/fortran/error.cc]
+
+   Directives %< and %> should come in pairs; these pairs cannot be nested.
+   Directives %r and %R should come in pairs; these pairs cannot be nested.
+   Directives %{ and %} should come in pairs; these pairs cannot be nested.
 
    Numbered ('%m$' or '*m$') and unnumbered argument specifications cannot
    be used in the same string.  */
@@ -96,29 +125,43 @@ enum format_arg_type
   /* Basic types */
   FAT_INTEGER           = 1,
   FAT_CHAR              = 2,
-  FAT_STRING            = 3,
-  FAT_POINTER           = 4,
-  FAT_LOCATION          = 5,
+  FAT_FLOAT             = 3,
+  FAT_STRING            = 4,
+  FAT_POINTER           = 5,
   FAT_TREE              = 6,
   FAT_TREE_CODE         = 7,
-  FAT_LANGUAGES         = 8,
+  FAT_EVENT_ID          = 8,
+  FAT_ELEMENT           = 9,
+  FAT_LANGUAGE_OR_LOCUS = 10,
+  FAT_CV                = 11,
+  FAT_INT_ARRAY_PART1   = 12,
+  FAT_INT_ARRAY_PART2   = 13,
+  FAT_COLOR             = 14,
+  FAT_URL               = 15,
   /* Flags */
   FAT_UNSIGNED          = 1 << 4,
   FAT_SIZE_LONG         = 1 << 5,
   FAT_SIZE_LONGLONG     = 2 << 5,
   FAT_SIZE_WIDE         = 3 << 5,
-  FAT_TREE_DECL         = 1 << 7,
-  FAT_TREE_STATEMENT    = 2 << 7,
-  FAT_TREE_FUNCDECL     = 3 << 7,
-  FAT_TREE_TYPE         = 4 << 7,
-  FAT_TREE_ARGUMENT     = 5 << 7,
-  FAT_TREE_EXPRESSION   = 6 << 7,
-  FAT_TREE_CV           = 7 << 7,
-  FAT_TREE_CODE_BINOP   = 1 << 10,
-  FAT_TREE_CODE_ASSOP   = 2 << 10,
-  FAT_FUNCPARAM         = 1 << 12,
+  FAT_SIZE_SIZE         = 4 << 5,
+  FAT_SIZE_PTRDIFF      = 5 << 5,
+  FAT_TREE_DECL         = 1 << 8,
+  FAT_TREE_STATEMENT    = 2 << 8,
+  FAT_TREE_FUNCDECL     = 3 << 8,
+  FAT_TREE_TYPE         = 4 << 8,
+  FAT_TREE_TYPE_DIFF1   = 5 << 8,
+  FAT_TREE_TYPE_DIFF2   = 6 << 8,
+  FAT_TREE_ARGUMENT     = 7 << 8,
+  FAT_TREE_EXPRESSION   = 8 << 8,
+  FAT_TREE_CV           = 9 << 8,
+  FAT_TREE_SUBSTITUTION = 10 << 8,
+  FAT_TREE_EXCEPTION    = 11 << 8,
+  FAT_TREE_CODE_BINOP   = 1 << 12,
+  FAT_TREE_CODE_ASSOP   = 2 << 12,
+  FAT_FUNCPARAM         = 1 << 14,
   /* Bitmasks */
-  FAT_SIZE_MASK         = (FAT_SIZE_LONG | FAT_SIZE_LONGLONG | FAT_SIZE_WIDE)
+  FAT_SIZE_MASK         = (FAT_SIZE_LONG | FAT_SIZE_LONGLONG
+                           | FAT_SIZE_WIDE | FAT_SIZE_SIZE | FAT_SIZE_PTRDIFF)
 };
 #ifdef __cplusplus
 typedef int format_arg_type_t;
@@ -138,6 +181,7 @@ struct spec
   unsigned int numbered_arg_count;
   struct numbered_arg *numbered;
   bool uses_err_no;
+  bool uses_current_locus;
 };
 
 
@@ -164,6 +208,7 @@ format_parse (const char *format, bool translated, char *fdi,
   spec.numbered_arg_count = 0;
   spec.numbered = NULL;
   spec.uses_err_no = false;
+  spec.uses_current_locus = false;
   numbered_allocated = 0;
   unnumbered_arg_count = 0;
 
@@ -176,16 +221,20 @@ format_parse (const char *format, bool translated, char *fdi,
         spec.directives++;
 
         if (*format == '%' || *format == '<' || *format == '>'
-            || *format == '\'')
+            || *format == '}' || *format == '\'' || *format == 'R')
           ;
         else if (*format == 'm')
           spec.uses_err_no = true;
+        else if (*format == 'C')
+          spec.uses_current_locus = true;
         else
           {
             unsigned int number = 0;
             unsigned int flag_q = 0;
             unsigned int flag_l = 0;
             unsigned int flag_w = 0;
+            unsigned int flag_z = 0;
+            unsigned int flag_t = 0;
             unsigned int flag_plus = 0;
             unsigned int flag_sharp = 0;
             format_arg_type_t size;
@@ -227,15 +276,25 @@ format_parse (const char *format, bool translated, char *fdi,
                     flag_q = 1;
                     continue;
                   case 'l':
-                    if (flag_l > 1 || flag_w)
+                    if (flag_l > 1 || flag_w || flag_z || flag_t)
                       goto invalid_flags;
                     flag_l++;
                     continue;
                   case 'w':
-                    if (flag_w > 0 || flag_l)
+                    if (flag_l || flag_w || flag_z || flag_t)
                       goto invalid_flags;
                     flag_w = 1;
                     continue;
+                  case 'z':
+                    if (flag_l || flag_w || flag_z || flag_t)
+                      goto invalid_flags;
+                    flag_z = 1;
+                    continue;
+                  case 't':
+                    if (flag_l || flag_w || flag_z || flag_t)
+                      goto invalid_flags;
+                    flag_t = 1;
+                    continue;
                   case '+':
                     if (flag_plus > 0)
                       goto invalid_flags;
@@ -258,6 +317,8 @@ format_parse (const char *format, bool translated, char *fdi,
             size = (flag_l == 2 ? FAT_SIZE_LONGLONG :
                     flag_l == 1 ? FAT_SIZE_LONG :
                     flag_w ? FAT_SIZE_WIDE :
+                    flag_z ? FAT_SIZE_SIZE :
+                    flag_t ? FAT_SIZE_PTRDIFF :
                     0);
 
             if (*format == 'c')
@@ -408,60 +469,66 @@ format_parse (const char *format, bool translated, char *fdi,
               type = FAT_INTEGER | size;
             else if (*format == 'o' || *format == 'u' || *format == 'x')
               type = FAT_INTEGER | FAT_UNSIGNED | size;
+            else if (*format == 'f')
+              type = FAT_FLOAT;
             else if (*format == 'p')
               type = FAT_POINTER;
-            else if (*format == 'H')
-              type = FAT_LOCATION;
-            else if (*format == 'J')
+            else if (*format == '@')
+              type = FAT_EVENT_ID;
+            else if (*format == 'e')
+              type = FAT_ELEMENT;
+            else if (*format == 'v')
+              type = FAT_CV;
+            else if (*format == 'Z')
+              type = FAT_INT_ARRAY_PART1;
+            else if (*format == 'r')
+              type = FAT_COLOR;
+            else if (*format == '{')
+              type = FAT_URL;
+            else if (*format == 'D')
               type = FAT_TREE | FAT_TREE_DECL;
-            else if (*format == 'K')
-              type = FAT_TREE | FAT_TREE_STATEMENT;
+            else if (*format == 'F')
+              type = FAT_TREE | FAT_TREE_FUNCDECL;
+            else if (*format == 'T')
+              type = FAT_TREE | FAT_TREE_TYPE;
+            else if (*format == 'H')
+              type = FAT_TREE | FAT_TREE_TYPE_DIFF1;
+            else if (*format == 'I')
+              type = FAT_TREE | FAT_TREE_TYPE_DIFF2;
+            else if (*format == 'E')
+              type = FAT_TREE | FAT_TREE_EXPRESSION;
+            else if (*format == 'A')
+              type = FAT_TREE | FAT_TREE_ARGUMENT;
+            else if (*format == 'C')
+              type = FAT_TREE_CODE;
+            else if (*format == 'L')
+              type = FAT_LANGUAGE_OR_LOCUS;
+            else if (*format == 'O')
+              type = FAT_TREE_CODE | FAT_TREE_CODE_BINOP;
+            else if (*format == 'P')
+              type = FAT_INTEGER | FAT_FUNCPARAM;
+            else if (*format == 'Q')
+              type = FAT_TREE_CODE | FAT_TREE_CODE_ASSOP;
+            else if (*format == 'V')
+              type = FAT_TREE | FAT_TREE_CV;
+            else if (*format == 'S')
+              type = FAT_TREE | FAT_TREE_SUBSTITUTION;
+            else if (*format == 'X')
+              type = FAT_TREE | FAT_TREE_EXCEPTION;
             else
               {
-                if (*format == 'D')
-                  type = FAT_TREE | FAT_TREE_DECL;
-                else if (*format == 'F')
-                  type = FAT_TREE | FAT_TREE_FUNCDECL;
-                else if (*format == 'T')
-                  type = FAT_TREE | FAT_TREE_TYPE;
-                else if (*format == 'E')
-                  type = FAT_TREE | FAT_TREE_EXPRESSION;
-                else if (*format == 'A')
-                  type = FAT_TREE | FAT_TREE_ARGUMENT;
-                else if (*format == 'C')
-                  type = FAT_TREE_CODE;
-                else if (*format == 'L')
-                  type = FAT_LANGUAGES;
-                else if (*format == 'O')
-                  type = FAT_TREE_CODE | FAT_TREE_CODE_BINOP;
-                else if (*format == 'P')
-                  type = FAT_INTEGER | FAT_FUNCPARAM;
-                else if (*format == 'Q')
-                  type = FAT_TREE_CODE | FAT_TREE_CODE_ASSOP;
-                else if (*format == 'V')
-                  type = FAT_TREE | FAT_TREE_CV;
+                if (*format == '\0')
+                  {
+                    *invalid_reason = INVALID_UNTERMINATED_DIRECTIVE ();
+                    FDI_SET (format - 1, FMTDIR_ERROR);
+                  }
                 else
                   {
-                    if (*format == '\0')
-                      {
-                        *invalid_reason = INVALID_UNTERMINATED_DIRECTIVE ();
-                        FDI_SET (format - 1, FMTDIR_ERROR);
-                      }
-                    else
-                      {
-                        *invalid_reason =
-                          (*format == 'c'
-                           || *format == 's'
-                           || *format == 'i' || *format == 'd'
-                           || *format == 'o' || *format == 'u' || *format == 'x'
-                           || *format == 'H'
-                           ? xasprintf (_("In the directive number %u, flags are not allowed before '%c'."), spec.directives, *format)
-                           : INVALID_CONVERSION_SPECIFIER (spec.directives,
-                                                           *format));
-                        FDI_SET (format, FMTDIR_ERROR);
-                      }
-                    goto bad_format;
+                    *invalid_reason =
+                      INVALID_CONVERSION_SPECIFIER (spec.directives, *format);
+                    FDI_SET (format, FMTDIR_ERROR);
                   }
+                goto bad_format;
               }
 
             if (number)
@@ -484,6 +551,18 @@ format_parse (const char *format, bool translated, char *fdi,
                 spec.numbered[spec.numbered_arg_count].number = number;
                 spec.numbered[spec.numbered_arg_count].type = type;
                 spec.numbered_arg_count++;
+
+                if (type == FAT_INT_ARRAY_PART1)
+                  {
+                    if (numbered_allocated == spec.numbered_arg_count)
+                      {
+                        numbered_allocated = 2 * numbered_allocated + 1;
+                        spec.numbered = (struct numbered_arg *) xrealloc (spec.numbered, numbered_allocated * sizeof (struct numbered_arg));
+                      }
+                    spec.numbered[spec.numbered_arg_count].number = number + 1;
+                    spec.numbered[spec.numbered_arg_count].type = FAT_INT_ARRAY_PART2;
+                    spec.numbered_arg_count++;
+                  }
               }
             else
               {
@@ -505,6 +584,18 @@ format_parse (const char *format, bool translated, char *fdi,
                 spec.numbered[unnumbered_arg_count].number = unnumbered_arg_count + 1;
                 spec.numbered[unnumbered_arg_count].type = type;
                 unnumbered_arg_count++;
+
+                if (type == FAT_INT_ARRAY_PART1)
+                  {
+                    if (numbered_allocated == unnumbered_arg_count)
+                      {
+                        numbered_allocated = 2 * numbered_allocated + 1;
+                        spec.numbered = (struct numbered_arg *) xrealloc (spec.numbered, numbered_allocated * sizeof (struct numbered_arg));
+                      }
+                    spec.numbered[unnumbered_arg_count].number = unnumbered_arg_count + 1;
+                    spec.numbered[unnumbered_arg_count].type = FAT_INT_ARRAY_PART2;
+                    unnumbered_arg_count++;
+                  }
               }
           }
 
@@ -683,6 +774,23 @@ format_check (void *msgid_descr, void *msgstr_descr, bool equality,
       err = true;
     }
 
+  /* Check that the use of current_locus is the same.  */
+  if (spec1->uses_current_locus != spec2->uses_current_locus)
+    {
+      if (error_logger)
+        {
+          if (spec1->uses_current_locus)
+            error_logger (error_logger_data,
+                          _("'%s' uses %%C but '%s' doesn't"),
+                          pretty_msgid, pretty_msgstr);
+          else
+            error_logger (error_logger_data,
+                          _("'%s' does not use %%C but '%s' uses %%C"),
+                          pretty_msgid, pretty_msgstr);
+        }
+      err = true;
+    }
+
   return err;
 }
 
@@ -744,6 +852,12 @@ format_print (void *descr)
         case FAT_SIZE_WIDE:
           printf ("[host-wide]");
           break;
+        case FAT_SIZE_SIZE:
+          printf ("[host-size_t]");
+          break;
+        case FAT_SIZE_PTRDIFF:
+          printf ("[host-ptrdiff_t]");
+          break;
         default:
           abort ();
         }
@@ -758,14 +872,35 @@ format_print (void *descr)
         case FAT_CHAR:
           printf ("c");
           break;
+        case FAT_FLOAT:
+          printf ("f");
+          break;
         case FAT_STRING:
           printf ("s");
           break;
         case FAT_POINTER:
           printf ("p");
           break;
-        case FAT_LOCATION:
-          printf ("H");
+        case FAT_EVENT_ID:
+          printf ("@");
+          break;
+        case FAT_ELEMENT:
+          printf ("e");
+          break;
+        case FAT_CV:
+          printf ("v");
+          break;
+        case FAT_INT_ARRAY_PART1:
+          printf ("Z1");
+          break;
+        case FAT_INT_ARRAY_PART2:
+          printf ("Z2");
+          break;
+        case FAT_COLOR:
+          printf ("r");
+          break;
+        case FAT_URL:
+          printf ("{");
           break;
         case FAT_TREE | FAT_TREE_DECL:
           printf ("D");
@@ -779,6 +914,12 @@ format_print (void *descr)
         case FAT_TREE | FAT_TREE_TYPE:
           printf ("T");
           break;
+        case FAT_TREE | FAT_TREE_TYPE_DIFF1:
+          printf ("H");
+          break;
+        case FAT_TREE | FAT_TREE_TYPE_DIFF2:
+          printf ("I");
+          break;
         case FAT_TREE | FAT_TREE_ARGUMENT:
           printf ("A");
           break;
@@ -788,6 +929,12 @@ format_print (void *descr)
         case FAT_TREE | FAT_TREE_CV:
           printf ("V");
           break;
+        case FAT_TREE | FAT_TREE_SUBSTITUTION:
+          printf ("S");
+          break;
+        case FAT_TREE | FAT_TREE_EXCEPTION:
+          printf ("X");
+          break;
         case FAT_TREE_CODE:
           printf ("C");
           break;
@@ -797,7 +944,7 @@ format_print (void *descr)
         case FAT_TREE_CODE | FAT_TREE_CODE_ASSOP:
           printf ("Q");
           break;
-        case FAT_LANGUAGES:
+        case FAT_LANGUAGE_OR_LOCUS:
           printf ("L");
           break;
         default:
@@ -808,6 +955,8 @@ format_print (void *descr)
   printf (")");
   if (spec->uses_err_no)
     printf (" ERR_NO");
+  if (spec->uses_current_locus)
+    printf (" CURRENT_LOCUS");
 }
 
 int
index b0f3dd8a8b7ceb39e5177debe63ce1fb06126ea0..482e8f40491732c44e8f6e13bb457aea1684909b 100755 (executable)
@@ -11,9 +11,17 @@ cat <<\EOF > f-gi-1.data
 # Valid: no argument
 "abc%>"
 # Valid: no argument
+"abc%}"
+# Valid: no argument
 "abc%'"
 # Valid: no argument
+"abc%R"
+# Valid: no argument
 "abc%m"
+# Valid: one color argument
+"abc%r"
+# Valid: one URL argument
+"abc%{"
 # Valid: one character argument
 "abc%c"
 # Valid: one string argument
@@ -30,32 +38,32 @@ cat <<\EOF > f-gi-1.data
 "abc%x"
 # Valid: one integer and one string argument
 "abc%.*s"
+# Valid: one floating-point argument
+"abc%f"
 # Valid: one pointer argument
 "abc%p"
 # Valid: one pointer argument
-"abc%H"
+"abc%@"
 # Valid: one pointer argument
-"%J"
-# Valid: %J not at start
-"abc%J"
-# Valid: %J with flags
-"%qJ"
-# Valid: %K with flags
-"%qK"
+"abc%e"
+# Valid: one pointer and one pointer argument
+"abc%Z"
 # Valid: one pointer argument
 "abc%D"
 # Valid: one pointer argument
+"abc%E"
+# Valid: one pointer argument
 "abc%F"
 # Valid: one pointer argument
 "abc%T"
 # Valid: one pointer argument
-"abc%A"
-# Valid: one pointer argument
-"abc%C"
+"abc%V"
 # Valid: one pointer argument
-"abc%E"
+"abc%v"
 # Valid: one pointer argument
-"abc%L"
+"abc%A"
+# Valid: two pointer arguments
+"abc%H-%I"
 # Valid: one pointer argument
 "abc%O"
 # Valid: one pointer argument
@@ -63,7 +71,13 @@ cat <<\EOF > f-gi-1.data
 # Valid: one pointer argument
 "abc%Q"
 # Valid: one pointer argument
-"abc%V"
+"abc%S"
+# Valid: one pointer argument
+"abc%X"
+# Valid: possibly one pointer argument
+"abc%C"
+# Valid: one pointer argument
+"abc%L"
 # Valid: one argument with flags
 "abc%qdef"
 # Valid: one argument with flags
@@ -76,6 +90,10 @@ cat <<\EOF > f-gi-1.data
 "abc%llli"
 # Valid: one argument with size specifier
 "abc%wi"
+# Valid: one argument with size specifier
+"abc%zi"
+# Valid: one argument with size specifier
+"abc%ti"
 # Invalid: unterminated
 "abc%"
 # Invalid: unknown format specifier
index c0b604554cc1001684e619990304f18a0d163c87..5114a4f56257c1e38226c95094dd53fc3b702e0d 100755 (executable)
@@ -26,11 +26,11 @@ msgstr "xyz%muvw"
 msgid  "abc%%def"
 msgstr "xyz%"
 # Valid: same arguments
-msgid  "abc%s%Hdef"
-msgstr "xyz%s%H"
+msgid  "abc%s%Ddef"
+msgstr "xyz%s%D"
 # Valid: same arguments, with different flags
-msgid  "abc%s%Hdef"
-msgstr "xyz%qs%qH"
+msgid  "abc%s%Ddef"
+msgstr "xyz%qs%qD"
 # Valid: same arguments, with different widths
 msgid  "abc%.*sdef"
 msgstr "xyz%i%s"
@@ -71,6 +71,159 @@ msgstr "xyz%u"
 msgid  "abc%u"
 msgstr "xyz%x"
 # Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%{"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%c"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%s"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%i"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%u"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%f"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%p"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%@"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%e"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%Z"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%D"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%E"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%F"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%T"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%V"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%v"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%A"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%H"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%I"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%O"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%P"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%Q"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%r"
+msgstr "xyz%L"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%c"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%s"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%i"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%u"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%f"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%p"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%@"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%e"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%Z"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%D"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%E"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%F"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%T"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%V"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%v"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%A"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%H"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%I"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%O"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%P"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%Q"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%{"
+msgstr "xyz%L"
+# Invalid: type incompatibility
 msgid  "abc%c"
 msgstr "xyz%s"
 # Invalid: type incompatibility
@@ -81,31 +234,46 @@ msgid  "abc%c"
 msgstr "xyz%u"
 # Invalid: type incompatibility
 msgid  "abc%c"
+msgstr "xyz%f"
+# Invalid: type incompatibility
+msgid  "abc%c"
 msgstr "xyz%p"
 # Invalid: type incompatibility
 msgid  "abc%c"
-msgstr "xyz%H"
+msgstr "xyz%@"
+# Invalid: type incompatibility
+msgid  "abc%c"
+msgstr "xyz%e"
+# Invalid: type incompatibility
+msgid  "abc%c"
+msgstr "xyz%Z"
 # Invalid: type incompatibility
 msgid  "abc%c"
 msgstr "xyz%D"
 # Invalid: type incompatibility
 msgid  "abc%c"
+msgstr "xyz%E"
+# Invalid: type incompatibility
+msgid  "abc%c"
 msgstr "xyz%F"
 # Invalid: type incompatibility
 msgid  "abc%c"
 msgstr "xyz%T"
 # Invalid: type incompatibility
 msgid  "abc%c"
-msgstr "xyz%A"
+msgstr "xyz%V"
 # Invalid: type incompatibility
 msgid  "abc%c"
-msgstr "xyz%C"
+msgstr "xyz%v"
 # Invalid: type incompatibility
 msgid  "abc%c"
-msgstr "xyz%E"
+msgstr "xyz%A"
 # Invalid: type incompatibility
 msgid  "abc%c"
-msgstr "xyz%L"
+msgstr "xyz%H"
+# Invalid: type incompatibility
+msgid  "abc%c"
+msgstr "xyz%I"
 # Invalid: type incompatibility
 msgid  "abc%c"
 msgstr "xyz%O"
@@ -117,7 +285,16 @@ msgid  "abc%c"
 msgstr "xyz%Q"
 # Invalid: type incompatibility
 msgid  "abc%c"
-msgstr "xyz%V"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%c"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%c"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%c"
+msgstr "xyz%L"
 # Invalid: type incompatibility
 msgid  "abc%s"
 msgstr "xyz%i"
@@ -126,31 +303,46 @@ msgid  "abc%s"
 msgstr "xyz%u"
 # Invalid: type incompatibility
 msgid  "abc%s"
+msgstr "xyz%f"
+# Invalid: type incompatibility
+msgid  "abc%s"
 msgstr "xyz%p"
 # Invalid: type incompatibility
 msgid  "abc%s"
-msgstr "xyz%H"
+msgstr "xyz%@"
+# Invalid: type incompatibility
+msgid  "abc%s"
+msgstr "xyz%e"
+# Invalid: type incompatibility
+msgid  "abc%s"
+msgstr "xyz%Z"
 # Invalid: type incompatibility
 msgid  "abc%s"
 msgstr "xyz%D"
 # Invalid: type incompatibility
 msgid  "abc%s"
+msgstr "xyz%E"
+# Invalid: type incompatibility
+msgid  "abc%s"
 msgstr "xyz%F"
 # Invalid: type incompatibility
 msgid  "abc%s"
 msgstr "xyz%T"
 # Invalid: type incompatibility
 msgid  "abc%s"
-msgstr "xyz%A"
+msgstr "xyz%V"
 # Invalid: type incompatibility
 msgid  "abc%s"
-msgstr "xyz%C"
+msgstr "xyz%v"
 # Invalid: type incompatibility
 msgid  "abc%s"
-msgstr "xyz%E"
+msgstr "xyz%A"
 # Invalid: type incompatibility
 msgid  "abc%s"
-msgstr "xyz%L"
+msgstr "xyz%H"
+# Invalid: type incompatibility
+msgid  "abc%s"
+msgstr "xyz%I"
 # Invalid: type incompatibility
 msgid  "abc%s"
 msgstr "xyz%O"
@@ -162,37 +354,61 @@ msgid  "abc%s"
 msgstr "xyz%Q"
 # Invalid: type incompatibility
 msgid  "abc%s"
-msgstr "xyz%V"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%s"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%s"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%s"
+msgstr "xyz%L"
 # Invalid: type incompatibility
 msgid  "abc%i"
 msgstr "xyz%u"
 # Invalid: type incompatibility
 msgid  "abc%i"
+msgstr "xyz%f"
+# Invalid: type incompatibility
+msgid  "abc%i"
 msgstr "xyz%p"
 # Invalid: type incompatibility
 msgid  "abc%i"
-msgstr "xyz%H"
+msgstr "xyz%@"
+# Invalid: type incompatibility
+msgid  "abc%i"
+msgstr "xyz%e"
+# Invalid: type incompatibility
+msgid  "abc%i"
+msgstr "xyz%Z"
 # Invalid: type incompatibility
 msgid  "abc%i"
 msgstr "xyz%D"
 # Invalid: type incompatibility
 msgid  "abc%i"
+msgstr "xyz%E"
+# Invalid: type incompatibility
+msgid  "abc%i"
 msgstr "xyz%F"
 # Invalid: type incompatibility
 msgid  "abc%i"
 msgstr "xyz%T"
 # Invalid: type incompatibility
 msgid  "abc%i"
-msgstr "xyz%A"
+msgstr "xyz%V"
 # Invalid: type incompatibility
 msgid  "abc%i"
-msgstr "xyz%C"
+msgstr "xyz%v"
 # Invalid: type incompatibility
 msgid  "abc%i"
-msgstr "xyz%E"
+msgstr "xyz%A"
 # Invalid: type incompatibility
 msgid  "abc%i"
-msgstr "xyz%L"
+msgstr "xyz%H"
+# Invalid: type incompatibility
+msgid  "abc%i"
+msgstr "xyz%I"
 # Invalid: type incompatibility
 msgid  "abc%i"
 msgstr "xyz%O"
@@ -204,34 +420,58 @@ msgid  "abc%i"
 msgstr "xyz%Q"
 # Invalid: type incompatibility
 msgid  "abc%i"
-msgstr "xyz%V"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%i"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%i"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%i"
+msgstr "xyz%L"
+# Invalid: type incompatibility
+msgid  "abc%u"
+msgstr "xyz%f"
 # Invalid: type incompatibility
 msgid  "abc%u"
 msgstr "xyz%p"
 # Invalid: type incompatibility
 msgid  "abc%u"
-msgstr "xyz%H"
+msgstr "xyz%@"
+# Invalid: type incompatibility
+msgid  "abc%u"
+msgstr "xyz%e"
+# Invalid: type incompatibility
+msgid  "abc%u"
+msgstr "xyz%Z"
 # Invalid: type incompatibility
 msgid  "abc%u"
 msgstr "xyz%D"
 # Invalid: type incompatibility
 msgid  "abc%u"
+msgstr "xyz%E"
+# Invalid: type incompatibility
+msgid  "abc%u"
 msgstr "xyz%F"
 # Invalid: type incompatibility
 msgid  "abc%u"
 msgstr "xyz%T"
 # Invalid: type incompatibility
 msgid  "abc%u"
-msgstr "xyz%A"
+msgstr "xyz%V"
 # Invalid: type incompatibility
 msgid  "abc%u"
-msgstr "xyz%C"
+msgstr "xyz%v"
 # Invalid: type incompatibility
 msgid  "abc%u"
-msgstr "xyz%E"
+msgstr "xyz%A"
 # Invalid: type incompatibility
 msgid  "abc%u"
-msgstr "xyz%L"
+msgstr "xyz%H"
+# Invalid: type incompatibility
+msgid  "abc%u"
+msgstr "xyz%I"
 # Invalid: type incompatibility
 msgid  "abc%u"
 msgstr "xyz%O"
@@ -243,31 +483,112 @@ msgid  "abc%u"
 msgstr "xyz%Q"
 # Invalid: type incompatibility
 msgid  "abc%u"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%u"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%u"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%u"
+msgstr "xyz%L"
+# Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%p"
+# Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%@"
+# Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%e"
+# Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%Z"
+# Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%D"
+# Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%E"
+# Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%F"
+# Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%T"
+# Invalid: type incompatibility
+msgid  "abc%f"
 msgstr "xyz%V"
 # Invalid: type incompatibility
-msgid  "abc%p"
+msgid  "abc%f"
+msgstr "xyz%v"
+# Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%A"
+# Invalid: type incompatibility
+msgid  "abc%f"
 msgstr "xyz%H"
 # Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%I"
+# Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%O"
+# Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%P"
+# Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%Q"
+# Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%f"
+msgstr "xyz%L"
+# Invalid: type incompatibility
+msgid  "abc%p"
+msgstr "xyz%@"
+# Invalid: type incompatibility
+msgid  "abc%p"
+msgstr "xyz%e"
+# Invalid: type incompatibility
+msgid  "abc%p"
+msgstr "xyz%Z"
+# Invalid: type incompatibility
 msgid  "abc%p"
 msgstr "xyz%D"
 # Invalid: type incompatibility
 msgid  "abc%p"
+msgstr "xyz%E"
+# Invalid: type incompatibility
+msgid  "abc%p"
 msgstr "xyz%F"
 # Invalid: type incompatibility
 msgid  "abc%p"
 msgstr "xyz%T"
 # Invalid: type incompatibility
 msgid  "abc%p"
-msgstr "xyz%A"
+msgstr "xyz%V"
 # Invalid: type incompatibility
 msgid  "abc%p"
-msgstr "xyz%C"
+msgstr "xyz%v"
 # Invalid: type incompatibility
 msgid  "abc%p"
-msgstr "xyz%E"
+msgstr "xyz%A"
 # Invalid: type incompatibility
 msgid  "abc%p"
-msgstr "xyz%L"
+msgstr "xyz%H"
+# Invalid: type incompatibility
+msgid  "abc%p"
+msgstr "xyz%I"
 # Invalid: type incompatibility
 msgid  "abc%p"
 msgstr "xyz%O"
@@ -279,41 +600,173 @@ msgid  "abc%p"
 msgstr "xyz%Q"
 # Invalid: type incompatibility
 msgid  "abc%p"
-msgstr "xyz%V"
+msgstr "xyz%S"
 # Invalid: type incompatibility
-msgid  "abc%H"
-msgstr "xyz%D"
+msgid  "abc%p"
+msgstr "xyz%X"
 # Invalid: type incompatibility
-msgid  "abc%H"
-msgstr "xyz%F"
+msgid  "abc%p"
+msgstr "xyz%C"
 # Invalid: type incompatibility
-msgid  "abc%H"
-msgstr "xyz%T"
+msgid  "abc%p"
+msgstr "xyz%L"
 # Invalid: type incompatibility
-msgid  "abc%H"
+msgid  "abc%@"
+msgstr "xyz%e"
+# Invalid: type incompatibility
+msgid  "abc%@"
+msgstr "xyz%Z"
+# Invalid: type incompatibility
+msgid  "abc%@"
+msgstr "xyz%D"
+# Invalid: type incompatibility
+msgid  "abc%@"
+msgstr "xyz%E"
+# Invalid: type incompatibility
+msgid  "abc%@"
+msgstr "xyz%F"
+# Invalid: type incompatibility
+msgid  "abc%@"
+msgstr "xyz%T"
+# Invalid: type incompatibility
+msgid  "abc%@"
+msgstr "xyz%V"
+# Invalid: type incompatibility
+msgid  "abc%@"
+msgstr "xyz%v"
+# Invalid: type incompatibility
+msgid  "abc%@"
 msgstr "xyz%A"
 # Invalid: type incompatibility
-msgid  "abc%H"
+msgid  "abc%@"
+msgstr "xyz%H"
+# Invalid: type incompatibility
+msgid  "abc%@"
+msgstr "xyz%I"
+# Invalid: type incompatibility
+msgid  "abc%@"
+msgstr "xyz%O"
+# Invalid: type incompatibility
+msgid  "abc%@"
+msgstr "xyz%P"
+# Invalid: type incompatibility
+msgid  "abc%@"
+msgstr "xyz%Q"
+# Invalid: type incompatibility
+msgid  "abc%@"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%@"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%@"
 msgstr "xyz%C"
 # Invalid: type incompatibility
-msgid  "abc%H"
+msgid  "abc%@"
+msgstr "xyz%L"
+# Invalid: type incompatibility
+msgid  "abc%e"
+msgstr "xyz%Z"
+# Invalid: type incompatibility
+msgid  "abc%e"
+msgstr "xyz%D"
+# Invalid: type incompatibility
+msgid  "abc%e"
 msgstr "xyz%E"
 # Invalid: type incompatibility
-msgid  "abc%H"
-msgstr "xyz%L"
+msgid  "abc%e"
+msgstr "xyz%F"
 # Invalid: type incompatibility
-msgid  "abc%H"
+msgid  "abc%e"
+msgstr "xyz%T"
+# Invalid: type incompatibility
+msgid  "abc%e"
+msgstr "xyz%V"
+# Invalid: type incompatibility
+msgid  "abc%e"
+msgstr "xyz%v"
+# Invalid: type incompatibility
+msgid  "abc%e"
+msgstr "xyz%A"
+# Invalid: type incompatibility
+msgid  "abc%e"
+msgstr "xyz%H"
+# Invalid: type incompatibility
+msgid  "abc%e"
+msgstr "xyz%I"
+# Invalid: type incompatibility
+msgid  "abc%e"
 msgstr "xyz%O"
 # Invalid: type incompatibility
-msgid  "abc%H"
+msgid  "abc%e"
 msgstr "xyz%P"
 # Invalid: type incompatibility
-msgid  "abc%H"
+msgid  "abc%e"
 msgstr "xyz%Q"
 # Invalid: type incompatibility
-msgid  "abc%H"
+msgid  "abc%e"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%e"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%e"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%e"
+msgstr "xyz%L"
+# Invalid: type incompatibility
+msgid  "abc%Z"
+msgstr "xyz%D"
+# Invalid: type incompatibility
+msgid  "abc%Z"
+msgstr "xyz%E"
+# Invalid: type incompatibility
+msgid  "abc%Z"
+msgstr "xyz%F"
+# Invalid: type incompatibility
+msgid  "abc%Z"
+msgstr "xyz%T"
+# Invalid: type incompatibility
+msgid  "abc%Z"
 msgstr "xyz%V"
 # Invalid: type incompatibility
+msgid  "abc%Z"
+msgstr "xyz%v"
+# Invalid: type incompatibility
+msgid  "abc%Z"
+msgstr "xyz%A"
+# Invalid: type incompatibility
+msgid  "abc%Z"
+msgstr "xyz%H"
+# Invalid: type incompatibility
+msgid  "abc%Z"
+msgstr "xyz%I"
+# Invalid: type incompatibility
+msgid  "abc%Z"
+msgstr "xyz%O"
+# Invalid: type incompatibility
+msgid  "abc%Z"
+msgstr "xyz%P"
+# Invalid: type incompatibility
+msgid  "abc%Z"
+msgstr "xyz%Q"
+# Invalid: type incompatibility
+msgid  "abc%Z"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%Z"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%Z"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%Z"
+msgstr "xyz%L"
+# Invalid: type incompatibility
+msgid  "abc%D"
+msgstr "xyz%E"
+# Invalid: type incompatibility
 msgid  "abc%D"
 msgstr "xyz%F"
 # Invalid: type incompatibility
@@ -321,16 +774,19 @@ msgid  "abc%D"
 msgstr "xyz%T"
 # Invalid: type incompatibility
 msgid  "abc%D"
-msgstr "xyz%A"
+msgstr "xyz%V"
 # Invalid: type incompatibility
 msgid  "abc%D"
-msgstr "xyz%C"
+msgstr "xyz%v"
 # Invalid: type incompatibility
 msgid  "abc%D"
-msgstr "xyz%E"
+msgstr "xyz%A"
 # Invalid: type incompatibility
 msgid  "abc%D"
-msgstr "xyz%L"
+msgstr "xyz%H"
+# Invalid: type incompatibility
+msgid  "abc%D"
+msgstr "xyz%I"
 # Invalid: type incompatibility
 msgid  "abc%D"
 msgstr "xyz%O"
@@ -342,22 +798,76 @@ msgid  "abc%D"
 msgstr "xyz%Q"
 # Invalid: type incompatibility
 msgid  "abc%D"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%D"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%D"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%D"
+msgstr "xyz%L"
+# Invalid: type incompatibility
+msgid  "abc%E"
+msgstr "xyz%F"
+# Invalid: type incompatibility
+msgid  "abc%E"
+msgstr "xyz%T"
+# Invalid: type incompatibility
+msgid  "abc%E"
 msgstr "xyz%V"
 # Invalid: type incompatibility
+msgid  "abc%E"
+msgstr "xyz%v"
+# Invalid: type incompatibility
+msgid  "abc%E"
+msgstr "xyz%A"
+# Invalid: type incompatibility
+msgid  "abc%E"
+msgstr "xyz%H"
+# Invalid: type incompatibility
+msgid  "abc%E"
+msgstr "xyz%I"
+# Invalid: type incompatibility
+msgid  "abc%E"
+msgstr "xyz%O"
+# Invalid: type incompatibility
+msgid  "abc%E"
+msgstr "xyz%P"
+# Invalid: type incompatibility
+msgid  "abc%E"
+msgstr "xyz%Q"
+# Invalid: type incompatibility
+msgid  "abc%E"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%E"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%E"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%E"
+msgstr "xyz%L"
+# Invalid: type incompatibility
 msgid  "abc%F"
 msgstr "xyz%T"
 # Invalid: type incompatibility
 msgid  "abc%F"
-msgstr "xyz%A"
+msgstr "xyz%V"
 # Invalid: type incompatibility
 msgid  "abc%F"
-msgstr "xyz%C"
+msgstr "xyz%v"
 # Invalid: type incompatibility
 msgid  "abc%F"
-msgstr "xyz%E"
+msgstr "xyz%A"
 # Invalid: type incompatibility
 msgid  "abc%F"
-msgstr "xyz%L"
+msgstr "xyz%H"
+# Invalid: type incompatibility
+msgid  "abc%F"
+msgstr "xyz%I"
 # Invalid: type incompatibility
 msgid  "abc%F"
 msgstr "xyz%O"
@@ -369,19 +879,31 @@ msgid  "abc%F"
 msgstr "xyz%Q"
 # Invalid: type incompatibility
 msgid  "abc%F"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%F"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%F"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%F"
+msgstr "xyz%L"
+# Invalid: type incompatibility
+msgid  "abc%T"
 msgstr "xyz%V"
 # Invalid: type incompatibility
 msgid  "abc%T"
-msgstr "xyz%A"
+msgstr "xyz%v"
 # Invalid: type incompatibility
 msgid  "abc%T"
-msgstr "xyz%C"
+msgstr "xyz%A"
 # Invalid: type incompatibility
 msgid  "abc%T"
-msgstr "xyz%E"
+msgstr "xyz%H"
 # Invalid: type incompatibility
 msgid  "abc%T"
-msgstr "xyz%L"
+msgstr "xyz%I"
 # Invalid: type incompatibility
 msgid  "abc%T"
 msgstr "xyz%O"
@@ -393,16 +915,85 @@ msgid  "abc%T"
 msgstr "xyz%Q"
 # Invalid: type incompatibility
 msgid  "abc%T"
-msgstr "xyz%V"
+msgstr "xyz%S"
 # Invalid: type incompatibility
-msgid  "abc%A"
+msgid  "abc%T"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%T"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%T"
+msgstr "xyz%L"
+# Invalid: type incompatibility
+msgid  "abc%V"
+msgstr "xyz%v"
+# Invalid: type incompatibility
+msgid  "abc%V"
+msgstr "xyz%A"
+# Invalid: type incompatibility
+msgid  "abc%V"
+msgstr "xyz%H"
+# Invalid: type incompatibility
+msgid  "abc%V"
+msgstr "xyz%I"
+# Invalid: type incompatibility
+msgid  "abc%V"
+msgstr "xyz%O"
+# Invalid: type incompatibility
+msgid  "abc%V"
+msgstr "xyz%P"
+# Invalid: type incompatibility
+msgid  "abc%V"
+msgstr "xyz%Q"
+# Invalid: type incompatibility
+msgid  "abc%V"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%V"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%V"
 msgstr "xyz%C"
 # Invalid: type incompatibility
+msgid  "abc%V"
+msgstr "xyz%L"
+# Invalid: type incompatibility
+msgid  "abc%v"
+msgstr "xyz%A"
+# Invalid: type incompatibility
+msgid  "abc%v"
+msgstr "xyz%H"
+# Invalid: type incompatibility
+msgid  "abc%v"
+msgstr "xyz%I"
+# Invalid: type incompatibility
+msgid  "abc%v"
+msgstr "xyz%O"
+# Invalid: type incompatibility
+msgid  "abc%v"
+msgstr "xyz%P"
+# Invalid: type incompatibility
+msgid  "abc%v"
+msgstr "xyz%Q"
+# Invalid: type incompatibility
+msgid  "abc%v"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%v"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%v"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%v"
+msgstr "xyz%L"
+# Invalid: type incompatibility
 msgid  "abc%A"
-msgstr "xyz%E"
+msgstr "xyz%H"
 # Invalid: type incompatibility
 msgid  "abc%A"
-msgstr "xyz%L"
+msgstr "xyz%I"
 # Invalid: type incompatibility
 msgid  "abc%A"
 msgstr "xyz%O"
@@ -414,70 +1005,124 @@ msgid  "abc%A"
 msgstr "xyz%Q"
 # Invalid: type incompatibility
 msgid  "abc%A"
-msgstr "xyz%V"
+msgstr "xyz%S"
 # Invalid: type incompatibility
-msgid  "abc%C"
-msgstr "xyz%E"
+msgid  "abc%A"
+msgstr "xyz%X"
 # Invalid: type incompatibility
-msgid  "abc%C"
+msgid  "abc%A"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%A"
 msgstr "xyz%L"
 # Invalid: type incompatibility
-msgid  "abc%C"
+msgid  "abc%H"
+msgstr "xyz%I"
+# Invalid: type incompatibility
+msgid  "abc%H"
 msgstr "xyz%O"
 # Invalid: type incompatibility
-msgid  "abc%C"
+msgid  "abc%H"
 msgstr "xyz%P"
 # Invalid: type incompatibility
-msgid  "abc%C"
+msgid  "abc%H"
 msgstr "xyz%Q"
 # Invalid: type incompatibility
-msgid  "abc%C"
-msgstr "xyz%V"
+msgid  "abc%H"
+msgstr "xyz%S"
 # Invalid: type incompatibility
-msgid  "abc%E"
+msgid  "abc%H"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%H"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%H"
 msgstr "xyz%L"
 # Invalid: type incompatibility
-msgid  "abc%E"
+msgid  "abc%I"
 msgstr "xyz%O"
 # Invalid: type incompatibility
-msgid  "abc%E"
+msgid  "abc%I"
 msgstr "xyz%P"
 # Invalid: type incompatibility
-msgid  "abc%E"
+msgid  "abc%I"
 msgstr "xyz%Q"
 # Invalid: type incompatibility
-msgid  "abc%E"
-msgstr "xyz%V"
+msgid  "abc%I"
+msgstr "xyz%S"
 # Invalid: type incompatibility
-msgid  "abc%L"
-msgstr "xyz%O"
+msgid  "abc%I"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%I"
+msgstr "xyz%C"
 # Invalid: type incompatibility
-msgid  "abc%L"
+msgid  "abc%I"
+msgstr "xyz%L"
+# Invalid: type incompatibility
+msgid  "abc%O"
 msgstr "xyz%P"
 # Invalid: type incompatibility
-msgid  "abc%L"
+msgid  "abc%O"
 msgstr "xyz%Q"
 # Invalid: type incompatibility
-msgid  "abc%L"
-msgstr "xyz%V"
+msgid  "abc%O"
+msgstr "xyz%S"
 # Invalid: type incompatibility
 msgid  "abc%O"
-msgstr "xyz%P"
+msgstr "xyz%X"
 # Invalid: type incompatibility
 msgid  "abc%O"
-msgstr "xyz%Q"
+msgstr "xyz%C"
 # Invalid: type incompatibility
 msgid  "abc%O"
-msgstr "xyz%V"
+msgstr "xyz%L"
 # Invalid: type incompatibility
 msgid  "abc%P"
 msgstr "xyz%Q"
 # Invalid: type incompatibility
 msgid  "abc%P"
-msgstr "xyz%V"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%P"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%P"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%P"
+msgstr "xyz%L"
 # Invalid: type incompatibility
 msgid  "abc%Q"
-msgstr "xyz%V"
+msgstr "xyz%S"
+# Invalid: type incompatibility
+msgid  "abc%Q"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%Q"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%Q"
+msgstr "xyz%L"
+# Invalid: type incompatibility
+msgid  "abc%S"
+msgstr "xyz%X"
+# Invalid: type incompatibility
+msgid  "abc%S"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%S"
+msgstr "xyz%L"
+# Invalid: type incompatibility
+msgid  "abc%X"
+msgstr "xyz%C"
+# Invalid: type incompatibility
+msgid  "abc%X"
+msgstr "xyz%L"
+# Invalid: type incompatibility
+msgid  "abc%C"
+msgstr "xyz%L"
 # Invalid: type incompatibility due to size
 msgid  "abc%i"
 msgstr "xyz%li"
@@ -488,14 +1133,41 @@ msgstr "xyz%lli"
 msgid  "abc%i"
 msgstr "xyz%wi"
 # Invalid: type incompatibility due to size
+msgid  "abc%i"
+msgstr "xyz%zi"
+# Invalid: type incompatibility due to size
+msgid  "abc%i"
+msgstr "xyz%ti"
+# Invalid: type incompatibility due to size
 msgid  "abc%li"
 msgstr "xyz%lli"
 # Invalid: type incompatibility due to size
 msgid  "abc%li"
 msgstr "xyz%wi"
 # Invalid: type incompatibility due to size
+msgid  "abc%li"
+msgstr "xyz%zi"
+# Invalid: type incompatibility due to size
+msgid  "abc%li"
+msgstr "xyz%ti"
+# Invalid: type incompatibility due to size
 msgid  "abc%lli"
 msgstr "xyz%wi"
+# Invalid: type incompatibility due to size
+msgid  "abc%lli"
+msgstr "xyz%zi"
+# Invalid: type incompatibility due to size
+msgid  "abc%lli"
+msgstr "xyz%ti"
+# Invalid: type incompatibility due to size
+msgid  "abc%wi"
+msgstr "xyz%zi"
+# Invalid: type incompatibility due to size
+msgid  "abc%wi"
+msgstr "xyz%ti"
+# Invalid: type incompatibility due to size
+msgid  "abc%zi"
+msgstr "xyz%ti"
 # Invalid: type incompatibility for width
 msgid  "abc%.*s"
 msgstr "xyz%u%s"