represented in the binfo for the derived class. */
else if (offset != 0)
{
- tree base_binfo, found_binfo = NULL_TREE;
- for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
- if (types_same_for_odr (TREE_TYPE (base_binfo), TREE_TYPE (fld)))
- {
- found_binfo = base_binfo;
- break;
- }
- if (!found_binfo)
- return NULL_TREE;
- binfo = found_binfo;
+ tree base_binfo, binfo2 = binfo;
+
+ /* Find BINFO corresponding to FLD. This is bit harder
+ by a fact that in virtual inheritance we may need to walk down
+ the non-virtual inheritance chain. */
+ while (true)
+ {
+ tree containing_binfo = NULL, found_binfo = NULL;
+ for (i = 0; BINFO_BASE_ITERATE (binfo2, i, base_binfo); i++)
+ if (types_same_for_odr (TREE_TYPE (base_binfo), TREE_TYPE (fld)))
+ {
+ found_binfo = base_binfo;
+ break;
+ }
+ else
+ if (BINFO_OFFSET (base_binfo) - BINFO_OFFSET (binfo) < pos
+ && (!containing_binfo
+ || (BINFO_OFFSET (containing_binfo)
+ < BINFO_OFFSET (base_binfo))))
+ containing_binfo = base_binfo;
+ if (found_binfo)
+ {
+ binfo = found_binfo;
+ break;
+ }
+ if (!containing_binfo)
+ return NULL_TREE;
+ binfo2 = containing_binfo;
+ }
}
type = TREE_TYPE (fld);