lex.c (handle_cp_pragma): Remove #pragma vtable.

* lex.c (handle_cp_pragma): Remove #pragma vtable.
	* lang-options.h: Remove +e options.
	* decl2.c (lang_decode_option): Likewise.
	(import_export_vtable): Don't check write_virtuals.
	(finish_vtable_vardecl, finish_file): Likewise.
	* search.c (dfs_debug_mark): Likewise.
	* semantics.c (begin_class_definition): Likewise.
	* class.c (build_vtable, finish_vtbls, finish_struct_1): Likewise.
	* call.c (build_over_call): Check flag_elide_constructors.
	* decl2.c: flag_elide_constructors defaults to 1.
	* typeck.c (convert_arguments): Remove return_loc parm.
	(build_function_call_real): Adjust.

From-SVN: r22027
This commit is contained in:
Jason Merrill 1998-08-27 19:03:59 +00:00 committed by Jason Merrill
parent 0603b640a0
commit 56ae6d7780
10 changed files with 49 additions and 131 deletions

View File

@ -1,5 +1,19 @@
1998-08-27 Jason Merrill <jason@yorick.cygnus.com>
* lex.c (handle_cp_pragma): Remove #pragma vtable.
* lang-options.h: Remove +e options.
* decl2.c (lang_decode_option): Likewise.
(import_export_vtable): Don't check write_virtuals.
(finish_vtable_vardecl, finish_file): Likewise.
* search.c (dfs_debug_mark): Likewise.
* semantics.c (begin_class_definition): Likewise.
* class.c (build_vtable, finish_vtbls, finish_struct_1): Likewise.
* call.c (build_over_call): Check flag_elide_constructors.
* decl2.c: flag_elide_constructors defaults to 1.
* typeck.c (convert_arguments): Remove return_loc parm.
(build_function_call_real): Adjust.
* search.c: Tear out all mi_matrix and memoize code.
(lookup_field, lookup_fnfields): Use scratch_tree_cons.
* lang-options.h: Remove documentation for -fhandle-exceptions,

View File

@ -3409,8 +3409,11 @@ build_over_call (cand, args, flags)
/* Avoid actually calling copy constructors and copy assignment operators,
if possible. */
if (DECL_CONSTRUCTOR_P (fn)
&& TREE_VEC_LENGTH (convs) == 1
if (! flag_elide_constructors)
/* Do things the hard way. */;
else if (DECL_CONSTRUCTOR_P (fn)
&& TREE_VEC_LENGTH (convs) == 1
&& copy_args_p (fn))
{
tree targ;

View File

@ -678,9 +678,7 @@ build_vtable (binfo, type)
DECL_ALIGN (decl) = MAX (TYPE_ALIGN (double_type_node),
DECL_ALIGN (decl));
/* Why is this conditional? (mrs) */
if (binfo && write_virtuals >= 0)
DECL_VIRTUAL_P (decl) = 1;
DECL_VIRTUAL_P (decl) = 1;
DECL_CONTEXT (decl) = type;
binfo = TYPE_BINFO (type);
@ -2134,8 +2132,7 @@ finish_vtbls (binfo, do_self, t)
decl = BINFO_VTABLE (binfo);
context = DECL_CONTEXT (decl);
DECL_CONTEXT (decl) = 0;
if (write_virtuals >= 0
&& DECL_INITIAL (decl) != BINFO_VIRTUALS (binfo))
if (DECL_INITIAL (decl) != BINFO_VIRTUALS (binfo))
DECL_INITIAL (decl) = build_nt (CONSTRUCTOR, NULL_TREE,
BINFO_VIRTUALS (binfo));
cp_finish_decl (decl, DECL_INITIAL (decl), NULL_TREE, 0, 0);
@ -3963,8 +3960,7 @@ finish_struct_1 (t, warn_anon)
else if (has_virtual)
{
TYPE_BINFO_VIRTUALS (t) = pending_virtuals;
if (write_virtuals >= 0)
DECL_VIRTUAL_P (TYPE_BINFO_VTABLE (t)) = 1;
DECL_VIRTUAL_P (TYPE_BINFO_VTABLE (t)) = 1;
}
}
@ -4130,14 +4126,9 @@ finish_struct_1 (t, warn_anon)
references between translation units. */
if (CLASSTYPE_METHOD_VEC (t))
{
extern tree pending_vtables;
/* Don't output full info about any type
which does not have its implementation defined here. */
if (TYPE_VIRTUAL_P (t) && write_virtuals == 2)
TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t))
= (value_member (TYPE_IDENTIFIER (t), pending_vtables) == 0);
else if (CLASSTYPE_INTERFACE_ONLY (t))
if (CLASSTYPE_INTERFACE_ONLY (t))
TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t)) = 1;
#if 0
/* XXX do something about this. */

View File

@ -3072,7 +3072,7 @@ extern tree get_member_function_from_ptrfunc PROTO((tree *, tree));
extern tree build_function_call_real PROTO((tree, tree, int, int));
extern tree build_function_call PROTO((tree, tree));
extern tree build_function_call_maybe PROTO((tree, tree));
extern tree convert_arguments PROTO((tree, tree, tree, tree, int));
extern tree convert_arguments PROTO((tree, tree, tree, int));
extern tree build_x_binary_op PROTO((enum tree_code, tree, tree));
extern tree build_binary_op PROTO((enum tree_code, tree, tree, int));
extern tree build_binary_op_nodefault PROTO((enum tree_code, tree, tree, enum tree_code));

View File

@ -345,21 +345,14 @@ int flag_this_is_variable;
/* 3 means write out only virtuals function tables `defined'
in this implementation file.
2 means write out only specific virtual function tables
and give them (C) public access.
1 means write out virtual function tables and give them
(C) public access.
0 means write out virtual function tables and give them
(C) static access (default).
-1 means declare virtual function tables extern. */
(C) static access (default). */
int write_virtuals;
/* Nonzero means we should attempt to elide constructors when possible.
FIXME: This flag is obsolete, and should be torn out along with the
old overloading code. */
/* Nonzero means we should attempt to elide constructors when possible. */
int flag_elide_constructors;
int flag_elide_constructors = 1;
/* Nonzero means recognize and handle signature language constructs. */
@ -542,22 +535,6 @@ lang_decode_option (argc, argv)
if (!strcmp (p, "-ftraditional") || !strcmp (p, "-traditional"))
/* ignore */;
/* The +e options are for cfront compatibility. They come in as
`-+eN', to kludge around gcc.c's argument handling. */
else if (p[0] == '-' && p[1] == '+' && p[2] == 'e')
{
int old_write_virtuals = write_virtuals;
if (p[3] == '1')
write_virtuals = 1;
else if (p[3] == '0')
write_virtuals = -1;
else if (p[3] == '2')
write_virtuals = 2;
else error ("invalid +e option");
if (old_write_virtuals != 0
&& write_virtuals != old_write_virtuals)
error ("conflicting +e options given");
}
else if (p[0] == '-' && p[1] == 'f')
{
/* Some kind of -f option.
@ -2575,12 +2552,10 @@ import_export_vtable (decl, type, final)
if (DECL_INTERFACE_KNOWN (decl))
return;
/* +e0 or +e1 */
if (write_virtuals < 0 || write_virtuals == 1 || TYPE_FOR_JAVA (type))
if (TYPE_FOR_JAVA (type))
{
TREE_PUBLIC (decl) = 1;
if (write_virtuals < 0 || TYPE_FOR_JAVA (type))
DECL_EXTERNAL (decl) = 1;
DECL_EXTERNAL (decl) = 1;
DECL_INTERFACE_KNOWN (decl) = 1;
}
else if (CLASSTYPE_INTERFACE_KNOWN (type))
@ -2702,8 +2677,7 @@ static int
finish_vtable_vardecl (prev, vars)
tree prev, vars;
{
if (write_virtuals >= 0
&& ! DECL_EXTERNAL (vars)
if (! DECL_EXTERNAL (vars)
&& ((TREE_PUBLIC (vars) && ! DECL_WEAK (vars) && ! DECL_ONE_ONLY (vars))
|| CLASSTYPE_EXPLICIT_INSTANTIATION (DECL_CONTEXT (vars))
|| TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (vars))
@ -3599,19 +3573,6 @@ finish_file ()
walk_vtables ((void (*) PROTO((tree, tree))) 0,
prune_vtable_vardecl);
if (write_virtuals == 2)
{
/* Now complain about an virtual function tables promised
but not delivered. */
while (pending_vtables)
{
if (TREE_PURPOSE (pending_vtables) == NULL_TREE)
error ("virtual function table for `%s' not defined",
IDENTIFIER_POINTER (TREE_VALUE (pending_vtables)));
pending_vtables = TREE_CHAIN (pending_vtables);
}
}
finish_repo ();
this_time = get_run_time ();

View File

@ -23,9 +23,6 @@ DEFINE_LANG_NAME ("C++")
/* This is the contribution to the `lang_options' array in gcc.c for
g++. */
{ "-+e0", "" }, /* gcc.c tacks the `-' on the front. */
{ "-+e1", "" },
{ "-+e2", "" },
{ "-faccess-control", "" },
{ "-fno-access-control", "Do not obey access control semantics" },
{ "-fall-virtual", "Make all member functions virtual" },
@ -41,7 +38,7 @@ DEFINE_LANG_NAME ("C++")
{ "-fconst-strings", "" },
{ "-fno-const-strings", "Make string literals `char[]' instead of `const char[]'" },
{ "-fdefault-inline", "" },
{ "-fno-default-inline", "Do not inline mmeber functions be default"},
{ "-fno-default-inline", "Do not inline member functions by default"},
{ "-frtti", "" },
{ "-fno-rtti", "Do not generate run time type descriptor information" },
{ "-felide-constructors", "" },
@ -60,13 +57,13 @@ DEFINE_LANG_NAME ("C++")
{ "-fno-handle-exceptions", "" },
{ "-fhandle-signatures", "Handle signature language constructs" },
{ "-fno-handle-signatures", "" },
{ "-fhonor-std", "Do not ignore the namespace standard" },
{ "-fhonor-std", "Treat the namespace `std' as a normal namespace" },
{ "-fno-honor-std", "" },
{ "-fhuge-objects", "Enable support for huge objects" },
{ "-fno-huge-objects", "" },
{ "-fimplement-inlines", "" },
{ "-fno-implement-inlines", "Export functions even if they can be inlined" },
{ "-fimplicit-templates", "Emit implicit instatiations if needed" },
{ "-fimplicit-templates", "Emit implicit template instatiations when used" },
{ "-fno-implicit-templates", "" },
{ "-finit-priority", "Handle the init_priority attribute" },
{ "-fno-init-priority", "" },
@ -74,7 +71,7 @@ DEFINE_LANG_NAME ("C++")
{ "-fno-labels-ok", "" },
{ "-fmemoize-lookups", "" },
{ "-fno-memoize-lookups", "" },
{ "-fname-mangling-version-", "Set the version of name mangling to use" },
{ "-fname-mangling-version-", "" },
{ "-fnew-abi", "Enable experimental ABI changes" },
{ "-fno-new-abi", "" },
{ "-fnonnull-objects", "" },

View File

@ -4712,33 +4712,7 @@ handle_cp_pragma (pname)
{
register int token;
if (! strcmp (pname, "vtable"))
{
extern tree pending_vtables;
/* More follows: it must be a string constant (class name). */
token = real_yylex ();
if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
{
error ("invalid #pragma vtable");
return -1;
}
if (write_virtuals != 2)
{
warning ("use `+e2' option to enable #pragma vtable");
return -1;
}
pending_vtables
= perm_tree_cons (NULL_TREE,
get_identifier (TREE_STRING_POINTER (yylval.ttype)),
pending_vtables);
token = real_yylex ();
if (token != END_OF_LINE)
warning ("trailing characters ignored");
return 1;
}
else if (! strcmp (pname, "unit"))
if (! strcmp (pname, "unit"))
{
/* More follows: it must be a string constant (unit name). */
token = real_yylex ();

View File

@ -2241,8 +2241,7 @@ dfs_debug_mark (binfo)
/* If interface info is known, either we've already emitted the debug
info or we don't need to. */
if (CLASSTYPE_INTERFACE_KNOWN (t)
|| (write_virtuals == 2 && TYPE_VIRTUAL_P (t)))
if (CLASSTYPE_INTERFACE_KNOWN (t))
return;
/* If debug info is requested from this context for this type, supply it.

View File

@ -1246,7 +1246,6 @@ begin_class_definition (t)
/* Don't change signatures. */
if (! IS_SIGNATURE (t))
{
extern tree pending_vtables;
int needs_writing;
tree name = TYPE_IDENTIFIER (t);
@ -1258,24 +1257,13 @@ begin_class_definition (t)
}
/* Record how to set the access of this class's
virtual functions. If write_virtuals == 2 or 3, then
virtual functions. If write_virtuals == 3, then
inline virtuals are ``extern inline''. */
switch (write_virtuals)
{
case 0:
case 1:
needs_writing = 1;
break;
case 2:
needs_writing = !! value_member (name, pending_vtables);
break;
case 3:
needs_writing = ! CLASSTYPE_INTERFACE_ONLY (t)
&& CLASSTYPE_INTERFACE_KNOWN (t);
break;
default:
needs_writing = 0;
}
if (write_virtuals == 3)
needs_writing = ! CLASSTYPE_INTERFACE_ONLY (t)
&& CLASSTYPE_INTERFACE_KNOWN (t);
else
needs_writing = 1;
CLASSTYPE_VTABLE_NEEDS_WRITING (t) = needs_writing;
}
#if 0

View File

@ -2916,10 +2916,10 @@ build_function_call_real (function, params, require_complete, flags)
function prototype, or apply default promotions. */
if (flags & LOOKUP_COMPLAIN)
coerced_params = convert_arguments (NULL_TREE, TYPE_ARG_TYPES (fntype),
coerced_params = convert_arguments (TYPE_ARG_TYPES (fntype),
params, fndecl, LOOKUP_NORMAL);
else
coerced_params = convert_arguments (NULL_TREE, TYPE_ARG_TYPES (fntype),
coerced_params = convert_arguments (TYPE_ARG_TYPES (fntype),
params, fndecl, 0);
if (coerced_params == error_mark_node)
@ -2985,12 +2985,6 @@ build_function_call (function, params)
If parmdecls is exhausted, or when an element has NULL as its type,
perform the default conversions.
RETURN_LOC is the location of the return value, if known, NULL_TREE
otherwise. This is useful in the case where we can avoid creating
a temporary variable in the case where we can initialize the return
value directly. If we are not eliding constructors, then we set this
to NULL_TREE to avoid this avoidance.
NAME is an IDENTIFIER_NODE or 0. It is used only for error messages.
This is also where warnings about wrong number of args are generated.
@ -3004,8 +2998,8 @@ build_function_call (function, params)
default arguments, if such were specified. Do so here. */
tree
convert_arguments (return_loc, typelist, values, fndecl, flags)
tree return_loc, typelist, values, fndecl;
convert_arguments (typelist, values, fndecl, flags)
tree typelist, values, fndecl;
int flags;
{
register tree typetail, valtail;
@ -3013,9 +3007,6 @@ convert_arguments (return_loc, typelist, values, fndecl, flags)
char *called_thing = 0;
int i = 0;
if (! flag_elide_constructors)
return_loc = 0;
/* Argument passing is always copy-initialization. */
flags |= LOOKUP_ONLYCONVERTING;
@ -3120,7 +3111,7 @@ convert_arguments (return_loc, typelist, values, fndecl, flags)
else
{
parmval = convert_for_initialization
(return_loc, type, val, flags,
(NULL_TREE, type, val, flags,
"argument passing", fndecl, i);
#ifdef PROMOTE_PROTOTYPES
if ((TREE_CODE (type) == INTEGER_TYPE
@ -7094,8 +7085,8 @@ convert_for_assignment (type, rhs, errtype, fndecl, parmnum)
return error_mark_node;
}
/* Convert RHS to be of type TYPE. If EXP is non-zero,
it is the target of the initialization.
/* Convert RHS to be of type TYPE.
If EXP is non-zero, it is the target of the initialization.
ERRTYPE is a string to use in error messages.
Two major differences between the behavior of