Commit 04bbdb1d by Paolo Carlini Committed by Paolo Carlini

re PR c++/53025 ([C++11] noexcept operator depends on copy-elision)

/cp
2014-10-02  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/53025
	* cp-tree.h (struct saved_scope): Add noexcept_operand.
	(cp_noexcept_operand): Define.
	* call.c (build_over_call): Use it.
	* parser.c (cp_parser_unary_expression, [RID_NOEXCEPT]): Likewise.
	* pt.c (tsubst_copy_and_build, [NOEXCEPT_EXPR]): Likewise.

/testsuite
2014-10-02  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/53025
	* g++.dg/cpp0x/noexcept23.C: New.
	* g++.dg/cpp0x/noexcept24.C: Likewise.

From-SVN: r215813
parent a3ac63c4
2014-10-02 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/53025
* cp-tree.h (struct saved_scope): Add noexcept_operand.
(cp_noexcept_operand): Define.
* call.c (build_over_call): Use it.
* parser.c (cp_parser_unary_expression, [RID_NOEXCEPT]): Likewise.
* pt.c (tsubst_copy_and_build, [NOEXCEPT_EXPR]): Likewise.
2014-10-01 Jason Merrill <jason@redhat.com>
PR c++/63362
......
......@@ -7251,7 +7251,11 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
/* Do things the hard way. */;
else if (cand->num_convs == 1
&& (DECL_COPY_CONSTRUCTOR_P (fn)
|| DECL_MOVE_CONSTRUCTOR_P (fn)))
|| DECL_MOVE_CONSTRUCTOR_P (fn))
/* It's unsafe to elide the constructor when handling
a noexcept-expression, it may evaluate to the wrong
value (c++/53025). */
&& cp_noexcept_operand == 0)
{
tree targ;
tree arg = argarray[num_artificial_parms_for (fn)];
......
......@@ -1058,6 +1058,7 @@ struct GTY(()) saved_scope {
int unevaluated_operand;
int inhibit_evaluation_warnings;
int noexcept_operand;
/* If non-zero, implicit "omp declare target" attribute is added into the
attribute lists. */
int omp_declare_target_attribute;
......@@ -1124,6 +1125,10 @@ struct GTY(()) saved_scope {
#define local_specializations scope_chain->x_local_specializations
/* Nonzero if we are parsing the operand of a noexcept operator. */
#define cp_noexcept_operand scope_chain->noexcept_operand
/* A list of private types mentioned, for deferred access checking. */
extern GTY(()) struct saved_scope *scope_chain;
......
......@@ -7156,7 +7156,9 @@ cp_parser_unary_expression (cp_parser *parser, bool address_p, bool cast_p,
++cp_unevaluated_operand;
++c_inhibit_evaluation_warnings;
++cp_noexcept_operand;
expr = cp_parser_expression (parser);
--cp_noexcept_operand;
--c_inhibit_evaluation_warnings;
--cp_unevaluated_operand;
......
......@@ -14769,11 +14769,13 @@ tsubst_copy_and_build (tree t,
op1 = TREE_OPERAND (t, 0);
++cp_unevaluated_operand;
++c_inhibit_evaluation_warnings;
++cp_noexcept_operand;
op1 = tsubst_copy_and_build (op1, args, complain, in_decl,
/*function_p=*/false,
/*integral_constant_expression_p=*/false);
--cp_unevaluated_operand;
--c_inhibit_evaluation_warnings;
--cp_noexcept_operand;
RETURN (finish_noexcept_expr (op1, complain));
case MODOP_EXPR:
......
2014-10-02 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/53025
* g++.dg/cpp0x/noexcept23.C: New.
* g++.dg/cpp0x/noexcept24.C: Likewise.
2014-10-02 Marek Polacek <polacek@redhat.com>
* gcc.dg/noncompile/20020130-1.c: Use -std=gnu89.
......
// PR c++/53025
// { dg-do compile { target c++11 } }
struct A {
A() noexcept {}
A(const A&) noexcept(false) {}
};
void a(A) noexcept {}
void f()
{
static_assert(!noexcept(a(A{})), "");
}
// PR c++/53025
// { dg-do compile { target c++11 } }
template<typename T>
struct A {
A() noexcept {}
A(const A&) noexcept(false) {}
};
template<typename T>
void a(A<T>) noexcept {}
template<typename T>
void f()
{
static_assert(!noexcept(a(A<T>{})), "");
}
void g()
{
f<int>();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment