[C++ Patch] PR 52599

2012-04-17 Thread Paolo Carlini

Hi,

in order to avoid this ICE on invalid, I think it makes sense to 
explicitly check for try-block in massage_constexpr_body, since 7.1.5/4 
explicitly rules out for constexpr constructors such function-body.


Tested x86_64-linux.

Thanks,
Paolo.

///
/cp
2012-04-17  Paolo Carlini  paolo.carl...@oracle.com

PR c++/52599
* semantics.c (massage_constexpr_body): Check for function-try-block
as constructor function-body.

/testsuite
2012-04-17  Paolo Carlini  paolo.carl...@oracle.com

PR c++/52599
* g++.dg/cpp0x/constexpr-ctor10.C: New.
Index: testsuite/g++.dg/cpp0x/constexpr-ctor10.C
===
--- testsuite/g++.dg/cpp0x/constexpr-ctor10.C   (revision 0)
+++ testsuite/g++.dg/cpp0x/constexpr-ctor10.C   (revision 0)
@@ -0,0 +1,6 @@
+// PR c++/52599
+// { dg-options -std=c++11 }
+
+struct foo {
+  constexpr foo() try { } catch(...) { };  // { dg-error constructor }
+};
Index: cp/semantics.c
===
--- cp/semantics.c  (revision 186523)
+++ cp/semantics.c  (working copy)
@@ -6001,8 +6001,18 @@ static tree
 massage_constexpr_body (tree fun, tree body)
 {
   if (DECL_CONSTRUCTOR_P (fun))
-body = build_constexpr_constructor_member_initializers
-  (DECL_CONTEXT (fun), body);
+{
+  if (TREE_CODE (body) == BIND_EXPR
+  TREE_CODE (BIND_EXPR_BODY (body)) == TRY_BLOCK)
+   {
+ error (body of %constexpr% constructor cannot be a 
+function-try-block);
+ return error_mark_node;
+   }
+
+  body = build_constexpr_constructor_member_initializers
+   (DECL_CONTEXT (fun), body);
+}
   else
 {
   if (TREE_CODE (body) == EH_SPEC_BLOCK)


Re: [C++ Patch] PR 52599

2012-04-17 Thread Jason Merrill
I think build_constexpr_constructor_member_initializers is a better 
place for that check, since it's already looking at the tree structure.


Jason


Re: [C++ Patch] PR 52599

2012-04-17 Thread Paolo Carlini

Hi,
I think build_constexpr_constructor_member_initializers is a better 
place for that check, since it's already looking at the tree structure.

Indeed. I'm finishing testing the below. Ok if it passes?

Thanks,
Paolo.


/cp
2012-04-17  Paolo Carlini  paolo.carl...@oracle.com

PR c++/52599
* semantics.c (build_constexpr_constructor_member_initializers):
Check for function-try-block as function-body.

/testsuite
2012-04-17  Paolo Carlini  paolo.carl...@oracle.com

PR c++/52599
* g++.dg/cpp0x/constexpr-ctor10.C: New.
Index: testsuite/g++.dg/cpp0x/constexpr-ctor10.C
===
--- testsuite/g++.dg/cpp0x/constexpr-ctor10.C   (revision 0)
+++ testsuite/g++.dg/cpp0x/constexpr-ctor10.C   (revision 0)
@@ -0,0 +1,6 @@
+// PR c++/52599
+// { dg-options -std=c++11 }
+
+struct foo {
+  constexpr foo() try { } catch(...) { };  // { dg-error constructor }
+};
Index: cp/semantics.c
===
--- cp/semantics.c  (revision 186523)
+++ cp/semantics.c  (working copy)
@@ -5921,6 +5921,8 @@ build_constexpr_constructor_member_initializers (t
break;
}
 }
+  else if (TREE_CODE (body) == TRY_BLOCK)
+error (body of %constexpr% constructor cannot be a function-try-block);
   else if (EXPR_P (body))
 ok = build_data_member_initialization (body, vec);
   else


Re: [C++ Patch] PR 52599

2012-04-17 Thread Paolo Carlini

On 04/17/2012 05:35 PM, Paolo Carlini wrote:

Hi,
I think build_constexpr_constructor_member_initializers is a better 
place for that check, since it's already looking at the tree structure.

Indeed. I'm finishing testing the below. Ok if it passes?
... uhm, actually like this seems more correct to me, I'm testing this 
variant instead. Sorry.


Paolo.

///
Index: testsuite/g++.dg/cpp0x/constexpr-ctor10.C
===
--- testsuite/g++.dg/cpp0x/constexpr-ctor10.C   (revision 0)
+++ testsuite/g++.dg/cpp0x/constexpr-ctor10.C   (revision 0)
@@ -0,0 +1,6 @@
+// PR c++/52599
+// { dg-options -std=c++11 }
+
+struct foo {
+  constexpr foo() try { } catch(...) { };  // { dg-error constructor }
+};
Index: cp/semantics.c
===
--- cp/semantics.c  (revision 186523)
+++ cp/semantics.c  (working copy)
@@ -5921,6 +5921,12 @@ build_constexpr_constructor_member_initializers (t
break;
}
 }
+  else if (TREE_CODE (body) == TRY_BLOCK)
+{
+  error (body of %constexpr% constructor cannot be 
+a function-try-block);
+  return error_mark_node;
+}
   else if (EXPR_P (body))
 ok = build_data_member_initialization (body, vec);
   else


Re: [C++ Patch] PR 52599

2012-04-17 Thread Jason Merrill

OK.

Jason