re PR c++/72868 (Constexpr expressions mistreat case ranges)

PR c++/72868
	* constexpr.c (label_matches): Handle case range expressions.

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

From-SVN: r239379
This commit is contained in:
Jakub Jelinek 2016-08-11 17:59:53 +02:00 committed by Jakub Jelinek
parent df7ec09f12
commit 385ed708b2
4 changed files with 43 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2016-08-11 Jakub Jelinek <jakub@redhat.com>
PR c++/72868
* constexpr.c (label_matches): Handle case range expressions.
2016-08-11 Jason Merrill <jason@redhat.com>
PR c++/73456

View File

@ -3448,6 +3448,12 @@ label_matches (tree *jump_target, tree_stmt_iterator i,
{
if (!CASE_LOW (stmt))
default_label = i;
else if (CASE_HIGH (stmt))
{
if (tree_int_cst_le (CASE_LOW (stmt), *jump_target)
&& tree_int_cst_le (*jump_target, CASE_HIGH (stmt)))
return true;
}
else if (tree_int_cst_equal (*jump_target, CASE_LOW (stmt)))
return true;
}

View File

@ -1,3 +1,8 @@
2016-08-11 Jakub Jelinek <jakub@redhat.com>
PR c++/72868
* g++.dg/cpp1y/constexpr-switch4.C: New test.
2015-08-11 H.J. Lu <hongjiu.lu@intel.com>
* gcc.target/i386/pieces-memcpy-1.c: New test.

View File

@ -0,0 +1,27 @@
// PR c++/72868
// { dg-do compile }
// { dg-options "-std=gnu++14" }
constexpr int
foo (int i)
{
switch (i)
{
case 11 ... 12:
return 4;
case 0 ... 9:
return 3;
default:
return 7;
}
}
#define SA(X) static_assert((X),#X)
SA (foo (-1) == 7);
SA (foo (0) == 3);
SA (foo (3) == 3);
SA (foo (9) == 3);
SA (foo (10) == 7);
SA (foo (11) == 4);
SA (foo (12) == 4);
SA (foo (13) == 7);