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.133.124]) by sourceware.org (Postfix) with ESMTPS id 76C323858402 for ; Tue, 8 Nov 2022 23:40:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 76C323858402 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=1667950808; 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=2rgrzm+aGpLjuliluZllRi/11KRtrzBTABtZhtoGqes=; b=QiwOFMXyj+Zy9BtZ4OlBPT3iAjK846vuCo/RkrS5bbZ3X/UYzEAJ4YZluIiKc6DBFWNGOR UNRUG8rCw49/6RaBLe2a7suCTSd2ehvPoRUhiHTS9EsZuAg12Kdr4aC8fsQzj0/iirRRLZ Z39ljwQEDpojE4so7JYpIcN8ULz1Pa4= Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-368-HwKYFMw_Pxq2P60YFGyYgg-1; Tue, 08 Nov 2022 18:40:07 -0500 X-MC-Unique: HwKYFMw_Pxq2P60YFGyYgg-1 Received: by mail-pg1-f200.google.com with SMTP id k16-20020a635a50000000b0042986056df6so8482257pgm.2 for ; Tue, 08 Nov 2022 15:40:06 -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=2rgrzm+aGpLjuliluZllRi/11KRtrzBTABtZhtoGqes=; b=bBquMVY7/bzssuGYgPFLjQcVKKqC7k9SqQuDkNkU2q0FoWVsVHrPUi8OdykwrawFeO //wHuNfYnzaOsvNHglBrHT9oZqLjO9cltyT5c8p6pH6vyTnplr0TS0os1mDstinQk82Q eGVbLsV9X75C/7PKsjZ6cpgw54Gt2XLAndBtppOICrF5ZS1wXbSFDxDb8WITUma2uFLr GrzigxNzOxIDeAY/X3IXhHBR17hBqE+jZNAdTdJQWhdd/5rr84Ztc3FBvtG5JOQMlQRB R0ub0kd8kqpdQJmrLP7xGkMzoHnz9EgcKXKF6evjvAA1qL1j4GtI04ntbW8eppRzuu5t e+PQ== X-Gm-Message-State: ACrzQf1R0v2zo2y5AfRVmIqa/G8VxB/VJkxYF+y+YLJsVigXtRuL0pQ5 cV1LFLn/cbnQdRTPSy2Z3pno4YZbcyZpJSNpwGpOJP57y2IkbqmevqrpBj7qw9spdCYQGRzYa+X ABV2LoIL3Iv9uafeu3A== X-Received: by 2002:a17:90a:ce81:b0:212:f61d:35c6 with SMTP id g1-20020a17090ace8100b00212f61d35c6mr58214513pju.243.1667950805835; Tue, 08 Nov 2022 15:40:05 -0800 (PST) X-Google-Smtp-Source: AMsMyM6iMoMtozsL6YuZ7zlFoWTsZwefexYQA4S/luAMAO7RL67GGTidjfwJQrqSh77H5v8XkTRQfw== X-Received: by 2002:a17:90a:ce81:b0:212:f61d:35c6 with SMTP id g1-20020a17090ace8100b00212f61d35c6mr58214486pju.243.1667950805390; Tue, 08 Nov 2022 15:40:05 -0800 (PST) Received: from [172.22.36.61] (rrcs-24-43-233-8.west.biz.rr.com. [24.43.233.8]) by smtp.gmail.com with ESMTPSA id h3-20020aa796c3000000b0056246403534sm6901555pfq.88.2022.11.08.15.40.04 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 08 Nov 2022 15:40:04 -0800 (PST) Message-ID: Date: Tue, 8 Nov 2022 13:40:03 -1000 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Subject: Re: [RFC PATCH] c++: Minimal handling of carries_dependency attribute To: Jakub Jelinek 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.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham 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/8/22 04:42, Jakub Jelinek wrote: > Hi! > > A comment in D2552R1: > "The only questionable (but still conforming) case we found was > [[carries_dependency(some_argument)]] on GCC, where the emitted diagnostic said that the > carries_dependency attribute is not supported, but did not specifically call out the syntax error > in the argument clause." > made me try the following patch, where we'll error at least > for arguments to the attribute and for some uses of the attribute > appertaining to something not mentioned in the standard warn > with different diagnostics (or should that be an error?; clang++ > does that, but I think we never do for any attribute, standard or not). > The diagnostics on toplevel attribute declaration is still an > attribute ignored warning and on empty statement different wording. > > The paper additionally mentions > struct X { [[nodiscard]]; }; // no diagnostic on GCC > and 2 cases of missing diagnostics on [[fallthrough]] (guess I should > file a PR about those; one problem is that do { ... } while (0); there > is replaced during genericization just by ... and another that > [[fallthrough]] there is followed by a label, but not user/case/default > label, but an artificial one created from while loop genericization. > > Thoughts on this? LGTM. > 2022-11-08 Jakub Jelinek > > * tree.cc (handle_carries_dependency_attribute): New function. > (std_attribute_table): Add carries_dependency attribute. > * parser.cc (cp_parser_check_std_attribute): Add carries_dependency > attribute. > > * g++.dg/cpp0x/attr-carries_dependency1.C: New test. > > --- gcc/cp/tree.cc.jj 2022-11-07 10:30:42.758629740 +0100 > +++ gcc/cp/tree.cc 2022-11-08 14:45:08.853864684 +0100 > @@ -4923,6 +4923,32 @@ structural_type_p (tree t, bool explain) > return true; > } > > +/* Partially handle the C++11 [[carries_dependency]] attribute. > + Just emit a different diagnostics when it is used on something the > + spec doesn't allow vs. where it allows and we just choose to ignore > + it. */ > + > +static tree > +handle_carries_dependency_attribute (tree *node, tree name, > + tree ARG_UNUSED (args), > + int ARG_UNUSED (flags), > + bool *no_add_attrs) > +{ > + if (TREE_CODE (*node) != FUNCTION_DECL > + && TREE_CODE (*node) != PARM_DECL) > + { > + warning (OPT_Wattributes, "%qE attribute can only be applied to " > + "functions or parameters", name); > + *no_add_attrs = true; > + } > + else > + { > + warning (OPT_Wattributes, "%qE attribute ignored", name); > + *no_add_attrs = true; > + } > + return NULL_TREE; > +} > + > /* Handle the C++17 [[nodiscard]] attribute, which is similar to the GNU > warn_unused_result attribute. */ > > @@ -5036,6 +5062,8 @@ const struct attribute_spec std_attribut > handle_likeliness_attribute, attr_cold_hot_exclusions }, > { "noreturn", 0, 0, true, false, false, false, > handle_noreturn_attribute, attr_noreturn_exclusions }, > + { "carries_dependency", 0, 0, true, false, false, false, > + handle_carries_dependency_attribute, NULL }, > { NULL, 0, 0, false, false, false, false, NULL, NULL } > }; > > --- gcc/cp/parser.cc.jj 2022-11-04 18:11:41.523945997 +0100 > +++ gcc/cp/parser.cc 2022-11-08 13:41:35.075135139 +0100 > @@ -29239,8 +29239,7 @@ cp_parser_std_attribute (cp_parser *pars > > /* Warn if the attribute ATTRIBUTE appears more than once in the > attribute-list ATTRIBUTES. This used to be enforced for certain > - attributes, but the restriction was removed in P2156. Note that > - carries_dependency ([dcl.attr.depend]) isn't implemented yet in GCC. > + attributes, but the restriction was removed in P2156. > LOC is the location of ATTRIBUTE. Returns true if ATTRIBUTE was not > found in ATTRIBUTES. */ > > @@ -29249,7 +29248,7 @@ cp_parser_check_std_attribute (location_ > { > static auto alist = { "noreturn", "deprecated", "nodiscard", "maybe_unused", > "likely", "unlikely", "fallthrough", > - "no_unique_address" }; > + "no_unique_address", "carries_dependency" }; > if (attributes) > for (const auto &a : alist) > if (is_attribute_p (a, get_attribute_name (attribute)) > --- gcc/testsuite/g++.dg/cpp0x/attr-carries_dependency1.C.jj 2022-11-08 15:17:43.168238390 +0100 > +++ gcc/testsuite/g++.dg/cpp0x/attr-carries_dependency1.C 2022-11-08 15:16:39.695104787 +0100 > @@ -0,0 +1,17 @@ > +// { dg-do compile { target c++11 } } > + > +[[carries_dependency]] int *f1 (); // { dg-warning "attribute ignored" } > +int f2 (int *x [[carries_dependency]]); // { dg-warning "attribute ignored" } > +[[carries_dependency]] int f3 (); // { dg-warning "attribute ignored" } > +int f4 (int x [[carries_dependency]]); // { dg-warning "attribute ignored" } > +[[carries_dependency(1)]] int f5 (); // { dg-error "'carries_dependency' attribute does not take any arguments" } > +[[carries_dependency]] int v; // { dg-warning "'carries_dependency' attribute can only be applied to functions or parameters" } > +[[carries_dependency]]; // { dg-warning "attribute ignored" } > +void > +f6 () > +{ > + [[carries_dependency]]; // { dg-warning "attributes at the beginning of statement are ignored" } > +} > +#if __has_cpp_attribute(carries_dependency) > +#error carries_dependency attribute is not actually implemented > +#endif > > Jakub >