Commit 0d3128d6 by Jason Merrill Committed by Jason Merrill

* error.c (type_to_string): Avoid redundant akas.

From-SVN: r175833
parent bc947511
2011-07-04 Jason Merrill <jason@redhat.com>
* error.c (type_to_string): Avoid redundant akas.
2011-07-01 Jonathan Wakely <jwakely.gcc@gmail.com> 2011-07-01 Jonathan Wakely <jwakely.gcc@gmail.com>
PR c++/49605 PR c++/49605
......
...@@ -2634,14 +2634,28 @@ type_to_string (tree typ, int verbose) ...@@ -2634,14 +2634,28 @@ type_to_string (tree typ, int verbose)
reinit_cxx_pp (); reinit_cxx_pp ();
dump_type (typ, flags); dump_type (typ, flags);
/* 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
it in that case, we play ugly obstack games. */
if (typ && TYPE_P (typ) && typ != TYPE_CANONICAL (typ) if (typ && TYPE_P (typ) && typ != TYPE_CANONICAL (typ)
&& !uses_template_parms (typ)) && !uses_template_parms (typ))
{ {
int aka_start; char *p;
struct obstack *ob = pp_base (cxx_pp)->buffer->obstack;
/* Remember the end of the initial dump. */
int len = obstack_object_size (ob);
tree aka = strip_typedefs (typ); tree aka = strip_typedefs (typ);
pp_string (cxx_pp, " {aka"); pp_string (cxx_pp, " {aka");
pp_cxx_whitespace (cxx_pp); pp_cxx_whitespace (cxx_pp);
/* And remember the start of the aka dump. */
aka_start = obstack_object_size (ob);
dump_type (aka, flags); dump_type (aka, flags);
pp_character (cxx_pp, '}'); pp_character (cxx_pp, '}');
p = (char*)obstack_base (ob);
/* If they are identical, cut off the aka with a NUL. */
if (memcmp (p, p+aka_start, len) == 0)
p[len] = '\0';
} }
return pp_formatted_text (cxx_pp); return pp_formatted_text (cxx_pp);
} }
......
2011-07-04 Jason Merrill <jason@redhat.com>
* g++.dg/diagnostic/aka1.C: New.
2011-07-04 Jakub Jelinek <jakub@redhat.com> 2011-07-04 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/49619 PR rtl-optimization/49619
......
// Basic test for typedef stripping in diagnostics.
struct A {
void f();
};
void A::f() {
// We don't want an aka for the injected-class-name.
A a = 0; // { dg-error "type .A. requested" }
}
typedef A B;
// We do want an aka for a real typedef.
B b = 0; // { dg-error "B .aka A." }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment