aboutsummaryrefslogtreecommitdiff
path: root/gcc
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
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')
-rw-r--r--gcc/cp/parser.c7
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/noexcept71.C31
2 files changed, 37 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,
diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept71.C b/gcc/testsuite/g++.dg/cpp0x/noexcept71.C
new file mode 100644
index 0000000..361d6ad
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/noexcept71.C
@@ -0,0 +1,31 @@
+// PR c++/99980
+// { dg-do compile { target c++11 } }
+
+#define SA(X) static_assert(X, #X)
+
+struct S {
+ template<typename T>
+ void f(T) noexcept(B);
+
+ struct N {
+ template<typename T>
+ void f2(T) noexcept(B);
+ };
+
+ static constexpr bool B = true;
+};
+
+S s;
+SA(noexcept(s.f(10)));
+S::N n;
+SA(noexcept(n.f2(10)));
+
+struct Bad {
+ template<typename T>
+ using U = void() noexcept(B); // { dg-error "not declared" }
+
+ template<typename T>
+ friend void friendo() noexcept(B); // { dg-error "not declared" }
+
+ static constexpr bool B = true;
+};