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:
parent
ca15e36529
commit
50ef2c18a9
@ -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.
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
@ -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.
|
||||||
|
11
gcc/testsuite/g++.dg/template/typename11.C
Normal file
11
gcc/testsuite/g++.dg/template/typename11.C
Normal 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" }
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user