aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/parser.cc
diff options
context:
space:
mode:
authorNathaniel Shead <nathanieloshead@gmail.com>2024-03-04 22:59:56 +1100
committerNathaniel Shead <nathanieloshead@gmail.com>2024-08-07 11:49:46 +1000
commitb7f719612515a86d1d2a36e24b02ade3f0904e10 (patch)
tree59fe8cb02501cde6f0e36b0609f07cb48422700f /gcc/cp/parser.cc
parent8fac69a2dbff98ebe1feb87faba0d9b81a173c40 (diff)
downloadgcc-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.cc19
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. */