From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 595883858C60 for ; Tue, 15 Nov 2022 00:00:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 595883858C60 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1668470458; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=T9pu03x+YzAnrgJnljvewzaqw4a1jiSLnk5NQ7ZX3xY=; b=MgfWv2XyGps784VhABa+gtdGQO6TILHZYgwh5jlXBXFJi63jS9hNVMXiQIUaKSOclNU96P 6Sj84z3ow29ljsHDw9d4P6vV+a4PxImqRXjseILTD1ZnjjVKxaKI3htvZs/Z2v+auQxE1k 18H0/aJZ4cCfZFRDZHhhJE3J4sbKS/Y= Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-435-hTbRhGMSOMiwbSy7pQCYJA-1; Mon, 14 Nov 2022 19:00:57 -0500 X-MC-Unique: hTbRhGMSOMiwbSy7pQCYJA-1 Received: by mail-qv1-f69.google.com with SMTP id 71-20020a0c804d000000b004b2fb260447so9492165qva.10 for ; Mon, 14 Nov 2022 16:00:57 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=T9pu03x+YzAnrgJnljvewzaqw4a1jiSLnk5NQ7ZX3xY=; b=fiAXZEYftOhTrjsoErK7hiVfZze35vqzJ5jjskvCyt7UZDcdk/SLu/MCFR3OrTJHRQ 5XJRaWyT6HJd94IOQGkwfeHnlKVHh7V3YKmeP+jrmSVMFJf2THvCr/2EaCKj/aDEEN6u dPc08acAkGGOJRw7hpKDI5cS8CybxgXZy/zfF3uVNQ05HSqo1kN4XddtIe046U2qiO5l y2iVlBqTgdDF74X4z3cMDT/oDxkx2rTeWg8BUqEP0PgC2BFYlxoF7fgWJA/+oMZhJx65 070Ye0xrdkFwbrg2wOfXv9xRpEn7ujRsiwPYIrRN4NEtl96Pe0la0CvwZFRgHvlGPbmv Ai/w== X-Gm-Message-State: ANoB5pnXXxPiEncbAPWJeC7jEjCVPh/ePdRvM3s8D5BBPiYH4barSw1l 8yzQiEO4wi3oCYWsueddmFfdAjGk64u8kLhUBOYIUw4WV5DgBF5Xx0CqjHBYSS+NaZfIh2w5Af8 qzTFRuPRDvM5LhUU2gA== X-Received: by 2002:a05:6214:3c87:b0:4bb:58bf:7507 with SMTP id ok7-20020a0562143c8700b004bb58bf7507mr15086610qvb.96.1668470456782; Mon, 14 Nov 2022 16:00:56 -0800 (PST) X-Google-Smtp-Source: AA0mqf7JhHBip6yR1oDweelD8mc6Gxv3IU4DS3BUSp6Fv5e59ZLlxYDvC4aPYydbwlu8DGEnXL0Bvw== X-Received: by 2002:a05:6214:3c87:b0:4bb:58bf:7507 with SMTP id ok7-20020a0562143c8700b004bb58bf7507mr15086569qvb.96.1668470456340; Mon, 14 Nov 2022 16:00:56 -0800 (PST) Received: from [192.168.1.101] (130-44-159-43.s15913.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.159.43]) by smtp.gmail.com with ESMTPSA id e7-20020a05622a110700b0038b684a1642sm6370978qty.32.2022.11.14.16.00.55 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 14 Nov 2022 16:00:55 -0800 (PST) Message-ID: Date: Mon, 14 Nov 2022 19:00:54 -0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Subject: Re: [PATCH] c++: Allow attributes on concepts - DR 2428 To: Jakub Jelinek , Patrick Palka , Jonathan Wakely Cc: gcc-patches@gcc.gnu.org References: From: Jason Merrill In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-6.2 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,KAM_NUMSUBJECT,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On 11/14/22 00:40, Jakub Jelinek wrote: > Hi! > > Working virtually out of Baker Island. > > 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. > Lightly tested so far. > > 2022-11-13 Jakub Jelinek > > gcc/c-family/ > * c-common.h (c_concept_decl): Declare. > * c-attribs.cc (handle_deprecated_attribute): Allow deprecated > attribute on CONCEPT_DECL if flag_concepts. > gcc/c/ > * c-decl.cc (c_concept_decl): New function. > gcc/cp/ > * 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. > * tree.cc (c_concept_decl): New function. > gcc/testsuite/ > * g++.dg/cpp2a/concepts-dr2428.C: New test. > > --- gcc/c-family/c-common.h.jj 2022-10-27 21:00:53.698247586 -1200 > +++ gcc/c-family/c-common.h 2022-11-13 21:49:37.934598359 -1200 > @@ -831,6 +831,7 @@ extern tree (*make_fname_decl) (location > > /* In c-decl.cc and cp/tree.cc. FIXME. */ > extern void c_register_addr_space (const char *str, addr_space_t as); > +extern bool c_concept_decl (enum tree_code); > > /* In c-common.cc. */ > extern bool in_late_binary_op; > --- gcc/c-family/c-attribs.cc.jj 2022-10-09 19:31:57.177988375 -1200 > +++ gcc/c-family/c-attribs.cc 2022-11-13 21:52:37.920152731 -1200 > @@ -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)) > + || (flag_concepts && c_concept_decl (TREE_CODE (decl)))) > TREE_DEPRECATED (decl) = 1; > else if (TREE_CODE (decl) == LABEL_DECL) > { > --- gcc/c/c-decl.cc.jj 2022-11-12 23:29:08.181504470 -1200 > +++ gcc/c/c-decl.cc 2022-11-13 21:50:38.178779716 -1200 > @@ -12987,6 +12987,14 @@ c_register_addr_space (const char *word, > ridpointers [rid] = id; > } > > +/* C doesn't have CONCEPT_DECL. */ > + > +bool > +c_concept_decl (enum tree_code) > +{ > + return false; > +} > + > /* Return identifier to look up for omp declare reduction. */ > > tree > --- gcc/cp/cp-tree.h.jj 2022-11-11 20:30:10.138056914 -1200 > +++ gcc/cp/cp-tree.h 2022-11-13 20:58:39.443218815 -1200 > @@ -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-08 22:39:13.325041007 -1200 > +++ gcc/cp/parser.cc 2022-11-13 20:58:15.692542640 -1200 > @@ -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/pt.cc.jj 2022-11-07 20:54:37.341399829 -1200 > +++ gcc/cp/pt.cc 2022-11-13 21:01:18.333053377 -1200 > @@ -29027,7 +29027,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); > @@ -29061,6 +29061,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/cp/constraint.cc.jj 2022-11-04 05:11:41.491946435 -1200 > +++ gcc/cp/constraint.cc 2022-11-13 22:24:55.314809969 -1200 > @@ -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/tree.cc.jj 2022-11-08 22:39:13.318041103 -1200 > +++ gcc/cp/tree.cc 2022-11-13 21:51:21.851186254 -1200 > @@ -6103,6 +6103,14 @@ c_register_addr_space (const char * /*wo > { > } > > +/* Return true if CODE is CONCEPT_DECL. */ > + > +bool > +c_concept_decl (enum tree_code code) > +{ > + return code == CONCEPT_DECL; > +} > + > /* Return the number of operands in T that we care about for things like > mangling. */ > > --- gcc/testsuite/g++.dg/cpp2a/concepts-dr2428.C.jj 2022-11-13 22:27:56.977337907 -1200 > +++ gcc/testsuite/g++.dg/cpp2a/concepts-dr2428.C 2022-11-13 22:28:07.767191065 -1200 > @@ -0,0 +1,22 @@ > +// DR 2428 > +// { dg-do compile { target c++20 } } > + > +template > +concept C1 [[deprecated]] = true; > + > +template > +concept C2 __attribute__((deprecated)) = false; > + > +template > +concept C3 [[deprecated]] = true; > + > +template > +concept C4 __attribute__((deprecated)) = false; > + > +static_assert(C3); // { dg-warning "'C3' is deprecated" } > +static_assert(C4); // { dg-error "static assertion failed" } > + // { dg-warning "'C4' is deprecated" "" { target *-*-* } .-1 } > + > +template > + requires C3 // { dg-warning "'C3' is deprecated" } > +int fn1(T t) { return 0; } > > Jakub >