C++ PATCH for c++/83820 - excessive attribute arguments not detected

Jason Merrill jason@redhat.com
Mon Jun 17 16:00:00 GMT 2019


Ok.

On Sun, Jun 16, 2019, 3:10 PM Marek Polacek <polacek@redhat.com> wrote:

> While messing with [[noreturn]] I also found out that we don't detect
> the case when an attribute specifier that takes no arguments contains
> an attribute-argument-clause.
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk?
>
> 2019-06-16  Marek Polacek  <polacek@redhat.com>
>
>         PR c++/83820 - excessive attribute arguments not detected.
>         * parser.c (cp_parser_std_attribute): Detect excessive arguments.
>
>         * g++.dg/cpp0x/gen-attrs-67.C: New test.
>
> diff --git gcc/cp/parser.c gcc/cp/parser.c
> index 8f5ae84670a..871bc45da63 100644
> --- gcc/cp/parser.c
> +++ gcc/cp/parser.c
> @@ -26149,6 +26149,20 @@ cp_parser_std_attribute (cp_parser *parser, tree
> attr_ns)
>      vec<tree, va_gc> *vec;
>      int attr_flag = normal_attr;
>
> +    /* Maybe we don't expect to see any arguments for this attribute.  */
> +    const attribute_spec *as
> +      = lookup_attribute_spec (TREE_PURPOSE (attribute));
> +    if (as && as->max_length == 0)
> +      {
> +       error_at (token->location, "attribute %qE does not take any
> arguments",
> +                 attr_id);
> +       cp_parser_skip_to_closing_parenthesis (parser,
> +                                              /*recovering=*/true,
> +                                              /*or_comma=*/false,
> +                                              /*consume_paren=*/true);
> +       return error_mark_node;
> +      }
> +
>      if (attr_ns == gnu_identifier
>         && attribute_takes_identifier_p (attr_id))
>        /* A GNU attribute that takes an identifier in parameter.  */
> diff --git gcc/testsuite/g++.dg/cpp0x/gen-attrs-67.C
> gcc/testsuite/g++.dg/cpp0x/gen-attrs-67.C
> new file mode 100644
> index 00000000000..bbbedd0240a
> --- /dev/null
> +++ gcc/testsuite/g++.dg/cpp0x/gen-attrs-67.C
> @@ -0,0 +1,11 @@
> +// PR c++/83820 - excessive attribute arguments not detected.
> +// { dg-do compile { target c++11 } }
> +
> +[[noreturn()]] void f0 (); // { dg-error "attribute .noreturn. does not
> take any arguments" }
> +[[noreturn(1)]] void f1 (); // { dg-error "attribute .noreturn. does not
> take any arguments" }
> +[[noreturn(1, 2)]] void f2 (); // { dg-error "attribute .noreturn. does
> not take any arguments" }
> +[[maybe_unused()]] int f3(); // { dg-error "attribute .maybe_unused. does
> not take any arguments" }
> +[[nodiscard()]] int f4(); // { dg-error "attribute .nodiscard. does not
> take any arguments" }
> +[[gnu::noinline()]] int f5(); // { dg-error "attribute .noinline. does
> not take any arguments" }
> +[[gnu::constructor]] int f6();
> +[[gnu::constructor(101)]] int f7();
>



More information about the Gcc-patches mailing list