This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PING] C++ Re: [PATCH] C/C++: fix quoting of "aka" typedef information (PR 62170)
- From: David Malcolm <dmalcolm at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 20 Jun 2017 11:50:59 -0400
- Subject: [PING] C++ Re: [PATCH] C/C++: fix quoting of "aka" typedef information (PR 62170)
- Authentication-results: sourceware.org; auth=none
- Authentication-results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com
- Authentication-results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=dmalcolm at redhat dot com
- Dkim-filter: OpenDKIM Filter v2.11.0 mx1.redhat.com D4FF130AF44
- Dmarc-filter: OpenDMARC Filter v1.3.2 mx1.redhat.com D4FF130AF44
- References: <1496689294-11629-1-git-send-email-dmalcolm@redhat.com>
Ping re the C++ part of this:
https://gcc.gnu.org/ml/gcc-patches/2017-06/msg00242.html
Marek approved the C parts; are the C++ parts OK for trunk?
Or can I self-approve this? (exactly what the boundaries of
my"diagnostic messages" maintainer remit are aren't clear to me).
Thanks
Dave
On Mon, 2017-06-05 at 15:01 -0400, David Malcolm wrote:
> PR 62170 describes a problem with how the quoting in pp_format
> interacts with the "aka" information for typedefs in %qT for
> the C family of frontends, and also now for %qH and %qI in the
> C++ frontend.
>
> Currently for %qT we print e.g.:
>
> ‘Py_ssize_t* {aka int*}’
> ^^^^^^^^^^^^^^^^^^^^^^ colorized as "quote"
>
> i.e.
> ‘[START_COLOR]Py_ssize_t* {aka int*}[END_COLOR]’
>
> when we should print:
>
> ‘Py_ssize_t*’ {aka ‘int*’}
> ^^^^^^^^^^^ ^^^^ colorized as "quote"
>
> i.e.
> ‘[START_COLOR]Py_ssize_t*[END_COLOR]’ {aka
> ‘[START_COLOR]int*[END_COLOR]’}
>
> where the opening and closing quote characters and colorization are
> currently added by the 'q' handling within pp_format, adding the
> closing
> quote unconditionally after whatever pp_format_decoder prints for 'T'
> within "%qT".
>
> This patch fixes the quoting by updating the %T handling in C and C++
> and the %H/%I handling in C++ to insert the quoting appropriately.
> It converts the "quote" param of the pp_format_decoder callback from
> bool to bool *, allowing for the %T and %H/%I handlers to write
> false back to it, to avoid printing the closing quote for the cases
> like the above where a final trailing closing quote isn't needed.
>
> It introduces pp_begin_quote/pp_end_quote to simplify this. These
> take a "bool show_color", rather than using "pp_show_color (pp)"
> since cxx_pp's pp_show_color isn't currently initialized (since
> cxx_initialize_diagnostics happens before diagnostic_color_init).
>
> Successfully bootstrapped®rtested on x86_64-pc-linux-gnu.
>
> OK for trunk?
>
> gcc/c/ChangeLog:
> PR c++/62170
> * c-objc-common.c (c_tree_printer): Convert penultimate param
> from
> bool to bool *. Within '%T' handling, if showing an "aka", use
> "quoted" param to add appropriate quoting.
>
> gcc/cp/ChangeLog:
> PR c++/62170
> * error.c (type_to_string): Add leading comment. Add params
> "postprocessed", "quote", and "show_color", using them to fix
> quoting of the "aka" for types involving typedefs.
> (arg_to_string): Update for new params to type_to_string.
> (cxx_format_postprocessor::handle): Likewise.
> (cp_printer): Convert penultimate param from bool to bool *.
> Update call to type_to_string and calls to
> defer_phase_2_of_type_diff.
>
> gcc/fortran/ChangeLog:
> PR c++/62170
> * error.c (gfc_notify_std): Convert "quoted" param from bool to
> bool *.
>
> gcc/ChangeLog:
> PR c++/62170
> * pretty-print.c (pp_format): Move quoting implementation to
> pp_begin_quote and pp_end_quote. Update pp_format_decoder call
> to pass address of "quote" local.
> (pp_begin_quote): New function.
> (pp_end_quote): New function.
> * pretty-print.h (printer_fn): Convert penultimate param from
> bool
> to bool *.
> (pp_begin_quote): New decl.
> (pp_end_quote): New decl.
> * tree-diagnostic.c (default_tree_printer): Convert penultimate
> param from bool to bool *.
> * tree-diagnostic.h (default_tree_printer): Likewise.
>
> gcc/testsuite/ChangeLog:
> PR c++/62170
> * g++.dg/cpp1z/direct-enum-init1.C: Update expected error
> messages
> to reflect fixes to quoting.
> * g++.dg/diagnostic/aka1.C: Likewise.
> * g++.dg/diagnostic/aka2.C: New test case.
> * g++.dg/parse/error55.C: Update expected error messages to
> reflect fixes to quoting.
> * g++.dg/warn/pr12242.C: Likewise.
> * g++.old-deja/g++.mike/enum1.C: Likewise.
> * gcc.dg/diag-aka-1.c: Likewise.
> * gcc.dg/diag-aka-2.c: New test case.
> * gcc.dg/pr13804-1.c: Update expected error messages to reflect
> fixes to quoting.
> * gcc.dg/pr56980.c: Likewise.
> * gcc.dg/pr65050.c: Likewise.
> * gcc.dg/redecl-14.c: Likewise.
> * gcc.dg/utf16-4.c Likewise.
> * gcc.target/i386/sse-vect-types.c (__m128d): Likewise.
> * obj-c++.dg/invalid-type-1.mm: Likewise.
> ---
> gcc/c/c-objc-common.c | 12 +-
> gcc/cp/error.c | 92 ++++++++--
> gcc/fortran/error.c | 2 +-
> gcc/pretty-print.c | 37 +++-
> gcc/pretty-print.h | 5 +-
> gcc/testsuite/g++.dg/cpp1z/direct-enum-init1.C | 234 ++++++++++++---
> ----------
> gcc/testsuite/g++.dg/diagnostic/aka1.C | 2 +-
> gcc/testsuite/g++.dg/diagnostic/aka2.C | 32 ++++
> gcc/testsuite/g++.dg/parse/error55.C | 2 +-
> gcc/testsuite/g++.dg/warn/pr12242.C | 16 +-
> gcc/testsuite/g++.old-deja/g++.mike/enum1.C | 2 +-
> gcc/testsuite/gcc.dg/diag-aka-1.c | 4 +-
> gcc/testsuite/gcc.dg/diag-aka-2.c | 12 ++
> gcc/testsuite/gcc.dg/pr13804-1.c | 4 +-
> gcc/testsuite/gcc.dg/pr56980.c | 12 +-
> gcc/testsuite/gcc.dg/pr65050.c | 8 +-
> gcc/testsuite/gcc.dg/redecl-14.c | 2 +-
> gcc/testsuite/gcc.dg/utf16-4.c | 2 +-
> gcc/testsuite/gcc.target/i386/sse-vect-types.c | 2 +-
> gcc/testsuite/obj-c++.dg/invalid-type-1.mm | 4 +-
> gcc/tree-diagnostic.c | 2 +-
> gcc/tree-diagnostic.h | 2 +-
> 22 files changed, 312 insertions(+), 178 deletions(-)
> create mode 100644 gcc/testsuite/g++.dg/diagnostic/aka2.C
> create mode 100644 gcc/testsuite/gcc.dg/diag-aka-2.c
>
> diff --git a/gcc/c/c-objc-common.c b/gcc/c/c-objc-common.c
> index 05212b2..b87cdda 100644
> --- a/gcc/c/c-objc-common.c
> +++ b/gcc/c/c-objc-common.c
> @@ -28,7 +28,7 @@ along with GCC; see the file COPYING3. If not see
> #include "c-objc-common.h"
>
> static bool c_tree_printer (pretty_printer *, text_info *, const
> char *,
> - int, bool, bool, bool, bool, const char
> **);
> + int, bool, bool, bool, bool *, const
> char **);
>
> bool
> c_missing_noreturn_ok_p (tree decl)
> @@ -76,7 +76,7 @@ c_objc_common_init (void)
> static bool
> c_tree_printer (pretty_printer *pp, text_info *text, const char
> *spec,
> int precision, bool wide, bool set_locus, bool hash,
> - bool, const char **)
> + bool *quoted, const char **)
> {
> tree t = NULL_TREE;
> tree name;
> @@ -156,12 +156,20 @@ c_tree_printer (pretty_printer *pp, text_info
> *text, const char *spec,
> return true;
>
> /* They're not, print the stripped version now. */
> + if (*quoted)
> + pp_end_quote (pp, pp_show_color (pp));
> pp_c_whitespace (cpp);
> pp_left_brace (cpp);
> pp_c_ws_string (cpp, _("aka"));
> pp_c_whitespace (cpp);
> + if (*quoted)
> + pp_begin_quote (pp, pp_show_color (pp));
> cpp->type_id (TYPE_CANONICAL (t));
> + if (*quoted)
> + pp_end_quote (pp, pp_show_color (pp));
> pp_right_brace (cpp);
> + /* No further closing quotes are needed. */
> + *quoted = false;
> }
> return true;
> }
> diff --git a/gcc/cp/error.c b/gcc/cp/error.c
> index ed67d14..95288d1 100644
> --- a/gcc/cp/error.c
> +++ b/gcc/cp/error.c
> @@ -57,7 +57,7 @@ static const char *expr_to_string (tree);
> static const char *fndecl_to_string (tree, int);
> static const char *op_to_string (enum tree_code);
> static const char *parm_to_string (int);
> -static const char *type_to_string (tree, int);
> +static const char *type_to_string (tree, int, bool, bool *, bool);
>
> static void dump_alias_template_specialization (cxx_pretty_printer
> *, tree, int);
> static void dump_type (cxx_pretty_printer *, tree, int);
> @@ -99,7 +99,7 @@ static void cp_diagnostic_starter
> (diagnostic_context *, diagnostic_info *);
> static void cp_print_error_function (diagnostic_context *,
> diagnostic_info *);
>
> static bool cp_printer (pretty_printer *, text_info *, const char *,
> - int, bool, bool, bool, bool, const char **);
> + int, bool, bool, bool, bool *, const char
> **);
>
> /* Struct for handling %H or %I, which require delaying printing the
> type until a postprocessing stage. */
> @@ -3142,8 +3142,28 @@ op_to_string (enum tree_code p)
> return id ? IDENTIFIER_POINTER (id) : M_("<unknown>");
> }
>
> +/* Return a GC-allocated representation of type TYP, with verbosity
> VERBOSE.
> +
> + If QUOTE is non-NULL and if *QUOTE is true, then quotes are added
> to the
> + string in appropriate places, and *QUOTE is written to with false
> + to suppress pp_format's trailing close quote so that e.g.
> + foo_typedef {aka underlying_foo} {enum}
> + can be printed by "%qT" as:
> + `foo_typedef' {aka `underlying_foo'} {enum}
> + rather than:
> + `foo_typedef {aka underlying_foo} {enum}'
> + When adding such quotes, if POSTPROCESSED is true (for handling
> %H and %I)
> + then a leading open quote will be added, whereas if POSTPROCESSED
> is false
> + (for handling %T) then any leading quote has already been added
> by
> + pp_format, or is not needed due to QUOTE being NULL (for template
> arguments
> + within %H and %I).
> +
> + SHOW_COLOR is used to determine the colorization of any quotes
> that
> + are added. */
> +
> static const char *
> -type_to_string (tree typ, int verbose)
> +type_to_string (tree typ, int verbose, bool postprocessed, bool
> *quote,
> + bool show_color)
> {
> int flags = 0;
> if (verbose)
> @@ -3151,7 +3171,19 @@ type_to_string (tree typ, int verbose)
> flags |= TFF_TEMPLATE_HEADER;
>
> reinit_cxx_pp ();
> +
> + if (postprocessed && quote && *quote)
> + pp_begin_quote (cxx_pp, show_color);
> +
> + struct obstack *ob = pp_buffer (cxx_pp)->obstack;
> + int type_start, type_len;
> + type_start = obstack_object_size (ob);
> +
> dump_type (cxx_pp, typ, flags);
> +
> + /* Remember the end of the initial dump. */
> + type_len = obstack_object_size (ob) - type_start;
> +
> /* If we're printing a type that involves typedefs, also print the
> stripped version. But sometimes the stripped version looks
> exactly the same, so we don't want it after all. To avoid
> printing
> @@ -3160,21 +3192,42 @@ type_to_string (tree typ, int verbose)
> && !uses_template_parms (typ))
> {
> int aka_start, aka_len; char *p;
> - struct obstack *ob = pp_buffer (cxx_pp)->obstack;
> - /* Remember the end of the initial dump. */
> - int len = obstack_object_size (ob);
> tree aka = strip_typedefs (typ);
> + if (quote && *quote)
> + pp_end_quote (cxx_pp, show_color);
> pp_string (cxx_pp, " {aka");
> pp_cxx_whitespace (cxx_pp);
> + if (quote && *quote)
> + pp_begin_quote (cxx_pp, show_color);
> /* And remember the start of the aka dump. */
> aka_start = obstack_object_size (ob);
> dump_type (cxx_pp, aka, flags);
> aka_len = obstack_object_size (ob) - aka_start;
> + if (quote && *quote)
> + pp_end_quote (cxx_pp, show_color);
> pp_right_brace (cxx_pp);
> p = (char*)obstack_base (ob);
> - /* If they are identical, cut off the aka with a NUL. */
> - if (len == aka_len && memcmp (p, p+aka_start, len) == 0)
> - p[len] = '\0';
> + /* If they are identical, cut off the aka by unwinding the
> obstack. */
> + if (type_len == aka_len
> + && memcmp (p + type_start, p+aka_start, type_len) == 0)
> + {
> + /* We can't add a '\0' here, since we may be adding a
> closing quote
> + below, and it would be hidden by the '\0'.
> + Instead, manually unwind the current object within the
> obstack
> + so that the insertion point is at the end of the type,
> before
> + the "' {aka". */
> + ob->next_free = p + type_start + type_len;
> + }
> + else
> + if (quote)
> + /* No further closing quotes are needed. */
> + *quote = false;
> + }
> +
> + if (quote && *quote)
> + {
> + pp_end_quote (cxx_pp, show_color);
> + *quote = false;
> }
>
> if (typ && TYPE_P (typ) && TREE_CODE (typ) == ENUMERAL_TYPE)
> @@ -3643,7 +3696,7 @@ static const char *
> arg_to_string (tree arg, bool verbose)
> {
> if (TYPE_P (arg))
> - return type_to_string (arg, verbose);
> + return type_to_string (arg, verbose, true, NULL, false);
> else
> return expr_to_string (arg);
> }
> @@ -3935,8 +3988,10 @@ cxx_format_postprocessor::handle
> (pretty_printer *pp)
> {
> /* If the types were not comparable, they are printed
> normally,
> and no difference tree is printed. */
> - type_a_text = type_to_string (type_a.m_tree,
> type_a.m_verbose);
> - type_b_text = type_to_string (type_b.m_tree,
> type_b.m_verbose);
> + type_a_text = type_to_string (type_a.m_tree,
> type_a.m_verbose,
> + true, &type_a.m_quote,
> show_color);
> + type_b_text = type_to_string (type_b.m_tree,
> type_b.m_verbose,
> + true, &type_b.m_quote,
> show_color);
> }
>
> if (type_a.m_quote)
> @@ -4009,7 +4064,7 @@ defer_phase_2_of_type_diff
> (deferred_printed_type *deferred,
> static bool
> cp_printer (pretty_printer *pp, text_info *text, const char *spec,
> int precision, bool wide, bool set_locus, bool verbose,
> - bool quoted, const char **buffer_ptr)
> + bool *quoted, const char **buffer_ptr)
> {
> gcc_assert (pp->m_format_postprocessor);
> cxx_format_postprocessor *postprocessor
> @@ -4052,7 +4107,12 @@ cp_printer (pretty_printer *pp, text_info
> *text, const char *spec,
> case 'P': result = parm_to_string (next_int); bre
> ak;
> case 'Q': result = assop_to_string (next_tcode);
> break;
> case 'S': result = subst_to_string (next_tree); b
> reak;
> - case 'T': result = type_to_string (next_tree, verbose); b
> reak;
> + case 'T':
> + {
> + result = type_to_string (next_tree, verbose, false, quoted,
> + pp_show_color (pp));
> + }
> + break;
> case 'V': result = cv_to_string (next_tree, verbose); bre
> ak;
> case 'X': result = eh_spec_to_string (next_tree, verbose);
> break;
>
> @@ -4063,14 +4123,14 @@ cp_printer (pretty_printer *pp, text_info
> *text, const char *spec,
> case 'H':
> {
> defer_phase_2_of_type_diff (&postprocessor->m_type_a,
> next_tree,
> - buffer_ptr, verbose, quoted);
> + buffer_ptr, verbose, *quoted);
> return true;
> }
>
> case 'I':
> {
> defer_phase_2_of_type_diff (&postprocessor->m_type_b,
> next_tree,
> - buffer_ptr, verbose, quoted);
> + buffer_ptr, verbose, *quoted);
> return true;
> }
>
> diff --git a/gcc/fortran/error.c b/gcc/fortran/error.c
> index 3ad1cf9..2cece49 100644
> --- a/gcc/fortran/error.c
> +++ b/gcc/fortran/error.c
> @@ -918,7 +918,7 @@ gfc_notify_std (int std, const char *gmsgid, ...)
> static bool
> gfc_format_decoder (pretty_printer *pp, text_info *text, const char
> *spec,
> int precision, bool wide, bool set_locus, bool
> hash,
> - bool quoted, const char **buffer_ptr)
> + bool *quoted, const char **buffer_ptr)
> {
> switch (*spec)
> {
> diff --git a/gcc/pretty-print.c b/gcc/pretty-print.c
> index 570dec7..6aee2b5 100644
> --- a/gcc/pretty-print.c
> +++ b/gcc/pretty-print.c
> @@ -545,10 +545,7 @@ pp_format (pretty_printer *pp, text_info *text)
> gcc_assert (!wide || precision == 0);
>
> if (quote)
> - {
> - pp_string (pp, open_quote);
> - pp_string (pp, colorize_start (pp_show_color (pp),
> "quote"));
> - }
> + pp_begin_quote (pp, pp_show_color (pp));
>
> switch (*p)
> {
> @@ -675,19 +672,21 @@ pp_format (pretty_printer *pp, text_info *text)
> {
> bool ok;
>
> + /* Call the format decoder.
> + Pass the address of "quote" so that format decoders
> can
> + potentially disable printing of the closing quote
> + (e.g. when printing "'TYPEDEF' aka 'TYPE'" in the C
> family
> + of frontends). */
> gcc_assert (pp_format_decoder (pp));
> ok = pp_format_decoder (pp) (pp, text, p,
> - precision, wide, plus,
> hash, quote,
> + precision, wide, plus,
> hash, "e,
> formatters[argno]);
> gcc_assert (ok);
> }
> }
>
> if (quote)
> - {
> - pp_string (pp, colorize_stop (pp_show_color (pp)));
> - pp_string (pp, close_quote);
> - }
> + pp_end_quote (pp, pp_show_color (pp));
>
> obstack_1grow (&buffer->chunk_obstack, '\0');
> *formatters[argno] = XOBFINISH (&buffer->chunk_obstack, const
> char *);
> @@ -1061,6 +1060,26 @@ pp_separate_with (pretty_printer *pp, char c)
> pp_space (pp);
> }
>
> +/* Add a localized open quote, and if SHOW_COLOR is true, begin
> colorizing
> + using the "quote" color. */
> +
> +void
> +pp_begin_quote (pretty_printer *pp, bool show_color)
> +{
> + pp_string (pp, open_quote);
> + pp_string (pp, colorize_start (show_color, "quote"));
> +}
> +
> +/* If SHOW_COLOR is true, stop colorizing.
> + Add a localized close quote. */
> +
> +void
> +pp_end_quote (pretty_printer *pp, bool show_color)
> +{
> + pp_string (pp, colorize_stop (show_color));
> + pp_string (pp, close_quote);
> +}
> +
>
> /* The string starting at P has LEN (at least 1) bytes left; if they
> start with a valid UTF-8 sequence, return the length of that
> diff --git a/gcc/pretty-print.h b/gcc/pretty-print.h
> index 40e56a3..ff70b70 100644
> --- a/gcc/pretty-print.h
> +++ b/gcc/pretty-print.h
> @@ -180,7 +180,7 @@ struct pp_wrapping_mode_t
> A client-supplied formatter returns true if everything goes well,
> otherwise it returns false. */
> typedef bool (*printer_fn) (pretty_printer *, text_info *, const
> char *,
> - int, bool, bool, bool, bool, const char
> **);
> + int, bool, bool, bool, bool *, const
> char **);
>
> /* Client supplied function used to decode formats. */
> #define pp_format_decoder(PP) (PP)->format_decoder
> @@ -387,6 +387,9 @@ extern void pp_write_text_to_stream
> (pretty_printer *);
> extern void pp_write_text_as_dot_label_to_stream (pretty_printer *,
> bool);
> extern void pp_maybe_space (pretty_printer *);
>
> +extern void pp_begin_quote (pretty_printer *, bool);
> +extern void pp_end_quote (pretty_printer *, bool);
> +
> /* Switch into verbatim mode and return the old mode. */
> static inline pp_wrapping_mode_t
> pp_set_verbatim_wrapping_ (pretty_printer *pp)
> diff --git a/gcc/testsuite/g++.dg/cpp1z/direct-enum-init1.C
> b/gcc/testsuite/g++.dg/cpp1z/direct-enum-init1.C
> index 11269cc..39b6052 100644
> --- a/gcc/testsuite/g++.dg/cpp1z/direct-enum-init1.C
> +++ b/gcc/testsuite/g++.dg/cpp1z/direct-enum-init1.C
> @@ -17,121 +17,121 @@ void bar (E);
> void
> foo ()
> {
> - A a1 { 5 }; // { dg-error "invalid conversion from
> 'int' to 'A {enum}'" }
> - B b1 { 7 }; // { dg-error "invalid conversion from
> 'int' to 'B {enum}'" "" { target c++14_down } }
> + A a1 { 5 }; // { dg-error "invalid conversion from
> 'int' to 'A' {enum}" }
> + B b1 { 7 }; // { dg-error "invalid conversion from
> 'int' to 'B' {enum}" "" { target c++14_down } }
> C c1 { s };
> - D d1 { D(t) }; // { dg-error "invalid cast from type 'T' to
> type 'D {enum}'" }
> - D d2 { t }; // { dg-error "cannot convert 'T' to 'D
> {enum}' in initialization" "" { target c++14_down } }
> - // { dg-error "invalid cast from type 'T' to
> type 'D {enum}'" "" { target c++1z } .-1 }
> - D d3 { 9 }; // { dg-error "cannot convert 'int' to
> 'D {enum}' in initialization" "" { target c++14_down } }
> - D d4 { l }; // { dg-error "cannot convert 'long
> int' to 'D {enum}' in initialization" "" { target c++14_down } }
> + D d1 { D(t) }; // { dg-error "invalid cast from type 'T' to
> type 'D' {enum}" }
> + D d2 { t }; // { dg-error "cannot convert 'T' to
> 'D' {enum} in initialization" "" { target c++14_down } }
> + // { dg-error "invalid cast from type 'T' to
> type 'D' {enum}" "" { target c++1z } .-1 }
> + D d3 { 9 }; // { dg-error "cannot convert 'int' to
> 'D' {enum} in initialization" "" { target c++14_down } }
> + D d4 { l }; // { dg-error "cannot convert 'long
> int' to 'D' {enum} in initialization" "" { target c++14_down } }
> D d5 { D(l) };
> - D d6 { G }; // { dg-error "cannot convert 'A
> {enum}' to 'D {enum}' in initialization" "" { target c++14_down } }
> - E e1 { 5 }; // { dg-error "cannot convert 'int' to
> 'E {enum}' in initialization" "" { target c++14_down } }
> - E e2 { -1 }; // { dg-error "cannot convert 'int' to
> 'E {enum}' in initialization" "" { target c++14_down } }
> + D d6 { G }; // { dg-error "cannot convert 'A'
> {enum} to 'D' {enum} in initialization" "" { target c++14_down } }
> + E e1 { 5 }; // { dg-error "cannot convert 'int' to
> 'E' {enum} in initialization" "" { target c++14_down } }
> + E e2 { -1 }; // { dg-error "cannot convert 'int' to
> 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of '-1'
> from 'int' to 'unsigned char' inside" "" { target c++1z } .-1 }
> - E e3 { 5.0 }; // { dg-error "cannot convert
> 'double' to 'E {enum}' in initialization" "" { target c++14_down } }
> + E e3 { 5.0 }; // { dg-error "cannot convert
> 'double' to 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of
> '5.0e.0' from 'double' to 'unsigned char' inside" "" { target c++1z }
> .-1 }
> - E e4 { 5.2 }; // { dg-error "cannot convert
> 'double' to 'E {enum}' in initialization" "" { target c++14_down } }
> + E e4 { 5.2 }; // { dg-error "cannot convert
> 'double' to 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of
> '5.\[0-9]*e.0' from 'double' to 'unsigned char' inside" "" { target
> c++1z } .-1 }
> - B b2 = { 7 }; // { dg-error "invalid conversion
> from 'int' to 'B {enum}'" }
> - C c2 = { C { 8 } }; // { dg-error "cannot convert 'int' to
> 'C {enum}' in initialization" "" { target c++14_down } }
> + B b2 = { 7 }; // { dg-error "invalid conversion
> from 'int' to 'B' {enum}" }
> + C c2 = { C { 8 } }; // { dg-error "cannot convert 'int' to
> 'C' {enum} in initialization" "" { target c++14_down } }
>
> - D *d7 = new D { 9 }; // { dg-error "cannot convert
> \[^\n\r]* to 'D {enum}' in initialization" "" { target c++14_down } }
> - E *e5 = new E { -4 }; // { dg-error "cannot convert
> \[^\n\r]* to 'E {enum}' in initialization" "" { target c++14_down } }
> + D *d7 = new D { 9 }; // { dg-error "cannot convert
> \[^\n\r]* to 'D' {enum} in initialization" "" { target c++14_down } }
> + E *e5 = new E { -4 }; // { dg-error "cannot convert
> \[^\n\r]* to 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of '-4'
> from 'int' to 'unsigned char' inside" "" { target c++1z } .-1 }
> - bar ({ 10 }); // { dg-error "cannot convert
> \[^\n\r]* to 'E {enum}' for argument" }
> - bar (E { 9 }); // { dg-error "cannot convert 'int' to 'E
> {enum}' in initialization" "" { target c++14_down } }
> - V v1 = { { 11 } }; // { dg-error "braces around scalar
> initializer for type 'E {enum}'" }
> - V v2 = { E { 12 } }; // { dg-error "cannot convert 'int' to
> 'E {enum}' in initialization" "" { target c++14_down } }
> - V v3 = { E { 5.0 } }; // { dg-error "cannot convert
> 'double' to 'E {enum}' in initialization" "" { target c++14_down } }
> + bar ({ 10 }); // { dg-error "cannot convert
> \[^\n\r]* to 'E' {enum} for argument" }
> + bar (E { 9 }); // { dg-error "cannot convert 'int' to 'E'
> {enum} in initialization" "" { target c++14_down } }
> + V v1 = { { 11 } }; // { dg-error "braces around scalar
> initializer for type 'E' {enum}" }
> + V v2 = { E { 12 } }; // { dg-error "cannot convert 'int' to
> 'E' {enum} in initialization" "" { target c++14_down } }
> + V v3 = { E { 5.0 } }; // { dg-error "cannot convert
> 'double' to 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of
> '5.0e.0' from 'double' to 'unsigned char' inside" "" { target c++1z }
> .-1 }
> - V v4 = { 13 }; // { dg-error "cannot convert 'int' to 'E
> {enum}' in initialization" }
> - if (B b3 { 5 }) // { dg-error "invalid conversion from
> 'int' to 'B {enum}'" "" { target c++14_down } }
> + V v4 = { 13 }; // { dg-error "cannot convert 'int' to 'E'
> {enum} in initialization" }
> + if (B b3 { 5 }) // { dg-error "invalid conversion from
> 'int' to 'B' {enum}" "" { target c++14_down } }
> ;
> - if (B b4 { 4.0 }) // { dg-error "cannot convert 'double' to
> 'B {enum}' in initialization" "" { target c++14_down } }
> + if (B b4 { 4.0 }) // { dg-error "cannot convert 'double' to
> 'B' {enum} in initialization" "" { target c++14_down } }
> ; // { dg-error "narrowing conversion of
> '4.0e.0' from 'double' to 'short int' inside" "" { target c++1z } .-1
> }
> - C c3 { 8L }; // { dg-error "cannot convert 'long
> int' to 'C {enum}' in initialization" "" { target c++14_down } }
> - B b4 {short (c + 5)}; // { dg-error "invalid conversion
> from 'short int' to 'B {enum}'" "" { target c++14_down } }
> - B b5 {c + 5}; // { dg-error "invalid conversion
> from 'int' to 'B {enum}'" "" { target c++14_down } }
> + C c3 { 8L }; // { dg-error "cannot convert 'long
> int' to 'C' {enum} in initialization" "" { target c++14_down } }
> + B b4 {short (c + 5)}; // { dg-error "invalid conversion
> from 'short int' to 'B' {enum}" "" { target c++14_down } }
> + B b5 {c + 5}; // { dg-error "invalid conversion
> from 'int' to 'B' {enum}" "" { target c++14_down } }
> // { dg-error "narrowing conversion of
> \[^\n\r]* from 'int' to 'short int' inside" "" { target c++1z } .-1 }
> - C c4 { ll }; // { dg-error "cannot convert 'long
> long int' to 'C {enum}' in initialization" "" { target c++14_down } }
> + C c4 { ll }; // { dg-error "cannot convert 'long
> long int' to 'C' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of 'll'
> from 'long long int' to 'int' inside" "" { target c++1z } .-1 }
> - C c5 {short (c + 5)}; // { dg-error "cannot convert 'short
> int' to 'C {enum}' in initialization" "" { target c++14_down } }
> - C c6 {c + 5}; // { dg-error "cannot convert 'int'
> to 'C {enum}' in initialization" "" { target c++14_down } }
> + C c5 {short (c + 5)}; // { dg-error "cannot convert 'short
> int' to 'C' {enum} in initialization" "" { target c++14_down } }
> + C c6 {c + 5}; // { dg-error "cannot convert 'int'
> to 'C' {enum} in initialization" "" { target c++14_down } }
> }
>
> struct U
> {
> - U () : e { 5 } {} // { dg-error "cannot convert \[^\n\r]*
> to 'E {enum}' in initialization" "" { target c++14_down } }
> - U (int) : e { 5.0 } {}// { dg-error "cannot convert \[^\n\r]* to
> 'E {enum}' in initialization" "" { target c++14_down } }
> + U () : e { 5 } {} // { dg-error "cannot convert \[^\n\r]*
> to 'E' {enum} in initialization" "" { target c++14_down } }
> + U (int) : e { 5.0 } {}// { dg-error "cannot convert \[^\n\r]* to
> 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of
> '5.0e.0' from 'double' to 'unsigned char' inside" "" { target c++1z }
> .-1 }
> U (float) : e({ 6 }) {}// { dg-error "list-initializer for non
> -class type must not be parenthesized" }
> - // { dg-error "cannot convert \[^\n\r]* to
> 'E {enum}' in initialization" "" { target *-*-* } .-1 }
> + // { dg-error "cannot convert \[^\n\r]* to
> 'E' {enum} in initialization" "" { target *-*-* } .-1 }
> E e;
> };
>
> struct W
> {
> - A a { 5 }; // { dg-error "invalid conversion from
> 'int' to 'A {enum}'" }
> - B b { 6 }; // { dg-error "invalid conversion from
> 'int' to 'B {enum}'" "" { target c++14_down } }
> - C c { 3.0f }; // { dg-error "cannot convert
> \[^\n\r]* to 'C {enum}' in initialization" "" { target c++14_down } }
> + A a { 5 }; // { dg-error "invalid conversion from
> 'int' to 'A' {enum}" }
> + B b { 6 }; // { dg-error "invalid conversion from
> 'int' to 'B' {enum}" "" { target c++14_down } }
> + C c { 3.0f }; // { dg-error "cannot convert
> \[^\n\r]* to 'C' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of
> '3.0e.0f' from 'float' to 'int' inside" "" { target c++1z } .-1 }
> - D d = { 7 }; // { dg-error "cannot convert
> \[^\n\r]* to 'D {enum}' in initialization" }
> + D d = { 7 }; // { dg-error "cannot convert
> \[^\n\r]* to 'D' {enum} in initialization" }
> };
>
> template <int N>
> void
> foo2 ()
> {
> - A a1 { 5 }; // { dg-error "invalid conversion from
> 'int' to 'A {enum}'" }
> - B b1 { 7 }; // { dg-error "invalid conversion from
> 'int' to 'B {enum}'" "" { target c++14_down } }
> + A a1 { 5 }; // { dg-error "invalid conversion from
> 'int' to 'A' {enum}" }
> + B b1 { 7 }; // { dg-error "invalid conversion from
> 'int' to 'B' {enum}" "" { target c++14_down } }
> C c1 { s };
> - D d1 { D(t) }; // { dg-error "invalid cast from type 'T' to
> type 'D {enum}'" }
> - D d2 { t }; // { dg-error "cannot convert 'T' to 'D
> {enum}' in initialization" "" { target c++14_down } }
> - // { dg-error "invalid cast from type 'T' to
> type 'D {enum}'" "" { target c++1z } .-1 }
> - D d3 { 9 }; // { dg-error "cannot convert 'int' to
> 'D {enum}' in initialization" "" { target c++14_down } }
> - D d4 { l }; // { dg-error "cannot convert 'long
> int' to 'D {enum}' in initialization" "" { target c++14_down } }
> + D d1 { D(t) }; // { dg-error "invalid cast from type 'T' to
> type 'D' {enum}" }
> + D d2 { t }; // { dg-error "cannot convert 'T' to
> 'D' {enum} in initialization" "" { target c++14_down } }
> + // { dg-error "invalid cast from type 'T' to
> type 'D' {enum}" "" { target c++1z } .-1 }
> + D d3 { 9 }; // { dg-error "cannot convert 'int' to
> 'D' {enum} in initialization" "" { target c++14_down } }
> + D d4 { l }; // { dg-error "cannot convert 'long
> int' to 'D' {enum} in initialization" "" { target c++14_down } }
> D d5 { D(l) };
> - D d6 { G }; // { dg-error "cannot convert 'A
> {enum}' to 'D {enum}' in initialization" "" { target c++14_down } }
> - E e1 { 5 }; // { dg-error "cannot convert 'int' to
> 'E {enum}' in initialization" "" { target c++14_down } }
> - E e2 { -1 }; // { dg-error "cannot convert 'int' to
> 'E {enum}' in initialization" "" { target c++14_down } }
> + D d6 { G }; // { dg-error "cannot convert 'A'
> {enum} to 'D' {enum} in initialization" "" { target c++14_down } }
> + E e1 { 5 }; // { dg-error "cannot convert 'int' to
> 'E' {enum} in initialization" "" { target c++14_down } }
> + E e2 { -1 }; // { dg-error "cannot convert 'int' to
> 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of '-1'
> from 'int' to 'unsigned char' inside" "" { target c++1z } .-1 }
> - E e3 { 5.0 }; // { dg-error "cannot convert
> 'double' to 'E {enum}' in initialization" "" { target c++14_down } }
> + E e3 { 5.0 }; // { dg-error "cannot convert
> 'double' to 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of
> '5.0e.0' from 'double' to 'unsigned char' inside" "" { target c++1z }
> .-1 }
> - E e4 { 5.2 }; // { dg-error "cannot convert
> 'double' to 'E {enum}' in initialization" "" { target c++14_down } }
> + E e4 { 5.2 }; // { dg-error "cannot convert
> 'double' to 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of
> '5.\[0-9]*e.0' from 'double' to 'unsigned char' inside" "" { target
> c++1z } .-1 }
> - B b2 = { 7 }; // { dg-error "invalid conversion
> from 'int' to 'B {enum}'" }
> - C c2 = { C { 8 } }; // { dg-error "cannot convert 'int' to
> 'C {enum}' in initialization" "" { target c++14_down } }
> - D *d7 = new D { 9 }; // { dg-error "cannot convert
> \[^\n\r]* to 'D {enum}' in initialization" "" { target c++14_down } }
> - E *e5 = new E { -4 }; // { dg-error "cannot convert
> \[^\n\r]* to 'E {enum}' in initialization" "" { target c++14_down } }
> + B b2 = { 7 }; // { dg-error "invalid conversion
> from 'int' to 'B' {enum}" }
> + C c2 = { C { 8 } }; // { dg-error "cannot convert 'int' to
> 'C' {enum} in initialization" "" { target c++14_down } }
> + D *d7 = new D { 9 }; // { dg-error "cannot convert
> \[^\n\r]* to 'D' {enum} in initialization" "" { target c++14_down } }
> + E *e5 = new E { -4 }; // { dg-error "cannot convert
> \[^\n\r]* to 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of '-4'
> from 'int' to 'unsigned char' inside" "" { target c++1z } .-1 }
> - bar ({ 10 }); // { dg-error "cannot convert
> \[^\n\r]* to 'E {enum}' for argument" }
> - bar (E { 9 }); // { dg-error "cannot convert 'int' to 'E
> {enum}' in initialization" "" { target c++14_down } }
> - V v1 = { { 11 } }; // { dg-error "braces around scalar
> initializer for type 'E {enum}'" }
> - V v2 = { E { 12 } }; // { dg-error "cannot convert 'int' to
> 'E {enum}' in initialization" "" { target c++14_down } }
> - V v3 = { E { 5.0 } }; // { dg-error "cannot convert
> 'double' to 'E {enum}' in initialization" "" { target c++14_down } }
> + bar ({ 10 }); // { dg-error "cannot convert
> \[^\n\r]* to 'E' {enum} for argument" }
> + bar (E { 9 }); // { dg-error "cannot convert 'int' to 'E'
> {enum} in initialization" "" { target c++14_down } }
> + V v1 = { { 11 } }; // { dg-error "braces around scalar
> initializer for type 'E' {enum}" }
> + V v2 = { E { 12 } }; // { dg-error "cannot convert 'int' to
> 'E' {enum} in initialization" "" { target c++14_down } }
> + V v3 = { E { 5.0 } }; // { dg-error "cannot convert
> 'double' to 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of
> '5.0e.0' from 'double' to 'unsigned char' inside" "" { target c++1z }
> .-1 }
> - V v4 = { 13 }; // { dg-error "cannot convert 'int' to 'E
> {enum}' in initialization" }
> - if (B b3 { 5 }) // { dg-error "invalid conversion from
> 'int' to 'B {enum}'" "" { target c++14_down } }
> + V v4 = { 13 }; // { dg-error "cannot convert 'int' to 'E'
> {enum} in initialization" }
> + if (B b3 { 5 }) // { dg-error "invalid conversion from
> 'int' to 'B' {enum}" "" { target c++14_down } }
> ;
> - if (B b4 { 4.0 }) // { dg-error "cannot convert 'double' to
> 'B {enum}' in initialization" "" { target c++14_down } }
> + if (B b4 { 4.0 }) // { dg-error "cannot convert 'double' to
> 'B' {enum} in initialization" "" { target c++14_down } }
> ; // { dg-error "narrowing conversion of
> '4.0e.0' from 'double' to 'short int' inside" "" { target c++1z } .-1
> }
> - C c3 { 8L }; // { dg-error "cannot convert 'long
> int' to 'C {enum}' in initialization" "" { target c++14_down } }
> - B b4 {short (c + 5)}; // { dg-error "invalid conversion
> from 'short int' to 'B {enum}'" "" { target c++14_down } }
> - B b5 {c + 5}; // { dg-error "invalid conversion
> from 'int' to 'B {enum}'" "" { target c++14_down } }
> + C c3 { 8L }; // { dg-error "cannot convert 'long
> int' to 'C' {enum} in initialization" "" { target c++14_down } }
> + B b4 {short (c + 5)}; // { dg-error "invalid conversion
> from 'short int' to 'B' {enum}" "" { target c++14_down } }
> + B b5 {c + 5}; // { dg-error "invalid conversion
> from 'int' to 'B' {enum}" "" { target c++14_down } }
> // { dg-error "narrowing conversion of
> \[^\n\r]* from 'int' to 'short int' inside" "" { target c++1z } .-1 }
> - C c4 { ll }; // { dg-error "cannot convert 'long
> long int' to 'C {enum}' in initialization" "" { target c++14_down } }
> + C c4 { ll }; // { dg-error "cannot convert 'long
> long int' to 'C' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of 'll'
> from 'long long int' to 'int' inside" "" { target c++1z } .-1 }
> - C c5 {short (c + 5)}; // { dg-error "cannot convert 'short
> int' to 'C {enum}' in initialization" "" { target c++14_down } }
> - C c6 {c + 5}; // { dg-error "cannot convert 'int'
> to 'C {enum}' in initialization" "" { target c++14_down } }
> + C c5 {short (c + 5)}; // { dg-error "cannot convert 'short
> int' to 'C' {enum} in initialization" "" { target c++14_down } }
> + C c6 {c + 5}; // { dg-error "cannot convert 'int'
> to 'C' {enum} in initialization" "" { target c++14_down } }
> }
>
> template <int N>
> struct U2
> {
> - U2 () : e { 5 } {} // { dg-error "cannot convert \[^\n\r]*
> to 'E {enum}' in initialization" "" { target c++14_down } }
> - U2 (int) : e { 5.0 } {}// { dg-error "cannot convert \[^\n\r]* to
> 'E {enum}' in initialization" "" { target c++14_down } }
> + U2 () : e { 5 } {} // { dg-error "cannot convert \[^\n\r]*
> to 'E' {enum} in initialization" "" { target c++14_down } }
> + U2 (int) : e { 5.0 } {}// { dg-error "cannot convert \[^\n\r]* to
> 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of
> '5.0e.0' from 'double' to 'unsigned char' inside" "" { target c++1z }
> .-1 }
> U2 (float) : e({ 6 }) {}
> E e;
> @@ -140,11 +140,11 @@ struct U2
> template <int N>
> struct W2
> {
> - A a { 5 }; // { dg-error "invalid conversion from
> 'int' to 'A {enum}'" "" { target *-*-* } .-2 }
> - B b { 6 }; // { dg-error "invalid conversion from
> 'int' to 'B {enum}'" "" { target c++14_down } .-3 }
> - C c { 3.0f }; // { dg-error "cannot convert
> \[^\n\r]* to 'C {enum}' in initialization" "" { target c++14_down } .
> -4 }
> + A a { 5 }; // { dg-error "invalid conversion from
> 'int' to 'A' {enum}" "" { target *-*-* } .-2 }
> + B b { 6 }; // { dg-error "invalid conversion from
> 'int' to 'B' {enum}" "" { target c++14_down } .-3 }
> + C c { 3.0f }; // { dg-error "cannot convert
> \[^\n\r]* to 'C' {enum} in initialization" "" { target c++14_down } .
> -4 }
> // { dg-error "narrowing conversion of
> '3.0e.0f' from 'float' to 'int' inside" "" { target c++1z } .-5 }
> - D d = { 7 }; // { dg-error "cannot convert
> \[^\n\r]* to 'D {enum}' in initialization" "" { target *-*-* } .-6 }
> + D d = { 7 }; // { dg-error "cannot convert
> \[^\n\r]* to 'D' {enum} in initialization" "" { target *-*-* } .-6 }
> };
>
> template <typename H, typename I, typename J, typename K, typename
> L, typename M>
> @@ -152,54 +152,54 @@ void
> foo3 ()
> {
> void bar3 (L);
> - H a1 { 5 }; // { dg-error "invalid conversion from
> 'int' to 'A {enum}'" }
> - I b1 { 7 }; // { dg-error "invalid conversion from
> 'int' to 'B {enum}'" "" { target c++14_down } }
> + H a1 { 5 }; // { dg-error "invalid conversion from
> 'int' to 'A' {enum}" }
> + I b1 { 7 }; // { dg-error "invalid conversion from
> 'int' to 'B' {enum}" "" { target c++14_down } }
> J c1 { s };
> - K d1 { K(t) }; // { dg-error "invalid cast from type 'T' to
> type 'D {enum}'" }
> - K d2 { t }; // { dg-error "cannot convert 'T' to 'D
> {enum}' in initialization" "" { target c++14_down } }
> - // { dg-error "invalid cast from type 'T' to
> type 'D {enum}'" "" { target c++1z } .-1 }
> - K d3 { 9 }; // { dg-error "cannot convert 'int' to
> 'D {enum}' in initialization" "" { target c++14_down } }
> - K d4 { l }; // { dg-error "cannot convert 'long
> int' to 'D {enum}' in initialization" "" { target c++14_down } }
> + K d1 { K(t) }; // { dg-error "invalid cast from type 'T' to
> type 'D' {enum}" }
> + K d2 { t }; // { dg-error "cannot convert 'T' to
> 'D' {enum} in initialization" "" { target c++14_down } }
> + // { dg-error "invalid cast from type 'T' to
> type 'D' {enum}" "" { target c++1z } .-1 }
> + K d3 { 9 }; // { dg-error "cannot convert 'int' to
> 'D' {enum} in initialization" "" { target c++14_down } }
> + K d4 { l }; // { dg-error "cannot convert 'long
> int' to 'D' {enum} in initialization" "" { target c++14_down } }
> K d5 { K(l) };
> - K d6 { G }; // { dg-error "cannot convert 'A
> {enum}' to 'D {enum}' in initialization" "" { target c++14_down } }
> - L e1 { 5 }; // { dg-error "cannot convert 'int' to
> 'E {enum}' in initialization" "" { target c++14_down } }
> - L e2 { -1 }; // { dg-error "cannot convert 'int' to
> 'E {enum}' in initialization" "" { target c++14_down } }
> + K d6 { G }; // { dg-error "cannot convert 'A'
> {enum} to 'D' {enum} in initialization" "" { target c++14_down } }
> + L e1 { 5 }; // { dg-error "cannot convert 'int' to
> 'E' {enum} in initialization" "" { target c++14_down } }
> + L e2 { -1 }; // { dg-error "cannot convert 'int' to
> 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of '-1'
> from 'int' to 'unsigned char' inside" "" { target c++1z } .-1 }
> - L e3 { 5.0 }; // { dg-error "cannot convert
> 'double' to 'E {enum}' in initialization" "" { target c++14_down } }
> + L e3 { 5.0 }; // { dg-error "cannot convert
> 'double' to 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of
> '5.0e.0' from 'double' to 'unsigned char' inside" "" { target c++1z }
> .-1 }
> - L e4 { 5.2 }; // { dg-error "cannot convert
> 'double' to 'E {enum}' in initialization" "" { target c++14_down } }
> + L e4 { 5.2 }; // { dg-error "cannot convert
> 'double' to 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of
> '5.\[0-9]*e.0' from 'double' to 'unsigned char' inside" "" { target
> c++1z } .-1 }
> - I b2 = { 7 }; // { dg-error "invalid conversion
> from 'int' to 'B {enum}'" }
> - J c2 = { J { 8 } }; // { dg-error "cannot convert 'int' to
> 'C {enum}' in initialization" "" { target c++14_down } }
> - K *d7 = new K { 9 }; // { dg-error "cannot convert
> \[^\n\r]* to 'D {enum}' in initialization" "" { target c++14_down } }
> - L *e5 = new L { -4 }; // { dg-error "cannot convert
> \[^\n\r]* to 'E {enum}' in initialization" "" { target c++14_down } }
> + I b2 = { 7 }; // { dg-error "invalid conversion
> from 'int' to 'B' {enum}" }
> + J c2 = { J { 8 } }; // { dg-error "cannot convert 'int' to
> 'C' {enum} in initialization" "" { target c++14_down } }
> + K *d7 = new K { 9 }; // { dg-error "cannot convert
> \[^\n\r]* to 'D' {enum} in initialization" "" { target c++14_down } }
> + L *e5 = new L { -4 }; // { dg-error "cannot convert
> \[^\n\r]* to 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of '-4'
> from 'int' to 'unsigned char' inside" "" { target c++1z } .-1 }
> - bar3 ({ 10 }); // { dg-error "cannot convert \[^\n\r]* to
> 'E {enum}' for argument" }
> - bar3 (E { 9 }); // { dg-error "cannot convert 'int' to 'E
> {enum}' in initialization" "" { target c++14_down } }
> - M v1 = { { 11 } }; // { dg-error "braces around scalar
> initializer for type 'E {enum}'" }
> - M v2 = { L { 12 } }; // { dg-error "cannot convert 'int' to
> 'E {enum}' in initialization" "" { target c++14_down } }
> - M v3 = { L { 5.0 } }; // { dg-error "cannot convert
> 'double' to 'E {enum}' in initialization" "" { target c++14_down } }
> + bar3 ({ 10 }); // { dg-error "cannot convert \[^\n\r]* to
> 'E' {enum} for argument" }
> + bar3 (E { 9 }); // { dg-error "cannot convert 'int' to 'E'
> {enum} in initialization" "" { target c++14_down } }
> + M v1 = { { 11 } }; // { dg-error "braces around scalar
> initializer for type 'E' {enum}" }
> + M v2 = { L { 12 } }; // { dg-error "cannot convert 'int' to
> 'E' {enum} in initialization" "" { target c++14_down } }
> + M v3 = { L { 5.0 } }; // { dg-error "cannot convert
> 'double' to 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of
> '5.0e.0' from 'double' to 'unsigned char' inside" "" { target c++1z }
> .-1 }
> - M v4 = { 13 }; // { dg-error "cannot convert 'int' to 'E
> {enum}' in initialization" }
> - if (I b3 { 5 }) // { dg-error "invalid conversion from
> 'int' to 'B {enum}'" "" { target c++14_down } }
> + M v4 = { 13 }; // { dg-error "cannot convert 'int' to 'E'
> {enum} in initialization" }
> + if (I b3 { 5 }) // { dg-error "invalid conversion from
> 'int' to 'B' {enum}" "" { target c++14_down } }
> ;
> - if (I b4 { 4.0 }) // { dg-error "cannot convert 'double' to
> 'B {enum}' in initialization" "" { target c++14_down } }
> + if (I b4 { 4.0 }) // { dg-error "cannot convert 'double' to
> 'B' {enum} in initialization" "" { target c++14_down } }
> ; // { dg-error "narrowing conversion of
> '4.0e.0' from 'double' to 'short int' inside" "" { target c++1z } .-1
> }
> - J c3 { 8L }; // { dg-error "cannot convert 'long
> int' to 'C {enum}' in initialization" "" { target c++14_down } }
> - I b4 {short (c + 5)}; // { dg-error "invalid conversion
> from 'short int' to 'B {enum}'" "" { target c++14_down } }
> - I b5 {c + 5}; // { dg-error "invalid conversion
> from 'int' to 'B {enum}'" "" { target c++14_down } }
> + J c3 { 8L }; // { dg-error "cannot convert 'long
> int' to 'C' {enum} in initialization" "" { target c++14_down } }
> + I b4 {short (c + 5)}; // { dg-error "invalid conversion
> from 'short int' to 'B' {enum}" "" { target c++14_down } }
> + I b5 {c + 5}; // { dg-error "invalid conversion
> from 'int' to 'B' {enum}" "" { target c++14_down } }
> // { dg-error "narrowing conversion of
> \[^\n\r]* from 'int' to 'short int' inside" "" { target c++1z } .-1 }
> - J c4 { ll }; // { dg-error "cannot convert 'long
> long int' to 'C {enum}' in initialization" "" { target c++14_down } }
> + J c4 { ll }; // { dg-error "cannot convert 'long
> long int' to 'C' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of 'll'
> from 'long long int' to 'int' inside" "" { target c++1z } .-1 }
> - J c5 {short (c + 5)}; // { dg-error "cannot convert 'short
> int' to 'C {enum}' in initialization" "" { target c++14_down } }
> - J c6 {c + 5}; // { dg-error "cannot convert 'int'
> to 'C {enum}' in initialization" "" { target c++14_down } }
> + J c5 {short (c + 5)}; // { dg-error "cannot convert 'short
> int' to 'C' {enum} in initialization" "" { target c++14_down } }
> + J c6 {c + 5}; // { dg-error "cannot convert 'int'
> to 'C' {enum} in initialization" "" { target c++14_down } }
> }
>
> template <typename L>
> struct U3
> {
> - U3 () : e { 5 } {} // { dg-error "cannot convert \[^\n\r]*
> to 'E {enum}' in initialization" "" { target c++14_down } }
> - U3 (int) : e { 5.0 } {}// { dg-error "cannot convert \[^\n\r]* to
> 'E {enum}' in initialization" "" { target c++14_down } }
> + U3 () : e { 5 } {} // { dg-error "cannot convert \[^\n\r]*
> to 'E' {enum} in initialization" "" { target c++14_down } }
> + U3 (int) : e { 5.0 } {}// { dg-error "cannot convert \[^\n\r]* to
> 'E' {enum} in initialization" "" { target c++14_down } }
> // { dg-error "narrowing conversion of
> '5.0e.0' from 'double' to 'unsigned char' inside" "" { target c++1z }
> .-1 }
> U3 (float) : e({ 6 }) {}
> L e;
> @@ -208,11 +208,11 @@ struct U3
> template <typename H, typename I, typename J, typename K>
> struct W3
> {
> - H a { 5 }; // { dg-error "invalid conversion from
> 'int' to 'A {enum}'" "" { target *-*-* } .-2 }
> - I b { 6 }; // { dg-error "invalid conversion from
> 'int' to 'B {enum}'" "" { target c++14_down } .-3 }
> - J c { 3.0f }; // { dg-error "cannot convert
> \[^\n\r]* to 'C {enum}' in initialization" "" { target c++14_down } .
> -4 }
> + H a { 5 }; // { dg-error "invalid conversion from
> 'int' to 'A' {enum}" "" { target *-*-* } .-2 }
> + I b { 6 }; // { dg-error "invalid conversion from
> 'int' to 'B' {enum}" "" { target c++14_down } .-3 }
> + J c { 3.0f }; // { dg-error "cannot convert
> \[^\n\r]* to 'C' {enum} in initialization" "" { target c++14_down } .
> -4 }
> // { dg-error "narrowing conversion of
> '3.0e.0f' from 'float' to 'int' inside" "" { target c++1z } .-5 }
> - K d = { 7 }; // { dg-error "cannot convert
> \[^\n\r]* to 'D {enum}' in initialization" "" { target *-*-* } .-6 }
> + K d = { 7 }; // { dg-error "cannot convert
> \[^\n\r]* to 'D' {enum} in initialization" "" { target *-*-* } .-6 }
> };
>
> void
> @@ -221,17 +221,17 @@ test ()
> foo2<0> ();
> U2<0> u20;
> U2<1> u21 (5);
> - W2<0> w2; // { dg-error "invalid conversion from
> 'int' to 'A {enum}'" }
> - // { dg-error "invalid conversion from 'int'
> to 'B {enum}'" "" { target c++14_down } .-1 }
> - // { dg-error "cannot convert \[^\n\r]* to
> 'C {enum}' in initialization" "" { target c++14_down } .-2 }
> + W2<0> w2; // { dg-error "invalid conversion from
> 'int' to 'A' {enum}" }
> + // { dg-error "invalid conversion from 'int'
> to 'B' {enum}" "" { target c++14_down } .-1 }
> + // { dg-error "cannot convert \[^\n\r]* to
> 'C' {enum} in initialization" "" { target c++14_down } .-2 }
> // { dg-error "narrowing conversion of
> '3.0e.0f' from 'float' to 'int' inside" "" { target c++1z } .-3 }
> - // { dg-error "cannot convert \[^\n\r]* to
> 'D {enum}' in initialization" "" { target *-*-* } .-4 }
> + // { dg-error "cannot convert \[^\n\r]* to
> 'D' {enum} in initialization" "" { target *-*-* } .-4 }
> foo3<A, B, C, D, E, V> ();
> U3<E> u30;
> U3<E> u31 (5);
> - W3<A, B, C, D> w3; // { dg-error "invalid conversion from
> 'int' to 'A {enum}'" }
> - // { dg-error "invalid conversion from 'int'
> to 'B {enum}'" "" { target c++14_down } .-1 }
> - // { dg-error "cannot convert \[^\n\r]* to
> 'C {enum}' in initialization" "" { target c++14_down } .-2 }
> + W3<A, B, C, D> w3; // { dg-error "invalid conversion from
> 'int' to 'A' {enum}" }
> + // { dg-error "invalid conversion from 'int'
> to 'B' {enum}" "" { target c++14_down } .-1 }
> + // { dg-error "cannot convert \[^\n\r]* to
> 'C' {enum} in initialization" "" { target c++14_down } .-2 }
> // { dg-error "narrowing conversion of
> '3.0e.0f' from 'float' to 'int' inside" "" { target c++1z } .-3 }
> - // { dg-error "cannot convert \[^\n\r]* to
> 'D {enum}' in initialization" "" { target *-*-* } .-4 }
> + // { dg-error "cannot convert \[^\n\r]* to
> 'D' {enum} in initialization" "" { target *-*-* } .-4 }
> }
> diff --git a/gcc/testsuite/g++.dg/diagnostic/aka1.C
> b/gcc/testsuite/g++.dg/diagnostic/aka1.C
> index 37f8df9..cb314fb 100644
> --- a/gcc/testsuite/g++.dg/diagnostic/aka1.C
> +++ b/gcc/testsuite/g++.dg/diagnostic/aka1.C
> @@ -12,4 +12,4 @@ void A::f() {
> typedef A B;
>
> // We do want an aka for a real typedef.
> -B b = 0; // { dg-error "B .aka A." }
> +B b = 0; // { dg-error "'B' {aka 'A'}" }
> diff --git a/gcc/testsuite/g++.dg/diagnostic/aka2.C
> b/gcc/testsuite/g++.dg/diagnostic/aka2.C
> new file mode 100644
> index 0000000..a43f9e3
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/diagnostic/aka2.C
> @@ -0,0 +1,32 @@
> +/* Verify that the "aka" descriptions for typedefs are correctly
> + quoted (PR 62170). */
> +
> +/* Exercise %H and %I. */
> +
> +typedef struct s1 t1;
> +typedef struct s2 {int i;} t2;
> +
> +int foo(t1 *);
> +
> +void test_1 () {
> + t2 pos;
> +
> + foo (&pos); // { dg-error "cannot convert 't2\\*' {aka 's2\\*'} to
> 't1\\*' {aka 's1\\*'} for argument '1' to 'int foo\\(t1\\*\\)'" }
> +}
> +
> +/* Exercise %T. */
> +
> +typedef struct s3
> +{
> + void m3 ();
> +} t3;
> +
> +void test_2 (const s3 *ptr)
> +{
> + ptr->m3 (); // { dg-error "passing 'const s3' as 'this' argument
> discards qualifiers" }
> +}
> +
> +void test_3 (const t3 *ptr)
> +{
> + ptr->m3 (); // { dg-error "passing 'const t3' {aka 'const s3'} as
> 'this' argument discards qualifiers" }
> +}
> diff --git a/gcc/testsuite/g++.dg/parse/error55.C
> b/gcc/testsuite/g++.dg/parse/error55.C
> index 24cca50..70af85d 100644
> --- a/gcc/testsuite/g++.dg/parse/error55.C
> +++ b/gcc/testsuite/g++.dg/parse/error55.C
> @@ -3,5 +3,5 @@
> class A { };
> typedef A B;
> void foo (B &a) {
> - a.x(); // { dg-error "'B {aka class A}' has no member named 'x'"
> }
> + a.x(); // { dg-error "'B' {aka 'class A'} has no member named
> 'x'" }
> }
> diff --git a/gcc/testsuite/g++.dg/warn/pr12242.C
> b/gcc/testsuite/g++.dg/warn/pr12242.C
> index e1cd780..2cb344b 100644
> --- a/gcc/testsuite/g++.dg/warn/pr12242.C
> +++ b/gcc/testsuite/g++.dg/warn/pr12242.C
> @@ -10,14 +10,14 @@ void example ()
> X x;
> Y y;
>
> - x = 10; // { dg-warning "invalid conversion from .int. to .X
> {enum}." "invalid" }
> - // { dg-warning "unspecified" "unspecified" { target *-*
> -* } .-1 }
> - x = 1; // { dg-warning "invalid conversion from .int. to .X
> {enum}." }
> - x = C; // { dg-error "cannot convert .Y {enum}. to .X {enum}. in
> assignment" }
> - x = D; // { dg-error "cannot convert .Y {enum}. to .X {enum}. in
> assignment" }
> - y = A; // { dg-error "cannot convert .X {enum}. to .Y {enum}. in
> assignment" }
> - x = y; // { dg-error "cannot convert .Y {enum}. to .X {enum}. in
> assignment" }
> - x = i; // { dg-warning "invalid conversion from .int. to .X
> {enum}." }
> + x = 10; // { dg-warning "invalid conversion from 'int' to 'X'
> {enum}" "invalid" }
> + // { dg-warning "unspecified" "unspecified" { target *-*
> -* } '-1 }
> + x = 1; // { dg-warning "invalid conversion from 'int' to 'X'
> {enum}" }
> + x = C; // { dg-error "cannot convert 'Y' {enum} to 'X' {enum} in
> assignment" }
> + x = D; // { dg-error "cannot convert 'Y' {enum} to 'X' {enum} in
> assignment" }
> + y = A; // { dg-error "cannot convert 'X' {enum} to 'Y' {enum} in
> assignment" }
> + x = y; // { dg-error "cannot convert 'Y' {enum} to 'X' {enum} in
> assignment" }
> + x = i; // { dg-warning "invalid conversion from 'int' to 'X'
> {enum}" }
> }
>
> void foo ()
> diff --git a/gcc/testsuite/g++.old-deja/g++.mike/enum1.C
> b/gcc/testsuite/g++.old-deja/g++.mike/enum1.C
> index 2f7a6dd..82abb602e 100644
> --- a/gcc/testsuite/g++.old-deja/g++.mike/enum1.C
> +++ b/gcc/testsuite/g++.old-deja/g++.mike/enum1.C
> @@ -8,4 +8,4 @@ struct Type {
> void setBTK();
> };
>
> -void Type::setBTK() { kind = DTK; } // { dg-warning "conversion from
> '\[^\n\r]+' to .unsigned char:1. changes value from" }
> +void Type::setBTK() { kind = DTK; } // { dg-warning "conversion from
> '\[^\n\r]+' {enum} to .unsigned char:1. changes value from" }
> diff --git a/gcc/testsuite/gcc.dg/diag-aka-1.c
> b/gcc/testsuite/gcc.dg/diag-aka-1.c
> index 87bc757..fde4ca7 100644
> --- a/gcc/testsuite/gcc.dg/diag-aka-1.c
> +++ b/gcc/testsuite/gcc.dg/diag-aka-1.c
> @@ -10,7 +10,7 @@ typedef int IA[];
> typedef IA *IAP;
> extern IAP arr[];
>
> -void fn1 (B *); /* { dg-message "expected .B \\* {aka struct A \\*}.
> but argument is of type .struct B \\*." } */
> +void fn1 (B *); /* { dg-message "expected 'B \\*' {aka 'struct A
> \\*'} but argument is of type 'struct B \\*'" } */
> void fn2 (TFC *);
>
> void
> @@ -24,6 +24,6 @@ bar (B *b, int *i)
> int
> foo (void *a)
> {
> - T *t = a; /* { dg-warning "request for implicit conversion from
> .void \\*. to .T \\* {aka struct T \\*}. not" } */
> + T *t = a; /* { dg-warning "request for implicit conversion from
> 'void \\*' to 'T \\*' {aka 'struct T \\*'} not" } */
> return t->i;
> }
> diff --git a/gcc/testsuite/gcc.dg/diag-aka-2.c
> b/gcc/testsuite/gcc.dg/diag-aka-2.c
> new file mode 100644
> index 0000000..a4b2242
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/diag-aka-2.c
> @@ -0,0 +1,12 @@
> +/* Verify that the "aka" descriptions for typedefs are correctly
> + quoted (PR 62170). */
> +
> +typedef struct s1 t1;
> +
> +int foo(t1 *); /* { dg-message "expected 't1 \\*' {aka 'struct s1
> \\*'} but argument is of type 't2 \\*' {aka 'struct s2 \\*'}" } */
> +
> +int bar() {
> + typedef struct s2 {int i;} t2;
> + t2 pos;
> + return foo(&pos); /* { dg-error "incompatible pointer type" } */
> +}
> diff --git a/gcc/testsuite/gcc.dg/pr13804-1.c
> b/gcc/testsuite/gcc.dg/pr13804-1.c
> index 65b238a..5fc17f4 100644
> --- a/gcc/testsuite/gcc.dg/pr13804-1.c
> +++ b/gcc/testsuite/gcc.dg/pr13804-1.c
> @@ -20,9 +20,9 @@ void
> f (void)
> {
> x0.c; /* { dg-error "'struct s0' has no member named 'c'" } */
> - x1.c; /* { dg-error "'S0 {aka struct s0}' has no member named 'c'"
> } */
> + x1.c; /* { dg-error "'S0' {aka 'struct s0'} has no member named
> 'c'" } */
> x2.c; /* { dg-error "'union u0' has no member named 'c'" } */
> - x3.c; /* { dg-error "'U0 {aka union u0}' has no member named 'c'"
> } */
> + x3.c; /* { dg-error "'U0' {aka 'union u0'} has no member named
> 'c'" } */
> x4->c; /* { dg-error "'struct s0' has no member named 'c'" } */
> x5->c; /* { dg-error "'union u0' has no member named 'c'" } */
> }
> diff --git a/gcc/testsuite/gcc.dg/pr56980.c
> b/gcc/testsuite/gcc.dg/pr56980.c
> index 27405ef..5303c61 100644
> --- a/gcc/testsuite/gcc.dg/pr56980.c
> +++ b/gcc/testsuite/gcc.dg/pr56980.c
> @@ -5,12 +5,12 @@ typedef struct A { int i; } B;
> typedef union U { int i; } V;
> typedef enum E { G } F;
>
> -void foo_s (struct A); /* { dg-message "expected .struct A. but
> argument is of type .B \\* {aka struct A \\*}." } */
> -void foo_u (union U); /* { dg-message "expected .union U. but
> argument is of type .V \\* {aka union U \\*}." } */
> -void foo_e (enum E); /* { dg-message "expected .enum E. but argument
> is of type .F \\* {aka enum E \\*}." } */
> -void foo_sp (B *); /* { dg-message "expected .B \\* {aka struct A
> \\*}. but argument is of type .struct B \\*." } */
> -void foo_up (V *); /* { dg-message "expected .V \\* {aka union U
> \\*}. but argument is of type .union V \\*." } */
> -void foo_ep (F *); /* { dg-message "expected .F \\* {aka enum E
> \\*}. but argument is of type .enum F \\*." } */
> +void foo_s (struct A); /* { dg-message "expected .struct A. but
> argument is of type 'B \\*' {aka 'struct A \\*'}" } */
> +void foo_u (union U); /* { dg-message "expected .union U. but
> argument is of type 'V \\*' {aka 'union U \\*'}" } */
> +void foo_e (enum E); /* { dg-message "expected .enum E. but argument
> is of type 'F \\*' {aka 'enum E \\*'}" } */
> +void foo_sp (B *); /* { dg-message "expected 'B \\*' {aka 'struct A
> \\*'} but argument is of type .struct B \\*." } */
> +void foo_up (V *); /* { dg-message "expected 'V \\*' {aka 'union U
> \\*'} but argument is of type .union V \\*." } */
> +void foo_ep (F *); /* { dg-message "expected 'F \\*' {aka 'enum E
> \\*'} but argument is of type .enum F \\*." } */
>
> void
> bar (B *b, V *v, F *f)
> diff --git a/gcc/testsuite/gcc.dg/pr65050.c
> b/gcc/testsuite/gcc.dg/pr65050.c
> index 0822a99..e29559d 100644
> --- a/gcc/testsuite/gcc.dg/pr65050.c
> +++ b/gcc/testsuite/gcc.dg/pr65050.c
> @@ -2,9 +2,9 @@
> /* { dg-do compile } */
>
> typedef int A[];
> -struct S { int i; A a[5]; } s; /* { dg-error "array type has
> incomplete element type .A {aka int\\\[\\\]}." } */
> +struct S { int i; A a[5]; } s; /* { dg-error "array type has
> incomplete element type 'A' {aka 'int\\\[\\\]'}" } */
> extern void foo (int p[2][]); /* { dg-error "array type has
> incomplete element type .int\\\[\\\]." } */
> -extern void bar (A p[2]); /* { dg-error "array type has incomplete
> element type .A {aka int\\\[\\\]}." } */
> +extern void bar (A p[2]); /* { dg-error "array type has incomplete
> element type 'A' {aka 'int\\\[\\\]'}" } */
>
> void
> foo (int p[2][]) /* { dg-error "array type has incomplete element
> type .int\\\[\\\]." } */
> @@ -12,7 +12,7 @@ foo (int p[2][]) /* { dg-error "array type has
> incomplete element type .int\\\[\
> }
>
> void
> -bar (A p[2]) /* { dg-error "array type has incomplete element type
> .A {aka int\\\[\\\]}." } */
> +bar (A p[2]) /* { dg-error "array type has incomplete element type
> 'A' {aka 'int\\\[\\\]'}" } */
> {
> }
>
> @@ -20,4 +20,4 @@ struct T;
> struct T t[5]; /* { dg-error "array type has incomplete element type
> .struct T." } */
> struct U u[] = { { "abc" } }; /* { dg-error "array type has
> incomplete element type .struct U." } */
> typedef struct T TT;
> -TT tt[5]; /* { dg-error "array type has incomplete element type .TT
> {aka struct T}." } */
> +TT tt[5]; /* { dg-error "array type has incomplete element type 'TT'
> {aka 'struct T'}" } */
> diff --git a/gcc/testsuite/gcc.dg/redecl-14.c
> b/gcc/testsuite/gcc.dg/redecl-14.c
> index 97003c1..1bf1d96 100644
> --- a/gcc/testsuite/gcc.dg/redecl-14.c
> +++ b/gcc/testsuite/gcc.dg/redecl-14.c
> @@ -18,5 +18,5 @@ f (void)
> }
> extern IAP a[];
> extern IAP a[5];
> - sizeof (*a[0]); /* { dg-error "invalid application of 'sizeof' to
> incomplete type 'IA {aka int\\\[\\\]}'" } */
> + sizeof (*a[0]); /* { dg-error "invalid application of 'sizeof' to
> incomplete type 'IA' {aka 'int\\\[\\\]'}" } */
> }
> diff --git a/gcc/testsuite/gcc.dg/utf16-4.c
> b/gcc/testsuite/gcc.dg/utf16-4.c
> index f9ebd61..f2d4388 100644
> --- a/gcc/testsuite/gcc.dg/utf16-4.c
> +++ b/gcc/testsuite/gcc.dg/utf16-4.c
> @@ -12,7 +12,7 @@ char16_t c2 = u'\U00064321'; /* { dg
> -warning "constant too long" } */
> char16_t c3 = 'a';
> char16_t c4 = U'a';
> char16_t c5 = U'\u2029';
> -char16_t c6 = U'\U00064321'; /* { dg-warning
> "conversion from .unsigned int. to .char16_t {aka short unsigned
> int}. changes value from .410401. to .17185." } */
> +char16_t c6 = U'\U00064321'; /* { dg-warning
> "conversion from .unsigned int. to 'char16_t' {aka 'short unsigned
> int'} changes value from .410401. to .17185." } */
> char16_t c7 = L'a';
> char16_t c8 = L'\u2029';
> char16_t c9 = L'\U00064321'; /* { dg-warning
> "conversion" "" { target { 4byte_wchar_t } } } */
> diff --git a/gcc/testsuite/gcc.target/i386/sse-vect-types.c
> b/gcc/testsuite/gcc.target/i386/sse-vect-types.c
> index 9cb6f3e..ac4ece4 100644
> --- a/gcc/testsuite/gcc.target/i386/sse-vect-types.c
> +++ b/gcc/testsuite/gcc.target/i386/sse-vect-types.c
> @@ -10,4 +10,4 @@ __m128d foo1(__m128d z, __m128d a, int N) {
> }
> return a;
> }
> -/* { dg-message "note: expected '\[^'\n\]*' but argument is of type
> '\[^'\n\]*'" "note: expected" { target *-*-* } 0 } */
> +/* { dg-message "note: expected '.*'.* but argument is of type '.*'"
> "note: expected" { target *-*-* } 0 } */
> diff --git a/gcc/testsuite/obj-c++.dg/invalid-type-1.mm
> b/gcc/testsuite/obj-c++.dg/invalid-type-1.mm
> index cb2138f..59c8666 100644
> --- a/gcc/testsuite/obj-c++.dg/invalid-type-1.mm
> +++ b/gcc/testsuite/obj-c++.dg/invalid-type-1.mm
> @@ -18,8 +18,8 @@ id <MyProtocol> object; /* This is fine. */
>
> AClass <MyProtocol> *object1; /* This is fine. */
>
> -Integer <MyProtocol> *object2; /* { dg-error ".Integer {aka int}. is
> not a template" } */
> +Integer <MyProtocol> *object2; /* { dg-error "'Integer' {aka 'int'}
> is not a template" } */
> /* { dg-error ".MyProtocol. was not declared in this scope" "" {
> target *-*-* } .-1 } */
>
> -Integer <NonExistingProtocol> *object3; /* { dg-error ".Integer {aka
> int}. is not a template" } */
> +Integer <NonExistingProtocol> *object3; /* { dg-error "'Integer'
> {aka 'int'} is not a template" } */
> /* { dg-error ".NonExistingProtocol. was not declared in this scope"
> "" { target *-*-* } .-1 } */
> diff --git a/gcc/tree-diagnostic.c b/gcc/tree-diagnostic.c
> index 52b7e7f..5f3295f 100644
> --- a/gcc/tree-diagnostic.c
> +++ b/gcc/tree-diagnostic.c
> @@ -245,7 +245,7 @@ virt_loc_aware_diagnostic_finalizer
> (diagnostic_context *context,
> bool
> default_tree_printer (pretty_printer *pp, text_info *text, const
> char *spec,
> int precision, bool wide, bool set_locus, bool
> hash,
> - bool, const char **)
> + bool *, const char **)
> {
> tree t;
>
> diff --git a/gcc/tree-diagnostic.h b/gcc/tree-diagnostic.h
> index 85aa980..e38bb44 100644
> --- a/gcc/tree-diagnostic.h
> +++ b/gcc/tree-diagnostic.h
> @@ -55,6 +55,6 @@ void virt_loc_aware_diagnostic_finalizer
> (diagnostic_context *,
>
> void tree_diagnostics_defaults (diagnostic_context *context);
> bool default_tree_printer (pretty_printer *, text_info *, const char
> *,
> - int, bool, bool, bool, bool, const char
> **);
> + int, bool, bool, bool, bool *, const char
> **);
>
> #endif /* ! GCC_TREE_DIAGNOSTIC_H */