re PR c++/54777 ([C++11] Comma operator in constexpr environment can cause ICE)

PR c++/54777
	* semantics.c (cxx_eval_constant_expression) <case COMPOUND_EXPR>: If
	not ignoring the second operand, pass the original second operand
	and not one with stripped nops to cxx_eval_constant_expression.

	* g++.dg/cpp0x/constexpr-ref4.C: New test.

From-SVN: r192037
This commit is contained in:
Jakub Jelinek 2012-10-03 16:27:30 +02:00 committed by Jakub Jelinek
parent 4a6385468b
commit 5903784808
4 changed files with 31 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2012-10-03 Jakub Jelinek <jakub@redhat.com>
PR c++/54777
* semantics.c (cxx_eval_constant_expression) <case COMPOUND_EXPR>: If
not ignoring the second operand, pass the original second operand
and not one with stripped nops to cxx_eval_constant_expression.
2012-09-20 Release Manager
* GCC 4.7.2 released.

View File

@ -7682,6 +7682,7 @@ cxx_eval_constant_expression (const constexpr_call *call, tree t,
/* Check that the LHS is constant and then discard it. */
cxx_eval_constant_expression (call, op0, allow_non_constant,
false, non_constant_p);
op1 = TREE_OPERAND (t, 1);
r = cxx_eval_constant_expression (call, op1, allow_non_constant,
addr, non_constant_p);
}

View File

@ -1,3 +1,8 @@
2012-10-03 Jakub Jelinek <jakub@redhat.com>
PR c++/54777
* g++.dg/cpp0x/constexpr-ref4.C: New test.
2012-09-30 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR target/54083

View File

@ -0,0 +1,18 @@
// PR c++/54777
// { dg-options -std=c++0x }
struct S
{
int s[1];
constexpr const int &foo (unsigned i) { return (i < 1 ? 0 : throw 1), s[i]; }
constexpr const int &bar (unsigned i) { return i < 1 ? s[i] : (throw 0, s[i]); }
};
int
main ()
{
constexpr S a {};
constexpr int i = a.foo (0);
constexpr int j = a.bar (0);
static_assert (i == j, "Ouch");
}