public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Jakub Jelinek <jakub@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-4082] c++: Allow attributes on concepts - DR 2428 Date: Wed, 16 Nov 2022 06:38:46 +0000 (GMT) [thread overview] Message-ID: <20221116063846.A600F3954C61@sourceware.org> (raw) https://gcc.gnu.org/g:7f014022861b5b3f00be9bb32fe3fe772517ddac commit r13-4082-g7f014022861b5b3f00be9bb32fe3fe772517ddac Author: Jakub Jelinek <jakub@redhat.com> Date: Wed Nov 16 07:37:05 2022 +0100 c++: Allow attributes on concepts - DR 2428 The following patch adds parsing of attributes to concept definition, allows deprecated attribute to be specified (as CONCEPT_DECL now needs to be checked in c-family/c-attribs.cc, I had to move its declaration from cp/*.def to c-family/*.def) and checks TREE_DEPRECATED in build_standard_check (not sure if that is the right spot, or whether it shouldn't be checked also for variable and function concepts and how to write testcase coverage for that). 2022-11-16 Jakub Jelinek <jakub@redhat.com> gcc/c-family/ * c-common.def (CONCEPT_DECL): New tree, moved here from cp-tree.def. * c-common.cc (c_common_init_ts): Handle CONCEPT_DECL. * c-attribs.cc (handle_deprecated_attribute): Allow deprecated attribute on CONCEPT_DECL. gcc/cp/ * cp-tree.def (CONCEPT_DECL): Move to c-common.def. * cp-objcp-common.cc (cp_common_init_ts): Don't handle CONCEPT_DECL here. * cp-tree.h (finish_concept_definition): Add ATTRS parameter. * parser.cc (cp_parser_concept_definition): Parse attributes in between identifier and =. Adjust finish_concept_definition caller. * pt.cc (finish_concept_definition): Add ATTRS parameter. Call cplus_decl_attributes. * constraint.cc (build_standard_check): If CONCEPT_DECL is TREE_DEPRECATED, emit -Wdeprecated-declaration warnings. gcc/testsuite/ * g++.dg/cpp2a/concepts-dr2428.C: New test. Diff: --- gcc/c-family/c-attribs.cc | 3 ++- gcc/c-family/c-common.cc | 2 ++ gcc/c-family/c-common.def | 8 ++++++++ gcc/cp/constraint.cc | 2 ++ gcc/cp/cp-objcp-common.cc | 1 - gcc/cp/cp-tree.def | 5 ----- gcc/cp/cp-tree.h | 2 +- gcc/cp/parser.cc | 4 +++- gcc/cp/pt.cc | 5 ++++- gcc/testsuite/g++.dg/cpp2a/concepts-dr2428.C | 22 ++++++++++++++++++++++ 10 files changed, 44 insertions(+), 10 deletions(-) diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc index 92ac93ba2ce..07bca68e9b9 100644 --- a/gcc/c-family/c-attribs.cc +++ b/gcc/c-family/c-attribs.cc @@ -4211,7 +4211,8 @@ handle_deprecated_attribute (tree *node, tree name, || VAR_OR_FUNCTION_DECL_P (decl) || TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == CONST_DECL - || objc_method_decl (TREE_CODE (decl))) + || objc_method_decl (TREE_CODE (decl)) + || TREE_CODE (decl) == CONCEPT_DECL) TREE_DEPRECATED (decl) = 1; else if (TREE_CODE (decl) == LABEL_DECL) { diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc index 71507d4cb0a..6f1f21bc4c1 100644 --- a/gcc/c-family/c-common.cc +++ b/gcc/c-family/c-common.cc @@ -8497,6 +8497,8 @@ c_common_init_ts (void) MARK_TS_EXP (FOR_STMT); MARK_TS_EXP (SWITCH_STMT); MARK_TS_EXP (WHILE_STMT); + + MARK_TS_DECL_COMMON (CONCEPT_DECL); } /* Build a user-defined numeric literal out of an integer constant type VALUE diff --git a/gcc/c-family/c-common.def b/gcc/c-family/c-common.def index dd8be7fdd3d..64956fc2ca1 100644 --- a/gcc/c-family/c-common.def +++ b/gcc/c-family/c-common.def @@ -81,6 +81,14 @@ DEFTREECODE (CONTINUE_STMT, "continue_stmt", tcc_statement, 0) SWITCH_STMT_SCOPE, respectively. */ DEFTREECODE (SWITCH_STMT, "switch_stmt", tcc_statement, 4) +/* Extensions for C++ Concepts. */ + +/* Concept definition. This is not entirely different than a VAR_DECL + except that a) it must be a template, and b) doesn't have the wide + range of value and linkage options available to variables. Used + by C++ FE and in c-family attribute handling. */ +DEFTREECODE (CONCEPT_DECL, "concept_decl", tcc_declaration, 0) + /* Local variables: mode:c diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc index 3ddbd535330..a113d3e269e 100644 --- a/gcc/cp/constraint.cc +++ b/gcc/cp/constraint.cc @@ -1396,6 +1396,8 @@ build_standard_check (tree tmpl, tree args, tsubst_flags_t complain) { gcc_assert (standard_concept_p (tmpl)); gcc_assert (TREE_CODE (tmpl) == TEMPLATE_DECL); + if (TREE_DEPRECATED (DECL_TEMPLATE_RESULT (tmpl))) + warn_deprecated_use (DECL_TEMPLATE_RESULT (tmpl), NULL_TREE); tree parms = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (tmpl)); args = coerce_template_parms (parms, args, tmpl, complain); if (args == error_mark_node) diff --git a/gcc/cp/cp-objcp-common.cc b/gcc/cp/cp-objcp-common.cc index e4df30d9720..7f76f2c669a 100644 --- a/gcc/cp/cp-objcp-common.cc +++ b/gcc/cp/cp-objcp-common.cc @@ -473,7 +473,6 @@ cp_common_init_ts (void) /* New decls. */ MARK_TS_DECL_COMMON (TEMPLATE_DECL); MARK_TS_DECL_COMMON (WILDCARD_DECL); - MARK_TS_DECL_COMMON (CONCEPT_DECL); MARK_TS_DECL_NON_COMMON (USING_DECL); diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def index f83b4c54d43..3de8278e9f1 100644 --- a/gcc/cp/cp-tree.def +++ b/gcc/cp/cp-tree.def @@ -495,11 +495,6 @@ DEFTREECODE (OMP_DEPOBJ, "omp_depobj", tcc_statement, 2) /* Extensions for Concepts. */ -/* Concept definition. This is not entirely different than a VAR_DECL - except that a) it must be a template, and b) doesn't have the wide - range of value and linkage options available to variables. */ -DEFTREECODE (CONCEPT_DECL, "concept_decl", tcc_declaration, 0) - /* Used to represent information associated with constrained declarations. */ DEFTREECODE (CONSTRAINT_INFO, "constraint_info", tcc_exceptional, 0) diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 8c9beb86568..07f96ea861f 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -8322,7 +8322,7 @@ struct diagnosing_failed_constraint extern cp_expr finish_constraint_or_expr (location_t, cp_expr, cp_expr); extern cp_expr finish_constraint_and_expr (location_t, cp_expr, cp_expr); extern cp_expr finish_constraint_primary_expr (cp_expr); -extern tree finish_concept_definition (cp_expr, tree); +extern tree finish_concept_definition (cp_expr, tree, tree); extern tree combine_constraint_expressions (tree, tree); extern tree append_constraint (tree, tree); extern tree get_constraints (const_tree); diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index e4021835ed5..c5929a6cc5f 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -29672,6 +29672,8 @@ cp_parser_concept_definition (cp_parser *parser) return NULL_TREE; } + tree attrs = cp_parser_attributes_opt (parser); + if (!cp_parser_require (parser, CPP_EQ, RT_EQ)) { cp_parser_skip_to_end_of_statement (parser); @@ -29688,7 +29690,7 @@ cp_parser_concept_definition (cp_parser *parser) but continue as if it were. */ cp_parser_consume_semicolon_at_end_of_statement (parser); - return finish_concept_definition (id, init); + return finish_concept_definition (id, init, attrs); } // -------------------------------------------------------------------------- // diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index e6017b34c0c..0310e38c9b9 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -28928,7 +28928,7 @@ placeholder_type_constraint_dependent_p (tree t) the TEMPLATE_DECL. */ tree -finish_concept_definition (cp_expr id, tree init) +finish_concept_definition (cp_expr id, tree init, tree attrs) { gcc_assert (identifier_p (id)); gcc_assert (processing_template_decl); @@ -28962,6 +28962,9 @@ finish_concept_definition (cp_expr id, tree init) DECL_CONTEXT (decl) = current_scope (); DECL_INITIAL (decl) = init; + if (attrs) + cplus_decl_attributes (&decl, attrs, 0); + set_originating_module (decl, false); /* Push the enclosing template. */ diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-dr2428.C b/gcc/testsuite/g++.dg/cpp2a/concepts-dr2428.C new file mode 100644 index 00000000000..d08ad36bd8c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-dr2428.C @@ -0,0 +1,22 @@ +// DR 2428 +// { dg-do compile { target c++20 } } + +template<typename T> +concept C1 [[deprecated]] = true; + +template<typename T> +concept C2 __attribute__((deprecated)) = false; + +template<typename T> +concept C3 [[deprecated]] = true; + +template<typename T> +concept C4 __attribute__((deprecated)) = false; + +static_assert(C3<int>); // { dg-warning "'C3' is deprecated" } +static_assert(C4<int>); // { dg-error "static assertion failed" } + // { dg-warning "'C4' is deprecated" "" { target *-*-* } .-1 } + +template<typename T> + requires C3<T> // { dg-warning "'C3' is deprecated" } +int fn1(T t) { return 0; }
reply other threads:[~2022-11-16 6:38 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20221116063846.A600F3954C61@sourceware.org \ --to=jakub@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).