re PR c++/55993 ([C++11] derived-to-base conversion fails in constant expression)

PR c++/55993
	* semantics.c (cxx_fold_indirect_ref): Handle empty bases at
	non-zero offsets, too.

From-SVN: r196023
This commit is contained in:
Jason Merrill 2013-02-13 12:56:28 -05:00 committed by Jason Merrill
parent d0d9cf0ebf
commit 58b922f813
3 changed files with 24 additions and 0 deletions

View File

@ -1,5 +1,9 @@
2013-02-13 Jason Merrill <jason@redhat.com>
PR c++/55993
* semantics.c (cxx_fold_indirect_ref): Handle empty bases at
non-zero offsets, too.
PR c++/56155
* decl.c (build_enumerator): Always convert the value to a
fixed underlying type.

View File

@ -7448,6 +7448,15 @@ cxx_fold_indirect_ref (location_t loc, tree type, tree op0, bool *empty_base)
return build4_loc (loc, ARRAY_REF, type, op00, op01,
NULL_TREE, NULL_TREE);
}
/* Also handle conversion to an empty base class, which
is represented with a NOP_EXPR. */
else if (is_empty_class (type)
&& CLASS_TYPE_P (op00type)
&& DERIVED_FROM_P (type, op00type))
{
*empty_base = true;
return op00;
}
/* ((foo *)&struct_with_foo_field)[1] => COMPONENT_REF */
else if (RECORD_OR_UNION_TYPE_P (op00type))
{

View File

@ -0,0 +1,11 @@
// PR c++/55993
// { dg-do compile { target c++11 } }
struct A {};
struct B:A {};
struct C:A {};
struct D:B,C {};
constexpr D d {};
constexpr const C& e=d; // OK
constexpr auto f=static_cast<const C&>(d); // FAIL