re PR c++/15471 (Incorrect member pointer offsets in anonymous structs/unions)
PR c++/15471 * typeck.c (unary_complex_lvalue): Use context_for_name_lookup when determining the scope to use for a pointer to member. (lookup_anon_field): Give it external linkage. * cp-tree.h (lookup_anon_field): Declare it. * expr.c (cplus_expand_constant): Use it. From-SVN: r82401
This commit is contained in:
parent
5182fafe48
commit
b3dd05b10a
|
@ -16,6 +16,9 @@
|
|||
PR c++/15471
|
||||
* typeck.c (unary_complex_lvalue): Use context_for_name_lookup
|
||||
when determining the scope to use for a pointer to member.
|
||||
(lookup_anon_field): Give it external linkage.
|
||||
* cp-tree.h (lookup_anon_field): Declare it.
|
||||
* expr.c (cplus_expand_constant): Use it.
|
||||
|
||||
2004-05-28 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
|
|
|
@ -4243,6 +4243,7 @@ extern tree build_ptrmemfunc_access_expr (tree, tree);
|
|||
extern tree build_address (tree);
|
||||
extern tree build_nop (tree, tree);
|
||||
extern tree non_reference (tree);
|
||||
extern tree lookup_anon_field (tree, tree);
|
||||
|
||||
/* in typeck2.c */
|
||||
extern void require_complete_eh_spec_types (tree, tree);
|
||||
|
|
|
@ -51,8 +51,21 @@ cplus_expand_constant (tree cst)
|
|||
member = PTRMEM_CST_MEMBER (cst);
|
||||
|
||||
if (TREE_CODE (member) == FIELD_DECL)
|
||||
/* Find the offset for the field. */
|
||||
cst = fold (build_nop (type, byte_position (member)));
|
||||
{
|
||||
/* Find the offset for the field. */
|
||||
cst = byte_position (member);
|
||||
while (!same_type_p (DECL_CONTEXT (member),
|
||||
TYPE_PTRMEM_CLASS_TYPE (type)))
|
||||
{
|
||||
/* The MEMBER must have been nestled within an
|
||||
anonymous aggregate contained in TYPE. Find the
|
||||
anonymous aggregate. */
|
||||
member = lookup_anon_field (TYPE_PTRMEM_CLASS_TYPE (type),
|
||||
DECL_CONTEXT (member));
|
||||
cst = size_binop (PLUS_EXPR, cst, byte_position (member));
|
||||
}
|
||||
cst = fold (build_nop (type, cst));
|
||||
}
|
||||
else
|
||||
{
|
||||
tree delta;
|
||||
|
|
|
@ -54,7 +54,6 @@ static int comp_ptr_ttypes_const (tree, tree);
|
|||
static bool comp_except_types (tree, tree, bool);
|
||||
static bool comp_array_types (tree, tree, bool);
|
||||
static tree common_base_type (tree, tree);
|
||||
static tree lookup_anon_field (tree, tree);
|
||||
static tree pointer_diff (tree, tree, tree);
|
||||
static tree get_delta_difference (tree, tree, int);
|
||||
static void casts_away_constness_r (tree *, tree *);
|
||||
|
@ -1517,7 +1516,7 @@ rationalize_conditional_expr (enum tree_code code, tree t)
|
|||
anonymous unions can nest, we must also search all anonymous unions
|
||||
that are directly reachable. */
|
||||
|
||||
static tree
|
||||
tree
|
||||
lookup_anon_field (tree t, tree type)
|
||||
{
|
||||
tree field;
|
||||
|
|
Loading…
Reference in New Issue