> On Tuesday, 4 May 2021 15:34:13 CEST David Malcolm wrote:
> > Does the patch interact correctly with the %H and %I codes that try to
> > show the differences between two template types?
While looking into this, I noticed that given
namespace std {
struct A {};
typedef A B;
}
const std::B would print as "'const B' {aka 'const std::A'}", i.e. without
printing the scope of the typedef. I traced it to cp/error.c (dump_type). In
the `if (TYPE_P (t) && typedef_variant_p (t))` branch, in the final else
branch only cv-qualifiers and identifier are printed:
pp_cxx_cv_qualifier_seq (pp, t);
pp_cxx_tree_identifier (pp, TYPE_IDENTIFIER (t));
I believe the following should go in between, correct?
pp_cxx_cv_qualifier_seq (pp, t);
if (! (flags & TFF_UNQUALIFIED_NAME))
dump_scope (pp, CP_DECL_CONTEXT (TYPE_NAME (t)), flags);
pp_cxx_tree_identifier (pp, TYPE_IDENTIFIER (t));
This is important for my diagnose_as patch because otherwise the output is:
'const string' {aka 'const std::string'}
which is confusing and unnecessarily verbose. Patch below.
From: Matthias Kretz <[email protected]>
dump_type on 'const std::string' should not print 'const string' unless
TFF_UNQUALIFIED_NAME is requested.
gcc/cp/ChangeLog:
* error.c: Call dump_scope when printing a typedef.
---
gcc/cp/error.c | 2 ++
1 file changed, 2 insertions(+)
--
──────────────────────────────────────────────────────────────────────────
Dr. Matthias Kretz https://mattkretz.github.io
GSI Helmholtz Centre for Heavy Ion Research https://gsi.de
std::experimental::simd https://github.com/VcDevel/std-simd
──────────────────────────────────────────────────────────────────────────
diff --git a/gcc/cp/error.c b/gcc/cp/error.c
index 10b547afaa7..edeaad44bcd 100644
--- a/gcc/cp/error.c
+++ b/gcc/cp/error.c
@@ -511,6 +511,8 @@ dump_type (cxx_pretty_printer *pp, tree t, int flags)
else
{
pp_cxx_cv_qualifier_seq (pp, t);
+ if (! (flags & TFF_UNQUALIFIED_NAME))
+ dump_scope (pp, CP_DECL_CONTEXT (TYPE_NAME (t)), flags);
pp_cxx_tree_identifier (pp, TYPE_IDENTIFIER (t));
return;
}