diff options
author | Jason Merrill <jason@redhat.com> | 2011-07-04 17:43:49 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-07-04 17:43:49 -0400 |
commit | 0d3128d6a4925e05f560f665adcbb90eb1427a81 (patch) | |
tree | 3b49dc82c1c8947b944df0cf40ffbc1e69e86982 | |
parent | bc9475113ff3731afafca87e6b973863ead02ee5 (diff) | |
download | gcc-0d3128d6a4925e05f560f665adcbb90eb1427a81.zip gcc-0d3128d6a4925e05f560f665adcbb90eb1427a81.tar.gz gcc-0d3128d6a4925e05f560f665adcbb90eb1427a81.tar.bz2 |
* error.c (type_to_string): Avoid redundant akas.
From-SVN: r175833
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/error.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/diagnostic/aka1.C | 15 |
4 files changed, 37 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6ffebf1..692a95b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 7c90ec4..664b918 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -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); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fc7336a..51f8de9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/g++.dg/diagnostic/aka1.C b/gcc/testsuite/g++.dg/diagnostic/aka1.C new file mode 100644 index 0000000..37f8df9 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/aka1.C @@ -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." } |