On Mon, Feb 26, 2018 at 09:19:56PM -0700, Martin Sebor wrote:
> +  /* Put together a list of the black listed attributes that the primary
> +     template is declared with that the specialization is not, in case
> +     it's not apparent from the most recent declaration of the primary.  */
> +  unsigned nattrs = 0;
> +  std::string str;
> +
> +  for (unsigned i = 0; i != sizeof blacklist / sizeof *blacklist; ++i)
> +    {
> +      for (unsigned j = 0; j != 2; ++j)
> +     {
> +       if (!lookup_attribute (blacklist[i], tmpl_attrs[j]))
> +         continue;
> +
> +       for (unsigned k = 0; k != 1 + !!spec_attrs[1]; ++k)
> +         {
> +           if (lookup_attribute (blacklist[i], spec_attrs[k]))
> +             break;
> +
> +           if (str.size ())
> +             str += ", ";
> +           str += "%<";
> +           str += blacklist[i];
> +           str += "%>";
> +           ++nattrs;
> +         }
> +     }
> +    }
> +
> +  if (!nattrs)
> +    return;
> +
> +  if (warning_at (DECL_SOURCE_LOCATION (spec), OPT_Wmissing_attributes,
> +               "explicit specialization %q#D may be missing attributes",
> +               spec))
> +    {
> +      if (nattrs > 1)
> +     str = G_("missing primary template attributes ") + str;
> +      else
> +     str = G_("missing primary template attribute ") + str;
> +
> +      inform (DECL_SOURCE_LOCATION (tmpl), str.c_str ());

This is broken for multiple reasons:
1) it should be inform_n rather than inform
2) you really can't do what you're doing for translations;
   G_(...) marks the string for translations, but what actually is
   translated is not that string, but rather what is passed to inform,
   i.e. str.c_str (), so it will be likely never translated
3) as others have mentioned, the #include <string> you are doing is
   wrong
4) I don't see justification to use std::string here

What you IMHO should use instead is use
  pretty_printer str;
instead, and the pp_* APIs to add stuff in there, including
pp_begin_quote (&str, pp_show_color (global_dc->printer))
and
pp_end_quote (&str, pp_show_color (global_dc->printer))
when you want to add what %< or %> expand to,
and finally
  inform_n (DECL_SOURCE_LOCATION (tmpl), nattrs,
            "missing primary template attribute %s",
            "missing primary template attributes %s",
            pp_formatted_text (&str));
That way it should be properly translatable.

        Jakub

Reply via email to