public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] c++: delayed noexcept in member function template [PR99980]
@ 2021-12-16 16:00 Marek Polacek
  2021-12-16 21:15 ` Jason Merrill
  0 siblings, 1 reply; 2+ messages in thread
From: Marek Polacek @ 2021-12-16 16:00 UTC (permalink / raw)
  To: GCC Patches, Jason Merrill

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.

Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

	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.
---
 gcc/cp/parser.c                         |  7 +++++-
 gcc/testsuite/g++.dg/cpp0x/noexcept71.C | 31 +++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp0x/noexcept71.C

diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index c2564e51e41..c19e5f1359d 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 00000000000..361d6ad7b60
--- /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;
+};

base-commit: 41cc28405c74a5ec59c6725274aaedefa9ca5887
-- 
2.33.1


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] c++: delayed noexcept in member function template [PR99980]
  2021-12-16 16:00 [PATCH] c++: delayed noexcept in member function template [PR99980] Marek Polacek
@ 2021-12-16 21:15 ` Jason Merrill
  0 siblings, 0 replies; 2+ messages in thread
From: Jason Merrill @ 2021-12-16 21:15 UTC (permalink / raw)
  To: Marek Polacek, GCC Patches

On 12/16/21 11:00, Marek Polacek wrote:
> 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.
> 
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

OK.

> 	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.
> ---
>   gcc/cp/parser.c                         |  7 +++++-
>   gcc/testsuite/g++.dg/cpp0x/noexcept71.C | 31 +++++++++++++++++++++++++
>   2 files changed, 37 insertions(+), 1 deletion(-)
>   create mode 100644 gcc/testsuite/g++.dg/cpp0x/noexcept71.C
> 
> diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
> index c2564e51e41..c19e5f1359d 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 00000000000..361d6ad7b60
> --- /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;
> +};
> 
> base-commit: 41cc28405c74a5ec59c6725274aaedefa9ca5887


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-12-16 21:15 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-16 16:00 [PATCH] c++: delayed noexcept in member function template [PR99980] Marek Polacek
2021-12-16 21:15 ` Jason Merrill

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).