This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] PR c++/51462 - ICE in cx_check_missing_mem_inits
- From: Dodji Seketeli <dodji at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 16 Dec 2011 20:19:57 +0100
- Subject: Re: [PATCH] PR c++/51462 - ICE in cx_check_missing_mem_inits
- References: <m3aa6sxyfh.fsf@redhat.com> <4EEB8D71.8030707@redhat.com>
Jason Merrill <jason@redhat.com> writes:
> On 12/16/2011 11:40 AM, Dodji Seketeli wrote:
>> /* It's OK to skip a member with a trivial constexpr ctor.
>> A constexpr ctor that isn't trivial should have been
>> added in by now. */
>> gcc_checking_assert (!TYPE_HAS_COMPLEX_DFLT (ftype));
>>
>> If you think I am trying too hard, maybe I could just get out early
>> from register_constexpr_fundef if errorcount is non-zero?
>
> Let's just check errorcount in this assert.
OK, I am currently testing the patch below.
>
>> [1]: By the way, I am just curious, why using gcc_checking_assert
>> instead of just gcc_assert?
>
> In general, I think it makes sense to use gcc_checking_assert for
> checks that either are expensive, or check conditions that aren't
> really problematic to deal with if they do occur. But I haven't been
> particularly methodical about using one or the other.
I see. Thanks.
gcc/cp/
PR c++/51462
* semantics.c (cx_check_missing_mem_inits): Don't assert in case
of error.
gcc/testsuite/
PR c++/51462
* g++.dg/cpp0x/constexpr-99.C: New test.
---
gcc/cp/semantics.c | 3 ++-
gcc/testsuite/g++.dg/cpp0x/constexpr-99.C | 13 +++++++++++++
2 files changed, 15 insertions(+), 1 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-99.C
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 2f2a26a..f5d34c1 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -6021,7 +6021,8 @@ cx_check_missing_mem_inits (tree fun, tree body, bool complain)
/* It's OK to skip a member with a trivial constexpr ctor.
A constexpr ctor that isn't trivial should have been
added in by now. */
- gcc_checking_assert (!TYPE_HAS_COMPLEX_DFLT (ftype));
+ gcc_checking_assert (!TYPE_HAS_COMPLEX_DFLT (ftype)
+ || errorcount != 0);
continue;
}
error ("uninitialized member %qD in %<constexpr%> constructor",
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-99.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-99.C
new file mode 100644
index 0000000..13a5ea3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-99.C
@@ -0,0 +1,13 @@
+// Origin PR c++/51462
+// { dg-options "-std=c++11" }
+
+struct A
+{
+ int i = 0;
+};
+
+struct B
+{
+ A a;
+ constexpr B() : a(0) {} // { dg-error "no matching function" }
+};
--
1.7.6.4
--
Dodji