Commit 0250ba58 by Marek Polacek Committed by Marek Polacek

re PR c++/86767 (continue statements in constexpr functions causes unbounded looping)

	PR c++/86767
	* constexpr.c (cxx_eval_statement_list): Handle continue.

	* g++.dg/cpp1y/constexpr-86767.C: New test.

From-SVN: r263340
parent 5242b3cb
2018-08-06 Marek Polacek <polacek@redhat.com>
PR c++/86767
* constexpr.c (cxx_eval_statement_list): Handle continue.
2018-08-03 David Malcolm <dmalcolm@redhat.com>
Jonathan Wakely <jwakely@redhat.com>
......
......@@ -3950,6 +3950,16 @@ cxx_eval_statement_list (const constexpr_ctx *ctx, tree t,
for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
{
tree stmt = tsi_stmt (i);
/* We've found a continue, so skip everything until we reach
the label its jumping to. */
if (continues (jump_target))
{
if (label_matches (ctx, jump_target, stmt))
/* Found it. */
*jump_target = NULL_TREE;
else
continue;
}
if (TREE_CODE (stmt) == DEBUG_BEGIN_STMT)
continue;
r = cxx_eval_constant_expression (ctx, stmt, false,
......
2018-08-06 Marek Polacek <polacek@redhat.com>
PR c++/86767
* g++.dg/cpp1y/constexpr-86767.C: New test.
2018-08-06 Uros Bizjak <ubizjak@gmail.com>
* g++.dg/torture/pr86763.C (dg-additional-options): Add -lrt
......
// PR c++/86767
// { dg-do compile { target c++14 } }
constexpr int
fn0 () noexcept
{
int r = 0;
for (int i = 0; i < 10; ++i)
{
continue;
r++;
for (int j = 0; j < 10; ++j )
{
}
}
return r;
}
static_assert (fn0 () == 0, "");
constexpr int
fn1 () noexcept
{
int r = 0;
for (int i = 0; i < 10; ++i)
for (int j = 0; j < 10; ++j)
{
continue;
r++;
}
return r;
}
static_assert (fn1 () == 0, "");
constexpr int
fn2 () noexcept
{
int r = 0;
for (int i = 0; i < 10; ++i)
{
continue;
r++;
}
return r;
}
static_assert (fn2 () == 0, "");
constexpr int
fn3 () noexcept
{
int r = 0;
for (int i = 0; i < 10; ++i)
{
continue;
r++;
while (1)
{
}
}
return r;
}
static_assert (fn3 () == 0, "");
constexpr int
fn4 () noexcept
{
for (int i = 0; i < 10; ++i)
{
switch (i)
{
case 5:
return i;
default:
continue;
}
while (1)
{
}
}
return 0;
}
static_assert (fn4 () == 5, "");
constexpr int
fn5 () noexcept
{
for (int i = 0; i < 10; ++i)
{
switch (i)
{
case 0:
case 1:
case 2:
case 3:
case 4:
continue;
default:
return i;
}
while (1)
{
}
}
return 0;
}
static_assert (fn5 () == 5, "");
constexpr int
fn6 () noexcept
{
int r = 0;
for (int i = 0; i < 10; ++i)
{
continue;
for (int j = 0; j < 10; ++j )
r++;
}
return r;
}
static_assert (fn6 () == 0, "");
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