+1999-08-06 Jason Merrill <jason@yorick.cygnus.com>
+
+ * decl.c (lookup_name_real): Set the complain flag if we're
+ looking for a namespace member.
+
+ * lex.c (real_yylex): We can have a number with no digits.
+
+ * cvt.c (cp_convert_to_pointer): Don't force pmf conversions.
+
+ * search.c (binfo_from_vbase): New fn.
+ * cp-tree.h: Declare it.
+ * cvt.c (cp_convert_to_pointer): Use it to diagnose conversion
+ from pointer to member of virtual base.
+ * typeck.c (get_delta_difference): Likewise.
+
1999-08-06 Alexandre Oliva <oliva@dcc.unicamp.br>
* pt.c (tsubst): Use build_index_type to build in-template array
extern tree current_scope PROTO((void));
extern tree lookup_conversions PROTO((tree));
extern tree binfo_for_vtable PROTO((tree));
+extern int binfo_from_vbase PROTO((tree));
extern tree dfs_walk PROTO((tree,
tree (*)(tree, void *),
tree (*) (tree, void *),
/* Language-level data type conversion for GNU C++.
- Copyright (C) 1987, 88, 92-97, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1987-1988, 1992-1999 Free Software Foundation, Inc.
Hacked by Michael Tiemann (tiemann@cygnus.com)
This file is part of GNU CC.
if (binfo == error_mark_node)
return error_mark_node;
+ if (binfo_from_vbase (binfo))
+ {
+ cp_error ("conversion to `%T' from pointer to member of virtual base `%T'",
+ type, intype);
+ return error_mark_node;
+ }
+
if (TREE_CODE (expr) == PTRMEM_CST)
expr = cplus_expand_constant (expr);
return rval;
}
else if (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype))
- return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 1);
+ return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0);
else if (TYPE_PTRMEMFUNC_P (intype))
{
cp_error ("cannot convert `%E' from type `%T' to type `%T'",
{
struct tree_binding b;
val = binding_init (&b);
+ flags |= LOOKUP_COMPLAIN;
if (!qualified_lookup_using_namespace (name, type, val, flags))
return NULL_TREE;
val = select_decl (val, flags);
}
/* [namespace.qual]
- Excepts the name to lookup and its qualifying scope.
- Returns the name/type pair found into the CPLUS_BINDING result,
+ Accepts the NAME to lookup and its qualifying SCOPE.
+ Returns the name/type pair found into the CPLUS_BINDING RESULT,
or 0 on error. */
int
}
}
+ /* This can happen on input like `int i = 0x;' */
if (numdigits == 0)
- my_friendly_abort (990710);
+ error ("numeric constant with no digits");
if (largest_digit >= base)
error ("numeric constant contains digits beyond the radix");
return dfs_walk_real (TYPE_BINFO (type),
0, dfs_bfv_helper, dfs_bfv_queue_p, &bfvi);
}
+
+/* Returns 1 iff BINFO is from a direct or indirect virtual base. */
+
+int
+binfo_from_vbase (binfo)
+ tree binfo;
+{
+ for (; binfo; binfo = BINFO_INHERITANCE_CHAIN (binfo))
+ {
+ if (TREE_VIA_VIRTUAL (binfo))
+ return 1;
+ }
+ return 0;
+}
binfo = get_binfo (to, from, 1);
if (binfo == 0 || binfo == error_mark_node)
return delta;
- if (TREE_VIA_VIRTUAL (binfo))
+ if (binfo_from_vbase (binfo))
{
binfo = binfo_member (BINFO_TYPE (binfo),
CLASSTYPE_VBASECLASSES (from));
delta);
}
- if (TREE_VIA_VIRTUAL (binfo))
+ if (binfo_from_vbase (binfo))
{
if (force)
{