Commit d7981fd9 by Jason Merrill Committed by Jason Merrill

* class.c (build_base_path): Tidy a bit.

From-SVN: r82004
parent c9e66eda
2004-05-18 Jason Merrill <jason@redhat.com>
* class.c (build_base_path): Tidy a bit.
2004-05-14 Geoffrey Keating <geoffk@apple.com> 2004-05-14 Geoffrey Keating <geoffk@apple.com>
* name-lookup.c (struct scope_binding): New. * name-lookup.c (struct scope_binding): New.
......
...@@ -255,6 +255,7 @@ build_base_path (enum tree_code code, ...@@ -255,6 +255,7 @@ build_base_path (enum tree_code code,
int fixed_type_p; int fixed_type_p;
int want_pointer = TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE; int want_pointer = TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE;
bool has_empty = false; bool has_empty = false;
bool virtual_access;
if (expr == error_mark_node || binfo == error_mark_node || !binfo) if (expr == error_mark_node || binfo == error_mark_node || !binfo)
return error_mark_node; return error_mark_node;
...@@ -296,21 +297,24 @@ build_base_path (enum tree_code code, ...@@ -296,21 +297,24 @@ build_base_path (enum tree_code code,
offset = BINFO_OFFSET (binfo); offset = BINFO_OFFSET (binfo);
fixed_type_p = resolves_to_fixed_type_p (expr, &nonnull); fixed_type_p = resolves_to_fixed_type_p (expr, &nonnull);
if (want_pointer && !nonnull /* Do we need to look in the vtable for the real offset? */
&& (!integer_zerop (offset) || (v_binfo && fixed_type_p <= 0))) virtual_access = (v_binfo && fixed_type_p <= 0);
/* Do we need to check for a null pointer? */
if (want_pointer && !nonnull && (virtual_access || !integer_zerop (offset)))
null_test = error_mark_node; null_test = error_mark_node;
if (TREE_SIDE_EFFECTS (expr) /* Protect against multiple evaluation if necessary. */
&& (null_test || (v_binfo && fixed_type_p <= 0))) if (TREE_SIDE_EFFECTS (expr) && (null_test || virtual_access))
expr = save_expr (expr); expr = save_expr (expr);
/* Now that we've saved expr, build the real null test. */
if (null_test) if (null_test)
null_test = fold (build2 (NE_EXPR, boolean_type_node, null_test = fold (build2 (NE_EXPR, boolean_type_node,
expr, integer_zero_node)); expr, integer_zero_node));
/* If this is a simple base reference, express it as a COMPONENT_REF. */ /* If this is a simple base reference, express it as a COMPONENT_REF. */
if (code == PLUS_EXPR if (code == PLUS_EXPR && !virtual_access
&& (v_binfo == NULL_TREE || fixed_type_p > 0)
/* We don't build base fields for empty bases, and they aren't very /* We don't build base fields for empty bases, and they aren't very
interesting to the optimizers anyway. */ interesting to the optimizers anyway. */
&& !has_empty) && !has_empty)
...@@ -323,7 +327,7 @@ build_base_path (enum tree_code code, ...@@ -323,7 +327,7 @@ build_base_path (enum tree_code code,
goto out; goto out;
} }
if (v_binfo && fixed_type_p <= 0) if (virtual_access)
{ {
/* Going via virtual base V_BINFO. We need the static offset /* Going via virtual base V_BINFO. We need the static offset
from V_BINFO to BINFO, and the dynamic offset from D_BINFO to from V_BINFO to BINFO, and the dynamic offset from D_BINFO to
......
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