So abidiff libabigail.so libabigail.so is broken again. Sigh.
It was broken by this wrong commit:
commit
5b33223cb7b7d514bb8b0d31ed09a0ae14b8d7ce
Author: Dodji Seketeli <dodji@redhat.com>
Date: Fri Feb 20 13:48:48 2015 +0100
Simplify canonicalizing handling for typedefs
* src/abg-dwarf-reader.cc (build_ir_node_from_die): For typedefs,
we don't need to test that the current scope is a class to know
that we are looking at a member type. Just looking at the
is_member flag is enough.
So the issue arises when for instance, we are reading a class that
defines a member typedef (or enum) and uses that enum as the type of a
data member. When reading that data member (before reading the
definition of the typedef), we read the type of the data member; so we
hit the typedef. But build_ir_node_from_die() cannot fully construct
the scope of the typedef before handing off the typedef because we are
currently building it! So it hands out a non-complete version of the
class that is being built; 'is_member' is not set to 'true' because
we are getting the type of the data member; it's not *necessarily* a
member type. So we need to check !is_class_type(scope) to know if we
are given a member type. I am now thinking that the "is_member" flag
is actually useless. I think I'll remove it in a later patch.
Anyway, this fixes 'abidiff libabigail.so libabigail.so' again. I
have some stashed patches that brings it's time down to ~ 45 seconds.
So we are getting close to being able to include that *ultimate* test in
regression test suite. Oh well.
* src/abg-dwarf-reader.cc (build_ir_node_from_die): When building
typedefs, enum and memeber classes, check that the scope is a
member class to detect if we are building a member type. In which
case the caller is going to handle the canonicalizing of the
member type *after* it's access specification has been adjusted.
Otherwise, that adjustments happens after the type has been
canonicalized and bad things happen at comparison type.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
called_from_public_decl,
where_offset);
result = add_decl_to_scope(t, scope);
- if (t && !is_member_type)
+ if (t && !is_member_type && !is_class_type(scope))
maybe_canonicalize_type(dwarf_dieoffset(die),
die_is_from_alt_di,
ctxt);
enum_type_decl_sptr e = build_enum_type(ctxt,
die_is_from_alt_di,
die);
- if (e && !is_member_type)
+ if (e && !is_member_type && !is_class_type(scope))
{
result = add_decl_to_scope(e, scope);
maybe_canonicalize_type(dwarf_dieoffset(die),
result = klass;
// For klass to be eligible for canonicalization at this
// point, it needs to be a non-member type.
- if (!is_member_type)
+ if (!is_member_type && !is_class_type(scope))
{
// To be early canonicalized here, klass needs:
if (// NOT be an incomplete type that is being currently