[C++ Patch] PR 52599
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
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
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
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
OK. Jason