Message ID | 5bbe72a0-c9c7-4d62-c5b2-74fe5d9098f9@oracle.com |
---|---|
State | New |
Headers | show |
Series | [C++] PR 85070 ("[8/9 Regression] ICE on C++ code: in lazily_declare_fn, at cp/method.c:2409") | expand |
On 9/24/18 3:48 AM, Paolo Carlini wrote: > Hi, > > as explained in the audit trail, the gcc_assert added by Nathan triggers > during error-recovery too, when add_method correctly returns false > because it failed to add the method. Thus it seems that we should simply > loosen a bit the assertion. Tested x86_64-linux. ok
On Mon, Sep 24, 2018 at 12:48:56PM +0200, Paolo Carlini wrote: > as explained in the audit trail, the gcc_assert added by Nathan triggers > during error-recovery too, when add_method correctly returns false because > it failed to add the method. Thus it seems that we should simply loosen a > bit the assertion. Tested x86_64-linux. Testcase fails with check-c++-all: FAIL: g++.dg/cpp0x/pr85070.C -std=c++17 (test for excess errors) FAIL: g++.dg/cpp0x/pr85070.C -std=c++2a (test for excess errors) FAIL: g++.dg/cpp0x/pr85070.C -std=c++17 -fconcepts (test for excess errors) Any reason why you've used c++14_only effective target, rather than c++14? If I use the latter, i.e. expect c++17/2a/17 + concepts to behave like c++14 in this case, there are no failures. Tested with make check-c++-all RUNTESTFLAGS=dg.exp=pr85070.C, ok for trunk? 2018-10-11 Jakub Jelinek <jakub@redhat.com> PR c++/85070 * g++.dg/cpp0x/pr85070.C: Change effective target for diagnostics from c++14_only to c++14. --- gcc/testsuite/g++.dg/cpp0x/pr85070.C.jj 2018-09-25 15:14:43.205270858 +0200 +++ gcc/testsuite/g++.dg/cpp0x/pr85070.C 2018-10-11 19:55:17.795180058 +0200 @@ -4,10 +4,10 @@ struct A; struct B { - constexpr A & operator= (const A &); // { dg-warning "used" "" { target c++14_only } } + constexpr A & operator= (const A &); // { dg-warning "used" "" { target c++14 } } }; -struct A : B // { dg-error "cannot be overloaded" "" { target c++14_only } } +struct A : B // { dg-error "cannot be overloaded" "" { target c++14 } } { using B::operator=; } a { a = a }; Jakub
Hi, On 11/10/18 19:59, Jakub Jelinek wrote: > On Mon, Sep 24, 2018 at 12:48:56PM +0200, Paolo Carlini wrote: >> as explained in the audit trail, the gcc_assert added by Nathan triggers >> during error-recovery too, when add_method correctly returns false because >> it failed to add the method. Thus it seems that we should simply loosen a >> bit the assertion. Tested x86_64-linux. > Testcase fails with check-c++-all: > FAIL: g++.dg/cpp0x/pr85070.C -std=c++17 (test for excess errors) > FAIL: g++.dg/cpp0x/pr85070.C -std=c++2a (test for excess errors) > FAIL: g++.dg/cpp0x/pr85070.C -std=c++17 -fconcepts (test for excess errors) Ah, sorry, it's because I tested with check-c++. > Any reason why you've used c++14_only effective target, rather than c++14? > If I use the latter, i.e. expect c++17/2a/17 + concepts to behave like c++14 > in this case, there are no failures. Not that I can remember now... I was working on some other issues too... Paolo.
OK. On Thu, Oct 11, 2018 at 1:59 PM Jakub Jelinek <jakub@redhat.com> wrote: > > On Mon, Sep 24, 2018 at 12:48:56PM +0200, Paolo Carlini wrote: > > as explained in the audit trail, the gcc_assert added by Nathan triggers > > during error-recovery too, when add_method correctly returns false because > > it failed to add the method. Thus it seems that we should simply loosen a > > bit the assertion. Tested x86_64-linux. > > Testcase fails with check-c++-all: > FAIL: g++.dg/cpp0x/pr85070.C -std=c++17 (test for excess errors) > FAIL: g++.dg/cpp0x/pr85070.C -std=c++2a (test for excess errors) > FAIL: g++.dg/cpp0x/pr85070.C -std=c++17 -fconcepts (test for excess errors) > > Any reason why you've used c++14_only effective target, rather than c++14? > If I use the latter, i.e. expect c++17/2a/17 + concepts to behave like c++14 > in this case, there are no failures. > > Tested with make check-c++-all RUNTESTFLAGS=dg.exp=pr85070.C, ok for trunk? > > 2018-10-11 Jakub Jelinek <jakub@redhat.com> > > PR c++/85070 > * g++.dg/cpp0x/pr85070.C: Change effective target for diagnostics from > c++14_only to c++14. > > --- gcc/testsuite/g++.dg/cpp0x/pr85070.C.jj 2018-09-25 15:14:43.205270858 +0200 > +++ gcc/testsuite/g++.dg/cpp0x/pr85070.C 2018-10-11 19:55:17.795180058 +0200 > @@ -4,10 +4,10 @@ struct A; > > struct B > { > - constexpr A & operator= (const A &); // { dg-warning "used" "" { target c++14_only } } > + constexpr A & operator= (const A &); // { dg-warning "used" "" { target c++14 } } > }; > > -struct A : B // { dg-error "cannot be overloaded" "" { target c++14_only } } > +struct A : B // { dg-error "cannot be overloaded" "" { target c++14 } } > { > using B::operator=; > } a { a = a }; > > > Jakub
Index: cp/method.c =================================================================== --- cp/method.c (revision 264524) +++ cp/method.c (working copy) @@ -2421,7 +2421,7 @@ lazily_declare_fn (special_function_kind sfk, tree /* Add it to the class */ bool added = add_method (type, fn, false); - gcc_assert (added); + gcc_assert (added || errorcount); /* Add it to TYPE_FIELDS. */ if (sfk == sfk_destructor Index: testsuite/g++.dg/cpp0x/pr85070.C =================================================================== --- testsuite/g++.dg/cpp0x/pr85070.C (nonexistent) +++ testsuite/g++.dg/cpp0x/pr85070.C (working copy) @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } + +struct A; + +struct B +{ + constexpr A & operator= (const A &); // { dg-warning "used" "" { target c++14_only } } +}; + +struct A : B // { dg-error "cannot be overloaded" "" { target c++14_only } } +{ + using B::operator=; +} a { a = a };