re PR c++/28999 (ICE on invalid use of typename)

PR c++/28999
	* decl.c (make_typename_type): If the qualified name is not a
	type, issue an error.
	* parser.c (cp_parser_elaborated_type_specifier): Fix comment
	formatting.

From-SVN: r120663
This commit is contained in:
Mark Mitchell 2007-01-11 03:24:33 +00:00 committed by Mark Mitchell
parent ca15e36529
commit 50ef2c18a9
5 changed files with 33 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2007-01-10 Mark Mitchell <mark@codesourcery.com>
PR c++/28999
* decl.c (make_typename_type): If the qualified name is not a
type, issue an error.
* parser.c (cp_parser_elaborated_type_specifier): Fix comment
formatting.
2007-01-08 Geoffrey Keating <geoffk@apple.com> 2007-01-08 Geoffrey Keating <geoffk@apple.com>
* rtti.c: Include target.h. * rtti.c: Include target.h.

View File

@ -2820,6 +2820,11 @@ make_typename_type (tree context, tree name, enum tag_types tag_type,
name = TREE_OPERAND (name, 0); name = TREE_OPERAND (name, 0);
if (TREE_CODE (name) == TEMPLATE_DECL) if (TREE_CODE (name) == TEMPLATE_DECL)
name = TREE_OPERAND (fullname, 0) = DECL_NAME (name); name = TREE_OPERAND (fullname, 0) = DECL_NAME (name);
else if (TREE_CODE (name) == OVERLOAD)
{
error ("%qD is not a type", name);
return error_mark_node;
}
} }
if (TREE_CODE (name) == TEMPLATE_DECL) if (TREE_CODE (name) == TEMPLATE_DECL)
{ {

View File

@ -6093,6 +6093,7 @@ cp_parser_constant_expression (cp_parser* parser,
parser->integral_constant_expression_p = true; parser->integral_constant_expression_p = true;
parser->allow_non_integral_constant_expression_p = allow_non_constant_p; parser->allow_non_integral_constant_expression_p = allow_non_constant_p;
parser->non_integral_constant_expression_p = false; parser->non_integral_constant_expression_p = false;
integral_constant_expr_p = true;
/* Although the grammar says "conditional-expression", we parse an /* Although the grammar says "conditional-expression", we parse an
"assignment-expression", which also permits "throw-expression" "assignment-expression", which also permits "throw-expression"
and the use of assignment operators. In the case that and the use of assignment operators. In the case that
@ -6104,6 +6105,7 @@ cp_parser_constant_expression (cp_parser* parser,
constant. */ constant. */
expression = cp_parser_assignment_expression (parser, /*cast_p=*/false); expression = cp_parser_assignment_expression (parser, /*cast_p=*/false);
/* Restore the old settings. */ /* Restore the old settings. */
integral_constant_expr_p = false;
parser->integral_constant_expression_p parser->integral_constant_expression_p
= saved_integral_constant_expression_p; = saved_integral_constant_expression_p;
parser->allow_non_integral_constant_expression_p parser->allow_non_integral_constant_expression_p
@ -10311,8 +10313,8 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
/*check_dependency_p=*/true, /*check_dependency_p=*/true,
/*type_p=*/true, /*type_p=*/true,
is_declaration); is_declaration);
/* For everything but enumeration types, consider a template-id. */ /* For everything but enumeration types, consider a template-id.
/* For an enumeration type, consider only a plain identifier. */ For an enumeration type, consider only a plain identifier. */
if (tag_type != enum_type) if (tag_type != enum_type)
{ {
bool template_p = false; bool template_p = false;

View File

@ -1,3 +1,8 @@
2007-01-10 Mark Mitchell <mark@codesourcery.com>
PR c++/28999
* g++.dg/template/typename11.C: New test.
2007-01-10 Robert Kennedy <jimbob@google.com> 2007-01-10 Robert Kennedy <jimbob@google.com>
* gcc.dg/fold-compare-2.c: New test case for fold_comparison. * gcc.dg/fold-compare-2.c: New test case for fold_comparison.

View File

@ -0,0 +1,11 @@
// PR c++/28999
namespace N
{
template<int> void foo();
}
template<int> struct A
{
friend void typename N::foo<0>(); // { dg-error "type|expected" }
};