[Bug c++/70096] [6 Regression] [Invalid codegen] Read of uninitialized value in ref-qualified pointer to member function
ppalka at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Mar 21 17:09:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70096
Patrick Palka <ppalka at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |ppalka at gcc dot gnu.org
--- Comment #3 from Patrick Palka <ppalka at gcc dot gnu.org> ---
The problem ultimately seems to be that the invariant DECL_MODE (x) ==
TYPE_MODE (TREE_TYPE (fptr)) is violated during substitution due to a change in
the TREE_TYPE of fptr from OFFSET_TYPE to TYPE_PTRMEMFUNC_P.
We first give the VAR_DECL fptr
F Holder::* fptr = ...;
a type of OFFSET_TYPE because we can't tell until instantiation whether fptr
will be a pointer-to-member-function or a pointer-to-data-member. We later
call layout_decl on this VAR_DECL which sets its mode to DImode because the
size of an OFFSET_TYPE is 8 bytes.
During instantiation, in tsubst_decl, after substitution we see that fptr is a
pointer-to-member-function so we create a copy of the fptr and give it the
proper type. Then we call layout_decl on it again. But its mode stays DImode
even though its size is now 16 bytes. We forget to clear the DECL_MODE of the
copied decl in tsubst_decl [VAR_DECL].
I haven't looked into why r229018 causes this regression. I suppose that
r229018 somehow exposed this latent bug.
More information about the Gcc-bugs
mailing list