aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2021-12-15 17:41:53 -0500
committerMarek Polacek <polacek@redhat.com>2021-12-16 17:38:02 -0500
commit06041b2c67a5d4d0941c53990f0438a309703ed0 (patch)
treedfcf3fc8fd5c682fe5f5c9f5627bd6766dbcb665 /gcc/cp
parent93faac7e32e4f9503c559f2a3e5a4732f5e9ea09 (diff)
downloadgcc-06041b2c67a5d4d0941c53990f0438a309703ed0.zip
gcc-06041b2c67a5d4d0941c53990f0438a309703ed0.tar.gz
gcc-06041b2c67a5d4d0941c53990f0438a309703ed0.tar.bz2
c++: delayed noexcept in member function template [PR99980]
Some time ago I noticed that we don't properly delay parsing of noexcept for member function templates. This patch fixes that. It didn't work because even though we set CP_PARSER_FLAGS_DELAY_NOEXCEPT in cp_parser_member_declaration, member template declarations take a different path: we call cp_parser_template_declaration and return prior to setting the flag. PR c++/99980 gcc/cp/ChangeLog: * parser.c (cp_parser_single_declaration): Maybe pass CP_PARSER_FLAGS_DELAY_NOEXCEPT down to cp_parser_init_declarator. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/noexcept71.C: New test.
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/parser.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 9cf7435..44eed7e 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -31673,8 +31673,13 @@ cp_parser_single_declaration (cp_parser* parser,
&& (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)
|| decl_specifiers.type != error_mark_node))
{
+ int flags = CP_PARSER_FLAGS_TYPENAME_OPTIONAL;
+ /* We don't delay parsing for friends, though CWG 2510 may change
+ that. */
+ if (member_p && !(friend_p && *friend_p))
+ flags |= CP_PARSER_FLAGS_DELAY_NOEXCEPT;
decl = cp_parser_init_declarator (parser,
- CP_PARSER_FLAGS_TYPENAME_OPTIONAL,
+ flags,
&decl_specifiers,
checks,
/*function_definition_allowed_p=*/true,