re PR c++/46369 (ICE: unexpected expression '((unsigned char*)&*r)[24]' of kind bit_field_ref)

PR c++/46369
	* semantics.c (cxx_eval_bit_field_ref): New.
	(cxx_eval_constant_expression): Call it.

From-SVN: r166576
This commit is contained in:
Jason Merrill 2010-11-10 19:06:34 -05:00 committed by Jason Merrill
parent a34779030e
commit 4ddf1c7f49
4 changed files with 64 additions and 0 deletions

View file

@ -1,3 +1,9 @@
2010-11-10 Jason Merrill <jason@redhat.com>
PR c++/46369
* semantics.c (cxx_eval_bit_field_ref): New.
(cxx_eval_constant_expression): Call it.
2010-11-10 Joseph Myers <joseph@codesourcery.com>
* cvt.c (cp_convert_to_pointer): Use %' in diagnostic.

View file

@ -6263,6 +6263,45 @@ cxx_eval_component_reference (const constexpr_call *call, tree t,
return error_mark_node;
}
/* Subroutine of cxx_eval_constant_expression.
Attempt to reduce a field access of a value of class type that is
expressed as a BIT_FIELD_REF. */
static tree
cxx_eval_bit_field_ref (const constexpr_call *call, tree t,
bool allow_non_constant, bool addr,
bool *non_constant_p)
{
tree orig_whole = TREE_OPERAND (t, 0);
tree whole = cxx_eval_constant_expression (call, orig_whole,
allow_non_constant, addr,
non_constant_p);
tree start, field, value;
unsigned HOST_WIDE_INT i;
if (whole == orig_whole)
return t;
/* Don't VERIFY_CONSTANT here; we only want to check that we got a
CONSTRUCTOR. */
if (!*non_constant_p && TREE_CODE (whole) != CONSTRUCTOR)
{
if (!allow_non_constant)
error ("%qE is not a constant expression", orig_whole);
*non_constant_p = true;
}
if (*non_constant_p)
return t;
start = TREE_OPERAND (t, 2);
FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (whole), i, field, value)
{
if (bit_position (field) == start)
return value;
}
gcc_unreachable();
return error_mark_node;
}
/* Subroutine of cxx_eval_constant_expression.
Evaluate a short-circuited logical expression T in the context
of a given constexpr CALL. BAILOUT_VALUE is the value for
@ -6841,6 +6880,11 @@ cxx_eval_constant_expression (const constexpr_call *call, tree t,
non_constant_p);
break;
case BIT_FIELD_REF:
r = cxx_eval_bit_field_ref (call, t, allow_non_constant, addr,
non_constant_p);
break;
case COND_EXPR:
case VEC_COND_EXPR:
r = cxx_eval_conditional_expression (call, t, allow_non_constant, addr,

View file

@ -1,3 +1,7 @@
2010-11-10 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/constexpr-bitfield.C: New.
2010-11-10 Jakub Jelinek <jakub@redhat.com>
PR debug/46409

View file

@ -0,0 +1,10 @@
// PR c++/46369
// { dg-options -std=c++0x }
struct A
{
unsigned i : 1;
};
constexpr A f() { return { 1 }; }
constexpr bool b = (f().i == 1);