Commit 75e0295b by Marek Polacek Committed by Marek Polacek

re PR c++/65202 (ICE segfault with constexpr/noexcept)

	PR c++/65202
	* constexpr.c (cxx_eval_constant_expression): Don't evaluate
	a RETURN_EXPR if its operand is null.

	* g++.dg/cpp1y/pr65202.C: New test.

From-SVN: r221015
parent 491080f4
2015-02-26 Marek Polacek <polacek@redhat.com>
PR c++/65202
* constexpr.c (cxx_eval_constant_expression): Don't evaluate
a RETURN_EXPR if its operand is null.
2015-02-25 Jason Merrill <jason@redhat.com>
PR c++/65209
......
......@@ -3113,9 +3113,10 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
break;
case RETURN_EXPR:
r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
lval,
non_constant_p, overflow_p);
if (TREE_OPERAND (t, 0) != NULL_TREE)
r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
lval,
non_constant_p, overflow_p);
*jump_target = t;
break;
......
2015-02-26 Marek Polacek <polacek@redhat.com>
PR c++/65202
* g++.dg/cpp1y/pr65202.C: New test.
2015-02-26 Tom de Vries <tom@codesourcery.com>
* g++.dg/gcov/gcov-14.C: Add cleanup of iostream.gcov, ostream.gcov and
......
// // PR c++/65202
// { dg-do compile { target c++14 } }
template <typename T> struct is_move_constructible;
template <typename T> struct is_move_assignable;
template <int, typename T> using enable_if_t = int;
namespace adl {
template <
typename L, typename R,
enable_if_t<is_move_constructible<L>() && is_move_assignable<L>(), int>...>
constexpr auto adl_swap(L &l, R &r) -> decltype(swap(l, r)) {
return;
}
template <typename L, typename R>
auto swap(L &l, R &r) noexcept(noexcept(adl::adl_swap(l, r)))
-> decltype(adl::adl_swap(l, r));
namespace ns {
template <typename T> struct foo {};
template <typename T> void swap(foo<T> &, foo<T> &);
struct bar;
int main()
{
foo<ns::bar> f;
adl::swap(f, f)
} // { dg-error "" }
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