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 [216.205.24.124]) by sourceware.org (Postfix) with ESMTP id 44E843857C4B for ; Fri, 25 Jun 2021 20:42:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 44E843857C4B Received: from mail-qk1-f199.google.com (mail-qk1-f199.google.com [209.85.222.199]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-271-_l19ju3FPTqrxbmwh2yFWQ-1; Fri, 25 Jun 2021 16:42:39 -0400 X-MC-Unique: _l19ju3FPTqrxbmwh2yFWQ-1 Received: by mail-qk1-f199.google.com with SMTP id y5-20020a37af050000b02903a9c3f8b89fso10974526qke.2 for ; Fri, 25 Jun 2021 13:42:39 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=s23/l9j1Xrp6k7VXbFyg+Q8iiVGrKVwFw/SLZs3Bow4=; b=ME2C1uPhRBVPiV9TRiT6577H2rEVJUUYfNGEEKfMJqCDOAP+it2bcXZGTBliDpcS8Q mIVXwk6vM1vb1TXec1ySCXjwhEpe0urn4yypc6Pcwd67YaWyOFTbNfCvLej/wU1XfqIn XgCTiPyQ7OMZdK5dzqNfy48uoMzVtDiftnozv+ufsoVpfgYmnYZZiwtKzfr8XV5DZUfm UBBZVWQl1d00p8sTmfJHOM4X8eeeie7VYs3Vk2aedM2PQn8mzLFzFDM1BjCC/73Hjruo ZwDHpbcl7d7ALd69mmGEC+AKQ3TCeHtxWphY+1q1ARCPRa8r/MO6F4QC425FtOG90biN wuSg== X-Gm-Message-State: AOAM531muLKrBiYYM7yZ105TXxKTpyza+YVMmTMcUDpJb0Un5ZHc8+pR XlAX9N8v+7bakZqWQYjWoRzaNvWRoVG3E6xgvmSg4/roICl58UgZjSm7A+hjhxOLxGnACXmLlJU Alln+0SMtaLklgYJIXA== X-Received: by 2002:a37:7d06:: with SMTP id y6mr3612418qkc.248.1624653759256; Fri, 25 Jun 2021 13:42:39 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz05XAgiWDOyCrDTeS0bOYG5nLdhjwzqifUH8sN6lmcHwQzS4Ah+kFEJfMuugOiw9QfTZryuA== X-Received: by 2002:a37:7d06:: with SMTP id y6mr3612392qkc.248.1624653758966; Fri, 25 Jun 2021 13:42:38 -0700 (PDT) Received: from redhat.com ([2601:184:4780:4310::8e66]) by smtp.gmail.com with ESMTPSA id h17sm4247462qtk.23.2021.06.25.13.42.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Jun 2021 13:42:38 -0700 (PDT) Date: Fri, 25 Jun 2021 16:42:36 -0400 From: Marek Polacek To: Jason Merrill Cc: GCC Patches Subject: Re: [PATCH v2] c++: Failure to delay noexcept parsing with ptr-operator [PR100752] Message-ID: References: <20210609002523.1256033-1-polacek@redhat.com> <86ff3105-f6a0-8d9c-06f2-5c2b63c2efb9@redhat.com> MIME-Version: 1.0 In-Reply-To: User-Agent: Mutt/2.0.7 (2021-05-04) X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-13.0 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, 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:42:42 -0000 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? -- >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 -- 2.31.1