* error.c (type_to_string): Avoid redundant akas.
From-SVN: r175833
This commit is contained in:
parent
bc9475113f
commit
0d3128d6a4
4 changed files with 37 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
15
gcc/testsuite/g++.dg/diagnostic/aka1.C
Normal file
15
gcc/testsuite/g++.dg/diagnostic/aka1.C
Normal 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." }
|
Loading…
Add table
Reference in a new issue