Commit 4047b164 by Kriang Lerdsuwanakij Committed by Kriang Lerdsuwanakij

re PR c++/157 (Duplicate error message for invalid elaborated type specifier)

	PR c++/157
	* parser.c (cp_parser_direct_declarator): Clear
	parser->num_template_parameter_lists when parsing function
	parameters.
	(cp_parser_constructor_declarator_p): Likewise.

	* g++.dg/parse/crash12.C: New test.

From-SVN: r71605
parent 2f54a73f
2003-09-20 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/157
* parser.c (cp_parser_direct_declarator): Clear
parser->num_template_parameter_lists when parsing function
parameters.
(cp_parser_constructor_declarator_p): Likewise.
2003-09-19 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/495
......
......@@ -9720,6 +9720,7 @@ cp_parser_direct_declarator (cp_parser* parser,
if (!first || dcl_kind != CP_PARSER_DECLARATOR_NAMED)
{
tree params;
unsigned saved_num_template_parameter_lists;
cp_parser_parse_tentatively (parser);
......@@ -9733,9 +9734,18 @@ cp_parser_direct_declarator (cp_parser* parser,
parser->in_declarator_p = true;
}
/* Inside the function parameter list, surrounding
template-parameter-lists do not apply. */
saved_num_template_parameter_lists
= parser->num_template_parameter_lists;
parser->num_template_parameter_lists = 0;
/* Parse the parameter-declaration-clause. */
params = cp_parser_parameter_declaration_clause (parser);
parser->num_template_parameter_lists
= saved_num_template_parameter_lists;
/* If all went well, parse the cv-qualifier-seq and the
exception-specification. */
if (cp_parser_parse_definitely (parser))
......@@ -13436,6 +13446,7 @@ cp_parser_constructor_declarator_p (cp_parser *parser, bool friend_p)
&& !cp_parser_storage_class_specifier_opt (parser))
{
tree type;
unsigned saved_num_template_parameter_lists;
/* Names appearing in the type-specifier should be looked up
in the scope of the class. */
......@@ -13456,6 +13467,13 @@ cp_parser_constructor_declarator_p (cp_parser *parser, bool friend_p)
}
push_scope (type);
}
/* Inside the constructor parameter list, surrounding
template-parameter-lists do not apply. */
saved_num_template_parameter_lists
= parser->num_template_parameter_lists;
parser->num_template_parameter_lists = 0;
/* Look for the type-specifier. */
cp_parser_type_specifier (parser,
CP_PARSER_FLAGS_NONE,
......@@ -13463,6 +13481,10 @@ cp_parser_constructor_declarator_p (cp_parser *parser, bool friend_p)
/*is_declarator=*/true,
/*declares_class_or_enum=*/NULL,
/*is_cv_qualifier=*/NULL);
parser->num_template_parameter_lists
= saved_num_template_parameter_lists;
/* Leave the scope of the class. */
if (type)
pop_scope (type);
......
2003-09-20 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/157
* g++.dg/parse/crash12.C: New test.
2003-09-19 Janis Johnson <janis187@us.ibm.com>
* gcc.dg/compat/mixed-struct-check.h: New.
......
// { dg-do compile }
// Origin: Martin von Loewis <martin@v.loewis.de>
// PR c++/157: Incorrect type/template decision in function parameter.
template <class _Tp> class auto_ptr {};
template <class _Tp>
class counted_ptr
{
public:
counted_ptr(auto_ptr<_Tp>& __a); // { dg-error "candidate" }
auto_ptr<_Tp> auto_ptr();
};
template <class _Tp>
inline counted_ptr<_Tp>::counted_ptr(class auto_ptr& __a) // { dg-error "required" }
{ // { dg-error "no type|not match|template" }
}
template <class _Tp>
inline class auto_ptr<_Tp> counted_ptr<_Tp>::auto_ptr()
{
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment