https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109756

--- Comment #10 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:39d6d4256d16d676f8b9031c4d1d115ddf4ad76b

commit r14-650-g39d6d4256d16d676f8b9031c4d1d115ddf4ad76b
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Wed May 10 11:37:04 2023 +0200

    c++: Reject attributes without arguments used as pack expansion [PR109756]

    The following testcase shows we silently accept (and ignore) attributes
without
    arguments used as pack expansions.  This is because we call
    make_pack_expansion and that starts with
      if (!arg || arg == error_mark_node)
        return arg;
    Now, an attribute without arguments like [[noreturn...]] is IMHO always
    invalid, in this case for 2 reasons; one is that as it has no arguments,
    no pack can be present and second is that the standard says that
    attributes need to specially permit uses of parameter pack and doesn't
    explicitly permit it for any of the standard attributes (except for
alignas?
    which has different syntax).
    If an attribute has some arguments but doesn't contain packs in those
    arguments, make_pack_expansion will already diagnose it.

    The patch also changes cp_parser_std_attribute, such that for attributes
unknown
    to the compiler (or perhaps registered just for -Wno-attributes=) we
differentiate
    between the attribute having no arguments (in that case we want to diagnose
them
    when followed by ellipsis even if they are unknown, as they can't contain a
pack
    in that case) and the case where they do have arguments but we've just
skipped over
    those arguments because we don't know how to parse them (except that they
are
    a balanced token sequence) - in that case we really don't know if they
contain
    packs or not.

    2023-05-10  Jakub Jelinek  <ja...@redhat.com>

            PR c++/109756
            * parser.cc (cp_parser_std_attribute): For unknown attributes with
            arguments set TREE_VALUE (attribute) to error_mark_node after
skipping
            the balanced tokens.
            (cp_parser_std_attribute_list): If ... is used after attribute
without
            arguments, diagnose it and return error_mark_node.  If
            TREE_VALUE (attribute) is error_mark_node, don't call
            make_pack_expansion nor return early error_mark_node.

            * g++.dg/cpp0x/gen-attrs-78.C: New test.

Reply via email to