Commit 3f8e2835 by Jason Merrill Committed by Jason Merrill

re PR c++/65896 (Erroneous uninitialized variable access error in constexpr…

re PR c++/65896 (Erroneous uninitialized variable access error in constexpr function with temporary variables)

	PR c++/65896
	* constexpr.c (cxx_eval_store_expression): Don't try to actually
	store an empty class.

From-SVN: r222549
parent db611306
2015-04-28 Jason Merrill <jason@redhat.com>
PR c++/65896
* constexpr.c (cxx_eval_store_expression): Don't try to actually
store an empty class.
PR c++/65656
* constexpr.c (cxx_eval_builtin_function_call): Fix
__builtin_constant_p.
......
......@@ -2580,12 +2580,25 @@ cxx_eval_store_expression (const constexpr_ctx *ctx, tree t,
/* First we figure out where we're storing to. */
tree target = TREE_OPERAND (t, 0);
tree type = TREE_TYPE (target);
target = cxx_eval_constant_expression (ctx, target,
true,
non_constant_p, overflow_p);
if (*non_constant_p)
return t;
if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (target), type))
{
/* For initialization of an empty base, the original target will be
*(base*)this, which the above evaluation resolves to the object
argument, which has the derived type rather than the base type. In
this situation, just evaluate the initializer and return, since
there's no actual data to store. */
gcc_assert (is_empty_class (type));
return cxx_eval_constant_expression (ctx, init, false,
non_constant_p, overflow_p);
}
/* And then find the underlying variable. */
vec<tree,va_gc> *refs = make_tree_vector();
tree object = NULL_TREE;
......@@ -2622,7 +2635,7 @@ cxx_eval_store_expression (const constexpr_ctx *ctx, tree t,
*non_constant_p = true;
return t;
}
tree type = TREE_TYPE (object);
type = TREE_TYPE (object);
while (!refs->is_empty())
{
if (*valp == NULL_TREE)
......
// PR c++/65896
// { dg-do compile { target c++11 } }
struct base {};
struct derived : base {
constexpr derived():
base{},
m_value(0) {
}
int m_value;
};
constexpr int by_ref(derived && value) {
return value.m_value;
}
constexpr int value = by_ref(derived{});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment