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

From-SVN: r175833
This commit is contained in:
Jason Merrill 2011-07-04 17:43:49 -04:00 committed by Jason Merrill
parent bc9475113f
commit 0d3128d6a4
4 changed files with 37 additions and 0 deletions

View file

@ -1,3 +1,7 @@
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>
PR c++/49605

View file

@ -2634,14 +2634,28 @@ type_to_string (tree typ, int verbose)
reinit_cxx_pp ();
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)
&& !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);
pp_string (cxx_pp, " {aka");
pp_cxx_whitespace (cxx_pp);
/* And remember the start of the aka dump. */
aka_start = obstack_object_size (ob);
dump_type (aka, flags);
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);
}

View file

@ -1,3 +1,7 @@
2011-07-04 Jason Merrill <jason@redhat.com>
* g++.dg/diagnostic/aka1.C: New.
2011-07-04 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/49619

View file

@ -0,0 +1,15 @@
// 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." }