diff options
author | Anthony Sharp <anthonysharp15@gmail.com> | 2021-12-04 17:23:22 +0000 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2022-01-13 16:01:52 -0500 |
commit | b8ffa71e4271ae562c2d315b9b24c4979bbf8227 (patch) | |
tree | aebd29fe180c0bd88e3634cb2fb5315cf645eb60 /gcc/doc/invoke.texi | |
parent | 7a7d8c3f6167fd45658ddbfa32adcfd2acc98eb4 (diff) | |
download | gcc-b8ffa71e4271ae562c2d315b9b24c4979bbf8227.zip gcc-b8ffa71e4271ae562c2d315b9b24c4979bbf8227.tar.gz gcc-b8ffa71e4271ae562c2d315b9b24c4979bbf8227.tar.bz2 |
c++: warning for dependent template members [PR70417]
Add a helpful warning message for when the user forgets to
include the "template" keyword after ., -> or :: when
accessing a member in a dependent context, where the member is a
template.
PR c++/70417
gcc/c-family/ChangeLog:
* c.opt: Added -Wmissing-template-keyword.
gcc/cp/ChangeLog:
* parser.c (cp_parser_id_expression): Handle
-Wmissing-template-keyword.
(struct saved_token_sentinel): Add modes to control what happens
on destruction.
(cp_parser_statement): Adjust.
(cp_parser_skip_entire_template_parameter_list): New function that
skips an entire template parameter list.
(cp_parser_require_end_of_template_parameter_list): Rename old
cp_parser_skip_to_end_of_template_parameter_list.
(cp_parser_skip_to_end_of_template_parameter_list): Refactor to be
called from one of the above two functions.
(cp_parser_lambda_declarator_opt)
(cp_parser_explicit_template_declaration)
(cp_parser_enclosed_template_argument_list): Adjust.
gcc/ChangeLog:
* doc/invoke.texi: Documentation for Wmissing-template-keyword.
gcc/testsuite/ChangeLog:
* g++.dg/cpp0x/variadic-mem_fn2.C: Catch warning about missing
template keyword.
* g++.dg/template/dependent-name17.C: New test.
* g++.dg/template/dependent-name18.C: New test.
Co-authored-by: Jason Merrill <jason@redhat.com>
Diffstat (limited to 'gcc/doc/invoke.texi')
-rw-r--r-- | gcc/doc/invoke.texi | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 6b84228..5504971 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -8963,6 +8963,39 @@ type @samp{T}. This warning can be disabled with @option{-Wno-missing-requires}. +@item -Wno-missing-template-keyword +@opindex Wmissing-template-keyword +@opindex Wno-missing-template-keyword + +The member access tokens ., -> and :: must be followed by the @code{template} +keyword if the parent object is dependent and the member being named is a +template. + +@smallexample +template <class X> +void DoStuff (X x) +@{ + x.template DoSomeOtherStuff<X>(); // Good. + x.DoMoreStuff<X>(); // Warning, x is dependent. +@} +@end smallexample + +In rare cases it is possible to get false positives. To silence this, wrap +the expression in parentheses. For example, the following is treated as a +template, even where m and N are integers: + +@smallexample +void NotATemplate (my_class t) +@{ + int N = 5; + + bool test = t.m < N > (0); // Treated as a template. + test = (t.m < N) > (0); // Same meaning, but not treated as a template. +@} +@end smallexample + +This warning can be disabled with @option{-Wno-missing-template-keyword}. + @item -Wno-multichar @opindex Wno-multichar @opindex Wmultichar |