Commit e59e8b5a by David Malcolm Committed by David Malcolm

Fix location of typeid() (PR c++/80014)

gcc/cp/ChangeLog:
	PR c++/80014
	* parser.c (cp_parser_postfix_expression): Construct a location
	for typeid expressions.

gcc/testsuite/ChangeLog:
	PR c++/80014
	* g++.dg/plugin/diagnostic-test-expressions-1.C (std::type_info):
	Add declaration.
	(test_typeid): New test function.

From-SVN: r249845
parent e855bdc0
2017-06-30 David Malcolm <dmalcolm@redhat.com>
PR c++/80014
* parser.c (cp_parser_postfix_expression): Construct a location
for typeid expressions.
2017-06-30 Nathan Sidwell <nathan@acm.org> 2017-06-30 Nathan Sidwell <nathan@acm.org>
* cp-tree.h (lookup_fnfields_1, class_method_index_for_fn): Don't * cp-tree.h (lookup_fnfields_1, class_method_index_for_fn): Don't
......
...@@ -6542,7 +6542,8 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, ...@@ -6542,7 +6542,8 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
/* Look for the `)' token. Otherwise, we can't be sure that /* Look for the `)' token. Otherwise, we can't be sure that
we're not looking at an expression: consider `typeid (int we're not looking at an expression: consider `typeid (int
(3))', for example. */ (3))', for example. */
cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN); cp_token *close_paren = cp_parser_require (parser, CPP_CLOSE_PAREN,
RT_CLOSE_PAREN);
/* If all went well, simply lookup the type-id. */ /* If all went well, simply lookup the type-id. */
if (cp_parser_parse_definitely (parser)) if (cp_parser_parse_definitely (parser))
postfix_expression = get_typeid (type, tf_warning_or_error); postfix_expression = get_typeid (type, tf_warning_or_error);
...@@ -6556,13 +6557,26 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, ...@@ -6556,13 +6557,26 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
/* Compute its typeid. */ /* Compute its typeid. */
postfix_expression = build_typeid (expression, tf_warning_or_error); postfix_expression = build_typeid (expression, tf_warning_or_error);
/* Look for the `)' token. */ /* Look for the `)' token. */
cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN); close_paren
= cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
} }
/* Restore the saved message. */ /* Restore the saved message. */
parser->type_definition_forbidden_message = saved_message; parser->type_definition_forbidden_message = saved_message;
/* `typeid' may not appear in an integral constant expression. */ /* `typeid' may not appear in an integral constant expression. */
if (cp_parser_non_integral_constant_expression (parser, NIC_TYPEID)) if (cp_parser_non_integral_constant_expression (parser, NIC_TYPEID))
postfix_expression = error_mark_node; postfix_expression = error_mark_node;
/* Construct a location e.g. :
typeid (expr)
^~~~~~~~~~~~~
ranging from the start of the "typeid" token to the final closing
paren, with the caret at the start. */
if (close_paren)
{
location_t typeid_loc
= make_location (start_loc, start_loc, close_paren->location);
postfix_expression.set_location (typeid_loc);
}
} }
break; break;
2017-06-30 David Malcolm <dmalcolm@redhat.com>
PR c++/80014
* g++.dg/plugin/diagnostic-test-expressions-1.C (std::type_info):
Add declaration.
(test_typeid): New test function.
2017-06-30 Jakub Jelinek <jakub@redhat.com> 2017-06-30 Jakub Jelinek <jakub@redhat.com>
PR target/81225 PR target/81225
......
...@@ -848,3 +848,35 @@ tests::test_method_calls () ...@@ -848,3 +848,35 @@ tests::test_method_calls ()
~~~~~~~~~~~~~~~~~~^~ ~~~~~~~~~~~~~~~~~~^~
{ dg-end-multiline-output "" } */ { dg-end-multiline-output "" } */
} }
namespace std
{
class type_info { public: int foo; };
}
void test_typeid (int i)
{
__emit_expression_range (0, &typeid(i)); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, &typeid(i));
^~~~~~~~~~
{ dg-end-multiline-output "" } */
__emit_expression_range (0, &typeid(int)); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, &typeid(int));
^~~~~~~~~~~~
{ dg-end-multiline-output "" } */
__emit_expression_range (0, &typeid(i * 2)); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, &typeid(i * 2));
^~~~~~~~~~~~~~
{ dg-end-multiline-output "" } */
__emit_expression_range (0, typeid(int).foo); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, typeid(int).foo);
~~~~~~~~~~~~^~~
{ dg-end-multiline-output "" } */
}
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