This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] PR c++/51462 - ICE in cx_check_missing_mem_inits


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]