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 ESMTP id 4B61F388F006 for ; Fri, 25 Jun 2021 20:47:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 4B61F388F006 Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-220-fDWLcUmXMli9BbgLAGV85Q-1; Fri, 25 Jun 2021 16:47:37 -0400 X-MC-Unique: fDWLcUmXMli9BbgLAGV85Q-1 Received: by mail-qt1-f197.google.com with SMTP id s20-20020ac85cd40000b029024ebedff900so9516413qta.10 for ; Fri, 25 Jun 2021 13:47:37 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=xYUeKDC1VaKcCus64Jzlxmqw3PtVZz60BmuBroK2FSY=; b=pir1WyiFKWcA1zctiY2ihVoLYspYfM2KlPFnyoEC/MnlRgaAUO9qbkjF+tcPs4cEf4 tYQTjpfBOyagESpT6/RYDvz1TnIa/zMmr44tjVo9IAKTHqeRBxTwJ3wX7TSoJGjhScHb zMlV70o4ybBIhGsDZLVCnKnnrK/xHN03eD6r4X8ijxK/wCAMDbvZ6oLF2qi/gBLJkBqh wwTNE6AEBZaLQOGiXOa7niWXv9rhfYnVItpm+YH2BAJE3AyPzIjF2jiLhfxGxUf9Mszt 7FJxu6QnhmtDPs/LKHU/aRKlGC02auRtUsou+RZxMUDhumqpbwhuVtY9dbD597L9f2FY 15qQ== X-Gm-Message-State: AOAM530Pput7/6JUtRPyggNBrlJJdMROfwoYSg0rIGMS29I9RmHoZsyn 2nHXrDeURft4souI8tIP9M8X4EwBB5MCJyqhndVTgsxCL4T0gbvRQkV/QVg+reZHMGkWd4XOGno 8YfDXBZPeQiV4ni7eOn7UA8oDLyLFpQEhmjuxAHddCifcruBXeB+ONF09tczDiqVCgw== X-Received: by 2002:a05:6214:15c2:: with SMTP id p2mr13317038qvz.8.1624654056557; Fri, 25 Jun 2021 13:47:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyM0vLx9f+i3V1wNX0VEWI11yMXmmE1i+5S2PvwAUHVk2e+Apu/jbDg1N3jztdp2ocM4rp1iA== X-Received: by 2002:a05:6214:15c2:: with SMTP id p2mr13317005qvz.8.1624654056146; Fri, 25 Jun 2021 13:47:36 -0700 (PDT) Received: from [192.168.1.148] (130-44-159-43.s11817.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.159.43]) by smtp.gmail.com with ESMTPSA id q72sm2736504qke.49.2021.06.25.13.47.35 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 25 Jun 2021 13:47:35 -0700 (PDT) Subject: Re: [PATCH v2] c++: Failure to delay noexcept parsing with ptr-operator [PR100752] To: Marek Polacek Cc: GCC Patches References: <20210609002523.1256033-1-polacek@redhat.com> <86ff3105-f6a0-8d9c-06f2-5c2b63c2efb9@redhat.com> From: Jason Merrill Message-ID: Date: Fri, 25 Jun 2021 16:47:34 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.10.0 MIME-Version: 1.0 In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-13.2 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, NICE_REPLY_A, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 25 Jun 2021 20:47:41 -0000 On 6/25/21 4:42 PM, Marek Polacek wrote: > On Thu, Jun 10, 2021 at 10:31:33PM -0400, Jason Merrill wrote: >> On 6/10/21 5:19 PM, Marek Polacek wrote: >>> On Thu, Jun 10, 2021 at 03:09:29PM -0400, Jason Merrill wrote: >>>> On 6/8/21 8:25 PM, Marek Polacek wrote: >>>>> We weren't passing 'flags' to the recursive call to cp_parser_declarator >>>>> in the ptr-operator case and as an effect, delayed parsing of noexcept >>>>> didn't work as advertised. The following change passes more than just >>>>> CP_PARSER_FLAGS_DELAY_NOEXCEPT but that doesn't seem to break anything. >>>>> >>>>> I'm not passing member_p because I don't need it and because it breaks >>>>> a few tests. >>>>> >>>>> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/branches? >>>>> >>>>> PR c++/100752 >>>>> >>>>> gcc/cp/ChangeLog: >>>>> >>>>> * parser.c (cp_parser_declarator): Pass flags down to >>>>> cp_parser_declarator. >>>>> >>>>> gcc/testsuite/ChangeLog: >>>>> >>>>> * g++.dg/cpp0x/noexcept69.C: New test. >>>>> --- >>>>> gcc/cp/parser.c | 3 +-- >>>>> gcc/testsuite/g++.dg/cpp0x/noexcept69.C | 12 ++++++++++++ >>>>> 2 files changed, 13 insertions(+), 2 deletions(-) >>>>> create mode 100644 gcc/testsuite/g++.dg/cpp0x/noexcept69.C >>>>> >>>>> diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c >>>>> index d59a829d0b9..5930990ec1c 100644 >>>>> --- a/gcc/cp/parser.c >>>>> +++ b/gcc/cp/parser.c >>>>> @@ -22066,8 +22066,7 @@ cp_parser_declarator (cp_parser* parser, >>>>> cp_parser_parse_tentatively (parser); >>>>> /* Parse the dependent declarator. */ >>>>> - declarator = cp_parser_declarator (parser, dcl_kind, >>>>> - CP_PARSER_FLAGS_NONE, >>>>> + declarator = cp_parser_declarator (parser, dcl_kind, flags, >>>>> /*ctor_dtor_or_conv_p=*/NULL, >>>>> /*parenthesized_p=*/NULL, >>>>> /*member_p=*/false, >>>> >>>> Should the other parameters also be passed down? I'd think definitely >>>> member_p and static_p, not sure about ctor_dtor_or_conv_p and >>>> parenthesized_p. >>> >>> Hmm, as I mentioned in the patch description, I tried, but passing member_p >>> broke a few tests and since it's not needed for this fix I gave up >>> investigating why. I could look into it if you're curious :). >> >> Please. > > Turns out those were just trivial changes to the expected error messages. > The following patch passes member_p and static_p too: > > Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk? OK. > -- >8 -- > We weren't passing 'flags' to the recursive call to cp_parser_declarator > in the ptr-operator case and as an effect, delayed parsing of noexcept > didn't work as advertised. The following change passes more than just > CP_PARSER_FLAGS_DELAY_NOEXCEPT but that doesn't seem to break anything. > > I'm now also passing member_p and static_p, as a consequence, two tests > needed small tweaks. > > PR c++/100752 > > gcc/cp/ChangeLog: > > * parser.c (cp_parser_declarator): Pass flags down to > cp_parser_declarator. Also pass static_p/member_p. > > gcc/testsuite/ChangeLog: > > * g++.dg/cpp0x/noexcept69.C: New test. > * g++.dg/parse/saved1.C: Adjust dg-error. > * g++.dg/template/crash50.C: Likewise. > --- > gcc/cp/parser.c | 6 ++---- > gcc/testsuite/g++.dg/cpp0x/noexcept69.C | 12 ++++++++++++ > gcc/testsuite/g++.dg/parse/saved1.C | 4 ++-- > gcc/testsuite/g++.dg/template/crash50.C | 2 +- > 4 files changed, 17 insertions(+), 7 deletions(-) > create mode 100644 gcc/testsuite/g++.dg/cpp0x/noexcept69.C > > diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c > index 096580e7e50..02daa7a6f6a 100644 > --- a/gcc/cp/parser.c > +++ b/gcc/cp/parser.c > @@ -22170,12 +22170,10 @@ cp_parser_declarator (cp_parser* parser, > cp_parser_parse_tentatively (parser); > > /* Parse the dependent declarator. */ > - declarator = cp_parser_declarator (parser, dcl_kind, > - CP_PARSER_FLAGS_NONE, > + declarator = cp_parser_declarator (parser, dcl_kind, flags, > /*ctor_dtor_or_conv_p=*/NULL, > /*parenthesized_p=*/NULL, > - /*member_p=*/false, > - friend_p, /*static_p=*/false); > + member_p, friend_p, static_p); > > /* If we are parsing an abstract-declarator, we must handle the > case where the dependent declarator is absent. */ > diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept69.C b/gcc/testsuite/g++.dg/cpp0x/noexcept69.C > new file mode 100644 > index 00000000000..9b87ba0cafb > --- /dev/null > +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept69.C > @@ -0,0 +1,12 @@ > +// PR c++/100752 > +// { dg-do compile { target c++11 } } > + > +struct S { > + void f() noexcept {} > + S &g() noexcept(noexcept(f())) { f(); return *this; } > +}; > + > +struct X { > + int& f() noexcept(noexcept(i)); > + int i; > +}; > diff --git a/gcc/testsuite/g++.dg/parse/saved1.C b/gcc/testsuite/g++.dg/parse/saved1.C > index 979a05676d2..1deaa93f516 100644 > --- a/gcc/testsuite/g++.dg/parse/saved1.C > +++ b/gcc/testsuite/g++.dg/parse/saved1.C > @@ -1,7 +1,7 @@ > // Test that the parser doesn't go into an infinite loop from ignoring the > // PRE_PARSED_FUNCTION_DECL token. > > -class C { static void* operator new(size_t); }; // { dg-error "24:declaration of .operator new. as non-function" } > -// { dg-error "expected|ISO C\\+\\+ forbids" "" { target *-*-* } .-1 } > +class C { static void* operator new(size_t); }; // { dg-error "37:.size_t. has not been declared" } > +// { dg-error ".operator new. takes type .size_t." "" { target *-*-* } .-1 } > void* C::operator new(size_t) { return 0; } // { dg-error "" } > class D { D(int i): integer(i){}}; // { dg-error "" } > diff --git a/gcc/testsuite/g++.dg/template/crash50.C b/gcc/testsuite/g++.dg/template/crash50.C > index 286685ac838..4b846cdabc8 100644 > --- a/gcc/testsuite/g++.dg/template/crash50.C > +++ b/gcc/testsuite/g++.dg/template/crash50.C > @@ -3,5 +3,5 @@ > > struct A > { > - template void* foo(; // { dg-error "primary-expression|initialization|static|template" } > + template void* foo(; // { dg-error "expected|initialization|static|template" } > }; > > base-commit: 74ebd1297e9cfa9f7d05bfcac5510d4968cc6ba8 >