From 46e2747c7175301068408521e2d132feb6e2ddb5 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 6 Sep 2000 09:21:35 +0000 Subject: [PATCH] error.c (dump_typename): New function, broken out of ... * error.c (dump_typename): New function, broken out of ... (dump_type): ... here. Use it. * typeck.c (same_type_p): Use cp_tree_equal for TYPENAME_TYPE. From-SVN: r36193 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/error.c | 23 ++++++++++++++++++++--- gcc/cp/typeck.c | 5 +++-- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e5c11ef..ecd845b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2000-09-06 Nathan Sidwell + * error.c (dump_typename): New function, broken out of ... + (dump_type): ... here. Use it. + * typeck.c (same_type_p): Use cp_tree_equal for TYPENAME_TYPE. + +2000-09-06 Nathan Sidwell + * init.c (build_offset_ref): Deal with namespace scoped TEMPLATE_ID_EXPRs. diff --git a/gcc/cp/error.c b/gcc/cp/error.c index c3bb284..6d821a2 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -87,6 +87,7 @@ static const char *parm_to_string PARAMS ((int, int)); static const char *type_to_string PARAMS ((tree, int)); static void dump_type PARAMS ((tree, enum tree_string_flags)); +static void dump_typename PARAMS ((tree, enum tree_string_flags)); static void dump_simple_decl PARAMS ((tree, tree, enum tree_string_flags)); static void dump_decl PARAMS ((tree, enum tree_string_flags)); static void dump_template_decl PARAMS ((tree, enum tree_string_flags)); @@ -503,9 +504,7 @@ dump_type (t, flags) } case TYPENAME_TYPE: OB_PUTS ("typename "); - dump_type (TYPE_CONTEXT (t), flags & ~TS_AGGR_TAGS); - OB_PUTS ("::"); - dump_decl (TYPENAME_TYPE_FULLNAME (t), flags); + dump_typename (t, flags); break; case TYPEOF_TYPE: @@ -525,6 +524,24 @@ dump_type (t, flags) } } +/* Dump a TYPENAME_TYPE. We need to notice when the context is itself + a TYPENAME_TYPE. */ + +static void +dump_typename (t, flags) + tree t; + enum tree_string_flags flags; +{ + tree ctx = TYPE_CONTEXT (t); + + if (TREE_CODE (ctx) == TYPENAME_TYPE) + dump_typename (ctx, flags); + else + dump_type (ctx, flags & ~TS_AGGR_TAGS); + OB_PUTS ("::"); + dump_decl (TYPENAME_TYPE_FULLNAME (t), flags); +} + /* Return the name of the supplied aggregate, or enumeral type. */ static const char * diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 823aaec..bff019d 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -1096,8 +1096,9 @@ comptypes (t1, t2, strict) && TEMPLATE_TYPE_LEVEL (t1) == TEMPLATE_TYPE_LEVEL (t2); case TYPENAME_TYPE: - if (TYPE_IDENTIFIER (t1) != TYPE_IDENTIFIER (t2)) - return 0; + if (cp_tree_equal (TYPENAME_TYPE_FULLNAME (t1), + TYPENAME_TYPE_FULLNAME (t2)) < 1) + return 0; return same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2)); case COMPLEX_TYPE: -- 2.7.4