diff options
author | Nathaniel Shead <nathanieloshead@gmail.com> | 2024-03-04 22:59:56 +1100 |
---|---|---|
committer | Nathaniel Shead <nathanieloshead@gmail.com> | 2024-08-07 11:49:46 +1000 |
commit | b7f719612515a86d1d2a36e24b02ade3f0904e10 (patch) | |
tree | 59fe8cb02501cde6f0e36b0609f07cb48422700f /gcc/cp/parser.cc | |
parent | 8fac69a2dbff98ebe1feb87faba0d9b81a173c40 (diff) | |
download | gcc-b7f719612515a86d1d2a36e24b02ade3f0904e10.zip gcc-b7f719612515a86d1d2a36e24b02ade3f0904e10.tar.gz gcc-b7f719612515a86d1d2a36e24b02ade3f0904e10.tar.bz2 |
c++: Improve fixits for incorrect explicit instantiations
When forgetting the '<>' on an explicit specialisation, the suggested
fixit hint suggests to add 'template <>', but naively applying will
cause nonsense results like 'template template <> struct S<int> {};'.
Instead check if we're currently parsing an explicit instantiation, and
if so inform about the issue (an instantiation cannot have a class body)
and suggest a fixit of simply '<>' to create a specialisation instead.
gcc/cp/ChangeLog:
* parser.cc (cp_parser_class_head): Clarify error message for
explicit instantiations.
gcc/testsuite/ChangeLog:
* g++.dg/template/explicit-instantiation9.C: New test.
Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
Diffstat (limited to 'gcc/cp/parser.cc')
-rw-r--r-- | gcc/cp/parser.cc | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index f625b0a..82f3903 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -27721,11 +27721,20 @@ cp_parser_class_head (cp_parser* parser, class_head_start_location, get_finish (type_start_token->location)); rich_location richloc (line_table, reported_loc); - richloc.add_fixit_insert_before (class_head_start_location, - "template <> "); - error_at (&richloc, - "an explicit specialization must be preceded by" - " %<template <>%>"); + if (processing_explicit_instantiation) + { + richloc.add_fixit_insert_before ("<> "); + error_at (&richloc, + "an explicit instantiation cannot have a definition;" + " use %<template <>%> to declare a specialization"); + } + else + { + richloc.add_fixit_insert_before ("template <> "); + error_at (&richloc, + "an explicit specialization must be preceded by" + " %<template <>%>"); + } invalid_explicit_specialization_p = true; /* Take the same action that would have been taken by cp_parser_explicit_specialization. */ |