This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]