From 206f4752d6998002e641e1d74a9ff3fa1bc3e894 Mon Sep 17 00:00:00 2001 From: Volker Reichelt Date: Tue, 6 Sep 2005 15:25:11 +0000 Subject: [PATCH] Backport: 2004-12-14 Mark Mitchell PR c++/18738 * decl.c (make_typename_type): Do not handle namespace-scoped names here. (tag_name): Handle typename_type. (check_elaborated_type_specifier): Handle typenames. * parser.c (cp_parser_diagnose_invalid_type_name): Do not call make_typename_type for namespace-scoped names here. (cp_parser_elaborated_type_specifier): Use cp_parser_diagnose_invalid_type_name. * g++.dg/template/typename8.C: New test. * g++.dg/parse/friend2.C: Tweak error message. From-SVN: r103951 --- gcc/cp/ChangeLog | 15 +++++++++++++++ gcc/cp/decl.c | 21 ++++++++------------- gcc/cp/parser.c | 5 +++-- gcc/testsuite/ChangeLog | 9 +++++++++ gcc/testsuite/g++.dg/parse/friend2.C | 2 +- 5 files changed, 36 insertions(+), 16 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bc4cfb3a82ac..dcbd0f7cd0af 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,18 @@ +2005-09-06 Volker Reichelt + + Backport: + + 2004-12-14 Mark Mitchell + PR c++/18738 + * decl.c (make_typename_type): Do not handle namespace-scoped + names here. + (tag_name): Handle typename_type. + (check_elaborated_type_specifier): Handle typenames. + * parser.c (cp_parser_diagnose_invalid_type_name): Do not call + make_typename_type for namespace-scoped names here. + (cp_parser_elaborated_type_specifier): Use + cp_parser_diagnose_invalid_type_name. + 2005-09-03 Volker Reichelt Backport: diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 7381ae321228..b9199da3169f 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -2647,16 +2647,7 @@ make_typename_type (tree context, tree name, tsubst_flags_t complain) return error_mark_node; } my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 20030802); - - if (TREE_CODE (context) == NAMESPACE_DECL) - { - /* We can get here from typename_sub0 in the explicit_template_type - expansion. Just fail. */ - if (complain & tf_error) - error ("no class template named `%#T' in `%#T'", - name, context); - return error_mark_node; - } + my_friendly_assert (TYPE_P (context), 20050905); if (!dependent_type_p (context) || currently_open_class (context)) @@ -9344,9 +9335,11 @@ tag_name (enum tag_types code) case class_type: return "class"; case union_type: - return "union "; + return "union"; case enum_type: return "enum"; + case typename_type: + return "typename"; default: abort (); } @@ -9384,7 +9377,8 @@ check_elaborated_type_specifier (enum tag_types tag_code, In other words, the only legitimate declaration to use in the elaborated type specifier is the implicit typedef created when the type is declared. */ - if (!DECL_IMPLICIT_TYPEDEF_P (decl)) + if (!DECL_IMPLICIT_TYPEDEF_P (decl) + && tag_code != typename_type) { error ("using typedef-name `%D' after `%s'", decl, tag_name (tag_code)); return IS_AGGR_TYPE (type) ? type : error_mark_node; @@ -9398,7 +9392,8 @@ check_elaborated_type_specifier (enum tag_types tag_code, } else if (TREE_CODE (type) != RECORD_TYPE && TREE_CODE (type) != UNION_TYPE - && tag_code != enum_type) + && tag_code != enum_type + && tag_code != typename_type) { error ("`%T' referred to as `%s'", type, tag_name (tag_code)); return error_mark_node; diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 1ae93effd64b..a9589bd0cb6e 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -9245,7 +9245,8 @@ cp_parser_elaborated_type_specifier (cp_parser* parser, } /* For a `typename', we needn't call xref_tag. */ - if (tag_type == typename_type) + if (tag_type == typename_type + && TREE_CODE (parser->scope) != NAMESPACE_DECL) return make_typename_type (parser->scope, identifier, /*complain=*/1); /* Look up a qualified name in the usual way. */ @@ -9289,7 +9290,7 @@ cp_parser_elaborated_type_specifier (cp_parser* parser, if (TREE_CODE (decl) != TYPE_DECL) { - error ("expected type-name"); + cp_parser_diagnose_invalid_type_name (parser); return error_mark_node; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 092acae2ff3c..6788ff16b925 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2005-09-06 Volker Reichelt + + Backport: + + 2004-12-14 Mark Mitchell + PR c++/18738 + * g++.dg/template/typename8.C: New test. + * g++.dg/parse/friend2.C: Tweak error message. + 2005-09-03 Volker Reichelt Backport: diff --git a/gcc/testsuite/g++.dg/parse/friend2.C b/gcc/testsuite/g++.dg/parse/friend2.C index 2e88845cceb0..1a2ad8bfad92 100644 --- a/gcc/testsuite/g++.dg/parse/friend2.C +++ b/gcc/testsuite/g++.dg/parse/friend2.C @@ -10,7 +10,7 @@ namespace NS { } template class X { - friend class NS::C; // { dg-error "expected|friend" } + friend class NS::C; // { dg-error "template|friend" } }; X c; -- 2.47.2