From: Jason Merrill <jason@redhat.com>
To: Jakub Jelinek <jakub@redhat.com>,
Patrick Palka <ppalka@redhat.com>,
Jonathan Wakely <jwakely@redhat.com>,
gcc-patches@gcc.gnu.org
Subject: Re: [PATCH] c++, v2: Allow attributes on concepts - DR 2428
Date: Tue, 15 Nov 2022 16:51:50 -0500 [thread overview]
Message-ID: <5a23209a-6eeb-17a2-0e50-5c57c348ec2f@redhat.com> (raw)
In-Reply-To: <Y3NT4FBgrqWUXSl1@tucnak>
On 11/14/22 22:54, Jakub Jelinek wrote:
> On Tue, Nov 15, 2022 at 09:54:00AM +0100, Jakub Jelinek via Gcc-patches wrote:
>> On Mon, Nov 14, 2022 at 07:00:54PM -0500, Jason Merrill wrote:
>>>> The following patch adds parsing of attributes to concept definition,
>>>> allows deprecated attribute to be specified (some ugliness needed
>>>> because CONCEPT_DECL is a cp/*.def attribute and so can't be mentioned
>>>> in c-family/ directly; used what is used for objc method decls,
>>>> an alternative would be a langhook)
>>>
>>> Several of the codes in c-common.def are C++-only, you might just move it
>>> over?
>>>
>>>> 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).
>>>
>>> I wouldn't bother with var/fn concepts, they're obsolete.
>>
>> Ok, so like this?
>> The previous version passed bootstrap/regtest on x86_64-linux and i686-linux,
>> I'll of course test this one as well.
>
> Better with a patch. Sorry.
OK.
> 2022-11-15 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.
>
> --- gcc/c-family/c-common.def.jj 2022-10-14 09:28:27.975164491 +0200
> +++ gcc/c-family/c-common.def 2022-11-15 09:34:01.384591076 +0100
> @@ -81,6 +81,14 @@ DEFTREECODE (CONTINUE_STMT, "continue_st
> 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
> --- gcc/c-family/c-common.cc.jj 2022-11-13 12:29:08.165504692 +0100
> +++ gcc/c-family/c-common.cc 2022-11-15 09:34:48.828950083 +0100
> @@ -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
> --- gcc/c-family/c-attribs.cc.jj 2022-11-14 13:35:34.184160348 +0100
> +++ gcc/c-family/c-attribs.cc 2022-11-15 09:30:57.370081060 +0100
> @@ -4211,7 +4211,8 @@ handle_deprecated_attribute (tree *node,
> || 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)
> {
> --- gcc/cp/cp-tree.def.jj 2022-09-29 18:11:34.836666800 +0200
> +++ gcc/cp/cp-tree.def 2022-11-15 09:32:17.456996090 +0100
> @@ -495,11 +495,6 @@ DEFTREECODE (OMP_DEPOBJ, "omp_depobj", t
>
> /* 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)
>
> --- gcc/cp/cp-objcp-common.cc.jj 2022-09-30 18:38:55.349607203 +0200
> +++ gcc/cp/cp-objcp-common.cc 2022-11-15 09:34:21.963313049 +0100
> @@ -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);
>
> --- gcc/cp/cp-tree.h.jj 2022-11-15 08:17:07.561388452 +0100
> +++ gcc/cp/cp-tree.h 2022-11-15 09:30:57.371081046 +0100
> @@ -8324,7 +8324,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);
> --- gcc/cp/parser.cc.jj 2022-11-14 13:35:34.380157682 +0100
> +++ gcc/cp/parser.cc 2022-11-15 09:30:57.377080965 +0100
> @@ -29672,6 +29672,8 @@ cp_parser_concept_definition (cp_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
> 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);
> }
>
> // -------------------------------------------------------------------------- //
> --- gcc/cp/constraint.cc.jj 2022-11-14 13:35:34.269159192 +0100
> +++ gcc/cp/constraint.cc 2022-11-15 09:30:57.382080897 +0100
> @@ -1396,6 +1396,8 @@ build_standard_check (tree tmpl, tree ar
> {
> 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)
> --- gcc/cp/pt.cc.jj 2022-11-15 07:56:05.130350281 +0100
> +++ gcc/cp/pt.cc 2022-11-15 09:30:57.381080911 +0100
> @@ -29030,7 +29030,7 @@ placeholder_type_constraint_dependent_p
> 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);
> @@ -29064,6 +29064,9 @@ finish_concept_definition (cp_expr id, t
> 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. */
> --- gcc/testsuite/g++.dg/cpp2a/concepts-dr2428.C.jj 2022-11-15 09:30:57.382080897 +0100
> +++ gcc/testsuite/g++.dg/cpp2a/concepts-dr2428.C 2022-11-15 09:30:57.382080897 +0100
> @@ -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; }
>
>
> Jakub
>
prev parent reply other threads:[~2022-11-15 21:51 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-14 10:40 [PATCH] c++: " Jakub Jelinek
2022-11-15 0:00 ` Jason Merrill
2022-11-15 8:54 ` [PATCH] c++, v2: " Jakub Jelinek
2022-11-15 8:54 ` Jakub Jelinek
2022-11-15 21:51 ` Jason Merrill [this message]
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=5a23209a-6eeb-17a2-0e50-5c57c348ec2f@redhat.com \
--to=jason@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=jakub@redhat.com \
--cc=jwakely@redhat.com \
--cc=ppalka@redhat.com \
/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: link
Be 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).