This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] [PR c++/84610,84642] recover from implicit template parms gracefully
OK.
On Wed, Mar 21, 2018 at 5:41 PM, Alexandre Oliva <aoliva@redhat.com> wrote:
> On Mar 20, 2018, Jason Merrill <jason@redhat.com> wrote:
>
>> On Tue, Mar 20, 2018 at 5:57 PM, Alexandre Oliva <aoliva@redhat.com> wrote:
>>> On Mar 20, 2018, Jason Merrill <jason@redhat.com> wrote:
>> Let's put this in cp-tree.h, with warning_sentinel.
>
>>> + (void)cleanup;
>
>> There are lots of RAII variables without this explicit cast to void,
>> and they don't seem to have been a problem; let's drop it here as
>> well.
>
> Done, here's what passed regstrap on i686- and x86_64-linux-gnu last
> night. Ok to install?
>
> Disable auto_is_implicit_function_template_parm_p while parsing attributes
>
> for gcc/cp/ChangeLog
>
> PR c++/84610
> PR c++/84642
> * cp-tree.h (temp_override): New template class, generalizing
> a cleanup that was only used...
> * parser.c (cp_parser_parameter_declaration_clause):
> ... here for auto_is_implicit_function_template_parm_p.
> (cp_parser_gnu_attributes_opt): Use it here as well.
> (cp_parser_std_attribute): Likewise.
> ---
> gcc/cp/cp-tree.h | 19 +++++++++++++++++++
> gcc/cp/parser.c | 18 ++++++++----------
> 2 files changed, 27 insertions(+), 10 deletions(-)
>
> diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
> index c07aaa5781ac..c8f4bc43fa3c 100644
> --- a/gcc/cp/cp-tree.h
> +++ b/gcc/cp/cp-tree.h
> @@ -1657,6 +1657,25 @@ struct warning_sentinel
> ~warning_sentinel() { flag = val; }
> };
>
> +/* RAII sentinel that saves the value of a variable, optionally
> + overrides it right away, and restores its value when the sentinel
> + id destructed. */
> +
> +template <typename T>
> +class temp_override
> +{
> + T& overridden_variable;
> + T saved_value;
> +public:
> + temp_override(T& var) : overridden_variable (var), saved_value (var) {}
> + temp_override(T& var, T overrider)
> + : overridden_variable (var), saved_value (var)
> + {
> + overridden_variable = overrider;
> + }
> + ~temp_override() { overridden_variable = saved_value; }
> +};
> +
> /* The cached class binding level, from the most recently exited
> class, or NULL if none. */
>
> diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
> index 6dcfae125b7b..34619293120b 100644
> --- a/gcc/cp/parser.c
> +++ b/gcc/cp/parser.c
> @@ -21196,16 +21196,8 @@ cp_parser_parameter_declaration_clause (cp_parser* parser)
> bool ellipsis_p;
> bool is_error;
>
> - struct cleanup {
> - cp_parser* parser;
> - int auto_is_implicit_function_template_parm_p;
> - ~cleanup() {
> - parser->auto_is_implicit_function_template_parm_p
> - = auto_is_implicit_function_template_parm_p;
> - }
> - } cleanup = { parser, parser->auto_is_implicit_function_template_parm_p };
> -
> - (void) cleanup;
> + temp_override<bool> cleanup
> + (parser->auto_is_implicit_function_template_parm_p);
>
> if (!processing_specialization
> && !processing_template_parmlist
> @@ -24968,6 +24960,9 @@ cp_parser_gnu_attributes_opt (cp_parser* parser)
> {
> tree attributes = NULL_TREE;
>
> + temp_override<bool> cleanup
> + (parser->auto_is_implicit_function_template_parm_p, false);
> +
> while (true)
> {
> cp_token *token;
> @@ -25159,6 +25154,9 @@ cp_parser_std_attribute (cp_parser *parser, tree attr_ns)
> tree attribute, attr_id = NULL_TREE, arguments;
> cp_token *token;
>
> + temp_override<bool> cleanup
> + (parser->auto_is_implicit_function_template_parm_p, false);
> +
> /* First, parse name of the attribute, a.k.a attribute-token. */
>
> token = cp_lexer_peek_token (parser->lexer);
>
>
> --
> Alexandre Oliva, freedom fighter http://FSFLA.org/~lxoliva/
> You must be the change you wish to see in the world. -- Gandhi
> Be Free! -- http://FSFLA.org/ FSF Latin America board member
> Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer