Commit 6ad07332 by Jason Merrill Committed by Jason Merrill

decl.c (lookup_name_real): Set the complain flag if we're looking for a namespace member.

	* 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.

From-SVN: r28560
parent 446588ab
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> 1999-08-06 Alexandre Oliva <oliva@dcc.unicamp.br>
* pt.c (tsubst): Use build_index_type to build in-template array * pt.c (tsubst): Use build_index_type to build in-template array
......
...@@ -3343,6 +3343,7 @@ extern void reinit_search_statistics PROTO((void)); ...@@ -3343,6 +3343,7 @@ extern void reinit_search_statistics PROTO((void));
extern tree current_scope PROTO((void)); extern tree current_scope PROTO((void));
extern tree lookup_conversions PROTO((tree)); extern tree lookup_conversions PROTO((tree));
extern tree binfo_for_vtable PROTO((tree)); extern tree binfo_for_vtable PROTO((tree));
extern int binfo_from_vbase PROTO((tree));
extern tree dfs_walk PROTO((tree, extern tree dfs_walk PROTO((tree,
tree (*)(tree, void *), tree (*)(tree, void *),
tree (*) (tree, void *), tree (*) (tree, void *),
......
/* Language-level data type conversion for GNU C++. /* 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) Hacked by Michael Tiemann (tiemann@cygnus.com)
This file is part of GNU CC. This file is part of GNU CC.
...@@ -199,6 +199,13 @@ cp_convert_to_pointer (type, expr) ...@@ -199,6 +199,13 @@ cp_convert_to_pointer (type, expr)
if (binfo == error_mark_node) if (binfo == error_mark_node)
return 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) if (TREE_CODE (expr) == PTRMEM_CST)
expr = cplus_expand_constant (expr); expr = cplus_expand_constant (expr);
...@@ -217,7 +224,7 @@ cp_convert_to_pointer (type, expr) ...@@ -217,7 +224,7 @@ cp_convert_to_pointer (type, expr)
return rval; return rval;
} }
else if (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)) 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)) else if (TYPE_PTRMEMFUNC_P (intype))
{ {
cp_error ("cannot convert `%E' from type `%T' to type `%T'", cp_error ("cannot convert `%E' from type `%T' to type `%T'",
......
...@@ -5707,6 +5707,7 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only) ...@@ -5707,6 +5707,7 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only)
{ {
struct tree_binding b; struct tree_binding b;
val = binding_init (&b); val = binding_init (&b);
flags |= LOOKUP_COMPLAIN;
if (!qualified_lookup_using_namespace (name, type, val, flags)) if (!qualified_lookup_using_namespace (name, type, val, flags))
return NULL_TREE; return NULL_TREE;
val = select_decl (val, flags); val = select_decl (val, flags);
......
...@@ -4421,8 +4421,8 @@ lookup_using_namespace (name, val, usings, scope, flags) ...@@ -4421,8 +4421,8 @@ lookup_using_namespace (name, val, usings, scope, flags)
} }
/* [namespace.qual] /* [namespace.qual]
Excepts the name to lookup and its qualifying scope. Accepts the NAME to lookup and its qualifying SCOPE.
Returns the name/type pair found into the CPLUS_BINDING result, Returns the name/type pair found into the CPLUS_BINDING RESULT,
or 0 on error. */ or 0 on error. */
int int
......
...@@ -3973,8 +3973,9 @@ real_yylex () ...@@ -3973,8 +3973,9 @@ real_yylex ()
} }
} }
/* This can happen on input like `int i = 0x;' */
if (numdigits == 0) if (numdigits == 0)
my_friendly_abort (990710); error ("numeric constant with no digits");
if (largest_digit >= base) if (largest_digit >= base)
error ("numeric constant contains digits beyond the radix"); error ("numeric constant contains digits beyond the radix");
......
...@@ -3315,3 +3315,17 @@ binfo_for_vtable (var) ...@@ -3315,3 +3315,17 @@ binfo_for_vtable (var)
return dfs_walk_real (TYPE_BINFO (type), return dfs_walk_real (TYPE_BINFO (type),
0, dfs_bfv_helper, dfs_bfv_queue_p, &bfvi); 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;
}
...@@ -6213,7 +6213,7 @@ get_delta_difference (from, to, force) ...@@ -6213,7 +6213,7 @@ get_delta_difference (from, to, force)
binfo = get_binfo (to, from, 1); binfo = get_binfo (to, from, 1);
if (binfo == 0 || binfo == error_mark_node) if (binfo == 0 || binfo == error_mark_node)
return delta; return delta;
if (TREE_VIA_VIRTUAL (binfo)) if (binfo_from_vbase (binfo))
{ {
binfo = binfo_member (BINFO_TYPE (binfo), binfo = binfo_member (BINFO_TYPE (binfo),
CLASSTYPE_VBASECLASSES (from)); CLASSTYPE_VBASECLASSES (from));
...@@ -6229,7 +6229,7 @@ get_delta_difference (from, to, force) ...@@ -6229,7 +6229,7 @@ get_delta_difference (from, to, force)
delta); delta);
} }
if (TREE_VIA_VIRTUAL (binfo)) if (binfo_from_vbase (binfo))
{ {
if (force) if (force)
{ {
......
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