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: r192036
This commit is contained in:
Jakub Jelinek 2012-10-03 16:21:20 +02:00 committed by Jakub Jelinek
parent 2352eadb81
commit 75ab707c75
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-10-01 Jason Merrill <jason@redhat.com>
* decl.c (check_initializer): Set DECL_NONTRIVIALLY_INITIALIZED_P

View File

@ -7740,6 +7740,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-10-02 Janus Weil <janus@gcc.gnu.org>
PR fortran/54778

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");
}