Implement C++20 P1301 [[nodiscard("should have a reason")]].
authorJeanHeyd Meneide <phdofthehouse@gmail.com>
Sat, 19 Oct 2019 04:51:59 +0000 (04:51 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 19 Oct 2019 04:51:59 +0000 (00:51 -0400)
commit8ad0c477e888d34c8fc6dbcc008ef66505071d65
tree9b2f5e5c5d3601b9c42221f4e30c262c62a681b4
parent9299523c9aad158f5276df2bfe777044bb144230
Implement C++20 P1301 [[nodiscard("should have a reason")]].

2019-10-17  JeanHeyd Meneide  <phdofthehouse@gmail.com>

gcc/
        * escaped_string.h (escaped_string): New header.
        * tree.c (escaped_string): Remove escaped_string class.

gcc/c-family
        * c-lex.c (c_common_has_attribute): Update nodiscard value.

gcc/cp/
        * tree.c (handle_nodiscard_attribute) Added C++2a nodiscard
string message.
        (std_attribute_table) Increase nodiscard argument handling
max_length from 0 to 1.
        * parser.c (cp_parser_check_std_attribute): Add requirement
that nodiscard only be seen once in attribute-list.
        (cp_parser_std_attribute): Check that empty parenthesis lists are
        not specified for attributes that have max_length > 0 (e.g.
[[attr()]]).
        * cvt.c (maybe_warn_nodiscard): Add nodiscard message to
output, if applicable.
(convert_to_void): Allow constructors to be nodiscard-able (P1771).

gcc/testsuite/g++.dg/cpp0x
        * gen-attrs-67.C: Test new error message for empty-parenthesis-list.

gcc/testsuite/g++.dg/cpp2a
        * nodiscard-construct.C: New test.
        * nodiscard-once.C: New test.
        * nodiscard-reason-nonstring.C: New test.
        * nodiscard-reason-only-one.C: New test.
        * nodiscard-reason.C: New test.

Reviewed-by: Jason Merrill <jason@redhat.com>
From-SVN: r277200
17 files changed:
gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-lex.c
gcc/cp/ChangeLog
gcc/cp/cvt.c
gcc/cp/parser.c
gcc/cp/tree.c
gcc/escaped_string.h [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/gen-attrs-67.C
gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C
gcc/testsuite/g++.dg/cpp2a/feat-cxx2a.C
gcc/testsuite/g++.dg/cpp2a/nodiscard-constructor.c [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/nodiscard-once.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/nodiscard-reason-nonstring.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/nodiscard-reason-only-one.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/nodiscard-reason.C [new file with mode: 0644]
gcc/tree.c