Commit f5a8677b by Jason Merrill Committed by Jason Merrill

re PR c++/67557 (Calling copy constructor of base class in constructor of…

re PR c++/67557 (Calling copy constructor of base class in constructor of derived class produces crashing code)

	PR c++/67557

	* expr.c (store_field): Call store_constructor directly when
	storing a CONSTRUCTOR into a target smaller than its type.
	Guard against unsafe bitwise copy.

From-SVN: r228704
parent 5330a79d
2015-10-11 Jason Merrill <jason@redhat.com>
PR c++/67557
* expr.c (store_field): Call store_constructor directly when
storing a CONSTRUCTOR into a target smaller than its type.
Guard against unsafe bitwise copy.
2015-10-11 Jan Hubicka <hubicka@ucw.cz> 2015-10-11 Jan Hubicka <hubicka@ucw.cz>
* cgraphbuild.c (compute_call_stmt_bb_frequency): Use * cgraphbuild.c (compute_call_stmt_bb_frequency): Use
...@@ -6616,7 +6616,11 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, ...@@ -6616,7 +6616,11 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos,
operations. */ operations. */
|| (bitsize >= 0 || (bitsize >= 0
&& TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST
&& compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)), bitsize) != 0) && compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)), bitsize) != 0
/* Except for initialization of full bytes from a CONSTRUCTOR, which
we will handle specially below. */
&& !(TREE_CODE (exp) == CONSTRUCTOR
&& bitsize % BITS_PER_UNIT == 0))
/* If we are expanding a MEM_REF of a non-BLKmode non-addressable /* If we are expanding a MEM_REF of a non-BLKmode non-addressable
decl we must use bitfield operations. */ decl we must use bitfield operations. */
|| (bitsize >= 0 || (bitsize >= 0
...@@ -6629,6 +6633,9 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, ...@@ -6629,6 +6633,9 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos,
rtx temp; rtx temp;
gimple *nop_def; gimple *nop_def;
/* Using bitwise copy is not safe for TREE_ADDRESSABLE types. */
gcc_assert (!TREE_ADDRESSABLE (TREE_TYPE (exp)));
/* If EXP is a NOP_EXPR of precision less than its mode, then that /* If EXP is a NOP_EXPR of precision less than its mode, then that
implies a mask operation. If the precision is the same size as implies a mask operation. If the precision is the same size as
the field we're storing into, that mask is redundant. This is the field we're storing into, that mask is redundant. This is
...@@ -6743,6 +6750,15 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, ...@@ -6743,6 +6750,15 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos,
if (!MEM_KEEP_ALIAS_SET_P (to_rtx) && MEM_ALIAS_SET (to_rtx) != 0) if (!MEM_KEEP_ALIAS_SET_P (to_rtx) && MEM_ALIAS_SET (to_rtx) != 0)
set_mem_alias_set (to_rtx, alias_set); set_mem_alias_set (to_rtx, alias_set);
/* Above we avoided using bitfield operations for storing a CONSTRUCTOR
into a target smaller than its type; handle that case now. */
if (TREE_CODE (exp) == CONSTRUCTOR && bitsize >= 0)
{
gcc_assert (bitsize % BITS_PER_UNIT == 0);
store_constructor (exp, to_rtx, 0, bitsize/BITS_PER_UNIT);
return to_rtx;
}
return store_expr (exp, to_rtx, 0, nontemporal); return store_expr (exp, to_rtx, 0, nontemporal);
} }
} }
......
// PR c++/50618 // PR c++/50618
// { dg-options "-fdump-rtl-expand" }
// { dg-do run } // { dg-do run }
struct Base struct Base
...@@ -37,3 +38,8 @@ int main(int, char**) ...@@ -37,3 +38,8 @@ int main(int, char**)
Diamond x(2); Diamond x(2);
x.printText(); x.printText();
} }
// Verify that the SubB() mem-initializer is storing 0 directly into
// this->D.whatever rather than into a stack temp that is then copied into the
// base field.
// { dg-final { scan-rtl-dump "set \[^\n\]*\n\[^\n\]*this\[^\n\]*\n\[^\n\]*const_int 0" "expand" } }
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