|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: C T
Length: 110073 (0x1adf9) Types: TextFile Names: »ChangeLog«
└─⟦a05ed705a⟧ Bits:30007078 DKUUG GNU 2/12/89 └─⟦6f889378a⟧ »./g++-1.36.1.tar.Z« └─⟦3aa9a3deb⟧ └─⟦this⟧ »g++-1.36.1/ChangeLog«
Mon Nov 6 00:51:43 1989 Michael Tiemann (tiemann at arkesden) * crt1.c: Changes from Eirik Fuller (Cornell Theory Center) to fix incremental linking. * gnulib3.c (__do_global_cleanup): Also from Eirik: fixed braino that was not reinitializing __DLI. * cplus-method.c (build_overload_name): Mangle member functions with qualifiers differently than member functions without qualifiers. Also, add 'F' before argument list for METHOD_TYPE, since cfront 2.0 seems to do so. * cplus-method.c (dump_type_suffix): Make formatting of these kinds of METHOD_TYPEs right. * cplus-dem.c (do_type): Grok these changes. * cplus-except.c (exception_object_name): Don't crash in case of ``raise all'', which comes encoded as VOID_TYPE_NODE. @@ Handle it correctly in next release. * cplus-decl2.c (grok_method_quals): New function. Incorporate `const' and `volatile' qualifiers into FUNCTION_DECLs and TYPE_DECLs. Uses code broken out of `grokclassfn'. * cplus-decl2.c (grokclassfn): Caller changed. * cplus-decl.c (grokdeclarator): Call `grok_method_quals' when QUALS is non-zero in declarator grokking loop. Sat Nov 4 20:21:54 1989 Michael Tiemann (tiemann at arkesden) * cplus-init.c (build_new): If TYPE_NEEDS_CONSTRUCTING (TYPE), then always wrap RVAL in an RTL_EXPR, since we don't know that we aren't one of the arms of a ?: operation. RVAL can now be a SAVE_EXPR (normally) or a VAR_DECL (in the case of array initialization). * cplus-init.c (build_new): Fix braino that was causing array types to be collapsed into their element types, causing `build_new' to return a point to the element type, rather then a pointer to the array type. * cplus-decl2.c (grokfield): Check DECL_NAME (VALUE) before dereferencing it. * cplus-init.c (expand_vec_init): Do not fail to initialize element of an array which receive default initialization. * cplus-type2.c (digest_init): If TYPE needs constructing, don't convert INIT to TYPE. The only time when this happens is when called upon to initialize an ARRAY_TYPE, and `expand_vec_init' will handle that case. * cplus-class.c (build_method_call): Error reporting for bad argument list was screwed for static member functions in static call context. * config.g++: Add MIPS-based configurations. * toplev.c: Make up for systems which do not have unistd.h (like many BSD systems). * Makefile: Add HAVE_UNISTD_H flag. * cplus-dem.c: Sequentize the code. * cplus-init.c (expand_cplus_expr_stmt): Warn if statement is just a reference to, and not a call of, some function. Thu Nov 2 10:03:50 1989 Michael Tiemann (tiemann at arkesden) * cplus-method.c (build_overload_name): Don't crash if we built a TREE_LIST which contains VOID_TYPE_NODE and which is not VOID_LIST_NODE. This happens if one of the parameters is of type VOID_TYPE. * stmt.c (expand_return): Even when RETVAL has type VOID_TYPE, we must expand it (it may be a call to another void function). * integrate.c (copy_rtx_and_substitute): Moved one to many insns to BEFORE_INLINE_FP_RTX. * cplus-typeck.c (convert_for_initialization,actualparameterlist): Don't defaultly convert ARRAY_TYPE when converting to REFERENCE_TYPE. Wed Nov 1 04:43:46 1989 Michael Tiemann (tiemann at teacake) * stmt.c (init_function_start): Initialize MAX_PARM_REG to FIRST_PSEUDO_REGISTER. * cplus-init.c (expand_vec_init): This function can be called to initialize a non-aggregate vector. Tue Oct 31 13:38:42 1989 Michael Tiemann (tiemann at arkesden) * cplus-type2.c (process_init_constructor): Don't even try initializing a structure from EMPTY_INIT_NODE. * cplus-init.c (build_new): Handle case where SAVE_EXPR_RTL of new'd value is 0 by putting it CONST0_RTX. * cplus-typeck.c (build_component_ref): If the COMPONENT_REF is really a reference to a member function, do the right thing if the member function is virtual. Mon Oct 30 00:39:18 1989 Michael Tiemann (tiemann at arkesden) * cplus-class.c (build_method_call): Removed code that seemed to build (superflouously) an INDIRECT_REF for INSTANCE just before heading to found/found_and_ok (where INSTANCE was just reinitialized). Also, fixed bug so that if INSTANCE was of fixed type, that fact remained known even if INSTANCE_PTR became more distanct due to going through a NOP_EXPR. * cplus-init.c (get_member_function): Add parameter EXP_ADDR_PTR which is a pointer to the tree representing the address of EXP. Also, add hairy code which does the right thing wrt. modifying `this' pointer when it is argument to call. @@ This modification causes GNU C++ to generate stupid conditional-branch code when optimizing. Hopefully future versions of the optimizer will understand and optimize it. * cplus-typeck.c (build_x_function_call): Caller changed. * cplus-tree.h (lang_type): Added new field GOT_SEMICOLON to TYPE_FLAGS field, to record whether a type has been `finished' or not. Attempt to catch bugs like `struct s { .. } main () { .. }'. * cplus-parse.y (various rules): Add call to `note_got_semicolon'. * cplus-decl.c (start_function): Check that we have a `finished' type. * cplus-lex.c (note_got_semicolon): Set the bit here. * cplus-class.c (finish_struct): Whenever we start afresh with a class type, zero the bit here. * cplus-type2.c: Rename file cplus-typeck2.c to fit brain-damaging SVID 14 char name limit. * cplus-typeck.c (build_modify_expr): Handle case where assignment comes from friend, rather than member function. * cplus-tree.c (lang_printable_name): Handle case where DECL's language specific field is nonexistent. * cplus-method.c (fndecl_as_string): Here too. * cplus-decl.c (finish_decl): Initialization of a reference from `*this' was falling down because nodes for `$this' were getting shared too much. * cplus-tree.h (TREE_HAS_CONSTRUCTOR): Reincarnate use of this flag--for SAVE_EXPR it means that underneath lies a call to `new' for a given type. * cplus-init.c (build_new): Set the flag. * cplus-method.c (dump_init): Test it. * cplus-tree.h (PARM_DECL_EXPR): Use this flag to distinguish parsing initializers for PARM_DECLs from initializers for global variables. * cplus-decl2.c (finish_file): Don't emit anything from STATIC_AGGREGATES that was really just for default parameters. * cplus-decl.c (grokparms): Set PARM_DECL_EXPR on SAVE_EXPRs. * cplus-method.c (dump_init): Same. Sun Oct 29 23:23:48 1989 Michael Tiemann (tiemann at arkesden) * cplus-method.c (build_opfncall): Don't check visibility here for operators `new' and `delete' unless within a constructor or destructor. * cplus-decl.c (finish_function): Add checks for visibility of those operators here instead. * cplus-decl2.c (groktypefield): Handle case where field name conflicts with a typedef. Fri Oct 27 01:02:20 1989 Michael Tiemann (tiemann at arkesden) * cplus-search.c (get_virtuals_named_this): Return a baselink instead of a FUNCTION_DECL. Also, walk through FIELDS as baselinks. I.e., use `next_baselink' instead of TREE_CHAIN. * cplus-search.c (get_first_matching_virtual): Caller changed. Thu Oct 26 16:09:07 1989 Michael Tiemann (tiemann at arkesden) * cplus-search.c (get_first_matching_virtual): Only complain about a particular property of a virtual function once. * cplus-class.c (finish_struct): If ASSOC winds up being zero, don't frob the vtable. * cplus-decl.c (shadow_tag): Handle case where exception does not have any fields. * cplus-parse.y (component_decl): Handle case where exception does not have any fields. * cplus-parse.y (structsp): Call `finish_exception' with only two parameters. * cplus-parse.y (stmt): Forgot ';' after `RAISE' stmt. * cplus-class.c: Gather statistics on number of elments in virtual function tables, number of entries we build for them, and number of virtual function table entries we search using linear lookup. * cplus-parse.y (aggr,opt.component_decl_list): Call `build_tree_list' instead of `decl_tree_list', because of nested structures. Would be better to make TEMP_DECL_OBSTACK pushable like the momentary obstack, but we don't for now. Tue Oct 24 06:26:13 1989 Michael Tiemann (tiemann at arkesden) * integrate.c (copy_rtx_and_substitute): Don't change something to a memory address unless it really is `memory_address_p'. * cplus-decl.c (finish_decl): Handle array initialization if type of array needs constructor. Also, implement initialization without INIT0 crutch. * cplus-init.c (expand_vec_init): Handle array initialization from {...} where type of array needs constructor. * cplus-typeck.c (build_binary_op_nodefault): Make compiler give error, not warning, if comparing pointers with integers. * cplus-typeck.c (build_component_ref): Call `lookup_fnfields' to get a list of methods. Mon Oct 23 17:29:03 1989 Michael Tiemann (tiemann at arkesden) * cplus-tree.h (lang_decl): Add bit `COMPILER_GENERATED' to indicate whether this FUNCTION_DECL was generated automatically by the compiler. * cplus-lex.c (cons_up_dtor_for_type): Set this bit. * cplus-decl.c (redeclaration_error_message): Give better error message if user redeclares something that was implicitly created by the compiler. * cplus-decl.c (finish_decl): Test DECL_LANG_SPECIFIC before testing DECL_IN_AGGR_P in case of init-free reference decl. Sat Oct 21 10:29:09 1989 Michael Tiemann (tiemann at arkesden) * cplus-class.c (build_method_call): Forgot to increment b_or_d as we go through class hierarchy. Probably fell out as a result of `next_baselink' change on Friday, Oct 13. * cplus-cvt.c (build_up_reference): When calling `convert_to_nonzero_pointer', use TYPE_MAIN_VARIANT so that TYPE_POINTER_TO is defined. * cplus-search.c ({push,pop}_memoized_context): Plug memory leak by freeing pushing and popping the TYPE_OBSTACK irrespective of whether we are memoizing lookups or not. * cplus-decl2.c (grokclassfn): Don't make `this' TREE_READONLY inside of destructors. * cplus-search.c (get_abstract_virtuals): New function. Returns the list of virtual functions that are considered abstract for a given type (i.e., those which are ` = 0' in declaration). * cplus-class.c (finish_base_struct): Call it. * All GNU C++ files: change names containing `UNINHERIT*' to names containing `ABSTRACT'. Eliminate use of CLASSTYPE_HAS_ABSTRACT_VIRTUALS in favor of testing CLASSTYPE_ABSTRACT_VIRTUALS directly. * cplus-decl.c (start_function): Handle case where user names and internal names conflict. * cplus-typeck.c (build_conditional_expr): Put type instantiation back in. * cplus-decl.c (start_function): Use DECL_STATIC_CONTEXT instead of DECL_CONTEXT for pushing into context of static function. * cplus-decl.c (auto_function): Like `builtin_function', but builds an overloadable function. * cplus-decl.c (init_decl_processing): Call it for __builtin_new, __builtin_delete and similar functions. Fri Oct 20 02:22:06 1989 Michael Tiemann (tiemann at arkesden) * cplus-decl.c (finish_decl): Set TREE_USED bit of DECL if DECL is a const VAR_DECL at TOPLEVEL. * cplus-class.c (modify_vtable_entry): Still more fixes to code which computes derived vtable. Thu Oct 19 11:14:55 1989 Michael Tiemann (tiemann at arkesden) * cplus-class.c (finish_struct): Move code that sets TYPE_USES_MULTIPLE_INHERITANCE from here... * cplus-decl.c (xref_tag): ...to here. * cplus-decl.c (finish_decl): Oct 12 change to implement initialization of class members so that their initializers could use private members did not test DECL sufficiently. In addition to checking DECL_CONTEXT, must also check that TREE_CODE (DECL) == VAR_DECL. Otherwise redeclaration of member functions cause crashes. Tue Oct 17 03:34:05 1989 Michael Tiemann (tiemann at arkesden) * cplus-method.c (hack_identifier): Use `error', not `error_with_decl' to report that a non-static member is being referenced in a static member function. * cplus-decl.c (duplicate_decls): TREE_INLINE was not being set for OLDDECL, which is really where it matters. * cplus-typeck2.c (merge_component_comparisons): Track TEM1 in addition to TEM0 in loop which computes BITPOS0. * cplus-decl2.c (grokfield): Set CLASSTYPE_LOCAL_TYPEDECLs from CURRENT_CLASS_TYPE rather than DECL_CONTEXT (VALUE), since the latter is not set up for TYPE_DECLs. * cplus-decl.c (xref_tag): Set CLASSTYPE_DECLARED_CLASS each time we see an xref to this tag until we see the actual type defined for this tag. Mon Oct 16 01:48:27 1989 Michael Tiemann (tiemann at arkesden) * cplus-tree.h (DECL_VIRTUAL_P): If set in an IDENTIFIER_NODE, it means that somebody has defined a virtual function with this name. * cplus-decl.c (grokfndecl): Set it. * cplus-search.c (get_first_matching_virtual): Use it. * cplus-decl.c (cplus-tree.h): Define DECL_EXTERNAL as synonym for TREE_LANG_FLAG_3, which means for a VAR_DECL to mean that `extern' was specified in for that VAR_DECL. * cplus-decl.c (grokvardecl): Set DECL_EXTERNAL. * cplus-decl.c (duplicate_decls): Set TREE_PUBLIC of `const' variables based on TREE_STATIC and DECL_EXTERNAL. Sun Oct 15 00:44:01 1989 Michael Tiemann (tiemann at arkesden) * cplus-decl.c (start_function): Set CURRENT_EXTERN_INLINE from TREE_PUBLIC of DECL1 if DECL1 came pre-parsed. * cplus-decl2.c (finish_file): Don't write out inline functions which had their address taken if they were declared `extern inline'. * cplus-decl.c (grokdeclarator): Don't set TREE_PUBLIC based on INLINEP here. Also, don't treat RID_INLINE as being a storage class for `multiple storage classes' error message. * cplus-decl2.c (grokfield): Do it instead here. * cplus-init.c (do_friend): And here. * cplus-decl.c (duplicate_decls): And change this to more match how GCC does things. * cplus-lex.c [USG_STDIO]: Use this instead of USG, for turncoats who have enough of System V that their stdio is broken, and too much Berkeley for USG to be the right thing. * cplus-decl.c (grokdeclarator): Grok declarations of the form `X x(args)[size]' to mean ARGS is an initializer to the array constructor for X[SIZE]. * cplus-decl2.c (finish_file): Handle new case. * cplus-method.c (build_opfncall): Don't abort if user makes a bad call to operator new. It's not the compiler's fault. * cplus-init.c (finish_base_init): Unmark virtual baseclasses which have explicit initializers. * cplus-init.c (expand_aggr_init_1): Change PROTECT parameter to FLAGS parameter. All callers changed. * cplus-decl.c (finish_function): In destructor code, it is CLASSTYPE_VSIZE, not TYPE_VIRTUAL_P, which is the operative value to test when building base destructor code. See Sept 1 change for more info. * cplus-parse.y (unary_expr): Arguments to build_vbase_delete were wrong: was passing POINTER_TYPE and address when should have been passing object type and object. Sat Oct 14 06:45:34 1989 Michael Tiemann (tiemann at arkesden) * stmt.c (expand_anon_union_decl): For anonymous unions in memory, don't call `change_address'. Just cast the memory reference ourselves. * cplus-typeck2.c (store_init_value): Don't test PEDNATIC to see whether to permit initialization of static variable from non-constant, since C++ 2.0 defines it to work. * cplus-init.c (expand_aggr_init_1): PARM_SLOTS was allocating sizeof (char) instead of sizeof (struct rtx_def*). * cplus-decl.c (grokfndecl): Call to `get_first_matching_virtual' must be followed by code which, under certain cases, goes all the way down the inheritance hierarchy to match the virtual function. Otherwise, the wrong virtual function tables come in to play when the time comes to reconcile them (in modify_vtable_entry). Note that the call to `get_first_matching_virtual' does the right thing within `finish_struct'. In that case, since we pull BASE_FNDECL from a virtual base class's virtual function table, there is no issue where it should be thought of as coming from. * cplus-search.c (rank_mi_virtuals): Spurious TREE_TYPE made it look like we were trying to compare PARM_DECLs instead of _TYPE nodes in our list at some time. * cplus-search.c (get_first_matching_virtual): Friday the 13th change was wrong. Instead, make `get_first_matching_virtual' handle the instance variable itself, and call `compparms' as before. * cplus-lex.c (reinit_parse_for_method): Null character was being inserted if USG hack to round up buffer length was being used. * cplus-class.c (compute_conversion_costs): When trying a type conversion, use the actual type that the function wants. No reference-bashing here! * cplus-search.c: Add a new obstack BRIDGE_OBSTACK which contains the class declarations across scopes. This is an alternative to building their lists on the permanant_obstack. * cplus-search.c (push_search_level): Record the obstack for which this level was pushed. * cplus-search.c (pop_search_level): Remove OBSTACK parameter. Get that value from the search level that is being popped. * cplus-tree.h (lang_type): Add a slot for the instance variable. * cplus-decl.c (start_function): Use it. * tree.c (build_nt0): New function. Use this to build declarators instead of `build_nt'. Uses new obstack `temp_decl_obstack'. * cplus-cvt.c (build_type_conversion): Distinguish void* from const void* if we are trying to convert from some arbitrary pointer to a void* variant. * cplus-class.c (finish_struct_bits): New function. Code broken out of `finish_struct'. Extend to handle both conversions to const pointers and conversions to non-const pointers. * cplus-tree.h (lang_type): Extend to handle both conversions to const pointers and conversions to non-const pointers. * cplus-decl.c (start_function): FNTYPE was not re-set after calling `pushdecl'. Consequently, static member functions with default arguments were breaking. * cplus-class.c (pushclass): When pushing tags into the class binding level, push the TYPE_DECL, not the _TYPE into the IDENTIFIER_CLASS_VALUE slot. * cplus-method.c (fndecl_as_string): Don't skip first parameter if FNDECL is a static member function. * gplus.gperf [CATCH]: Add it. * cplus-init.c (build_member_ref): Nodes returned from lookup_fnfields are not saved on the permanent obstack, regardless of CURRENT_OBSTACK. This is usually ok, since they are usually only used as a structure through which search machinery will traverse looking for values that do live on the permanent obstack. One exception is when `build_member_ref' builds an expression which requires type instantiation at top-level. * cplus-decl.c (finish_decl): Give better error messages for initialization of references, and remove invalid messages as well. Initialization of type-qualified references is different than initialization of type-qualified pointers in the following way: you can initialization a `X&' from a `const X&', but you cannot initialize a `X*' from a `const X*'. This is because the compiler can convert the `const X&' to a `const X', create a new temporary, and take a reference from that. * cplus-init.c (is_friend): In testing for friendly classes, allow for static member functions to be considered friends. Fri Oct 13 00:03:18 1989 Michael Tiemann (tiemann at arkesden) * cplus-decl.c (grokdeclarator): If DECL_CONTEXT is FIELD for building a TYPE_DECL, allocate using `build_lang_field_decl' instead of `build_decl'. * cplus-decl.c (xref_tag): Undo Sept 10 change. It causes problems for InterViews. Better to work around in ET++. * cplus-decl.c (lookup_name): When looking up NAME, if CURRENT_CLASS_TYPE is being defined, check its baseclasses for a definition of a TYPE_DECL. * cplus-decl.c (grok_enum_decls): Return DECL, not NULL_TREE if TYPE has already been recorded. * cplus-search.c (dfs_pushdecls): Push class-local TYPE_DECLs into IDENTIFIER_CLASS_VALUEs. * cplus-typeck.c (c_expand_return): Call `expand_cleanups_to' with NULL argument in case the return value generated cleanups for its call. * stmt.c (expand_anon_union_decl): Fixed so that MEM anon unions are correctly handled. * cplus-decl2.c (finish_anon_union): Handle non-global static anonymous unions. * cplus-decl.c (shadow_tag): Change int variable OK to enum tree_code OK_CODE, remembering the value of the code we though was ok. This avoids being confused when other legitimate DECLSPECS (such as `static') appear after one like `union ...'. * cplus-class.c (popclass): When popping from a class's scope, back to another class's scope, restore CURRENT_VTABLE_DECL only if we had one before. * cplus-decl2.c (grokfield): Push TYPE_DECL into class level as soon as we see it. * cplus-class.c (instantiate_type): In ADDR_EXPR case, complain if type we are instantiating to is not POINTER_TYPE. * cplus-decl.c (start_method): Call `preserve_data' to save the parameters (which were read into the maybepermanent obstack). * cplus-typeck2.c (digest_init): Handle case of union with constructor. * cplus-init.c (build_member_ref): Vestigial bug from change in representation of method lists (from list of lists to list of chains). * cplus-class.c (instantiate_type): Rewrite TREE_LIST case to use `next_baselink' when appropriate, and to try overloading based on non-member functions if that looks appropriate. * cplus-search.c (next_baselink): New function. Contains code broken out of `build_method_call' to advance to next chain of FUNCTION_DECLs. * cplus-init.c (build_member_ref): If member ref is a reference to non-unique member function, return a BASELINK (which is a list of lists) rather than a list containing just that type's methods with that name. * cplus-init.c (resolve_member_ref): Handle uninstantiated method types. * cplus-decl.c ({start,finish}_decl): Call pushclass/popclass for decls which are static class members, in order to perform visibility computations for initializers correctly. * cplus-decl.c (grokvardecl): If static class member, set DECL_CONTEXT of the decl to the containing class type. * cplus-search.c (get_first_matching_virtual): Must call comptypes starting from first parameter, not its TREE_CHAIN, since one version of the function may have a this which is `*const' while the other does not. * cplus-decl.c (finish_decl): Permit static class members of reference type to be uninitialized in class declaration. They will get initialized elsewhere, presumably. * cplus-method.c (dump_type_prefix): `const' and `volatile' were being put in the wrong places. Type like `const *const ...' were being dumped as `const const *...'. * cplus-decl2.c (finish_file): Don't try to initialize anything which has ERROR_MARK_NODE in its initializer. Thu Oct 12 02:41:34 1989 Michael Tiemann (tiemann at arkesden) * cplus-init.c (resolve_member_ref): Catch case when we are in static member function context by reference is to (apparently) non-static member. * cplus-method.c (fndecl_as_string): Check PARMTYPES before chaining down, in case of syntax error. * cplus-init.c (do_friend): Take QUALS parameter. Needed for `grokclassfn'. Also take CTYPE instead of CNAME parameter. * cplus-decl.c (grokdeclarator): Caller changed. * cplus-init.c (do_friend): Set DECL_CONSTRUCTOR_P bit if we get a constructor. * cplus-tree.c (layout_basetypes): Don't allocate a virtual baseclass pointer if we can share one with a non-virtual baseclass. * tree.c (make_node): Build PARM_DECL nodes on the maybepermanent_obstack, not on the permanent_obstack. * cplus-typeck.c (build_unary_op): If addressing a reference and the reference is a variable, we need to check DECL_INITIAL, in case the variable is being initialized by a function call at top level. * cplus-decl.c (grokdeclarator): Be more careful when looking for function name when giving error that parameter list is random. * cplus-decl.c (grokdeclarator): Change handling of STATICP for member functions. Eliminate variable MEMFUNC_STATICP. * cplus-decl.c (init_decl_processing): Don't disable profiling anymore. Wed Oct 11 05:37:12 1989 Michael Tiemann (tiemann at arkesden) * c plus-except.c [_JBLEN]: More systems have more ways to fail to define this value. Implement yet another way to get it. * cplus-typeck.c (build_component_ref): Have to really check whether FIELD comes from a virtual baseclass. * cplus-init.c (is_aggr_typedef): Renamed `is_aggr_typedef_or_else' to `is_aggr_typedef', and gave it OR_ELSE parameter. All callers changed. * cplus-parse.y (member_init): Call `is_aggr_typedef' with zero value for OR_ELSE. We just want to know if the member looks like a virtual baseclass member or not. * cplus-method.c (build_decl_overload): Handle case where error has us building an overloaded name for something with a signature of X::f (...). That signature is technically erroneous, but can arise in the face of certain syntax errors. * cplus-lex.c (yylex): Handling of extern language strings was broken. If we were unlucky and got a file name string while reading a declaration, it could cause YYLVAL.TTYPE to contain the filename, rather than the type that was read in. Fixed by assigning to YYLVAL.TTYPE after checking for possible language string identifier. * cplus-init.c (build_new): We cannot expand `new' inside of base or member initializers, so instead put the expansion into an RTL_EXPR. CURRENT_VTABLE_DECL is ERROR_MARK_NODE in that case. * cplus-parse.y (.set_base_init): Set CURRENT_VTABLE_DECL to ERROR_MARK_NODE to indicate we are in initialization. * cplus-class.c (build_vfn_ref): Don't use cached vtable if calling function from base or member initializer. Tue Oct 10 22:47:47 1989 Michael Tiemann (tiemann at arkesden) * cplus-typeck.c (unary_complex_lvalue): Can't take pointer to member through virtual baseclass. * cplus-typeck.c (convert_for_assignment): Same change. * stmt.c (assign_parms): Don't let BLKmode parameter get ``rounded'' off its word boundary...`access_parm_map' does not know what to do if that should happen for an inline function. * cplus-decl.c (grokdeclarator): Distinguish STATICP, which has roughly the usual `C' meaning, from MEMFUNC_STATICP, which means that the declaration is a static member function. Mon Oct 9 00:55:19 1989 Michael Tiemann (tiemann at arkesden) * cplus-method.c (build_overload_name): Change naming scheme so that GNU calling convention (which passes objects in the stack) is distinct from cfront/PCC convention. * cplus-decl.c (push_overloaded_decl): Don't compare DECL_LANGUAGE of previously overloaded decl if it is not a FUNCTION_DECL. * cplus-decl.c (grokfndecl): Use parameter CHECK to control behavior of `grokclassfn' in non-constructor case (already used in constructor case). * cplus-class.c (finish_struct): Give warning if struct or union has no data members if PEDANTIC *or* EXTRA_WARNINGS. * cplus-typeck.c (convert_for_initialization): Don't forget to change TREE_READONLY VAR_DECLs into their constant initial value if they have one. * cplus-parse.y (.set_base_init): Change grammar to not go into error mode if a base initializer shows up for a non-member function. Otherwise, compiler will push binding levels (in `start_function' and `store_parm_decls') which it will not pop, leaving us not at global_bindings_p at function end. * cplus-class.c (ideal_candidate): In the event that there is no ideal candidate, restore PARMS by moving value from TREE_PURPOSE values back into the TREE_VALUE slots. Mon Oct 2 02:28:43 1989 Michael Tiemann (tiemann at arkesden) * cplus-lex.c (cons_up_dtor_for_type): Call to `start_method' could yield VOID_TYPE_NODE in case of errors. Handle that. * cplus-class.c (finish_struct): Caller of `cons_up_dtor_for_type' changed. * cplus-decl.c (pushtag): Don't call `pushdecl' on for tags which are TREE_NONLOCAL. * cplus-class.c (pushclass): Set TREE_NONLOCAL before calling `pushtag'. Sun Oct 1 00:05:49 1989 Michael Tiemann (tiemann at arkesden) * cplus-tree.h [DECL_VINDEX]: Change definition from being a FUNCTION_DECL to being a list of FUNCTION_DECLs, in the event that multiple baseclasses define the same virtual function. This only affects code where DECL_VINDEX was assumed to be a FUNCTION_DECL, namely in cplus-decl.c (grokfndecl) and cplus-class.c (add_virtual_function). * cplus-typeck.c (convert_for_initialization): If we are converting to an ARRAY_TYPE, don't call `default_conversion' on an initializer which is also of ARRAY_TYPE. * cplus-decl.c (finish_decl): If FIELD_DECL is of type ARRAY_TYPE that has not yet been laid out, we must go through the code which calls `complete_array_type' for TYPE and `layout_decl' for DECL. * cplus-init.c (expand_aggr_init_1): See whether initializer can go through a type-conversion operator rather than an X(X&) constructor, since wel will save one constructor that way. I.e., trying to go through an X(X&) constructor may lead us to needing to go through a type-conversion operator, but the result of that conversion must still go through the original X(X&) constructor. * cplus-decl.c (finish_decl): For FUNCTION_DECLs with default argument, we build sub-FUNCTION_DECLs to catch calls to this function with fewer than the total number of arguments. We set TREE_USED of the sub-FUNCTION_DECLs to keep GNU C++ from complaining about the function being when compiling with -Wall. We also need to set TREE_ASM_WRITTEN and DECL_INITIAL of the function to really ensure that GNU C++ does not spuriously complain about these sun-FUNCTION_DECLs. * cplus-decl.c (grokdeclarator): Set TREE_PUBLIC of after calling `grokfndecl' on all paths. * cplus-typeck.c (build_function_call): Set TREE_USED for FUNCTION_DECL if TREE_INLINE is zero. * cplus-decl2.c (grok_enum_decls): Move to cplus-decl.c since it now needs access to `struct binding_level'. * cplus-decl.c (grok_enum_decls): When looking for class-local enum tags, warning if we find them in a class binding level other than the current one. It probably indicates a parse error in the file. * cplus-decl.c (lang_decode_option): Recognize new option -Wenum-clash, which gives warnings when enumeral types are used in suspect ways, such as assigning from one enumeral type to another. * cplus-typeck.c (message_2_types): Was previously called `error_2_types'. Now takes argument PFN which is pointer to the function which will actually print the message. * cplus-typeck.c (convert_for_assignment): Give error for passing incompatible enums only if pedantic. Otherwise, give warning. * cplus-init.c (finish_base_init): Add argument T which is the type for which the base initialization is being finalized. When finished initializing fields which come from anonymous unions, call `finish_base_init' on that anonymous union, which will unmark interesting fields recursively. * cplus-decl.c (finish_function): Caller changed. * cplus-method.c (hack_identifier): Permit calls through REFERENCE_TYPE fields which overload `operator ()'. * cplus-cvt.c (convert): Remove warning ``assignment to virtual aggregate type''. * cplus-decl.c (finish_decl): Make sure to destroy function-local static objects if they had been initialized. Set TREE_STATIC bit for elements of STATIC_AGGREGATES which are function-local objects. * cplus-decl2.c (finish_file): Rest of that implementation. Sat Sep 30 20:34:52 1989 Michael Tiemann (tiemann at arkesden) * cplus-typeck.c (actualparameterlist): Don't let objects with operator= or X(X&) constructors be passing into `...'. If PEDANTIC, give error, otherwise, give warning. * cplus-typeck.c (convert_for_assignment): Get tougher on conversions to/from enumeral data types. * cplus-typeck.c (build_modify_expr): Make `operator=' an inheritable operator. * cplus-decl.c (push_overloaded_decl): Give error message if overloaded functions from different language contexts have the same type signature. * cplus-cvt.c (build_default_binary_type_conversion): If the types are not C++ types, then give error message saying that no type conversion operator exists. Call function `typedecl_for_tag' to get name for error message. * cplus-decl.c (typedecl_for_tag): New function. Return the TYPE_DECL (if any) assoicated with TAG. * cplus-class.c (build_functional_cast): Handle case where `A (B)' does not mean pass `B' to A's constructor, but rather call B.operator A (). * cplus-search.c (get_first_matching_virtual): If argument types differ only in their qualifiers, admit a match, but warn the user that this match was made. * cplus-lex.c (yyungetc): New function. Give parser routines the ability to adjust input tokens if initial lexing was a little bit wrong. * cplus-method.c (build_overload_name): Distinguish reference types from non-reference types. * cplus-typeck.c (process_init_constructor): Give error messages about types of objects which cannot be initialized from an initializer list. Wed Sep 27 00:22:16 1989 Michael Tiemann (tiemann at arkesden) * cplus-class.c, cplus-init.c (various places): Handle cases that fields of struct are really local type declarations. * cplus-decl2.c (grokclassfn): Added new parameter CTYPE, in order to remove dependence on class name-class type equivalence. This was done for exception handling. * cplus-decl.c, cplus-init.c, cplus-except.c: All callers changed. * cplus-lex.c (cons_up_dtor_for_type): Added parameter NAME, for same reason. * cplus-class.c (finish_struct): Caller changed. * cplus-decl.c (duplicate_decls): If OLDDECL's type must change, remove OLDDECL from STATIC_AGGREGATES if it was there. * cplus-decl2.c (finish_file): Handle VARS being ERROR_MARK_NODE. * cplus-class.c (build_method_call): When calling `build_new', pass BASETYPE, not NAME, as the thing to be new'd. * cplus-parse.y (raise_identifiers): Permit qualified names, i.e., `raises List::NotFound'. * cplus-decl.c (grokdeclarator): Handle nested exception scopes. * cplus-except.c (finish_exception_decl): Ditto. * cplus-class.c (build_method_call): Ditto. * cplus-except.c (init_exception_processing): Build in `setjmp' and `longjmp'. * cplus-except.c (expand_cplus_{start,end}_exception): If the exception object has elements which need cleanpus, call those cleanups after handling the exception. * cplus-except.c (finish_exception_decl): Set TYPE_HAS_CONSTRUCTOR bit, since call to `grokdeclarator' is subverted. * cplus-except.c (init_exception_processing): Size of `handler' field in built-in `ExceptionHandler' type was too big by one. * cplus-init.c (build_delete): Don't call non-virtual destructor with first argument of zero. * cplus-parse.y (except_stmts): Handle default exception as last exception (so that fall-through does the right thing). Also, give error message if multiple `default' clauses appear within an `except_stmt'. * cplus-decl.c (finish_decl): If a variable needs a cleanup, pass the cleanup to `expand_decl', whether or not that variable has RTL or not. * cplus-except.c (expand_start_try): Call `finish_decl' instead of `expand_aggr_init' to initialize the exception handler for the try. Otherwise, the exception handler's destructor will not be called at the end of the try. * cplus-decl.c (store_parm_decls): Don't call `__main' from `main' until after the parameters have been dealt with. Tue Sep 26 09:41:29 1989 Michael Tiemann (tiemann at teacake) * cplus-parse.y (stmt): Deal with case of TRY statement without corresponding EXCEPT clause. * cplus-decl.c (duplicate_decls): Don't call `compexcepttypes' until after calling `commontype', lest default parameters cause identical exception lists to look different. * cplus-except.c (end_exception_decl): New function clears exception declaration state. * cplus-parse.y (datadef): Call end_exception_decl when we are at the end of a declaration which could be an exception declaration. * cplus-class.c (modify_vtable_entry): Reenable stubbed out code which is used when baseclass is virtual. * cplus-class.c (finish_struct): When base class is virtual, check CLASSTYPE_VBASECLASSES using `value_member' instead of CLASSTYPE_ASSOC using `assoc_value'. * dbxout.c (dbxout_tags): Ensure that fully output types have their typedefs output as well. Needed to support -fminimal-debug. Sun Sep 24 11:22:41 1989 Michael Tiemann (tiemann at arkesden) * cplus-method.c (report_type_mismatch): Don't tweak I if the function was FUNCTION_TYPE. Let TTF and TTA be advanced according to CP->U.BAD_ARG only. * expr.c (expand_expr): PROTECT argument missing in call to `expand_delete'. * cplus-init.c (build_delete): Call `convert_force' instead of `convert' if PROTECT is 0. * cplus-typeck2.c (digest_init): When initializing a RECORD_TYPE object, call `convert_for_initialization' as a last resort. * cplus-tree.c (build_exception_variant): Used TREE_CHAIN for look when should have used TYPE_NEXT_VARIANT. * cplus-decl.c ({start,finish}_decl): Handle decls which are CLASSTYPE_DECLARED_EXCEPTION. For `start_decl', nothing needs to be done. For `finish_decl', call `finish_exception_decl'. * cplus-except.c (finish_exception): When user defines an exception, make the compiler generate that exception's constructor automatically. * cplus-typeck.c (build_binary_op_nodefault): Associate (((a && b) && c) && d) to ((a && b) && (c && d)) to get better merging of component references when possible. * cplus-typeck2.c (merge_component_comparisons): Permit non-contiguous bitfield tests if bitfields are comparisons against integers. * cplus-tree.c (layout_basetypes): Give each basetype the alignment it wants. * cplus-lex.c (yylex): Recognize >?= and <?= operators (like += for min and max operators). * cplus-decl.c (grokdeclarator): Set TREE_PUBLIC bit of FUNCTION_DECLs in FIELD_CONTEXT if they are !INLINEP. * cplus-decl.c (finish_function): Don't pay attention to `current_function_returns_null' when compiling constructors. Sat Sep 23 00:03:52 1989 Michael Tiemann (tiemann at arkesden) * stmt.c (assign_parms): Take care of case where parm arrives on the stack, but `__builtin_saveregs' might be called. In that case, get bits from stack into registers, so that `__builtin_saveregs' will not overwrite with garbage. * expr.c (expand_builtin): Modify expansion of BUILT_IN_SAVEREGS to protect stack args that need protecting. * cplus-decl.c (grokdeclarator): Never build a METHOD_TYPE if CTYPE is NULL_TREE. Was doing that when declaration of illegal construct ``virtual friend'' was parsed. * cplus-parse.y (do_array:): Don't try to call `build_array_ref' if $3 is ERROR_MARK_NODE (cuts down on spurious error messages). * cplus-decl.c (grokfndecl): Move setting of DECL_VIRTUAL_P bit to after we know whether the function is virtual. Remove setting CLASSTYPE_VSIZE. This will be set more accurately by `finish_struct'. Fri Sep 22 15:36:32 1989 Michael Tiemann (tiemann at arkesden) * cplus-cvt.c (convert_to_pointer): PATH was reversed for computing nested virtual base accesses. * cplus-except.c (finish_exception): Call POPCLASS at end. * cplus-class.c (build_field_call): New function containing code broken out of `build_method_call'. Extended to grok calls through fields of exception objects which overload `operator()()', or are otherwise callable. * cplus-class.c (build_method_call): Now about 100 lines shorter. * cplus-decl.c (grokdeclarator): Take new argument RAISES specifying the exceptions that a function will raise. * cplus-decl.c (grokfield): Implement RAISES semantics by passing them to `grokdeclarator'. * cplus-decl.c (grok{fn,var}decl): Two new functions containing code broken out of `grokdeclarator'. * cplus-decl.c (grokdeclarator): Now about 250 lines shorter. Thu Sep 21 16:51:11 1989 Michael Tiemann (tiemann at arkesden) * cplus-search.c (get_vbase_types): Sort was totally broken. Completely rewritten. Wed Sep 20 00:47:36 1989 Michael Tiemann (tiemann at teacake) * cplus-decl2.c (finish_file): Change !defined(SDB_DEBUGGING_INFO) to defined(DBX_DEBUGGING_INFO). * cplus-class.c (finish_struct): Argument to `alloca' was off by 9. * cplus-init.c (build_new): If type requires alignment > BITS_PER_WORD (which is what ``__builtin_new'' is supposed to give), then get more space and round manually. Tue Sep 19 03:08:58 1989 Michael Tiemann (tiemann at teacake) * cplus-decl.c (finish_decl): Don't call `comptypes' if INIT is error_mark_node. * cplus-cvt.c (convert_to_reference): Set TREE_VOLATILE bit for assignment from one reference to another (for build_compound_expr). * cplus-decl2.c (finish_file): If we are compiling on Suns, bind local label ``_fini'' to static file cleanup function and ``_init'' to static file initialization function. STUBBED OUT FOR NOW. * cplus-parse.y: Put `type_quals' in 3rd operand position of a CALL_EXPR. Interface to `start_function', `start_method' and `grokfield' changed. * cplus-decl.c (grokdeclarator): Get QUALS from TREE_OPERAND (CALL_EXPR, 2). [n.b.: First operand is TREE_OPERAND (CALL_EXPR, 0)]. * cplus-tree.h (TYPE_RAISES_EXCEPTIONS): For FUNCTION_TYPE and METHOD_TYPE, a list of the exceptions that may be raised. * cplus-decl.c (duplicate_decls): Remove assumption that TYPE_LANG_SPECIFIC implies that type IS_AGGR_TYPE. Mon Sep 18 14:08:02 1989 Michael Tiemann (tiemann at teacake) * cplus-class.c (add_virtual_function): If WRITE_VIRTUALS == 2, only set the TREE_ADDRESSABLE bit on a virtual function if the virtual function table is actually being output in this file. * cplus-decl.c (grokdeclarator): If WRITE_VIRTUALS == 2, make inline virtual functions TREE_PUBLIC if we are writing out this virtual function's virtual function table. * cplus-lex.c (reinit_parse_for_method): Don't clobber the above setting of TREE_PUBLIC for virtual functions. * cplus-lex.c: Process inline functions in declaration order. Sun Sep 17 01:46:14 1989 Michael Tiemann (tiemann at teacake) * cplus-declc. (grokdeclarator,start_method,start_function): Merge ``extern inline'' change. * cplus-typeck2.c (merge_component_comparisons): New function. Optimizes operations on contiguous component references provided that operations and alignments permit. * cplus-typeck2.c (make_merged_ref): Subroutine of above function to actually get the combined references. * cplus-typeck2.c: New file. Contains error-reporting functionality from cplus-typeck.c, and other functionality which could be easily moved out. * cplus-typeck.c (unary_complex_lvalue): Must test against {FUNCTION,METHOD,OFFSET}_TYPE before testing whether ARG is a MEMBER_REF. If the former holds, then we have an expression like X::Y. In the latter case, we have an expression like (X->*Y). Sat Sep 16 11:31:21 1989 Michael Tiemann (tiemann at teacake) * toplev.c (main): Recognize `+' options again. * cplus-decl.c (lang_decode_option): Implement `+e2' option, which writes out only virtual function tables specified in #pragma vtable. * cplus-decl2.c (finish_file): Implement semantics of `+e2' option. * cplus-lex.c (yylex): Recognize `#pragma vtable'. * cplus-decl2.c (finish_file): Charge time used against VARCONST_TIME, not PARSE_TIME. Thu Sep 14 18:04:10 1989 Michael Tiemann (tiemann at teacake) * cplus-init.c (build_new): If FLAG_THIS_IS_VARIABLE is non-zero, then generate call to constructor with zero as first argument. Otherwise, use `expand_aggr_init' to initialize the storage returned from whatever storage allocator was called. Initialization of virtual baseclasses simplified. Memory management made more complex (though more general) because we may have `new' expressions not being evaluated until `finish_file' is called. * cplus-decl2.c (finish_file): Handle a `new' expreesion at top level. * cplus-decl.c (finish_function): Change call from `build_x_new' to `build_new'. * cplus-init.c (build_x_new): Deleted. * cplus-init.c (build_new): Give error if arguments are given to a `new' expression for which no constructor is defined. * cplus-decl.c (decode_lang_option): Use option table from toplev.c to decode -f options. * cplus-method.c (flush_repeats,build_overload_name): Change naming convention to avoid ambiguous names if type index or number of repeats is more than nine. * cplus-except.c (init_exception_processing): Use <setjmp.h> to find length of setjmp buffer. Wed Sep 13 05:32:50 1989 Michael Tiemann (tiemann at teacake) * cplus-decl.c (start_method): Set TREE_INLINE bit if FLAG_DEFAULT_INLINE is nonzero. * cplus-decl.c (lang_decode_option): Recognize -fdefault-inline. * cplus-init.c (do_friend): Call `pushdecl_top_level' instead of `pushdecl'. * cplus-decl.c (start_method): Only need to copy node if it is not a friend. * cplus-decl.c (finish_method): In that case, return VOID_TYPE_NODE if the method was really a friend, but save it to CLASSTYPE_INLINE_FRIENDS so it can be processed properly later. It would be nice to have an obstack for this list so it could be freed at the end of this class's processing. Tue Sep 12 05:22:03 1989 Michael Tiemann (tiemann at teacake) * cplus-decl.c (start_function): Make C++ FUNCTION_DECL inherit DECL_ASSEMBLER_NAME from old C FUNCTION_DECL if their types are identical. This makes C<->C++ calls *much* easier to deal with. * cplus-decl.c (xref_tag): Don't set CLASSTYPE_DECLARED_CLASS bit if REF is CURRENT_CLASS_TYPE (??? or on the CURRENT_CLASS_STACK). * cplus-search.c (lookup_field_1): Give the user the virtual function table field if the name is `_vptr'. * cplus-decl2.c (grokfield): Don't let user declare anything with that name. * cplus-cvt.c (build_type_conversion): If we are trying to convert to type `void*' and no conversion to ptr_type_node exists, but a some other pointer conversion for TYPE exists, then convert to that pointer type, unless there is more than one such conversion, in which case return ERROR_MARK_NODE. The caller will emit an error message in that case. All callers changed. * cplus-cvt.c (convert_to_{integer,real,pointer}): Removed `saving throw' case which would try converting aggregate to a default type if requested conversion did not succeed. `build_type_conversion' knows how to perform such `saving throws'. * cplus-tree.h (lang_type): New field `ptr_type_conversion'. * cplus-decl.c (grokdeclarator): Record whether a type has a type conversion operator here. * cplus-class.c (finish_struct): Set up `ptr_type_conversion'. Also, don't need to trudge through all methods to find out there are no type conversion methods. Mon Sep 11 10:45:01 1989 Michael Tiemann (tiemann at teacake) * cplus-class.c (finish_struct): If we must cons up a destructor for a type, and METHOD_VEC was 0, set TREE_VEC_LENGTH (METHOD_VEC) to 1 after allocating METHOD_VEC. * cplus-class.c (finish_struct): Finish processing METHOD_VEC before making other calls out which may call `hash_tree_chain'. * cplus-class.c (finish_struct): Add BASE_LAYOUT_DECL to eliminate need for callback in stor-layout.c. * cplus-typeck.c (build_binary_op): Special case situation where we compare ARG1 with INTEGER_ZERO_NODE and ARG1 is of aggregate type. This is what comes from `truthvalue_conversion'. * cplus-cvt.c (build_type_conversion): New argument CODE says for what purpose the conversion is taking place. Important ones are truthvalue operations, which permit us to convert to different types then the ones we asked for. All callers changed. * cplus-cvt.c (build_default_{binary,unary}_type_conversion): Same change. All callers changed. * cplus-class.c (finish_{base_}struct): Set TYPE_NEEDS_CONSTRUCTING bits when basetype or member type needs constructing. * cplus-search.c (compute_visibility): Use TYPE_MAIN_VARIANT to see if field is public member of private baseclass. * cplus-init.c (expand_aggr_init_1): When bad arguments were passed to constructors for base initialization, only half the error message would appear. * Makefile: Remove dependencies on unexec.c and unex-addr.c. * cplus-decl.c (push_overloaded_decl): Can't use `value_member' to find previously declared function. Use DECL_NAME of function instead, since that must be unique (as a type signature/name combination). * cplus-lex.c (yylex): typo in assert macro. * cplus-cvt.c (convert_to_nonzero_pointer): Ditto * All GNU C++ files: implement initialized constant fields. Make them non-static, non-addressable VAR_DECLs. Sun Sep 10 09:19:22 1989 Michael Tiemann (tiemann at teacake) * cplus-method.c (build_opfncall): Remove METHOD_REF case. * tree.def: Remove definition of METHOD_REF. * cplus-decl.c (finish_decl): If a static member needs constructing, but it does not have an initializer, make it TREE_EXTERNAL. * cplus-decl2.c (grokfield): Set DECL_IN_AGGR_P before calling `finish_decl' for VAR_DECLs. * cplus-parse.y (forhead.2): New rule to keep GNU C++ gives better error handling when multiple variables are declared in the first part of a `for' stmt. * cplus-lex.c (finish_method): Handle case when `start_method' returns VOID_TYPE_NODE (two definitions of the same method in the same class. * cplus-decl.c (grok_op_properties): Make static operators (other than new and delete) trigger error messages. If operator new or delete has no arguments (due to syntax errors), rebuild their types. They have the right names, because `build_operator_fnname' knows how to do that. * stor-layout.c (make_{un}signed_type): Cache size nodes for pointers, functions, and methods. * stor-layout.c (layout_type): Use cached types. * cplus-decl{2}.c: Use `hash_tree_chain' instead of `tree_cons' where possible. * cplus-decl.c (expand_static_init): If variable has already been initialized, give complaint, but don't store the initializer. That way we don't have to preserve it on the temporary obstack. * cplus-parse.y (identifier_or_opname): Accept new C++ destructor syntax, which is effectively "scoped_identifier '~' identifier". * cplus-class.c (build_scoped_method_call): Accept calls using new C++ destructor syntax here. * cplus-class.c (build_method_call): Reject calls through here which don't use a leading `scoped_identifier'. * cplus-init.c (build_new): Don't permit arrays of `void'. Better error message emitted for newing `void'. * cplus-typeck.c (build_conditional_expr): Don't call `default_conversion' on the arms of the conditional if both are of the same enumeral type. Otherwise, if EXTRA_WARNINGS, give warning if enumeral type appears in either (or both) arm(s) of the conditional. * cplus-cvt.c (build_type_conversion): Don't convert from `int' to `void*'. Don't convert a `void*' to an `int'. * cplus-decl.c (xref_tag): If we get an old reference to a C struct name, and we are in C++ langauge context, give it a TYPE_DECL. * cplus-class.c (build_method_call): Don't call `default_conversion' on MEMBER_REFs because they might be enums. Instead, call `resolve_member_ref', and then if the type is something we would rather convert before calling compute_conversion_costs, convert that. * cplus-init.c: Set TREE_VOLATILE bit after all ``build (CALL_EXPR, ...)'' calls. * cplus-init.c (expand_vec_init): If at global binding level, return a TREE_VEC which contains the initialization parameters for the vector. `expand_vec_init' is no longer static. * cplus-decl.c (finish_decl): Handle INIT being result of `expand_vec_init' at top-level. * cplus-decl2.c (finish_file): Ditto. Sat Sep 9 12:44:48 1989 Michael Tiemann (tiemann at teacake) * cplus-class.c (finish_struct): Move error message about static members in unions from stor-layout.c to here. * varasm.c, stor-layout.c: Merged with GCC. * cplus-class.c (finish_struct): Use special FIELD_DECL in TYPE_FIELDS of T before calling `layout_type' to have effect of passing basetype layout information to `layout_record'. * cplus-typeck.c (build_c_cast): Typo in call to cleanup_after_call. Fri Sep 8 11:16:01 1989 Michael Tiemann (tiemann at teacake) * All GNU C++ files: replaced calls to `abort' with assertion macros where appropriate. Also removed some unneccessary tests against ERROR_MARK_NODE in various function calls. * cplus-lex.c (check_newline): Changed to take NEXTCHAR into account. Thu Sep 7 06:15:56 1989 Michael Tiemann (tiemann at teacake) * cplus-decl.c (store_parm_decls): Change where DECL_REFERENCE_SLOT is initialized. Eliminate a second loop through the parms. * cplus-method.c (hack_identifier): Don't need to test against FUNCTION_DECL before testing if the TREE_TYPE is REFERENCE_TYPE. * cplus-lex.c (yylex): If reading `0' or `1', return INTEGER_ZERO_NODE or INTEGER_ONE_NODE respectively. * cplus-decl.c (build_enumerator): If we got one of these two as a value, make a copy. * tree.c,cplus-lex.c,cplus-class.c,cplus-search.c [GATHER_STATISTICS]: Now only gather statistics if this macro is defined. * tree.c (make_node,build_int_2,tree_cons,build_tree_list): Merge Bryan Boreham's ``deluxe'' memory profiling code. * cplus-decl.c (finish_decl): Only complain about uninitialized refs and consts if there is no constructor for the type. If there is a constructor, then that constructor should say whether it did not initializer certain fields or not. * cplus-init.c (expand_aggr_init): When initializing, nothing is `const'. * cplus-decl.c (store_parm_decls): No need to call expand_decl_init on a PARM_DECL. In fact, now it is wrong. * tree.h: rearranged tree_decl layout and defined tree_function_decl type for FUNCTION_DECLs. Now space requirements for FUNCTION_DECLs do not impose on other kinds of _DECL nodes. Also, PARM_DECL nodes use less than a full decl node's worth of space. * toplev.c (rest_of_decl_compilation): Don't permit ASMSPEC to appliy to PARM_DECL nodes. * varasm.c (make_decl_rtl): Abort if called for a PARM_DECL node. * print-tree.c (dump): PARM_DECL nodes are not full. FUNCTION_DECL nodes have more fields then regular _DECLs now. * tree.c (make_node): Use TREE_CODE_LENGTH when allocating _DECL nodes. Also, don't set DECL_SOURCE_* for PARM_DECL nodes. Instead, set their DECL_CONTEXT to CURRENT_FUNCTION_DECL. * tree.c (build_decl): Don't set DECL_ASSEMBLER_NAME for PARM_DECL nodes. * cplus-decl.c (start_decl): Don't not push DECL if DECL is a PARM_DECL. * cplus-lex.c (yylex): Remove tests about whether we *really* saw a keyword or not. Instead, use `init_lex' to do most of the work for us (since lang_c's reserved word set is a subset of lang_cplusplus). * cplus-decl.c,cplus-decl2.c,cplus-typeck.c,cplus-class.c, cplus-lex.c, cplus-method.c: change tests of the form (TREE_VALUE (t) == void_type_node) to (t == void_list_node). * cplus-decl2.c (grokopexpr): Added argument CTYPE to help distinguish whether operators NEW and DELETE belong to a class, or are the global operators NEW and DELETE. * cplus-decl.c (grokdeclarator): Caller changed. * cplus-method.c (hack_operator): Caller changed. Wed Sep 6 10:29:45 1989 Michael Tiemann (tiemann at teacake) * dbxout.c (dbxout_type): Handle static member functions. * cplus-typeck.c (c_expand_return): Change test from TYPE_NEEDS_CONSTRUCTING to TYPE_NEEDS_CONSTRUCTOR to see whether `expand_aggr_init' must be called. * cplus-decl2.c (grokfield): Use `digest_init' to digest CONSTRUCTOR initializers of fields. * cplus-decl.c (grokdeclarator): Permit ARRAY_TYPE field decls to get their types from their initializer (if they were incomplete). * cplus-lex.c (build_operator_fnname): If there is more than one parameter to NEW_EXPR, then it is `__user_new'. * cplus-decl.c (store_parm_decls): Remove code to deal with case that function was declared without prototypes. It is never executed. * cplus-typeck.c (unary_complex_lvalue): Handle (x->*y) as an lvalue. * cplus-decl.c (start_decl): Put in check that temporary obstack starts out empty when we start parsing an initializer. * cplus-decl.c (expand_static_init): If the initializer was read into the temporary obstack, preserve all space that it used. I don't think it is safe to always read the initializer into the permanent_obstack and then free the space if it doesn't look interesting, because types may be created dynamically as a result of reading it in (such as array types), and we don't want them to get freed. * cplus-decl.c (finish_decl): Don't set DECL_ASSEMBLER_NAME of the decl to ASMSPEC if ASMSPEC is 0. * cplus-decl.c (finish_function): Set named_label_uses to NULL_TREE at end of function. Tue Sep 5 05:24:18 1989 Michael Tiemann (tiemann at teacake) * cplus-except.c: New file. Implements exception handling scheme designed by Michael Powell. * cplus-method.c (build_overload_name): Overload constructor names as '__' instead of whatever their original name was. * cplus-method.c (build_decl_overload): Distinguish constructors from other kinds of member functions. * cplus-decl2.c (grokclassfn): Call changed to `build_decl_overload' to take this into account. * cplus-decl.c (duplicate_decls): Don't crash if NEWDECL is a VAR_DECL, and there is an old VAR_DECL on the chain. Happens for strange parse errors. Mon Sep 4 01:36:07 1989 Michael Tiemann (tiemann at teacake) * cplus-decl2.c: New file. Contains functions which used to be defined in cplus-decl.c, but could be easily broken out. Also moved some functions out of cplus-tree.c which did not really belong there, but were put there to make compilation less painful. * cplus-class.c (build_method_call): Use ERR_NAME in more places when printing error messages. * cplus-decl.c (grokdeclarator): Special case NEW_EXPR and DELETE_EXPR when grokking an OP_IDENTIFIER. Make these guys static member functions. Callers in cplus-init.c changed. * cplus-tree.c (coerce_new_type,coerce_delete_type): Force the type of `operator new' and `operator delete' to wind up with the right types. * cplus-lex.c (build_operator_fnname): Handle `operator new' and `operator delete' correctly, warning when the wrong number of parameters show up. * expr.c (expand_expr): Add NEW_EXPR to the list of tree codes for which INIT_EXPR and MODIFY_EXPR don't need to deal with noncopied_parts. * cplus-class.c (finish_struct): Initialize TREE_PURPOSE of TYPE_NONCOPIED_PARTS to the virtual function table for the type. * cplus-cvt.c (build_type_conversion_1): Compiler was getting into infinite recursion when asked to convert something from its own type to its own type. * cplus-parse.y: Added RERAISE statement. * cplus-lex.c: Added __reraise keyword. * cplus-cvt.c (build_type_conversion): Build type conversions to type variants (i.e., given `operator char * ()', convert to a `const char *'). * dbxout.c (dbxout_tags): Callback to language-specific files to see whether a type should actually be output. * dbxout.c (dbxout_symbol): Same change. * cplus-tree.c (lang_output_debug_info): New function. * cplus-decl.c (finish_function): Memoize information for lang_output_debug_info. * Merged latest changes from Bryan Boreham for incremental compilation via dumping. * cplus-parse.y: Recognize `::new' and `::delete'. * cplus-init.c (build_new): Handle `::new' by new interpretation of USER_PARMS. Only callers in cplus-parse.y needed changing. * cplus-init.c (build_{x_}delete): Handle `::delete' by accepting new argument USE_GLOBAL_DELETE. All callers changed. Sun Sep 3 12:42:38 1989 Michael Tiemann (tiemann at teacake) * expr.c (expand_cleanups_to): New function. * cplus-init.c (expand_cplus_expr_stmt): Call it after all is said and done. * expr.c (expand_expr): When encountering a NEW_EXPR, it is possible that the NEW_EXPR did not know (when it was built) what its cleanup needed to be. If its cleanup is 0, try building one if a new temporary was built for it. * cplus-decl.c (duplicate_decls): Warn if function type qualifiers don't match only if PEDANTIC (following change made by rms). * cplus-typeck.c (build_function_call): If pedantic, don't permit `main' to be called. * cplus-typeck.c (convert_for_assignment): Don't let ints convert to enums. * cplus-decl.c (start_function): Ensure that `main' is always declared to return an integer type. * cplus-decl.c (finish_function): Make it so that `main' always returns 0 by default. * cplus-decl.c (grokdeclarator): Make it now an error to specify return types for constructors and destructors. * cplus-typeck.c (comp_target_{parms,types}): Loosen up to permit contravariance violations, though not without warning. * cplus-method.c (build_overload_name): Change from old overloading scheme to one more or less compatible with type-safe linkage scheme proposed in Stroustrup's 1988 USENIX paper. Sat Sep 2 09:16:01 1989 Michael Tiemann (tiemann at teacake) * cplus-typeck.c (convert_for_initialization): Permit initialization of reference from incomplete type: that type will be converted to REFERENCE_TYPE, and that is just as good as a pointer to incomplete type. * cplus-decl.c (finish_decl): Handle case of static reference initialized from non-constant initializer. Break out code to initialize static variables as function `expand_static_init'. * cplus-decl.c (finish_decl): Don't call constructors on external variables. * integrate.c (copy_for_inline): Canonicalize PLUS expressions so that CONST_INTs appear on the right, and `FRAME_POINTER_RTX' and/or `ARG_POINTER_RTX' on the left. * integrate.c (copy_rtx_and_substitute): Take advantage of this fact and test fewer things while integrating. * cplus-typeck.c (c_expand_return): Try to get away with not issuing a call to `use_variable' for the DECL_RESULT of the function. If that fails, calling it only if `any_pending_cleanups' returns nonzero. * cplus-init.c (expand_recursive_init_1): Handle multi-demensional arrays which need constructing. * cplus-init.c (expand_vec_init): Handle multi-demensional arrays. Say sorry if we try to use an explicit initializer in that case, however. * cplus-parse.y: Permit the integer zero to be deleted (though who would want to?). * varasm.c (make_function_rtl): Replace call to lang_rtl_name with use of DECL_ASSEMBLER_NAME. * cplus-decl.c (lang_rtl_name): Removed. * cplus-decl.c (grokclassfn): Set DECL_ASSEMBLER_NAME after changing DECL_NAME. * cplus-init.c (do_friend): Ditto. * cplus-decl.c (start_function): If CURRENT_FUNCTION_DECL is a destructor, set up DESTRUCTOR_LABEL. * cplus-decl.c (finish_function): If DESTRUCTOR_LABEL is nonzero, expand just before calling base destructors. * cplus-typeck.c (c_expand_return): If DESTRUCTOR_LABEL is nonzero, jump there instead of just expanding the return. * collect.c (process): Change from (andrew%frip.wv.tek.com@relay.cs.net) to skip auxiliary entries. * All GNU C++ files merged from 1.35.97+ to 1.35.98. * cplus-decl.c (define_label): If a newly declared variable in the label's binding contour will need a cleanup, it must live in a new binding contour. * cplus-decl.c (define_case_label): New function. Same goes for case labels. * cplus-parse.y (stmt): Call `define_case_label' for CASE statements. * cplus-decl.c (lookup_label): Record in variable NAMED_LABEL_USES for each label the variables currently in scope at the use of the label. * cplus-decl.c (define_label): Give error message if jump to label crosses variable initialization in the current scope. * cplus-decl.c (struct binding_level): Change field `more_cleanups_ok' from char to bitfield. Added field `have_cleanups'. Change other fields to bitfields so that `struct binding_level' fits in 7 words, which can be malloc'd in total of 32 bytes. * cplus-decl.c (PUSH_BINDING_LEVEL,maybe_build_cleanup): Initialize and set field `have_cleanups'. * cplus-decl.c (expand_label): Set `more_cleanups_ok' to zero when we cross a label. * stmt.c (struct stack_block): Added field `initialized_decls_p' for blocks which need their decls expanded before used. * stmt.c (expand_decl{_init}): Set field initialized_decls_p when appropriate. Fri Sep 1 04:29:44 1989 Michael Tiemann (tiemann at teacake) * Exception handling constructs recognized (but nothing working). * cplus-decl.c (init_decl_processing): Call `set_identifier_size' with a length, not a number of bytes. * cplus-class.c (build_class_init_list): Braino. * cplus-init.c (expand_aggr_init_1): Reinitialize virtual base class virtual function tables if they are set to wrong values by their constructors. * cplus-init.c (expand_aggr_init): Initialize virtual base class virtual function tables if they are not set any other way. * cplus-class.c (finish_struct): Use CLASSTYPE_VSIZE instead of TYPE_VIRTUAL_P to determine whether a particular class has virtual functions which belong in its vtable. A type can be TYPE_VIRTUAL_P, meaning that *somewhere* it relies on virtual functions, but CLASSTYPE_VSIZE could be zero, meaning that it itself may not even have a virtual function table pointer. * cplus-decl.c (finish_file): Same changes. * cplus-decl.c (setup_vtbl_ptr): Same changes. * dbxout.c (dbxout_type): Same changes. * cplus-tree.c (layout_basetypes): Same changes. * cplus-class.c (finish_base_struct): Return 0 if all virtual functions come only from virtual baseclasses. Also, do not put into VFIELDS those fields which come from virtual baseclasses. * cplus-class.c (modify_vtable_entry): Instead, run through by hand the virtual baseclasses whose virtual function tables need to be modified. This means really using exactly the right associations for both base, context, and derived types. * cplus-class.c (prepare_fresh_vtable): Change parameter TYPE to CONTEXT_ASSSOC. All callers changed. Thu Aug 31 08:17:45 1989 Michael Tiemann (tiemann at teacake) * cplus-class.c (finish_struct): Test MAX_HAS_VIRTUAL, not HAS_VIRTUAL to assign TYPE_VIRTUAL_P (T). * integrate.c (save_for_inline): Add new variable PARM_INITIALIZATION which is nonzero during parameter initialization (either from the stack or registers). * integrate.c (copy_for_inline): Only zero TREE_READONLY of parm if PARM_INITIALIZATION is zero. * integrate.c (expand_inline_function): Back out Aug 30 TREE_INLINE change for PARM_DECLs. * cplus-decl.c, cplus-typeck.c: Ditto. * cplus-decl.c (finish_decl): Take into account case where static variable must be initialized ``by hand''. * cplus-typeck.c (store_init_value): Return VALUE if initialization could not be trivially performed for static variable. Otherwise return NULL_TREE. * cplus-decl.c (get_temp_name): Add parameter STATICP. All callers changed. * integrate.c (copy_rtx_and_substitute): Significantly simplify PLUS and MEM case after finding out that code from tList.cc could break the complex cases on Sparc. Net effect: maybe more work for optimizer in later passes, and maybe more space occupied by inline insns during compilation. * expr.c (store_one_arg): Add test to see if we can avoid calling convert_units if possible. Wed Aug 30 04:01:15 1989 Michael Tiemann (tiemann at teacake) * toplev.c (main): Change +e[01] to -f+e[01], and move to lang_decode_option. * cplus-decl.c (lang_decode_option): Incorporate new flags. * integrate.c (copy_rtx_and_substitute): Don't build a SUBREG of a CONST_INT. * integrate.c (expand_inline_function): Change test of FORMAL from TREE_READONLY to TREE_INLINE. * cplus-typeck.c (build_modify_expr,build_unary_op): When modifying a PARM_DECL, set TREE_INLINE to 0. * cplus-decl.c (store_parm_decls): Set TREE_INLINE of PARM_DECL to 1. * cplus-decl.c (finish_function): When finishing constructors, if simple case holds (no cleanups), just store CURRENT_CLASS_DECL into the DECL_RESULT of FNDECL and fall through. * integrate.c (expand_inline_function): Don't emit NOTE_INSN_DELETED notes. * cplus-parse.y (compstmt): Only save binding contour information if there actually were decls. * cplus-decl.c (finish_file): Argument LINENO was missing in calls to finish_function. Tue Aug 29 23:03:17 1989 Michael Tiemann (tiemann at teacake) * cplus-typeck.c (unary_complex_lvalue): Treat INIT_EXPR like MODIFY_EXPR. Also, handle WITH_CLEANUP_EXPR case. * expr.c (expand_expr): Brainos in WITH_CLEANUP_EXPR case. * cplus-cvt.c (build_up_reference): Handle case where ARG is a WITH_CLEANUP_EXPR. * stmt.c (expand_function_end): *Don't* set REG_FUNCTION_VALUE_P. * tree.def [NEW_EXPR]: Change from 2 arguments to 3. Third argument, if non-NULL, is cleanup expression to run after the new'd expression is used. All users of NEW_EXPR changed. Sun Aug 27 01:13:09 1989 Michael Tiemann (tiemann at hobbes.ai.mit.edu) * stor-layout.c (layout_basetypes): Move from this file. * cplus-tree.c (layout_basetypes): To this one. * make-links.g++ (borrowed_files): typeclass.h is now a borrowed file. * cplus-decl.c (cleanup_after_call): New function. * cplus-typeck.c (build_compound_expr): Call it if neccesary. * cplus-typeck.c (build_c_cast): Ditto. * cplus-init.c (expand_cplus_expr_stmt): Ditto. * expr.c (expand_call): Remove code to allocate destructable stack slot if function return value is not used. * cplus-decl.c (init_decl_processing): `built_in_vec_delete' is NOT_BUILT_IN. * expr.c (expand_builtin): Don't try to expand EXPAND_VEC_DELETE. * cplus-init.c (build_vec_delete): Build the vector delete here; don't make a call to `__builtin_vec_delete'. * expr.c (expand_expr): Merge INIT_EXPR and MODIFY_EXPR. * expr.c (init_noncopied_parts): New function. * gcc.c: Merged completely. Use GCC from standard distribution. Sat Aug 26 10:38:14 1989 Michael Tiemann (tiemann at hobbes.ai.mit.edu) * cplus-typeck.c (build_binary_op): Perform type instantiation if necessary. * cplus-class.c (instantiate_type,build_instantiated_decl): Change "type instantiation" to "overload" in various error messages. * cplus-class.c (instantiate_type): Also fix error message to report overload resolution failure only if function has more than one type signature declared. * cplus-class.c (instantiate_type): Call `mark_addressable' on result of instantiating something for an ADDR_EXPR. * 1.35.96 to 1.35.97+ changes: * Makefile: Change name of `cplus-parse.tab.*' to `cplus-tab.*'. * cplus-lex.c: Change #includes to reflect this. * cplus-decl.c: All merged except CURRENT_EXTERN_INLINE. * toplev.c: Changes for extern inlines not merged. * cplus-decl.c (finish_file): Reset FNNAME from DECL_NAME of the current function, since `start_function' may cause it to change if overloaded. Also, push into C language context during the generation of file-level initializer/cleanup functions, since we don't want the extra-long names that overloading will give us. * cplus-decl.c,cplus-class.c,cplus-search.c: #include "obstack.h" instead of "cplus-obstack.h". * gnulib3.c: New file. Provides initialization and cleanup services for GNU C++. This should obviate the need for crt0.c. * crt1.c: Changed completely for new initialization/cleanup model. * cplus-decl.c (store_parm_decls): Put in special hooks to call `__main' from `main' for such purposes. Thu Aug 24 02:11:42 1989 Michael Tiemann (tiemann at yahi) * cplus-lex.c (check_newline): Only call unexec #ifndef DONT_HAVE_UNEXEC. * cplus-lex.c (reinit_parse_for_method)[USG]: If the buffer given to setvbuf is shorter than eight bytes long, setvbuf will (in violation of its man page) ignore the buffer and call malloc to get a bigger one. Fixed. * cplus-typeck.c (comp_target_types): Permit converting from a T** to a T** which has different qualifiers. * gcc.c (collect_spec): Changes for sun386. * collect.c: Ditto. * config.g++: Ditto. * cplus-parse.y (primary): Handle case where unfound identifier comes from base class during class declaration. * cplus-init.c (build_member_ref): Handle uses of class-local enums and static members before type is completed. * cplus-decl.c (pushdecl_class_level): Put enums and static members into class scope as soon as they are seen. * cplus-decl.c (poplevel_class): Make sure to take them out upon leaving scope. * cplus-lex.c (build_lang_field_decl): Take new argument CODE to say what kind of decl to build. * cplus-decl.c,cplus-parse.y: All callers changed. * cplus-decl.c (grok_enum_decls): Call `build_lang_field_decl' instead of `build_lang_decl'. Saves memory. * cplus-decl.c (grokdeclarator): Same change for VAR_DECLs local to structs. * cplus-typeck.c (build_modify_expr): Fix logic so that when assigning to `this', the error message about not being within a constructor or destructor is only emitted at the appropriate time. * cplus-tree.h [OPERATOR_NEW_FORMAT,OPERATOR_DELETE_FORMAT]: Define these. * cplus-method.c (build_opfncall): Use them. * cplus-tree.h [OPERATOR_MODIFY_FORMAT,OPERATOR_MODIFY_LENGTH, OPERATOR_CALL_FORMAT,OPERATOR_CALL_LENGTH,OPERATOR_ARRAY_FORMAT, OPERATOR_ARRAY_LENGTH] Define these. * cplus-decl.c (grok_op_properties): Use them. * cplus-init.c (add_friends): Ditto. * cplus-tree.h [VTBL_PTR_TYPE]: Define this. * cplus-decl.c (init_decl_processing): Use it. * cplus-tree.h [OPERATOR_METHOD_FORMAT,OPERATOR_METHOD_LENGTH]: Define these. * cplus-class.c (build_method_call): Use them. * cplus-class.c (compute_conversion_costs): Fix typo which would cause error message to be generated for calling a const member function with a non-const object. * Aug 24 03:10 g++.xtar.Z on ~ftp/pub * cplus-init.c (build_new): Braino involving -fthis-is-variable removed. Wed Aug 23 00:12:29 1989 Michael Tiemann (tiemann at yahi) * cplus-decl.c (finish_decl): Cannot forever remove READONLY attribute from decl needing initialization. * cplus-method.c (report_type_mismatch): Report error if calling non-const member function with const object. * cplus-class.c (convert_harshness,build_method_call): Finish implementing code to catch calls to non-const member functions with const objects. * cplus-class.c (build_method_call): No longer need to get to TYPE_MAIN_VARIANT for type information, such as TYPE_NEEDS_.... * cplus-class.c (finish_struct): Set flags in all type variants. * cplus-parse.y (various places): Ditto. * integrate.c (expand_inline_function): No longer call abort if TREE_TYPE (arg) != TREE_TYPE (formal) for BLKmode parameter. This can happen when TREE_TYPE (formal) == ERROR_MARK_NODE. Tue Aug 22 09:06:32 1989 Michael Tiemann (tiemann at yahi) * cplus-class.c (ideal_candidate): Use `function' member instead of `u.field' member of candidates. The former is always properly set up, whereas the latter is set to 0 if the function used is a non-member function. * cplus-decl.c (groktypefield): Handle case where IDENTIFIER_NODE comes in which is not an aggregate type name. * cplus-method.c (hack_operator): Return ERROR_MARK_NODE if operator name is missing. * cplus-parse.y: Callers changed to deal with this. * cplus-search.c (various places): Most calls to `error_with_aggr_type' were wrong, leading to backward error messages (such as `member `A' not found for class `memfunc'). Changed back to call `error' with appropriate parameters. * cplus-search.c (lookup_fnfields): Braino in printing error message: TREE_VALUE (entry) is a BASELINK (a TREE_LIST of TREE_LISTs), not a TREE_LIST. * cplus-decl.c (grokdeclarator): Handle missing operator name for for OP_IDENTIFIER case. * cplus-init.c (finish_base_init): If the vtable installed by the constructor was not the right one, fix after call to base constructor, before derived initialization. * cplus-decl.c (store_parm_decls): New parm PRESERVE is nonzero if we should preserve the data containing the function parameters. This is normally done for inline functions, but also needs to be done for constructors of classes which use virtual baseclasses. * cplus-decl.c (finish_function): Don't set DECL_ARGUMENTS (FNDECL) to zero if above condition holds. * cplus-decl.c, cplus-parse.y: all callers of store_parm_decls modified. * cplus-tree.c (hash_tree_chain): New function. Simplified version of hash_tree_cons. * cplus-parse.y (declmods): Use `hash_tree_chain' to build up lists which are not destroyed during parsing. They can be reused throughout the rest of the parse. Mon Aug 21 09:51:47 1989 Michael Tiemann (tiemann at yahi) * cplus-init.c (expand_aggr_init_1): Replace PARM_DECL rtl's with actual values to parameters. * cplus-init.c (expand_aggr_vbase_init): Only try initializing base classes here if FNDECL is nonzero. * cplus-init.c (expand_aggr_init_1): Try initializing them here in that case instead. * cplus-decl.c (finish_decl): We can initialize a const& from a const int, etc. * cplus-init.c (expand_vec_delete): Only warn about ignored array size expressions if EXTRA_WARNINGS. * cplus-init.c (build_new): Don't forget to allocate space for vectors. * cplus-init.c (add_friend): If the friend is not of METHOD_TYPE, set CTYPE = ERROR_MARK_NODE. This prevents false friend matches due to fact that `is_friend' assumes that if CURRENT_CLASS_TYPE == TREE_PURPOSE (friends), that a class-match has occured. * stmt.c (expand_end_bindings): Don't let cleanups affect ({...}) constructs. * cplus-decl.c (finish_decl): When initializing one reference from another, make sure that we wrap the initializer in a SAVE_EXPR if it is TREE_VOLATILE. * cplus-class.c (compute_conversion_costs): Check that FORMAL_TYPE is not ERROR_MARK_NODE. * tree.h (tree_type): Delete unused field `parse_info'. * cplus-decl.c (setup_vtbl_ptr): Add tests for OPTIMIZE and that CURRENT_FUNCTION_DECL is not DECL_STATIC_FUNCTION_P. Sun Aug 20 12:09:30 1989 Michael Tiemann (tiemann at yahi) * cplus-decl.c,cplus-typeck.c (various places): Check for CONST_DECL in addition to TREE_READONLY VAR_DECLs when needing constants for various purposes. Sat Aug 19 12:27:41 1989 Michael Tiemann (tiemann at yahi) * cplus-class.c (build_method_call): Handle case where INSTANCE_PTR is integer_zerop. This can happen with casts like { return ((Object*)0)->Object::IsA(); } Fri Aug 18 01:14:02 1989 Michael Tiemann (tiemann at yahi) * cplus-class.c (build_method_call): Complain about using abstract function only if INSTANCE is of known abstract type. * cplus-class.c (add_method): Don't crash if FIELDS is 0. * dbxout.c (dbxout_type): Don't crash if type only defines constructors and destructors. * cplus-typeck.c (build_component_ref): If METHOD_VEC is 0, break out of loop. * cplus-decl.c (finish_file): Don't abort if INIT is 0. Thu Aug 17 21:55:35 1989 Michael Tiemann (tiemann at yahi) * cplus-parse.y (LC): If the type we get left of a '{' !IS_AGGR_TYPE, then make a fake node which can hold our types for us. * cplus-init.c (do_friend): Argument missing in call to grokclassfn. * cplus-decl.c (poplevel): Only call `expand_end_bindings' if the level being popped needed an `expand_start_bindings' to get going. This only happens if the level is specifically to hold temporaries (i.e., when the KEEP field is < 0). * cplus-decl.c (finish_decl): Emit a sorry message if the _DECL needs constructing, and is not at toplevel. * cplus-class.c (build_method_call): Complain about incomplete types only if (FLAGS&LOOKUP_COMPLAIN). Wed Aug 16 17:11:22 1989 Michael Tiemann (tiemann at yahi) * toplev.c (compile_file), cplus-lex.c (yylex): Use setjmp/longjmp to communicate fact that dump was just performed. This prevents duplicate bytes being written to the asm file, due to inline functions being written out by both original and dumped compilers. * toplev.c (compile_file): Hack to make dumped compiler move bytes quickly from old asm file to new. * cplus-search.c (build_mi_virtuals,free_mi_matrix): Pointer arithmetic for mi_vmatrix accesses were off by 1. * cplus-class.c (build_method_call): Handle case where INSTANCE has a POINTER_TYPE type. This is when it is a dummy argument for `operator new ()'. Tue Aug 15 00:05:49 1989 Michael Tiemann (tiemann at yahi) * cplus-decl.c (grokclassfn): `const' member function information was being lost. * cplus-class.c (build_method_call): Generate error message when passing const objects to non-const member functions. * cplus-class.c (finish_struct): METHOD_VEC must track the object being grown on the class obstack. * cplus-method.c (dump_type{_prefix}): Print `class' instead of `struct' if declared as class. * cplus-method.c (build_{decl,typename}_overload,do_actual_overload, fndecl_as_string): Distinguish `const' member functions from normal member functions. * cplus-search.c (get_base_type): Distinguish whether we want to know if a public field of baseclass is protected, or whether a conversion from derived to base class is protected by passing either 1 or 2 to the argument PROTECT. * cplus-search.c (get_base_distance): If protect is non-zero, always emit an error message if conversion from derived to base class is across a private visibility boundary. * cplus-cvt.c (convert_to_reference): Don't violate visibility rules when converting to references. Add parameter PROTECT to control this behavior. All callers changed. * cplus-cvt.c (build_up_reference): Ditto. Mon Aug 14 00:03:46 1989 Michael Tiemann (tiemann at yahi) * stmt.c (expand_end_case): Incorporate rfg's bugfix for optimizing case statements with signed negative test term. * cplus-search.c (reinit_search_statistics): New function. * toplev.c (compile_file): Call that function if BEEN_HERE_BEFORE. * cplus-decl.c: Remove explicit initializations from static variables--let them sit in common rather than data space. * cplus-method.c: Ditto. * Makefile,toplev.v, cplus-decl.c, cplus-lex.c: Incorporated changes from Bryan Boreham <kewill!bryan@uunet.uu.net> to dump a running GNU C++ for later reexecing. * unexec.c,lastfile.c: borrowed from GNU Emacs * unex-addr.c,getpagesize.h: New files * Aug 14 13:07 g++.xtar.Z on ~ftp/pub * cplus-decl.c (finish_file): Handle case where initializer for one static aggregate is another. Do so by disabling code which assumed the wrong thing in that case. * cplus-search.c, cplus-tree.c, cplus-class.c: Major surgery on assoc lists. Virtual baseclasses are no longer represented in the main assoc list of a type. CLASSTYPE_VBASECLASSES already holds such information. Various functions changed and/or simplified to use value from that assoc list when needed. * cplus-decl.c (grokdeclarator): Don't get confused by non-storageclass bits in SPECBITS when DECL_CONTEXT == FIELD. * cplus-init.c (expand_aggr_init_1): Only check whether a new value has been assigned to `this' by the base class if FLAG_THIS_IS_VARIABLE is nonzero. * cplus-init.c (expand_aggr_init_1,build_new): Function `expand_aggr_vbase_init_1' was the wrong thing. Change these functions to call `expand_aggr_vbase_init' instead. Also, #ifdef'd out `expand_aggr_vbase_init_1'. * cplus-search.c: Move assoc code from here... * cplus-tree.c: ...to here. * cplus-decl.c (lang_printable_name): Don't print return type for constructors or destructors. * cplus-class.c (finish_struct): Set TYPE_NEEDS_CONSTRUCTING bit if any default members. * cplus-decl.c (finish_file): Remove test for TYPE_NEEDS_CONSTRUCTING when considering vars in STATIC_AGGREGATES. If something made it to this list, it should be initialized. Sun Aug 13 14:25:55 1989 Michael Tiemann (tiemann at yahi) * cplus-decl.c: Rename static variable GLOBAL_AGGREGATES to STATIC_AGGREGATES. * cplus-decl.c (finish_decl): Put static aggregates on the STATIC_AGGREGATES list if the VAR_DECL is TREE_STATIC. It does not have to be at the global_binding_level to get this treatment. Also, rename variable OLDGLOBAL to OLDSTATIC, and remove error messages which are no longer needed due to this change. * cplus-typeck.c (comptypes): Qualifiers must match. (Fix taken from GCC). * cplus-init.c (expand_aggr_{vbase}_init,expand_recursive_init): provide arguments INPUT_FILENAME and LINENO to `expand_asm_operands'. * cplus-search.c (init_vbase_pointers,build_vbase_vtables_init): Ditto. * cplus-class.c (push_lang_context): Don't set current_lang_name if it is not a name we recognize. * All GNU C++ files: Merged changes from 1.35.95 to 1.35.96. Sat Aug 12 00:27:43 1989 Michael Tiemann (tiemann at yahi) * cplus-decl.c (finish_function): Call use_variable on CURRENT_VTABLE_DECL if it is non-NULL. * cplus-decl.c (finish_decl): Call build_indirect_ref instead of building the INDIRECT_REF by hand when setting the decl reference slot. * cplus-obstack.h: New file. Defines obstack_int_grow and obstack_ptr_grow. Cuts many calls to bcopy. * cplus-class.c: Use cplus-obstack.h instead of obstack.h. * cplus-search.c: Ditto. * cplus-parse.y (aggr): Fix minor nits in error messages. * cplus-class.c (finish_struct): Removed code which redundantly called `finish_decl' on static class members. * cplus-decl.c (finish_decl): C++ 2.0 now permits static class members to be of types with constructors. * cplus-search.c (bfs_unmark_finished_struct): Don't call assoc_value if TYPE == CURRENT_CLASS_TYPE. * cplus-search.c (assoc_value): Call compiler_error if we have multiple baseclass hits. Also, make this function look for matches recursively. This saves having to flatten out the hierarchy all the time, saving storage. * cplus-init.c (expand_recursive_init_1): Take into account fact that there is no virtual function table initialization needed if CLASSTYPE_NEEDS_VIRTUAL_REINIT set TREE_VALUE (init_list) to NULL_TREE. * cplus-class.c (build_class_init_list): Set up init lists correctly if the derived class just takes virtual function table initialization from the base class. * cplus-init.c (finish_base_init): Unmark fields initialized which belong to base classes. * cplus-decl.c (grokdeclarator,duplicate_decls): Implement C++ 2.0 interpretation of `const'. * Aug 12 08:33 g++.xtar.Z on ~ftp/pub * cplus-typeck.c (commontype): Case for REFERENCE_TYPE appeared to be missing. * cplus-typeck.c (comptypes): Ditto. * cplus-typeck.c (comp_target_parms): Braino caused this function to return after processing just the first argument! * cplus-typeck.c (comp_target_parms,compparms): Take contravariance into account for argument lists. Fri Aug 11 04:58:40 1989 Michael Tiemann (tiemann at yahi) * cplus-tree.c (list_hash): Implement hashing scheme for unchanging list nodes, such as compose TYPE_BASELINKS. Several new functions and data structures implement this. * cplus-search.c (get_baselinks): Call hash_tree_cons instead of tree_cons to get fresh nodes. * tree.c (init_tree): Remove call to bzero for hash_table. * cplus-init.c (expand_aggr_init): Typo in call to expand_vec_init. * newld.c (decode_command): Fix failure to bzero all entries in FILE_TABLE. * cplus-lex.c (cons_up_dtor_for_type): Add missing QUALS parameter in call to start_method. * cplus-decl.c (start_function): Set TREE_READONLY and TREE_VOLATILE bits of C_C_D. * cplus-class.c (popclass): Ditto. * cplus-tree.c (build_cplus_method_type): New function. Like `build_method_type', but permits qualifiers for the instance variable. * cplus-tree.h: Declare it. * cplus-decl.c (grokdeclarator,grokclassfn): Call this function instead of build_method_type. * tree.c (build_method_type): Set TYPE_METHOD_BASETYPE from the TYPE_MAIN_VARIANT of BASETYPE. * cplus-lex.c (gplus.input): Change `friend' from TYPE_QUAL to SCSPEC. * cplus-parse.y (fn.def1): Permit const and volatile member functions. * cplus-method.c (stash_inline_prefix): Handle case of const and/or volatile member functions declared inside class. * cplus-decl.c (start_{method,function}): Grok const and volatile member functions. * cplus-decl.c (grokdeclarator): New parameter QUALS. * cplus-typeck.c (readonly_warning_or_error): If ARG is a PARM_DECL, print its name. Also, if the message is due to the underlying structure of a COMPONENT_REF, tell user the member name instead of trying to hunt down the structure name. also, if ARG is a reference variable or parameter, name the reference as well. * cplus-cvt.c (build_up_reference): Handle case where we build a reference to a sub-object of an object which uses multiple inheritance. * cplus-class.c (finish_struct): Simplify conditions under which CLASSTYPE_NEEDS_VIRTUAL_REINIT is used, and use it. Thu Aug 10 00:13:03 1989 Michael Tiemann (tiemann at yahi) * cplus-parse.y (member_init): If base class is virtual, save the intializer on the permanent_obstack. * cplus-init.c (expand_aggr_vbase_init_1): New function. Called to actually walk the virtual baseclass initialization list. * cplus-init.c (expand_aggr_vbase_init): New argument DECL is the FUNCTION_DECL for the constructor by which this object is initialized. From that constructor comes the virtual base class initialization list. * cplus-init.c (finish_base_init): Store initializers for virtual base classes. * cplus-tree.h (lang_decl): Add new field `vbase_init_list'. Holds initializers for virtual base classes. * cplus-init.c (build_new): Arrange to initialize virtual baseclasses before calling constructor if FLAG_THIS_IS_VARIABLE is zero. Otherwise, constructor will call it on allocation. * cplus-cvt.c (convert_to_nonzero_pointer): If EXPR is already of type TYPE, don't build a NOP_EXPR; instead, just return EXPR. * cplus-class.c (build_method_call): If INSTANCE is NULL_TREE, then pre-allocate storage for the constructor. After that, if there are virtual baseclasses to initialize, initialize them right away. Then call constructor with resulting argument. * cplus-decl.c (flag_this_is_variable): Change default from 1 to 0. * cplus-decl.c (lang_decode_option): Recognize `-fthis-is-variable' on command line. * cplus-decl.c (finish_function): Don't emit test for whether `this' is zero if FLAG_THIS_IS_VARIABLE is zero. Check both constructor and destructor case. * cplus-decl.c (grokclassfn): Make `this' a *const if !FLAG_THIS_IS_VARIABLE. * cplus-search.c (build_mi_matrix): Initialize MI_SIZE when reusing an old mi-matrix. * cplus-cvt.c (convert_to_nonzero_pointer): Abort if argument is integer_zerop. * cplus-class.c (build_method_call): Simplify code, mostly for speed. * cplus-search.c (lookup_field): Use my_tree_cons instead of tree_cons for looking up fields. * cplus-search.c (my_{tree_cons,build_string}): Use SET_TREE_CODE to set tree code. * cplus-decl.c (finish_decl): Initialize globals whose type needs constructing, but ! IS_AGGR_TYPE (type), with empty_init_node to keep assemble_variable from crashing. * cplus-search.c (build_mi_matrix): Take into account CLASSTYPE_N_VBASECLASSES when computing MI_SIZE. * cplus-class.c (finish_struct): Braino: set CLASSTYPE_N_VBASECLASSES after calling layout_vbasetypes. * cplus-class.c (finish_base_struct): Set MAX_HAS_VIRTUAL regardless of whether base class is a virtual baseclass or not. * cplus-class.c (finish_struct): Also, set MAX_HAS_VIRTUAL taking into account virtual baseclasses. * cplus-tree.c (layout_vbasetypes): Takes new arg PMAX which passes info of maximum number of virtual functions defined in virtual baseclasses from this function to finish_struct. * cplus-class.c (finish_struct): Set MAX_HAS_VIRTUAL if HAS_VIRTUAL is set. * cplus-class.c (modify_vtable_entry): If VFIELD can be NULL_TREE, if the current class has no virtual function except those inherited from a virtual baseclass. In such a case, NORMAL will be zero. * cplus-lex.c (copy_type_lang_specific): Copy the array of basetypes so that CLASSTYPE_BASECLASS (t, i) gives the right baseclass. Wed Aug 9 10:41:17 1989 Michael Tiemann (tiemann at yahi) * cplus-typeck.c (c_expand_return): Don't pass return value though a temporary if there are no pending cleanups. * stmt.c (no_pending_cleanups): New function to support above change. * stmt.c (assign_parms): Add test to see if we can avoid calling convert_units if possible. * cplus-decl.c (grokparms): Use variables LAST_RESULT and LAST_DECL to eliminate need to call `chainon'. * stmt.c (expand_fixup,expand_start_bindings): Use static variable EMPTY_CLEANUP_LIST to short-circuit cleanup checking, and also cut down on calls to tree_cons, in new binding contours, which are quite frequent in C++ (20% of calls to tree_cons, and 5% of total TREE_LIST nodes). * stmt.c (expand_start_*): Build new nesting level structure on obstack instead of calling malloc. New variable STMT_OBSTACK. New function `init_stmt'. * toplev.c: Call `init_stmt'. * obstack.h (obstack_{ptr,int}_grow): New macros. * cplus-cvt.c (build_default_{binary,unary}_type_conversion): Handle case where one (or both) incoming types are "C" types, not "C++" types. * cplus-cvt.c (convert_to_pointer): If we go through any virtual base pointers, make sure that casts to BASETYPE from the last virtual base class use the right value for BASETYPE. * cplus-search.c (dfs_find_vbases): VBASES are now TREE_VECs, not TREE_LISTS. Change variable named OFFSET_INFO to ASSOC, and use accordingly. * cplus-search.c (dfs_get_vbase_types): Make assocs in VBASE_TYPES contain the true basetype, not its MAIN_VARIANT. Tue Aug 8 00:19:43 1989 Michael Tiemann (tiemann at yahi) * stor-layout.c (layout_basetypes): Don't inherit assoc info. Synthesize it instead. * cplus-class.c (finish_struct): Reenable code which fills in virtual function tables of virtual baseclasses. * cplus-class.c (finish_struct): Fill in virtual function table with values which come from virtual or non-leftmost baseclasses. These are not filled in correctly by `modify_vtable_entry', which for these cases, only correctly allocates their skeleton. * cplus-class.c (modify_vtable_entry): Only call get_base_distance when BASE != CONTEXT. * cplus-search.c (get_base_distance): Don't push a search_stack level until we know we need it and will use it. * cplus-class.c (modify_vtable_entry): Once we know what vtable is of interest, set BASE to the best approximation of T's vtable we know. I.e., set it to the vtable for the immediate super-class of T. Mon Aug 7 17:12:31 1989 Michael Tiemann (tiemann at yahi) * cplus-class.c (finish_struct): When extending the bounds of the virtaul function table, keep VFIELDS as it was; don't move it up the inheritance tree. * cplus-class.c (finish_struct): No need to allocate a lang_decl for the virtual function table pointer FIELD_DECL. Others need bits, but not bytes that FUNCTION_DECLs need. * cplus-init.c (build_virtual_init): For now, assume that FOR_TYPE and TYPE may be distinct, so use assoc lists to find the right vtable. * cplus-init.c (expand_recursive_init_1): Initialize the virtual function table of sub-components of aggregates driven by sub-component. Otherwise, we have to initialize the virtual function table driven by the caller who knows what sub-components must be initialized. Question: will this cause multiple initialization of vtables which are not down the left-hand side? Answer is probably yes. * tree.c (make_tree_vec): New function. * tree.c (copy_node): Now handles TREE_VEC correctly. * cplus-search.c ({make,copy}_assoc,assoc_value,debug_dump_assoc): Change representation of assoc list from TREE_LIST to TREE_VEC representation. * cplus-tree.h (ASSOC_* macros): Also here. * cplus-typeck.c (process_init_constructor): Don't complain about non-initialization of static class members, regardless of whether they are in global scope or not. (Previously only complained when at global scope.) * cplus-class.c (finish_struct): Allocate method_vec if members need destructors. Sun Aug 6 10:23:31 1989 Michael Tiemann (tiemann at yahi) * cplus-class.c (finish_struct): Eliminate redundant initialization of class fields to 0. * cplus-parse.y (parm rules): Use void_list_node instead of build_tree_list (NULL_TREE, void_type_node) where possible. * print-tree.c (dump): Handle TREE_VEC case. * cplus-init.c (add_method): Modified, and moved to cplus-class.c. * cplus-tree.h (lang_type): Change representation of list of member functions from list of lists to vector of lists. * cplus-class.c (finish_struct,build_method_call): Also here. * cplus-method.c (do_inline_function_hair): Also here. * cplus-decl.c (grokclassfn): Also here. * cplus-init.c (build_delete,build_member_ref): Also here * cplus-ptree.c (walk_lang_type): Also here. * cplus-search.c (lookup_fnfields{_1},get_baselinks,dfs_pushdecls, dfs_compress_decls,dfs_popdecls): Also here. * cplus-typeck.c (build_component_ref): Also here. * dbxout.c (dbxout_type): Also here. * cplus-class.c (build_method_call): Remove vestigal use of OVERLOAD_MAX_LEN. Sat Aug 5 09:49:48 1989 Michael Tiemann (tiemann at yahi) * cplus-decl.c (grokparms): Reuse TREE_LIST node in usual case of parameter processing. * cplus-decl.c (init_decl_processing): Do things here which used to be done in toplev.c * toplev.c (various places): Merge with GCC. Fri Aug 4 17:47:24 1989 Michael Tiemann (tiemann at yahi) * stor-layout.c (genop): Avoid creating new nodes when old ones will do. * stor-layout.c (build_int): Cache sizes we have made for types. Thu Aug 3 21:44:04 1989 Michael Tiemann (tiemann at yahi) * cplus-decl.c (pushdecl): Canonicalize enum typedefs same as struct, class, and unions. * cplus-init.c (resolve_member_ref): When member is of METHOD_TYPE, return logical address of the member, not the member itself. The member itself has type METHOD_TYPE, which has mode EPmode, which is not a valid mode for expand_expr. * cplus-init.c (expand_vec_delete): When calling vector delete on store which does not need destructors, just ignore the argument, and delete the container (array) instead. * cplus-decl.c (start_function): Handle case where OLDDECL comes back as a TREE_LIST. Wed Aug 2 10:54:54 1989 Michael Tiemann (tiemann at yahi) * collect.c (process): Initialize ldptr to NULL if COFF is defined. * cplus-method.c (stash_inline_prefix): String name of function is IDENTIFIER_POINTER (DECL_NAME (...)), not DECL_NAME. Mon Jul 31 12:14:35 1989 Michael Tiemann (tiemann at yahi) * cplus-decl.c (finish_decl): Handle case where INIT can be a TREE_LIST when initializing a named return value. Specifically, translate a TREE_LIST into a COMPOUND_EXPR when initializing a referece. * toplev.c (compile_file): Gripe about *non*-extern functions declared static but not defined. * cplus-init.c (build_delete): Keep ADDR parameter from being evaluated multiple times if TREE_VOLATILE. * cplus-decl.c (grok_function_init): Note whether DECL is an uninheritable virtual (i.e., a virtual function of an "abstract class"). * cplus-tree.h (lang_decl): Add bit to record above info. * cplus-class.c (build_method_call): Give error if compiler can detect that user is attempting to call this function for an object whose type is that of the "abstract class". * gcc.c (link_spec): Make libg++.a available via %s rather than from -lg++. Fri Jul 28 00:22:14 1989 Michael Tiemann (tiemann at yahi) * cplus-typeck.c (comp_target_types): Take contravariance into account for OFFSET_TYPE. * cplus-decl.c (grokdeclarator): When declaring an array, always call suspend momentary, since the TYPE_DOMAIN of the array may be needed later, for instance by expand_vec_delete. * cplus-parse.y (nonmomentary_expr): Second change needed to ensure that above condition is met. * cplus-decl.c (grokdeclarator): Handle case of derived class declaring member function static when derived class declared member function virtual. * cplus-decl.c (grokparms): Permit functions which have default arguments to end with `...'. cplus-typeck.c (actualparameterlist): Handle this new case. * cplus-typeck.c (c_expand_return): Handle case where conversion to return type of function returns ERROR_MARK_NODE. * cplus-init.c (build_delete): Handle case where member type is ARRAY_TYPE. * cplus-parse.y (component_decl): Handle case of missing ';' before '}'. * cplus-typeck.c (c_expand_start_case): Handle case where switch quantity is a MEMBER_REF. * cplus-method.c (build_component_type_expr): Handle case of calling non-virtual type conversion operators. * cplus-decl.c (shadow_tag): Make permanent any type created here. * gcc.c (struct compiler compilers[]): add -D__GNUC__ to files which are compiled using GNU C++. * cplus-parse.y (primary <- IDENTIFIER): If the identifier is a class-local enumeral value, check visibility--it may be a private member of a base class. * cplus-cvt.c (convert_force): New function. Permit conversion from sub-type to private super-type. * cplus-typeck.c (build_c_cast): Call convert_force instead of convert. * cplus-typeck.c (build_x_function_call): Don't crash if asked to resolve a function which has been declared overloaded, but does not yet have any signatures. * cplus-class.c (finish_decl): Don't crash when warning (or flagging as error) that array types in static objects cannot need constructors. Thu Jul 27 02:26:27 1989 Michael Tiemann (tiemann at yahi) * cplus-tree.c (build_cplus_array_type): Make array type permanent if ELT_TYPE is permanent. This is needed because the array type may exist within an inline function, and that inline function may be expanded at any future time. * cplus-typeck.c (build_scoped_ref): Typo caused fn call to have virtually no effect. * cplus-init.c (expand_recursive_init): Make usage of global INIT_PTR reentrant. * cplus-search.c (dfs_pushdecls): Don't try initializing a TYPE_DECL, just continue through it. * integrate.c (access_parm_map): Don't compensate for BYTES_BIG_ENDIAN if parm is BLKmode. * stmt.c (various places): Make stmt.c agree much more closely with GCC's stmt.c. Now only a few places where there are differences. These have to do with calling do_pending_adjust before running cleanups, and using `lang_printable_name' instead of DECL_PRINT_NAME to assign to `current_function_name'. Wed Jul 26 15:04:45 1989 Michael Tiemann (tiemann at yahi) * cplus-decl.c (finish_decl): If decl is static, but initialized by non-static initializer (such as an object initialized by a constructor), use a special initializer to make the decl lay down in data rather than bss space. * varasm.c (assemble_variable): Remove C++-specific code for above case. Tue Jul 25 13:10:19 1989 Michael Tiemann (tiemann at yahi) * cplus-class.c (modify_vtable_entry): If the base fndecl is not contained in the vtable, don't try to modify the vtable. This automatically includes virtual functions from virtual base classes. * cplus-class.c (modify_vtable_entry): If the virtual function does come from a virtual base class, remember to change its DECL_VINDEX from a FUNCTION_DECL to an INTEGER_CST before continuing with the loop. Use the DECL_VINDEX of the base FUNCTION_DECL. * cplus-search.c (debug_dump_assoc): New function. Mon Jul 24 11:22:50 1989 Michael Tiemann (tiemann at yahi) * cplus-class.c (finish_struct): Break out code to initialize a struct with information deriving from its base classes. * cplus-class.c (finish_base_struct): New function where that code now lives. * cplus-search.c (dfs_get_vbase_types): Make full association list; Don't do so only when TREE_VIRTUAL bit is set. Sun Jul 23 20:31:57 1989 Michael Tiemann (tiemann at yahi) * cplus-class.c (modify_vtable_entry): Braino caused base association to overwrite derived associate, causing base virtual functions to appear in derived virtual function tables when they shouldn't have. Sat Jul 22 14:48:51 1989 Michael Tiemann (tiemann at yahi) * cplus-lex.c (yylex): Characters are of type `char' * cplus-decl.c (lang_decode_option): No longer a need for flag_char_charconst. * flags.h: ditto. * All GNU C++ files: Merged changes from 1.35 to 1.35.95. Thu May 25 02:56:16 1989 Michael Tiemann (tiemann at yahi) * cplus-init.c (expand_aggr_init_1): make sure to emit error message when following an error path. * stor-layout.c (layout_decl): call this function instead of cplus_size_in_bytes. This saves many calls to `convert_units'. * cplus-typeck.c (cplus_size): new function, just returns the size of the type we are interested in (no units conversion is done). * cplus-decl.c (init_decl_processing): preallocate IDENTIFIER_NODES for `this' and `__delete_me__'; saves calls to get_identifier. * cplus-parse.y, cplus-lex.c: tried to speed things up. Removed vestigial `@' construct from cplus-parse.y. Also parse '(' ')' as a single token. * cplus-init.c (add_friend): make sure to return void_type_node if we want our callers not to see anything. Also, undo having set TREE_GETS_{NEW,DELETE} if the friend we get is global operator new or global operator delete. Tue May 23 01:10:51 1989 Michael Tiemann (tiemann at yahi) * cplus-typeck.c (build_modify_expr): Recursive memberwise assignment must work on all type variants, not just the main variant. Otherwise, we can't assign a const B& to a B&. * cplus-cvt.c (convert_to_pointer): convert to virtual baseclasses through virtual baseclass pointers. Also, give error if converting up from a virtual baseclass type. Mon May 22 22:03:24 1989 Michael Tiemann (tiemann at yahi) * cplus-class.c (finish_struct): remember to give dynamic classes a vfield even if they don't define virtual functions (-fSOS). * cplus-decl.c (init_decl_processing): fixed typo: TYPE_POINTER_TO does not build a pointer type, but build_pointer_type does. * cplus-decl.c, cplus-init.c: allow builtin functions to be declared friends. * cplus-class.c (ideal_candidate): if the best candidates require user-defined type conversions, don't reject as ambiguous the case where one candidate comes from one class, and the other candidates come from base classes of that class. * stor-layout.c (layout_type): after laying out a type, make sure that all type variants get the type's size. Fri May 19 13:20:07 1989 Michael Tiemann (tiemann at yahi) * cplus-class.c (popclass): don't kill out prev_class_type's decls if not at the global binding level. * cplus-decl.c: added new field `class_shadowed', which may some day be used to implement nested clases. * newld.c (various places): round up size to double word boundary if defined(sparc) || defined(sun). * tree.c (lvalue_p): A CALL_EXPR is an lvalue if the return type is an addressable type. * cplus-init.c (make_friend_class): fix typo in error message. * cplus-class.c (finish_struct): Don't give error message if class is does not define virtual functions which must be defined if that class has some of its own. * cplus-class.c (instantiate_type): handle case where user requests member function using object, i.e., `x.f'. If f is virtual, return the function found in the virtual function table. * stor-layout.c (layout_basetypes): language dependent code removed, put in cplus-class.c * stmt.c (expand_goto_internal, expand_end_bindings, fixup_cleanups): if cleanups were called on leaving a binding contour, and EXIT_IGNORE_STACK is not defined, call do_pending_stack_adjust. * gcc.c: recognize ".cxx" as a C++ file name extension. * cplus-typeck.c (convert_for_initialization, convert_for_assignment): convert MEMBER_REFs, if possible, to members or component refs as appropriate. * cplus-typeck.c (build_member_ref): recognize member refs which are not associated with any object in particular (i.e., could be, but need not be `this'). * cplus-search.c (get_vbase_types): orders the virtual base classes so that initialization and anti-initialization are performed in correct order. A virtual baseclass is not destroyed until all parts of the object which could be using that virtual base class are destroyed. * cplus-parse.y: call build_vbase_delete if appropriate. * cplus-init.c (expand_delete): call build_vbase_delete if appropriate. No longer deletes parts of objects via virtual base classes. * cplus-init.c: new function build_vbase_delete, performs destructors on objects with virtual base classes. new function build_x_delete calls free-store deallocator on objects without running destructors. * cplus-decl.c (pushdecl, shadow_tag, and xref_tag): implement C-like behavior in "C" language scope vis a vis type declarations. * cplus-decl.c: define macros PUSH_BINDING_LEVEL and POP_BINDING_LEVEL. Use these macros where appropriate. Fixed bug in popping binding contours in the presence of syntax errors. * README, config.g++, make-links.g++: fixed minor glitches Wed May 17 20:34:29 1989 Michael Tiemann (tiemann at yahi) * stor-layout.c: move code which deletes an incomplete base type to cplus-class.c. * cplus-class.c (finish_struct): call `propagate_basetype_offsets'. * cplus-class.c: new function `propagate_basetype_offsets' gives correct offsets to base types which are not immediate base types in a multiple inheritance lattice. Tue May 16 09:40:00 1989 Michael Tiemann (tiemann at yahi) * Started using ChangeLog for version 1.35.0