[Bug target/69841] Wrong template instantiation in C++11 on armv7l
jgreenhalgh at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Feb 25 17:40:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69841
James Greenhalgh <jgreenhalgh at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |alan.lawrence at arm dot com,
| |jakub at gcc dot gnu.org,
| |rguenth at gcc dot gnu.org
--- Comment #3 from James Greenhalgh <jgreenhalgh at gcc dot gnu.org> ---
I'm still confused by this. After coming out of the front end I checked the
DECL_ALIGN for each field of each of the parameters being passed to this
function. I see:
----
f1.ii
std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare,
_Alloc>::_M_emplace_hint_unique(std::_Rb_tree<_Key, _Val, _KeyOfValue,
_Compare, _Alloc>::const_iterator, _Args&& ...)
(struct _Rb_tree * const this
(decl alignment: 32),
struct const_iterator __pos
Fields:
_M_node (decl alignment: 32)
_Rb_tree_const_iterator (decl alignment: 8)
value_type (decl alignment: 8)
reference (decl alignment: 32)
pointer (decl alignment: 32)
iterator (decl alignment: 8)
iterator_category (decl alignment: 8)
difference_type (decl alignment: 32)
_Self (decl alignment: 8)
_Base_ptr (decl alignment: 32)
_Link_type (decl alignment: 32)
(decl alignment: 32, max field alignment: 32),
const struct piecewise_construct_t & __args#0
(decl alignment: 32),
struct tuple & __args#1
(decl alignment: 32),
struct tuple & __args#2
(decl alignment: 32))
f2.ii
std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare,
_Alloc>::_M_emplace_hint_unique(std::_Rb_tree<_Key, _Val, _KeyOfValue,
_Compare, _Alloc>::const_iterator, _Args&& ...)
(struct _Rb_tree * const this
(decl alignment: 32),
struct const_iterator __pos
Fields:
_M_node (decl alignment: 32)
_Rb_tree_const_iterator (decl alignment: 8)
value_type (decl alignment: 64)
reference (decl alignment: 32)
pointer (decl alignment: 32)
iterator (decl alignment: 32)
iterator_category (decl alignment: 8)
difference_type (decl alignment: 32)
_Self (decl alignment: 8)
_Base_ptr (decl alignment: 32)
_Link_type (decl alignment: 32)
(decl alignment: 32, max field alignment: 64),
const struct piecewise_construct_t & __args#0
(decl alignment: 32),
struct tuple & __args#1
(decl alignment: 32),
struct tuple & __args#2
(decl alignment: 32))
---
That is to say, after gimplification we've already decided that the alignment
of the value_type field of the std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare,
_Alloc>::const_iterator parameter to std::_Rb_tree<_Key, _Val, _KeyOfValue,
_Compare, _Alloc>::_M_emplace_hint_unique in f2.ii is 64, whereas in f1.ii we
don't have any extra alignment information.
I know nothing about the C++ front-end and how we could end up in this
situation. I can understand why, given this, we would generate the code we do
for ARM.
More information about the Gcc-bugs
mailing list