diff mbox series

[C++] PR 85070 ("[8/9 Regression] ICE on C++ code: in lazily_declare_fn, at cp/method.c:2409")

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

Commit Message

Paolo Carlini Sept. 24, 2018, 10:48 a.m. UTC
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.

Thanks, Paolo.

///////////////////
/cp
2018-09-24  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/85070
	* method.c (lazily_declare_fn): During error-recovery add_method
	may return false.

/testsuite
2018-09-24  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/85070
	* g++.dg/cpp0x/pr85070.C: New.

Comments

Nathan Sidwell Sept. 24, 2018, 3:20 p.m. UTC | #1
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
Jakub Jelinek Oct. 11, 2018, 5:59 p.m. UTC | #2
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
Paolo Carlini Oct. 11, 2018, 6:22 p.m. UTC | #3
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.
Jason Merrill Oct. 11, 2018, 6:33 p.m. UTC | #4
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
diff mbox series

Patch

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 };