aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/init.c
diff options
context:
space:
mode:
authorJason Merrill <jason@yorick.cygnus.com>1998-10-16 03:37:43 +0000
committerJason Merrill <jason@gcc.gnu.org>1998-10-15 23:37:43 -0400
commit162bc98d096a61193b3cb490a5430fb852d059eb (patch)
treebf3ac97d2f9df8fd2274f8ac3a2dd6327958d126 /gcc/cp/init.c
parent94706a5cfc9f995e52279c7594d188d826156f19 (diff)
downloadgcc-162bc98d096a61193b3cb490a5430fb852d059eb.zip
gcc-162bc98d096a61193b3cb490a5430fb852d059eb.tar.gz
gcc-162bc98d096a61193b3cb490a5430fb852d059eb.tar.bz2
typeck.c (build_indirect_ref): Complain about a pointer to data member, too.
* typeck.c (build_indirect_ref): Complain about a pointer to data member, too. * typeck2.c (build_m_component_ref): Don't indirect a pointer to data member. * init.c (resolve_offset_ref): Don't undo the above. * cp-tree.h (DECL_C_BIT_FIELD, SET_DECL_C_BIT_FIELD): New macros. (struct lang_decl_flags): Add `bitfield'. * class.c (finish_struct_1): Use DECL_C_BIT_FIELD instead of DECL_BIT_FIELD. * decl2.c (grokbitfield, grok_alignof): Likewise. * init.c (build_offset_ref): Likewise. * typeck.c (build_component_addr, expr_sizeof): Likewise. * cvt.c (build_up_reference): Don't crash if taking the address returns error_mark_node. From-SVN: r23124
Diffstat (limited to 'gcc/cp/init.c')
-rw-r--r--gcc/cp/init.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 2386215..985718c 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -1686,7 +1686,7 @@ build_offset_ref (type, name)
return convert_from_reference (t);
}
- if (TREE_CODE (t) == FIELD_DECL && DECL_BIT_FIELD (t))
+ if (TREE_CODE (t) == FIELD_DECL && DECL_C_BIT_FIELD (t))
{
cp_error ("illegal pointer to bit field `%D'", t);
return error_mark_node;
@@ -1740,7 +1740,8 @@ resolve_offset_ref (exp)
}
if ((TREE_CODE (member) == VAR_DECL
- && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (member)))
+ && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (member))
+ && ! TYPE_PTRMEM_P (TREE_TYPE (member)))
|| TREE_CODE (TREE_TYPE (member)) == FUNCTION_TYPE
|| TREE_CODE (TREE_TYPE (member)) == METHOD_TYPE)
{
@@ -1824,7 +1825,7 @@ resolve_offset_ref (exp)
for the dereferenced pointer-to-member construct. */
addr = build_unary_op (ADDR_EXPR, base, 0);
- if (TREE_CODE (TREE_TYPE (member)) == OFFSET_TYPE)
+ if (TYPE_PTRMEM_P (TREE_TYPE (member)))
{
if (addr == error_mark_node)
{
@@ -1832,10 +1833,9 @@ resolve_offset_ref (exp)
return error_mark_node;
}
- basetype = TYPE_OFFSET_BASETYPE (TREE_TYPE (member));
+ basetype = TYPE_OFFSET_BASETYPE (TREE_TYPE (TREE_TYPE (member)));
addr = convert_pointer_to (basetype, addr);
- member = cp_convert (ptrdiff_type_node,
- build_unary_op (ADDR_EXPR, member, 0));
+ member = cp_convert (ptrdiff_type_node, member);
/* Pointer to data members are offset by one, so that a null
pointer with a real value of 0 is distinguishable from an