re PR c++/85363 (Throwing exception from member constructor (brace initializer vs initializer list))
PR c++/85363 * call.c (set_flags_from_callee): Handle AGGR_INIT_EXPRs too. * tree.c (bot_manip): Call set_flags_from_callee for AGGR_INIT_EXPRs too. * g++.dg/cpp0x/initlist-throw1.C: New test. * g++.dg/cpp0x/initlist-throw2.C: New test. From-SVN: r260300
This commit is contained in:
parent
110fb19f6c
commit
0932d398ef
@ -1,3 +1,10 @@
|
||||
2018-05-16 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c++/85363
|
||||
* call.c (set_flags_from_callee): Handle AGGR_INIT_EXPRs too.
|
||||
* tree.c (bot_manip): Call set_flags_from_callee for
|
||||
AGGR_INIT_EXPRs too.
|
||||
|
||||
2018-05-15 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* cp-tree.h (cp_expr): Remove copy constructor.
|
||||
|
@ -319,15 +319,17 @@ build_call_n (tree function, int n, ...)
|
||||
void
|
||||
set_flags_from_callee (tree call)
|
||||
{
|
||||
bool nothrow;
|
||||
tree decl = get_callee_fndecl (call);
|
||||
/* Handle both CALL_EXPRs and AGGR_INIT_EXPRs. */
|
||||
tree decl = cp_get_callee_fndecl_nofold (call);
|
||||
|
||||
/* We check both the decl and the type; a function may be known not to
|
||||
throw without being declared throw(). */
|
||||
nothrow = decl && TREE_NOTHROW (decl);
|
||||
if (CALL_EXPR_FN (call))
|
||||
nothrow |= TYPE_NOTHROW_P (TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (call))));
|
||||
else if (internal_fn_flags (CALL_EXPR_IFN (call)) & ECF_NOTHROW)
|
||||
bool nothrow = decl && TREE_NOTHROW (decl);
|
||||
tree callee = cp_get_callee (call);
|
||||
if (callee)
|
||||
nothrow |= TYPE_NOTHROW_P (TREE_TYPE (TREE_TYPE (callee)));
|
||||
else if (TREE_CODE (call) == CALL_EXPR
|
||||
&& internal_fn_flags (CALL_EXPR_IFN (call)) & ECF_NOTHROW)
|
||||
nothrow = true;
|
||||
|
||||
if (!nothrow && at_function_scope_p () && cfun && cp_function_chain)
|
||||
|
@ -2987,7 +2987,7 @@ bot_manip (tree* tp, int* walk_subtrees, void* data_)
|
||||
|
||||
/* Make a copy of this node. */
|
||||
t = copy_tree_r (tp, walk_subtrees, NULL);
|
||||
if (TREE_CODE (*tp) == CALL_EXPR)
|
||||
if (TREE_CODE (*tp) == CALL_EXPR || TREE_CODE (*tp) == AGGR_INIT_EXPR)
|
||||
set_flags_from_callee (*tp);
|
||||
if (data.clear_location && EXPR_HAS_LOCATION (*tp))
|
||||
SET_EXPR_LOCATION (*tp, input_location);
|
||||
|
@ -1,4 +1,11 @@
|
||||
2018-05-16 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c++/85363
|
||||
* g++.dg/cpp0x/initlist-throw1.C: New test.
|
||||
* g++.dg/cpp0x/initlist-throw2.C: New test.
|
||||
|
||||
2018-05-16 Carl Love <cel@us.ibm.com>
|
||||
|
||||
* gcc.target/powerpc/vsx-vector-6-be.c: Remove file.
|
||||
* gcc.target/powerpc/vsx-vector-6-be.p7.c: New test file.
|
||||
* gcc.target/powerpc/vsx-vector-6-be.p8.c: New test file.
|
||||
|
29
gcc/testsuite/g++.dg/cpp0x/initlist-throw1.C
Normal file
29
gcc/testsuite/g++.dg/cpp0x/initlist-throw1.C
Normal file
@ -0,0 +1,29 @@
|
||||
// PR c++/85363
|
||||
// { dg-do run { target c++11 } }
|
||||
|
||||
int
|
||||
init (int f)
|
||||
{
|
||||
throw f;
|
||||
}
|
||||
|
||||
struct X {
|
||||
X (int f) : n {init (f)} {}
|
||||
int n;
|
||||
};
|
||||
|
||||
struct P {
|
||||
X x{20};
|
||||
};
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
try {
|
||||
P p {};
|
||||
}
|
||||
catch (int n) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
33
gcc/testsuite/g++.dg/cpp0x/initlist-throw2.C
Normal file
33
gcc/testsuite/g++.dg/cpp0x/initlist-throw2.C
Normal file
@ -0,0 +1,33 @@
|
||||
// PR c++/85363
|
||||
// { dg-do run { target c++11 } }
|
||||
|
||||
int
|
||||
init (int f)
|
||||
{
|
||||
throw f;
|
||||
}
|
||||
|
||||
struct X {
|
||||
X () : n {init (42)} {}
|
||||
int n;
|
||||
};
|
||||
|
||||
struct P {
|
||||
struct R {
|
||||
struct Q {
|
||||
X x = {};
|
||||
} q;
|
||||
} r;
|
||||
};
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
try {
|
||||
P p {};
|
||||
}
|
||||
catch (int n) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
Loading…
Reference in New Issue
Block a user