PR c++/62314: add fixit hint for missing "template <> " in explicit specialization
gcc/cp/ChangeLog: PR c++/62314 * parser.c (cp_parser_class_head): Capture the start location; use it to emit a fix-it insertion hint when complaining about missing "template <> " in explicit specializations. gcc/testsuite/ChangeLog: PR c++/62314 * g++.dg/pr62314.C: New test case. From-SVN: r235777
This commit is contained in:
parent
4877b5a4ac
commit
474e0129ac
@ -1,3 +1,10 @@
|
||||
2016-05-02 David Malcolm <dmalcolm@redhat.com>
|
||||
|
||||
PR c++/62314
|
||||
* parser.c (cp_parser_class_head): Capture the start location;
|
||||
use it to emit a fix-it insertion hint when complaining
|
||||
about missing "template <> " in explicit specializations.
|
||||
|
||||
2016-05-02 Richard Sandiford <richard.sandiford@arm.com>
|
||||
|
||||
* init.c (build_new_1): Use shift operators instead of wi:: shifts.
|
||||
|
@ -21656,6 +21656,8 @@ cp_parser_class_head (cp_parser* parser,
|
||||
if (class_key == none_type)
|
||||
return error_mark_node;
|
||||
|
||||
location_t class_head_start_location = input_location;
|
||||
|
||||
/* Parse the attributes. */
|
||||
attributes = cp_parser_attributes_opt (parser);
|
||||
|
||||
@ -21872,7 +21874,19 @@ cp_parser_class_head (cp_parser* parser,
|
||||
&& parser->num_template_parameter_lists == 0
|
||||
&& template_id_p)
|
||||
{
|
||||
error_at (type_start_token->location,
|
||||
/* Build a location of this form:
|
||||
struct typename <ARGS>
|
||||
^~~~~~~~~~~~~~~~~~~~~~
|
||||
with caret==start at the start token, and
|
||||
finishing at the end of the type. */
|
||||
location_t reported_loc
|
||||
= make_location (class_head_start_location,
|
||||
class_head_start_location,
|
||||
get_finish (type_start_token->location));
|
||||
rich_location richloc (line_table, reported_loc);
|
||||
richloc.add_fixit_insert (class_head_start_location, "template <> ");
|
||||
error_at_rich_loc
|
||||
(&richloc,
|
||||
"an explicit specialization must be preceded by %<template <>%>");
|
||||
invalid_explicit_specialization_p = true;
|
||||
/* Take the same action that would have been taken by
|
||||
|
@ -1,3 +1,8 @@
|
||||
2016-05-02 David Malcolm <dmalcolm@redhat.com>
|
||||
|
||||
PR c++/62314
|
||||
* g++.dg/pr62314.C: New test case.
|
||||
|
||||
2016-05-02 Jan Hubicka <hubicka@ucw.cz>
|
||||
|
||||
* gcc.dg/ipa/inline-8.c: New testcase.
|
||||
|
17
gcc/testsuite/g++.dg/pr62314.C
Normal file
17
gcc/testsuite/g++.dg/pr62314.C
Normal file
@ -0,0 +1,17 @@
|
||||
// { dg-options "-fdiagnostics-show-caret" }
|
||||
|
||||
template <typename T>
|
||||
struct iterator_traits {};
|
||||
|
||||
struct file_iterator;
|
||||
|
||||
struct iterator_traits<file_iterator> { // { dg-error "explicit specialization must be preceded by .template" }
|
||||
};
|
||||
|
||||
/* Verify that we emit a fixit hint for this case. */
|
||||
|
||||
/* { dg-begin-multiline-output "" }
|
||||
struct iterator_traits<file_iterator>
|
||||
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
template <>
|
||||
{ dg-end-multiline-output "" } */
|
Loading…
Reference in New Issue
Block a user