diff -Nrc3pad gcc-3.3.3/gcc/cp/call.c gcc-3.4.0/gcc/cp/call.c *** gcc-3.3.3/gcc/cp/call.c 2004-01-30 18:20:54.000000000 +0000 --- gcc-3.4.0/gcc/cp/call.c 2004-03-20 00:13:07.000000000 +0000 *************** *** 1,23 **** /* Functions related to invoking methods and overloaded functions. ! Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2003, ! 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) and modified by Brendan Kehoe (brendan@cygnus.com). ! This file is part of GNU CC. ! GNU CC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ --- 1,23 ---- /* Functions related to invoking methods and overloaded functions. ! Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) and modified by Brendan Kehoe (brendan@cygnus.com). ! This file is part of GCC. ! GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ *************** Boston, MA 02111-1307, USA. */ *** 26,31 **** --- 26,33 ---- #include "config.h" #include "system.h" + #include "coretypes.h" + #include "tm.h" #include "tree.h" #include "cp-tree.h" #include "output.h" *************** Boston, MA 02111-1307, USA. */ *** 33,50 **** #include "rtl.h" #include "toplev.h" #include "expr.h" - #include "ggc.h" #include "diagnostic.h" ! extern int inhibit_warnings; ! ! static tree build_field_call PARAMS ((tree, tree, tree)); ! static struct z_candidate * tourney PARAMS ((struct z_candidate *)); ! static int equal_functions PARAMS ((tree, tree)); ! static int joust PARAMS ((struct z_candidate *, struct z_candidate *, int)); ! static int compare_ics PARAMS ((tree, tree)); ! static tree build_over_call PARAMS ((struct z_candidate *, tree, int)); ! static tree build_java_interface_fn_ref PARAMS ((tree, tree)); #define convert_like(CONV, EXPR) \ convert_like_real ((CONV), (EXPR), NULL_TREE, 0, 0, \ /*issue_conversion_warnings=*/true) --- 35,51 ---- #include "rtl.h" #include "toplev.h" #include "expr.h" #include "diagnostic.h" + #include "intl.h" + #include "target.h" + #include "convert.h" ! static struct z_candidate * tourney (struct z_candidate *); ! static int equal_functions (tree, tree); ! static int joust (struct z_candidate *, struct z_candidate *, bool); ! static int compare_ics (tree, tree); ! static tree build_over_call (struct z_candidate *, int); ! static tree build_java_interface_fn_ref (tree, tree); #define convert_like(CONV, EXPR) \ convert_like_real ((CONV), (EXPR), NULL_TREE, 0, 0, \ /*issue_conversion_warnings=*/true) *************** static tree build_java_interface_fn_ref *** 52,114 **** convert_like_real ((CONV), (EXPR), (FN), (ARGNO), 0, \ /*issue_conversion_warnings=*/true) static tree convert_like_real (tree, tree, tree, int, int, bool); ! static void op_error PARAMS ((enum tree_code, enum tree_code, tree, tree, ! tree, const char *)); ! static tree build_object_call PARAMS ((tree, tree)); ! static tree resolve_args PARAMS ((tree)); ! static struct z_candidate * build_user_type_conversion_1 ! PARAMS ((tree, tree, int)); ! static void print_z_candidates PARAMS ((struct z_candidate *)); ! static tree build_this PARAMS ((tree)); ! static struct z_candidate * splice_viable PARAMS ((struct z_candidate *)); ! static int any_viable PARAMS ((struct z_candidate *)); ! static int any_strictly_viable PARAMS ((struct z_candidate *)); ! static struct z_candidate * add_template_candidate ! PARAMS ((struct z_candidate **, tree, tree, tree, tree, tree, ! tree, tree, int, unification_kind_t)); ! static struct z_candidate * add_template_candidate_real ! PARAMS ((struct z_candidate **, tree, tree, tree, tree, tree, ! tree, tree, int, tree, unification_kind_t)); ! static struct z_candidate * add_template_conv_candidate ! PARAMS ((struct z_candidate **, tree, tree, tree, tree, tree, tree)); static void add_builtin_candidates ! PARAMS ((struct z_candidate **, enum tree_code, enum tree_code, ! tree, tree *, int)); static void add_builtin_candidate ! PARAMS ((struct z_candidate **, enum tree_code, enum tree_code, ! tree, tree, tree, tree *, tree *, int)); ! static int is_complete PARAMS ((tree)); static void build_builtin_candidate ! PARAMS ((struct z_candidate **, tree, tree, tree, tree *, tree *, ! int)); ! static struct z_candidate * add_conv_candidate ! PARAMS ((struct z_candidate **, tree, tree, tree, tree, tree)); ! static struct z_candidate * add_function_candidate (struct z_candidate **, tree, tree, tree, tree, tree, int); ! static tree implicit_conversion PARAMS ((tree, tree, tree, int)); ! static tree standard_conversion PARAMS ((tree, tree, tree)); static tree reference_binding (tree, tree, tree, int); ! static tree non_reference PARAMS ((tree)); ! static tree build_conv PARAMS ((enum tree_code, tree, tree)); ! static int is_subseq PARAMS ((tree, tree)); ! static tree maybe_handle_ref_bind PARAMS ((tree*)); ! static void maybe_handle_implicit_object PARAMS ((tree*)); static struct z_candidate *add_candidate ! (struct z_candidate **, tree, tree, tree, tree, int); ! static tree source_type PARAMS ((tree)); ! static void add_warning PARAMS ((struct z_candidate *, struct z_candidate *)); ! static int reference_related_p PARAMS ((tree, tree)); ! static int reference_compatible_p PARAMS ((tree, tree)); ! static tree convert_class_to_reference PARAMS ((tree, tree, tree)); ! static tree direct_reference_binding PARAMS ((tree, tree)); ! static int promoted_arithmetic_type_p PARAMS ((tree)); ! static tree conditional_conversion PARAMS ((tree, tree)); ! static tree call_builtin_trap PARAMS ((void)); static tree merge_conversion_sequences (tree, tree); tree ! build_vfield_ref (datum, type) ! tree datum, type; { if (datum == error_mark_node) return error_mark_node; --- 53,117 ---- convert_like_real ((CONV), (EXPR), (FN), (ARGNO), 0, \ /*issue_conversion_warnings=*/true) static tree convert_like_real (tree, tree, tree, int, int, bool); ! static void op_error (enum tree_code, enum tree_code, tree, tree, ! tree, const char *); ! static tree build_object_call (tree, tree); ! static tree resolve_args (tree); ! static struct z_candidate *build_user_type_conversion_1 (tree, tree, int); ! static void print_z_candidate (const char *, struct z_candidate *); ! static void print_z_candidates (struct z_candidate *); ! static tree build_this (tree); ! static struct z_candidate *splice_viable (struct z_candidate *, bool, bool *); ! static bool any_strictly_viable (struct z_candidate *); ! static struct z_candidate *add_template_candidate ! (struct z_candidate **, tree, tree, tree, tree, tree, ! tree, tree, int, unification_kind_t); ! static struct z_candidate *add_template_candidate_real ! (struct z_candidate **, tree, tree, tree, tree, tree, ! tree, tree, int, tree, unification_kind_t); ! static struct z_candidate *add_template_conv_candidate ! (struct z_candidate **, tree, tree, tree, tree, tree, tree); static void add_builtin_candidates ! (struct z_candidate **, enum tree_code, enum tree_code, ! tree, tree *, int); static void add_builtin_candidate ! (struct z_candidate **, enum tree_code, enum tree_code, ! tree, tree, tree, tree *, tree *, int); ! static bool is_complete (tree); static void build_builtin_candidate ! (struct z_candidate **, tree, tree, tree, tree *, tree *, ! int); ! static struct z_candidate *add_conv_candidate ! (struct z_candidate **, tree, tree, tree, tree, tree); ! static struct z_candidate *add_function_candidate (struct z_candidate **, tree, tree, tree, tree, tree, int); ! static tree implicit_conversion (tree, tree, tree, int); ! static tree standard_conversion (tree, tree, tree); static tree reference_binding (tree, tree, tree, int); ! static tree build_conv (enum tree_code, tree, tree); ! static bool is_subseq (tree, tree); ! static tree maybe_handle_ref_bind (tree *); ! static void maybe_handle_implicit_object (tree *); static struct z_candidate *add_candidate ! (struct z_candidate **, tree, tree, tree, tree, tree, int); ! static tree source_type (tree); ! static void add_warning (struct z_candidate *, struct z_candidate *); ! static bool reference_related_p (tree, tree); ! static bool reference_compatible_p (tree, tree); ! static tree convert_class_to_reference (tree, tree, tree); ! static tree direct_reference_binding (tree, tree); ! static bool promoted_arithmetic_type_p (tree); ! static tree conditional_conversion (tree, tree); ! static char *name_as_c_string (tree, tree, bool *); ! static tree call_builtin_trap (tree); ! static tree prep_operand (tree); ! static void add_candidates (tree, tree, tree, bool, tree, tree, ! int, struct z_candidate **); static tree merge_conversion_sequences (tree, tree); + static bool magic_varargs_p (tree); tree ! build_vfield_ref (tree datum, tree type) { if (datum == error_mark_node) return error_mark_node; *************** build_vfield_ref (datum, type) *** 124,178 **** datum, TYPE_VFIELD (type)); } - /* Build a call to a member of an object. I.e., one that overloads - operator ()(), or is a pointer-to-function or pointer-to-method. */ - - static tree - build_field_call (tree instance_ptr, tree decl, tree parms) - { - tree instance; - - if (decl == error_mark_node || decl == NULL_TREE) - return decl; - - if (TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == VAR_DECL) - { - /* If it's a field, try overloading operator (), - or calling if the field is a pointer-to-function. */ - instance = build_indirect_ref (instance_ptr, NULL); - instance = build_class_member_access_expr (instance, decl, - /*access_path=*/NULL_TREE, - /*preserve_reference=*/false); - - if (instance == error_mark_node) - return error_mark_node; - - if (IS_AGGR_TYPE (TREE_TYPE (instance))) - return build_opfncall (CALL_EXPR, LOOKUP_NORMAL, - instance, parms, NULL_TREE); - else if (TREE_CODE (TREE_TYPE (instance)) == FUNCTION_TYPE - || (TREE_CODE (TREE_TYPE (instance)) == POINTER_TYPE - && (TREE_CODE (TREE_TYPE (TREE_TYPE (instance))) - == FUNCTION_TYPE))) - return build_function_call (instance, parms); - } - - return NULL_TREE; - } - /* Returns nonzero iff the destructor name specified in NAME (a BIT_NOT_EXPR) matches BASETYPE. The operand of NAME can take many forms... */ ! int ! check_dtor_name (basetype, name) ! tree basetype, name; { name = TREE_OPERAND (name, 0); /* Just accept something we've already complained about. */ if (name == error_mark_node) ! return 1; if (TREE_CODE (name) == TYPE_DECL) name = TREE_TYPE (name); --- 127,144 ---- datum, TYPE_VFIELD (type)); } /* Returns nonzero iff the destructor name specified in NAME (a BIT_NOT_EXPR) matches BASETYPE. The operand of NAME can take many forms... */ ! bool ! check_dtor_name (tree basetype, tree name) { name = TREE_OPERAND (name, 0); /* Just accept something we've already complained about. */ if (name == error_mark_node) ! return true; if (TREE_CODE (name) == TYPE_DECL) name = TREE_TYPE (name); *************** check_dtor_name (basetype, name) *** 195,323 **** NAME will be a class template. */ else if (DECL_CLASS_TEMPLATE_P (name)) ! return 0; else abort (); if (name && TYPE_MAIN_VARIANT (basetype) == TYPE_MAIN_VARIANT (name)) ! return 1; ! return 0; ! } ! ! /* Build a method call of the form `EXP->SCOPES::NAME (PARMS)'. ! This is how virtual function calls are avoided. */ ! ! tree ! build_scoped_method_call (exp, basetype, name, parms) ! tree exp, basetype, name, parms; ! { ! /* Because this syntactic form does not allow ! a pointer to a base class to be `stolen', ! we need not protect the derived->base conversion ! that happens here. ! ! @@ But we do have to check access privileges later. */ ! tree binfo, decl; ! tree type = TREE_TYPE (exp); ! ! if (type == error_mark_node ! || basetype == error_mark_node) ! return error_mark_node; ! ! if (processing_template_decl) ! { ! if (TREE_CODE (name) == BIT_NOT_EXPR ! && TREE_CODE (TREE_OPERAND (name, 0)) == IDENTIFIER_NODE) ! { ! tree type = get_aggr_from_typedef (TREE_OPERAND (name, 0), 0); ! if (type) ! name = build_min_nt (BIT_NOT_EXPR, type); ! } ! name = build_min_nt (SCOPE_REF, basetype, name); ! return build_min_nt (METHOD_CALL_EXPR, name, exp, parms, NULL_TREE); ! } ! ! if (TREE_CODE (type) == REFERENCE_TYPE) ! type = TREE_TYPE (type); ! ! if (TREE_CODE (basetype) == TREE_VEC) ! { ! binfo = basetype; ! basetype = BINFO_TYPE (binfo); ! } ! else ! binfo = NULL_TREE; ! ! /* Check the destructor call syntax. */ ! if (TREE_CODE (name) == BIT_NOT_EXPR) ! { ! /* We can get here if someone writes their destructor call like ! `obj.NS::~T()'; this isn't really a scoped method call, so hand ! it off. */ ! if (TREE_CODE (basetype) == NAMESPACE_DECL) ! return build_method_call (exp, name, parms, NULL_TREE, LOOKUP_NORMAL); ! ! if (! check_dtor_name (basetype, name)) ! error ("qualified type `%T' does not match destructor name `~%T'", ! basetype, TREE_OPERAND (name, 0)); ! ! /* Destructors can be "called" for simple types; see 5.2.4 and 12.4 Note ! that explicit ~int is caught in the parser; this deals with typedefs ! and template parms. */ ! if (! IS_AGGR_TYPE (basetype)) ! { ! if (TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (basetype)) ! error ("type of `%E' does not match destructor type `%T' (type was `%T')", ! exp, basetype, type); ! ! return cp_convert (void_type_node, exp); ! } ! } ! ! if (TREE_CODE (basetype) == NAMESPACE_DECL) ! { ! error ("`%D' is a namespace", basetype); ! return error_mark_node; ! } ! if (! is_aggr_type (basetype, 1)) ! return error_mark_node; ! ! if (! IS_AGGR_TYPE (type)) ! { ! error ("base object `%E' of scoped method call is of non-aggregate type `%T'", ! exp, type); ! return error_mark_node; ! } ! ! decl = build_scoped_ref (exp, basetype, &binfo); ! ! if (binfo) ! { ! /* Call to a destructor. */ ! if (TREE_CODE (name) == BIT_NOT_EXPR) ! { ! if (! TYPE_HAS_DESTRUCTOR (TREE_TYPE (decl))) ! return cp_convert (void_type_node, exp); ! ! return build_delete (TREE_TYPE (decl), decl, ! sfk_complete_destructor, ! LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, ! 0); ! } ! ! /* Call to a method. */ ! return build_method_call (decl, name, parms, binfo, ! LOOKUP_NORMAL|LOOKUP_NONVIRTUAL); ! } ! return error_mark_node; } /* We want the address of a function or method. We avoid creating a pointer-to-member function. */ tree ! build_addr_func (function) ! tree function; { tree type = TREE_TYPE (function); --- 161,180 ---- NAME will be a class template. */ else if (DECL_CLASS_TEMPLATE_P (name)) ! return false; else abort (); if (name && TYPE_MAIN_VARIANT (basetype) == TYPE_MAIN_VARIANT (name)) ! return true; ! return false; } /* We want the address of a function or method. We avoid creating a pointer-to-member function. */ tree ! build_addr_func (tree function) { tree type = TREE_TYPE (function); *************** build_addr_func (function) *** 325,348 **** functions. */ if (TREE_CODE (type) == METHOD_TYPE) { ! tree addr; ! ! type = build_pointer_type (type); ! ! if (!cxx_mark_addressable (function)) ! return error_mark_node; ! ! addr = build1 (ADDR_EXPR, type, function); ! ! /* Address of a static or external variable or function counts ! as a constant */ ! if (staticp (function)) ! TREE_CONSTANT (addr) = 1; ! ! function = addr; } else ! function = default_conversion (function); return function; } --- 182,197 ---- functions. */ if (TREE_CODE (type) == METHOD_TYPE) { ! if (TREE_CODE (function) == OFFSET_REF) ! { ! tree object = build_address (TREE_OPERAND (function, 0)); ! return get_member_function_from_ptrfunc (&object, ! TREE_OPERAND (function, 1)); ! } ! function = build_address (function); } else ! function = decay_conversion (function); return function; } *************** build_addr_func (function) *** 352,359 **** (TYPE_PTRMEMFUNC_P) must be handled by our callers. */ tree ! build_call (function, parms) ! tree function, parms; { int is_constructor = 0; int nothrow; --- 201,207 ---- (TYPE_PTRMEMFUNC_P) must be handled by our callers. */ tree ! build_call (tree function, tree parms) { int is_constructor = 0; int nothrow; *************** build_call (function, parms) *** 419,428 **** TREE_VALUE (tmp), t); } ! function = build_nt (CALL_EXPR, function, parms, NULL_TREE); TREE_HAS_CONSTRUCTOR (function) = is_constructor; - TREE_TYPE (function) = result_type; - TREE_SIDE_EFFECTS (function) = 1; TREE_NOTHROW (function) = nothrow; return function; --- 267,274 ---- TREE_VALUE (tmp), t); } ! function = build (CALL_EXPR, result_type, function, parms); TREE_HAS_CONSTRUCTOR (function) = is_constructor; TREE_NOTHROW (function) = nothrow; return function; *************** build_call (function, parms) *** 443,450 **** BASETYPE_PATH, if non-NULL, contains a chain from the type of INSTANCE down to the real instance type to use for access checking. We need this ! information to get protected accesses correct. This parameter is used ! by build_member_call. FLAGS is the logical disjunction of zero or more LOOKUP_ flags. See cp-tree.h for more info. --- 289,295 ---- BASETYPE_PATH, if non-NULL, contains a chain from the type of INSTANCE down to the real instance type to use for access checking. We need this ! information to get protected accesses correct. FLAGS is the logical disjunction of zero or more LOOKUP_ flags. See cp-tree.h for more info. *************** build_call (function, parms) *** 460,600 **** `operator()()' is defined for the type of that field, then we return that result. */ - #ifdef GATHER_STATISTICS - extern int n_build_method_call; - #endif - - tree - build_method_call (instance, name, parms, basetype_path, flags) - tree instance, name, parms, basetype_path; - int flags; - { - tree fn; - tree object_type; - tree template_args = NULL_TREE; - bool has_template_args = false; - - #ifdef GATHER_STATISTICS - n_build_method_call++; - #endif - - if (instance == error_mark_node - || name == error_mark_node - || parms == error_mark_node - || (instance && TREE_TYPE (instance) == error_mark_node)) - return error_mark_node; - - if (processing_template_decl) - { - /* We need to process template parm names here so that tsubst catches - them properly. Other type names can wait. */ - if (TREE_CODE (name) == BIT_NOT_EXPR) - { - tree type = NULL_TREE; - - if (TREE_CODE (TREE_OPERAND (name, 0)) == IDENTIFIER_NODE) - type = get_aggr_from_typedef (TREE_OPERAND (name, 0), 0); - else if (TREE_CODE (TREE_OPERAND (name, 0)) == TYPE_DECL) - type = TREE_TYPE (TREE_OPERAND (name, 0)); - - if (type && TREE_CODE (type) == TEMPLATE_TYPE_PARM) - name = build_min_nt (BIT_NOT_EXPR, type); - } - - return build_min_nt (METHOD_CALL_EXPR, name, instance, parms, NULL_TREE); - } - - if (TREE_CODE (instance) == OFFSET_REF) - instance = resolve_offset_ref (instance); - if (TREE_CODE (TREE_TYPE (instance)) == REFERENCE_TYPE) - instance = convert_from_reference (instance); - object_type = TREE_TYPE (instance); - - if (TREE_CODE (name) == BIT_NOT_EXPR) - { - tree instance_ptr; - - if (parms) - error ("destructors take no parameters"); - - if (! check_dtor_name (object_type, name)) - error - ("destructor name `~%T' does not match type `%T' of expression", - TREE_OPERAND (name, 0), object_type); - - /* The destructor type must be complete. */ - object_type = complete_type_or_else (object_type, NULL_TREE); - if (!object_type || object_type == error_mark_node) - return error_mark_node; - - if (! TYPE_HAS_DESTRUCTOR (object_type)) - return cp_convert (void_type_node, instance); - instance = default_conversion (instance); - instance_ptr = build_unary_op (ADDR_EXPR, instance, 0); - return build_delete (build_pointer_type (object_type), - instance_ptr, sfk_complete_destructor, - LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0); - } - - if (!CLASS_TYPE_P (object_type)) - { - if ((flags & LOOKUP_COMPLAIN) - && TREE_TYPE (instance) != error_mark_node) - error ("request for member `%D' in `%E', which is of non-aggregate type `%T'", - name, instance, object_type); - return error_mark_node; - } - - if (TREE_CODE (name) == TEMPLATE_ID_EXPR) - { - template_args = TREE_OPERAND (name, 1); - has_template_args = true; - name = TREE_OPERAND (name, 0); - } - if (TREE_CODE (name) == OVERLOAD) - name = DECL_NAME (get_first_fn (name)); - else if (TREE_CODE (name) == LOOKUP_EXPR) - name = TREE_OPERAND (name, 0); - else if (DECL_P (name)) - name = DECL_NAME (name); - if (has_template_args) - fn = lookup_fnfields (object_type, name, /*protect=*/2); - else - fn = lookup_member (object_type, name, /*protect=*/2, /*want_type=*/0); - - if (fn && TREE_CODE (fn) == TREE_LIST && !BASELINK_P (fn)) - { - error ("request for member `%D' is ambiguous", name); - print_candidates (fn); - return error_mark_node; - } - - /* If the name could not be found, issue an error. */ - if (!fn) - { - unqualified_name_lookup_error (name); - return error_mark_node; - } - - if (BASELINK_P (fn) && has_template_args) - BASELINK_FUNCTIONS (fn) - = build_nt (TEMPLATE_ID_EXPR, - BASELINK_FUNCTIONS (fn), - template_args); - if (BASELINK_P (fn) && basetype_path) - BASELINK_ACCESS_BINFO (fn) = basetype_path; - - return build_new_method_call (instance, fn, parms, - /*conversion_path=*/NULL_TREE, flags); - } - /* New overloading code. */ struct z_candidate GTY(()) { /* The FUNCTION_DECL that will be called if this candidate is selected by overload resolution. */ tree fn; tree convs; tree second_conv; int viable; /* If FN is a member function, the binfo indicating the path used to --- 305,324 ---- `operator()()' is defined for the type of that field, then we return that result. */ /* New overloading code. */ struct z_candidate GTY(()) { /* The FUNCTION_DECL that will be called if this candidate is selected by overload resolution. */ tree fn; + /* The arguments to use when calling this function. */ + tree args; + /* The implicit conversion sequences for each of the arguments to + FN. */ tree convs; + /* If FN is a user-defined conversion, the standard conversion + sequence from the type returned by FN to the desired destination + type. */ tree second_conv; int viable; /* If FN is a member function, the binfo indicating the path used to *************** struct z_candidate GTY(()) { *** 640,651 **** should be created to hold the result of the conversion. */ #define NEED_TEMPORARY_P(NODE) TREE_LANG_FLAG_4 (NODE) #define USER_CONV_CAND(NODE) WRAPPER_ZC (TREE_OPERAND (NODE, 1)) #define USER_CONV_FN(NODE) (USER_CONV_CAND (NODE)->fn) ! int ! null_ptr_cst_p (t) ! tree t; { /* [conv.ptr] --- 364,378 ---- should be created to hold the result of the conversion. */ #define NEED_TEMPORARY_P(NODE) TREE_LANG_FLAG_4 (NODE) + /* TRUE in an IDENTITY_CONV or BASE_CONV if the copy constructor must + be accessible, even though it is not being used. */ + #define CHECK_COPY_CONSTRUCTOR_P(NODE) TREE_LANG_FLAG_5 (NODE) + #define USER_CONV_CAND(NODE) WRAPPER_ZC (TREE_OPERAND (NODE, 1)) #define USER_CONV_FN(NODE) (USER_CONV_CAND (NODE)->fn) ! bool ! null_ptr_cst_p (tree t) { /* [conv.ptr] *************** null_ptr_cst_p (t) *** 653,681 **** (_expr.const_) rvalue of integer type that evaluates to zero. */ if (t == null_node || (CP_INTEGRAL_TYPE_P (TREE_TYPE (t)) && integer_zerop (t))) ! return 1; ! return 0; } /* Returns nonzero if PARMLIST consists of only default parms and/or ellipsis. */ ! int ! sufficient_parms_p (parmlist) ! tree parmlist; { for (; parmlist && parmlist != void_list_node; parmlist = TREE_CHAIN (parmlist)) if (!TREE_PURPOSE (parmlist)) ! return 0; ! return 1; } static tree ! build_conv (code, type, from) ! enum tree_code code; ! tree type, from; { tree t; int rank = ICS_STD_RANK (from); --- 380,405 ---- (_expr.const_) rvalue of integer type that evaluates to zero. */ if (t == null_node || (CP_INTEGRAL_TYPE_P (TREE_TYPE (t)) && integer_zerop (t))) ! return true; ! return false; } /* Returns nonzero if PARMLIST consists of only default parms and/or ellipsis. */ ! bool ! sufficient_parms_p (tree parmlist) { for (; parmlist && parmlist != void_list_node; parmlist = TREE_CHAIN (parmlist)) if (!TREE_PURPOSE (parmlist)) ! return false; ! return true; } static tree ! build_conv (enum tree_code code, tree type, tree from) { tree t; int rank = ICS_STD_RANK (from); *************** build_conv (code, type, from) *** 710,734 **** return t; } - /* If T is a REFERENCE_TYPE return the type to which T refers. - Otherwise, return T itself. */ - - static tree - non_reference (t) - tree t; - { - if (TREE_CODE (t) == REFERENCE_TYPE) - t = TREE_TYPE (t); - return t; - } - tree ! strip_top_quals (t) ! tree t; { if (TREE_CODE (t) == ARRAY_TYPE) return t; ! return TYPE_MAIN_VARIANT (t); } /* Returns the standard conversion path (see [conv]) from type FROM to type --- 434,445 ---- return t; } tree ! strip_top_quals (tree t) { if (TREE_CODE (t) == ARRAY_TYPE) return t; ! return cp_build_qualified_type (t, 0); } /* Returns the standard conversion path (see [conv]) from type FROM to type *************** strip_top_quals (t) *** 736,753 **** also pass the expression EXPR to convert from. */ static tree ! standard_conversion (to, from, expr) ! tree to, from, expr; { enum tree_code fcode, tcode; tree conv; ! int fromref = 0; ! if (TREE_CODE (to) == REFERENCE_TYPE) ! to = TREE_TYPE (to); if (TREE_CODE (from) == REFERENCE_TYPE) { ! fromref = 1; from = TREE_TYPE (from); } to = strip_top_quals (to); --- 447,462 ---- also pass the expression EXPR to convert from. */ static tree ! standard_conversion (tree to, tree from, tree expr) { enum tree_code fcode, tcode; tree conv; ! bool fromref = false; ! to = non_reference (to); if (TREE_CODE (from) == REFERENCE_TYPE) { ! fromref = true; from = TREE_TYPE (from); } to = strip_top_quals (to); *************** standard_conversion (to, from, expr) *** 782,788 **** else if (fromref || (expr && lvalue_p (expr))) conv = build_conv (RVALUE_CONV, from, conv); ! /* Allow conversion between `__complex__' data types */ if (tcode == COMPLEX_TYPE && fcode == COMPLEX_TYPE) { /* The standard conversion sequence to convert FROM to TO is --- 491,497 ---- else if (fromref || (expr && lvalue_p (expr))) conv = build_conv (RVALUE_CONV, from, conv); ! /* Allow conversion between `__complex__' data types. */ if (tcode == COMPLEX_TYPE && fcode == COMPLEX_TYPE) { /* The standard conversion sequence to convert FROM to TO is *************** standard_conversion (to, from, expr) *** 805,815 **** if (same_type_p (from, to)) return conv; ! if ((tcode == POINTER_TYPE || TYPE_PTRMEMFUNC_P (to)) && expr && null_ptr_cst_p (expr)) ! { ! conv = build_conv (STD_CONV, to, conv); ! } else if ((tcode == INTEGER_TYPE && fcode == POINTER_TYPE) || (tcode == POINTER_TYPE && fcode == INTEGER_TYPE)) { --- 514,528 ---- if (same_type_p (from, to)) return conv; ! if ((tcode == POINTER_TYPE || TYPE_PTR_TO_MEMBER_P (to)) && expr && null_ptr_cst_p (expr)) ! conv = build_conv (STD_CONV, to, conv); ! else if (tcode == POINTER_TYPE && fcode == POINTER_TYPE ! && TREE_CODE (TREE_TYPE (to)) == VECTOR_TYPE ! && TREE_CODE (TREE_TYPE (from)) == VECTOR_TYPE ! && ((*targetm.vector_opaque_p) (TREE_TYPE (to)) ! || (*targetm.vector_opaque_p) (TREE_TYPE (from)))) ! conv = build_conv (STD_CONV, to, conv); else if ((tcode == INTEGER_TYPE && fcode == POINTER_TYPE) || (tcode == POINTER_TYPE && fcode == INTEGER_TYPE)) { *************** standard_conversion (to, from, expr) *** 818,858 **** conv = build_conv (STD_CONV, to, conv); ICS_BAD_FLAG (conv) = 1; } ! else if (tcode == ENUMERAL_TYPE && fcode == INTEGER_TYPE ! && TYPE_PRECISION (to) == TYPE_PRECISION (from)) { /* For backwards brain damage compatibility, allow interconversion of enums and integers with a pedwarn. */ conv = build_conv (STD_CONV, to, conv); ICS_BAD_FLAG (conv) = 1; } ! else if (tcode == POINTER_TYPE && fcode == POINTER_TYPE) { ! enum tree_code ufcode = TREE_CODE (TREE_TYPE (from)); ! enum tree_code utcode = TREE_CODE (TREE_TYPE (to)); ! if (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (from), ! TREE_TYPE (to))) ; ! else if (utcode == VOID_TYPE && ufcode != OFFSET_TYPE ! && ufcode != FUNCTION_TYPE) { from = build_pointer_type (cp_build_qualified_type (void_type_node, cp_type_quals (TREE_TYPE (from)))); conv = build_conv (PTR_CONV, from, conv); } ! else if (ufcode == OFFSET_TYPE && utcode == OFFSET_TYPE) { ! tree fbase = TYPE_OFFSET_BASETYPE (TREE_TYPE (from)); ! tree tbase = TYPE_OFFSET_BASETYPE (TREE_TYPE (to)); if (DERIVED_FROM_P (fbase, tbase) && (same_type_ignoring_top_level_qualifiers_p ! (TREE_TYPE (TREE_TYPE (from)), ! TREE_TYPE (TREE_TYPE (to))))) { ! from = build_ptrmem_type (tbase, TREE_TYPE (TREE_TYPE (from))); conv = build_conv (PMEM_CONV, from, conv); } } --- 531,574 ---- conv = build_conv (STD_CONV, to, conv); ICS_BAD_FLAG (conv) = 1; } ! else if (tcode == ENUMERAL_TYPE && fcode == INTEGER_TYPE) { /* For backwards brain damage compatibility, allow interconversion of enums and integers with a pedwarn. */ conv = build_conv (STD_CONV, to, conv); ICS_BAD_FLAG (conv) = 1; } ! else if ((tcode == POINTER_TYPE && fcode == POINTER_TYPE) ! || (TYPE_PTRMEM_P (to) && TYPE_PTRMEM_P (from))) { ! tree to_pointee; ! tree from_pointee; ! if (tcode == POINTER_TYPE ! && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (from), ! TREE_TYPE (to))) ; ! else if (VOID_TYPE_P (TREE_TYPE (to)) ! && !TYPE_PTRMEM_P (from) ! && TREE_CODE (TREE_TYPE (from)) != FUNCTION_TYPE) { from = build_pointer_type (cp_build_qualified_type (void_type_node, cp_type_quals (TREE_TYPE (from)))); conv = build_conv (PTR_CONV, from, conv); } ! else if (TYPE_PTRMEM_P (from)) { ! tree fbase = TYPE_PTRMEM_CLASS_TYPE (from); ! tree tbase = TYPE_PTRMEM_CLASS_TYPE (to); if (DERIVED_FROM_P (fbase, tbase) && (same_type_ignoring_top_level_qualifiers_p ! (TYPE_PTRMEM_POINTED_TO_TYPE (from), ! TYPE_PTRMEM_POINTED_TO_TYPE (to)))) { ! from = build_ptrmem_type (tbase, ! TYPE_PTRMEM_POINTED_TO_TYPE (from)); conv = build_conv (PMEM_CONV, from, conv); } } *************** standard_conversion (to, from, expr) *** 878,891 **** conv = build_conv (PTR_CONV, from, conv); } if (same_type_p (from, to)) /* OK */; ! else if (comp_ptr_ttypes (TREE_TYPE (to), TREE_TYPE (from))) conv = build_conv (QUAL_CONV, to, conv); else if (expr && string_conv_p (to, expr, 0)) /* converting from string constant to char *. */ conv = build_conv (QUAL_CONV, to, conv); ! else if (ptr_reasonably_similar (TREE_TYPE (to), TREE_TYPE (from))) { conv = build_conv (PTR_CONV, to, conv); ICS_BAD_FLAG (conv) = 1; --- 594,618 ---- conv = build_conv (PTR_CONV, from, conv); } + if (tcode == POINTER_TYPE) + { + to_pointee = TREE_TYPE (to); + from_pointee = TREE_TYPE (from); + } + else + { + to_pointee = TYPE_PTRMEM_POINTED_TO_TYPE (to); + from_pointee = TYPE_PTRMEM_POINTED_TO_TYPE (from); + } + if (same_type_p (from, to)) /* OK */; ! else if (comp_ptr_ttypes (to_pointee, from_pointee)) conv = build_conv (QUAL_CONV, to, conv); else if (expr && string_conv_p (to, expr, 0)) /* converting from string constant to char *. */ conv = build_conv (QUAL_CONV, to, conv); ! else if (ptr_reasonably_similar (to_pointee, from_pointee)) { conv = build_conv (PTR_CONV, to, conv); ICS_BAD_FLAG (conv) = 1; *************** standard_conversion (to, from, expr) *** 910,930 **** return 0; from = cp_build_qualified_type (tbase, cp_type_quals (fbase)); ! from = build_cplus_method_type (from, TREE_TYPE (fromfn), ! TREE_CHAIN (TYPE_ARG_TYPES (fromfn))); from = build_ptrmemfunc_type (build_pointer_type (from)); conv = build_conv (PMEM_CONV, from, conv); } else if (tcode == BOOLEAN_TYPE) { ! if (! (INTEGRAL_CODE_P (fcode) || fcode == REAL_TYPE ! || fcode == POINTER_TYPE || TYPE_PTRMEMFUNC_P (from))) ! return 0; ! conv = build_conv (STD_CONV, to, conv); ! if (fcode == POINTER_TYPE ! || (TYPE_PTRMEMFUNC_P (from) && ICS_STD_RANK (conv) < PBOOL_RANK)) ! ICS_STD_RANK (conv) = PBOOL_RANK; } /* We don't check for ENUMERAL_TYPE here because there are no standard conversions to enum type. */ --- 637,669 ---- return 0; from = cp_build_qualified_type (tbase, cp_type_quals (fbase)); ! from = build_method_type_directly (from, ! TREE_TYPE (fromfn), ! TREE_CHAIN (TYPE_ARG_TYPES (fromfn))); from = build_ptrmemfunc_type (build_pointer_type (from)); conv = build_conv (PMEM_CONV, from, conv); } else if (tcode == BOOLEAN_TYPE) { ! /* [conv.bool] ! An rvalue of arithmetic, enumeration, pointer, or pointer to ! member type can be converted to an rvalue of type bool. */ ! if (ARITHMETIC_TYPE_P (from) ! || fcode == ENUMERAL_TYPE ! || fcode == POINTER_TYPE ! || TYPE_PTR_TO_MEMBER_P (from)) ! { ! conv = build_conv (STD_CONV, to, conv); ! if (fcode == POINTER_TYPE ! || TYPE_PTRMEM_P (from) ! || (TYPE_PTRMEMFUNC_P (from) ! && ICS_STD_RANK (conv) < PBOOL_RANK)) ! ICS_STD_RANK (conv) = PBOOL_RANK; ! return conv; ! } ! ! return NULL_TREE; } /* We don't check for ENUMERAL_TYPE here because there are no standard conversions to enum type. */ *************** standard_conversion (to, from, expr) *** 936,945 **** conv = build_conv (STD_CONV, to, conv); /* Give this a better rank if it's a promotion. */ ! if (to == type_promotes_to (from) && ICS_STD_RANK (TREE_OPERAND (conv, 0)) <= PROMO_RANK) ICS_STD_RANK (conv) = PROMO_RANK; } else if (IS_AGGR_TYPE (to) && IS_AGGR_TYPE (from) && is_properly_derived_from (from, to)) { --- 675,688 ---- conv = build_conv (STD_CONV, to, conv); /* Give this a better rank if it's a promotion. */ ! if (same_type_p (to, type_promotes_to (from)) && ICS_STD_RANK (TREE_OPERAND (conv, 0)) <= PROMO_RANK) ICS_STD_RANK (conv) = PROMO_RANK; } + else if (fcode == VECTOR_TYPE && tcode == VECTOR_TYPE + && ((*targetm.vector_opaque_p) (from) + || (*targetm.vector_opaque_p) (to))) + return build_conv (STD_CONV, to, conv); else if (IS_AGGR_TYPE (to) && IS_AGGR_TYPE (from) && is_properly_derived_from (from, to)) { *************** standard_conversion (to, from, expr) *** 960,969 **** /* Returns nonzero if T1 is reference-related to T2. */ ! static int ! reference_related_p (t1, t2) ! tree t1; ! tree t2; { t1 = TYPE_MAIN_VARIANT (t1); t2 = TYPE_MAIN_VARIANT (t2); --- 703,710 ---- /* Returns nonzero if T1 is reference-related to T2. */ ! static bool ! reference_related_p (tree t1, tree t2) { t1 = TYPE_MAIN_VARIANT (t1); t2 = TYPE_MAIN_VARIANT (t2); *************** reference_related_p (t1, t2) *** 980,989 **** /* Returns nonzero if T1 is reference-compatible with T2. */ ! static int ! reference_compatible_p (t1, t2) ! tree t1; ! tree t2; { /* [dcl.init.ref] --- 721,728 ---- /* Returns nonzero if T1 is reference-compatible with T2. */ ! static bool ! reference_compatible_p (tree t1, tree t2) { /* [dcl.init.ref] *************** reference_compatible_p (t1, t2) *** 998,1007 **** converted to T as in [over.match.ref]. */ static tree ! convert_class_to_reference (t, s, expr) ! tree t; ! tree s; ! tree expr; { tree conversions; tree arglist; --- 737,743 ---- converted to T as in [over.match.ref]. */ static tree ! convert_class_to_reference (tree t, tree s, tree expr) { tree conversions; tree arglist; *************** convert_class_to_reference (t, s, expr) *** 1009,1014 **** --- 745,751 ---- tree reference_type; struct z_candidate *candidates; struct z_candidate *cand; + bool any_viable_p; conversions = lookup_conversions (s); if (!conversions) *************** convert_class_to_reference (t, s, expr) *** 1091,1119 **** LOOKUP_NORMAL); if (cand) ! /* Build a standard conversion sequence indicating the ! binding from the reference type returned by the ! function to the desired REFERENCE_TYPE. */ ! cand->second_conv ! = (direct_reference_binding ! (reference_type, ! build1 (IDENTITY_CONV, ! TREE_TYPE (TREE_TYPE (TREE_TYPE (cand->fn))), ! NULL_TREE))); } conversions = TREE_CHAIN (conversions); } /* If none of the conversion functions worked out, let our caller know. */ ! if (!any_viable (candidates)) return NULL_TREE; ! ! candidates = splice_viable (candidates); cand = tourney (candidates); if (!cand) return NULL_TREE; /* Build a user-defined conversion sequence representing the conversion. */ conv = build_conv (USER_CONV, --- 828,866 ---- LOOKUP_NORMAL); if (cand) ! { ! /* Build a standard conversion sequence indicating the ! binding from the reference type returned by the ! function to the desired REFERENCE_TYPE. */ ! cand->second_conv ! = (direct_reference_binding ! (reference_type, ! build1 (IDENTITY_CONV, ! TREE_TYPE (TREE_TYPE (TREE_TYPE (cand->fn))), ! NULL_TREE))); ! ICS_BAD_FLAG (cand->second_conv) ! |= ICS_BAD_FLAG (TREE_VEC_ELT (cand->convs, 0)); ! } } conversions = TREE_CHAIN (conversions); } + candidates = splice_viable (candidates, pedantic, &any_viable_p); /* If none of the conversion functions worked out, let our caller know. */ ! if (!any_viable_p) return NULL_TREE; ! cand = tourney (candidates); if (!cand) return NULL_TREE; + /* Now that we know that this is the function we're going to use fix + the dummy first argument. */ + cand->args = tree_cons (NULL_TREE, + build_this (expr), + TREE_CHAIN (cand->args)); + /* Build a user-defined conversion sequence representing the conversion. */ conv = build_conv (USER_CONV, *************** convert_class_to_reference (t, s, expr) *** 1127,1133 **** if (cand->viable == -1) ICS_BAD_FLAG (conv) = 1; ! return cand->second_conv; } --- 874,880 ---- if (cand->viable == -1) ICS_BAD_FLAG (conv) = 1; ! return cand->second_conv; } *************** convert_class_to_reference (t, s, expr) *** 1136,1151 **** Return a conversion sequence for this binding. */ static tree ! direct_reference_binding (type, conv) ! tree type; ! tree conv; { tree t; my_friendly_assert (TREE_CODE (type) == REFERENCE_TYPE, 20030306); my_friendly_assert (TREE_CODE (TREE_TYPE (conv)) != REFERENCE_TYPE, 20030306); ! t = TREE_TYPE (type); /* [over.ics.rank] --- 883,896 ---- Return a conversion sequence for this binding. */ static tree ! direct_reference_binding (tree type, tree conv) { tree t; my_friendly_assert (TREE_CODE (type) == REFERENCE_TYPE, 20030306); my_friendly_assert (TREE_CODE (TREE_TYPE (conv)) != REFERENCE_TYPE, 20030306); ! t = TREE_TYPE (type); /* [over.ics.rank] *************** reference_binding (tree rto, tree rfrom, *** 1188,1195 **** tree conv = NULL_TREE; tree to = TREE_TYPE (rto); tree from = rfrom; ! int related_p; ! int compatible_p; cp_lvalue_kind lvalue_p = clk_none; if (TREE_CODE (to) == FUNCTION_TYPE && expr && type_unknown_p (expr)) --- 933,940 ---- tree conv = NULL_TREE; tree to = TREE_TYPE (rto); tree from = rfrom; ! bool related_p; ! bool compatible_p; cp_lvalue_kind lvalue_p = clk_none; if (TREE_CODE (to) == FUNCTION_TYPE && expr && type_unknown_p (expr)) *************** reference_binding (tree rto, tree rfrom, *** 1224,1237 **** -- is an lvalue (but not an lvalue for a bit-field), and "cv1 T1" is reference-compatible with "cv2 T2," ! the reference is bound directly to the initializer exprssion lvalue. */ conv = build1 (IDENTITY_CONV, from, expr); conv = direct_reference_binding (rto, conv); ! if ((lvalue_p & clk_bitfield) != 0 ! && CP_TYPE_CONST_NON_VOLATILE_P (to)) /* For the purposes of overload resolution, we ignore the fact ! this expression is a bitfield. (In particular, [over.ics.ref] says specifically that a function with a non-const reference parameter is viable even if the argument is a bitfield.) --- 969,982 ---- -- is an lvalue (but not an lvalue for a bit-field), and "cv1 T1" is reference-compatible with "cv2 T2," ! the reference is bound directly to the initializer expression lvalue. */ conv = build1 (IDENTITY_CONV, from, expr); conv = direct_reference_binding (rto, conv); ! if ((lvalue_p & clk_bitfield) != 0 ! || ((lvalue_p & clk_packed) != 0 && !TYPE_PACKED (to))) /* For the purposes of overload resolution, we ignore the fact ! this expression is a bitfield or packed field. (In particular, [over.ics.ref] says specifically that a function with a non-const reference parameter is viable even if the argument is a bitfield.) *************** reference_binding (tree rto, tree rfrom, *** 1242,1254 **** a temporary, so we just issue an error when the conversion actually occurs. */ NEED_TEMPORARY_P (conv) = 1; return conv; } else if (CLASS_TYPE_P (from) && !(flags & LOOKUP_NO_CONVERSION)) { /* [dcl.init.ref] ! If the initializer exprsesion -- has a class type (i.e., T2 is a class type) can be implicitly converted to an lvalue of type "cv3 T3," where --- 987,1000 ---- a temporary, so we just issue an error when the conversion actually occurs. */ NEED_TEMPORARY_P (conv) = 1; + return conv; } else if (CLASS_TYPE_P (from) && !(flags & LOOKUP_NO_CONVERSION)) { /* [dcl.init.ref] ! If the initializer expression -- has a class type (i.e., T2 is a class type) can be implicitly converted to an lvalue of type "cv3 T3," where *************** reference_binding (tree rto, tree rfrom, *** 1296,1302 **** or to a sub-object within that object. -- ... ! We use the first alternative. The implicit conversion sequence is supposed to be same as we would obtain by generating a temporary. Fortunately, if the types are reference compatible, --- 1042,1048 ---- or to a sub-object within that object. -- ... ! We use the first alternative. The implicit conversion sequence is supposed to be same as we would obtain by generating a temporary. Fortunately, if the types are reference compatible, *************** reference_binding (tree rto, tree rfrom, *** 1305,1311 **** if (CLASS_TYPE_P (from) && compatible_p) { conv = build1 (IDENTITY_CONV, from, expr); ! return direct_reference_binding (rto, conv); } /* [dcl.init.ref] --- 1051,1059 ---- if (CLASS_TYPE_P (from) && compatible_p) { conv = build1 (IDENTITY_CONV, from, expr); ! conv = direct_reference_binding (rto, conv); ! CHECK_COPY_CONSTRUCTOR_P (TREE_OPERAND (conv, 0)) = 1; ! return conv; } /* [dcl.init.ref] *************** reference_binding (tree rto, tree rfrom, *** 1336,1355 **** significant. */ static tree ! implicit_conversion (to, from, expr, flags) ! tree to, from, expr; ! int flags; { tree conv; - /* Resolve expressions like `A::p' that we thought might become - pointers-to-members. */ - if (expr && TREE_CODE (expr) == OFFSET_REF) - { - expr = resolve_offset_ref (expr); - from = TREE_TYPE (expr); - } - if (from == error_mark_node || to == error_mark_node || expr == error_mark_node) return NULL_TREE; --- 1084,1093 ---- significant. */ static tree ! implicit_conversion (tree to, tree from, tree expr, int flags) { tree conv; if (from == error_mark_node || to == error_mark_node || expr == error_mark_node) return NULL_TREE; *************** implicit_conversion (to, from, expr, fla *** 1360,1370 **** conv = standard_conversion (to, from, expr); if (conv) ! ; ! else if (expr != NULL_TREE ! && (IS_AGGR_TYPE (from) ! || IS_AGGR_TYPE (to)) ! && (flags & LOOKUP_NO_CONVERSION) == 0) { struct z_candidate *cand; --- 1098,1109 ---- conv = standard_conversion (to, from, expr); if (conv) ! return conv; ! ! if (expr != NULL_TREE ! && (IS_AGGR_TYPE (from) ! || IS_AGGR_TYPE (to)) ! && (flags & LOOKUP_NO_CONVERSION) == 0) { struct z_candidate *cand; *************** implicit_conversion (to, from, expr, fla *** 1376,1384 **** /* We used to try to bind a reference to a temporary here, but that is now handled by the recursive call to this function at the end of reference_binding. */ } ! return conv; } /* Add a new entry to the list of candidates. Used by the add_*_candidate --- 1115,1124 ---- /* We used to try to bind a reference to a temporary here, but that is now handled by the recursive call to this function at the end of reference_binding. */ + return conv; } ! return NULL_TREE; } /* Add a new entry to the list of candidates. Used by the add_*_candidate *************** implicit_conversion (to, from, expr, fla *** 1386,1398 **** static struct z_candidate * add_candidate (struct z_candidate **candidates, ! tree fn, tree convs, tree access_path, tree ! conversion_path, int viable) { ! struct z_candidate *cand ! = (struct z_candidate *) ggc_alloc_cleared (sizeof (struct z_candidate)); cand->fn = fn; cand->convs = convs; cand->access_path = access_path; cand->conversion_path = conversion_path; --- 1126,1138 ---- static struct z_candidate * add_candidate (struct z_candidate **candidates, ! tree fn, tree args, tree convs, tree access_path, ! tree conversion_path, int viable) { ! struct z_candidate *cand = ggc_alloc_cleared (sizeof (struct z_candidate)); cand->fn = fn; + cand->args = args; cand->convs = convs; cand->access_path = access_path; cand->conversion_path = conversion_path; *************** add_function_candidate (struct z_candida *** 1420,1425 **** --- 1160,1166 ---- int i, len; tree convs; tree parmnode, argnode; + tree orig_arglist; int viable = 1; /* Built-in functions that haven't been declared don't really *************** add_function_candidate (struct z_candida *** 1432,1439 **** --- 1173,1183 ---- if (DECL_CONSTRUCTOR_P (fn)) { parmlist = skip_artificial_parms_for (fn, parmlist); + orig_arglist = arglist; arglist = skip_artificial_parms_for (fn, arglist); } + else + orig_arglist = arglist; len = list_length (arglist); convs = make_tree_vec (len); *************** add_function_candidate (struct z_candida *** 1531,1537 **** } out: ! return add_candidate (candidates, fn, convs, access_path, conversion_path, viable); } --- 1275,1281 ---- } out: ! return add_candidate (candidates, fn, orig_arglist, convs, access_path, conversion_path, viable); } *************** add_function_candidate (struct z_candida *** 1547,1558 **** instead of the function. */ static struct z_candidate * ! add_conv_candidate (candidates, fn, obj, arglist, access_path, ! conversion_path) ! struct z_candidate **candidates; ! tree fn, obj, arglist; ! tree access_path; ! tree conversion_path; { tree totype = TREE_TYPE (TREE_TYPE (fn)); int i, len, viable, flags; --- 1291,1298 ---- instead of the function. */ static struct z_candidate * ! add_conv_candidate (struct z_candidate **candidates, tree fn, tree obj, ! tree arglist, tree access_path, tree conversion_path) { tree totype = TREE_TYPE (TREE_TYPE (fn)); int i, len, viable, flags; *************** add_conv_candidate (candidates, fn, obj, *** 1612,1628 **** if (!sufficient_parms_p (parmnode)) viable = 0; ! return add_candidate (candidates, totype, convs, access_path, conversion_path, viable); } static void ! build_builtin_candidate (candidates, fnname, type1, type2, ! args, argtypes, flags) ! struct z_candidate **candidates; ! tree fnname, type1, type2, *args, *argtypes; ! int flags; ! { tree t, convs; int viable = 1, i; --- 1352,1365 ---- if (!sufficient_parms_p (parmnode)) viable = 0; ! return add_candidate (candidates, totype, arglist, convs, access_path, conversion_path, viable); } static void ! build_builtin_candidate (struct z_candidate **candidates, tree fnname, ! tree type1, tree type2, tree *args, tree *argtypes, ! int flags) { tree t, convs; int viable = 1, i; *************** build_builtin_candidate (candidates, fnn *** 1662,1685 **** viable = 0; } ! add_candidate (candidates, fnname, convs, /*access_path=*/NULL_TREE, /*conversion_path=*/NULL_TREE, viable); } ! static int ! is_complete (t) ! tree t; { return COMPLETE_TYPE_P (complete_type (t)); } /* Returns nonzero if TYPE is a promoted arithmetic type. */ ! static int ! promoted_arithmetic_type_p (type) ! tree type; { /* [over.built] --- 1399,1420 ---- viable = 0; } ! add_candidate (candidates, fnname, /*args=*/NULL_TREE, convs, /*access_path=*/NULL_TREE, /*conversion_path=*/NULL_TREE, viable); } ! static bool ! is_complete (tree t) { return COMPLETE_TYPE_P (complete_type (t)); } /* Returns nonzero if TYPE is a promoted arithmetic type. */ ! static bool ! promoted_arithmetic_type_p (tree type) { /* [over.built] *************** promoted_arithmetic_type_p (type) *** 1704,1715 **** CODE (TYPE1, TYPE1) and CODE (TYPE2, TYPE2). */ static void ! add_builtin_candidate (candidates, code, code2, fnname, type1, type2, ! args, argtypes, flags) ! struct z_candidate **candidates; ! enum tree_code code, code2; ! tree fnname, type1, type2, *args, *argtypes; ! int flags; { switch (code) { --- 1439,1447 ---- CODE (TYPE1, TYPE1) and CODE (TYPE2, TYPE2). */ static void ! add_builtin_candidate (struct z_candidate **candidates, enum tree_code code, ! enum tree_code code2, tree fnname, tree type1, ! tree type2, tree *args, tree *argtypes, int flags) { switch (code) { *************** add_builtin_candidate (candidates, code, *** 1781,1788 **** T operator-(T); */ case CONVERT_EXPR: /* unary + */ ! if (TREE_CODE (type1) == POINTER_TYPE ! && TREE_CODE (TREE_TYPE (type1)) != OFFSET_TYPE) break; case NEGATE_EXPR: if (ARITHMETIC_TYPE_P (type1)) --- 1513,1519 ---- T operator-(T); */ case CONVERT_EXPR: /* unary + */ ! if (TREE_CODE (type1) == POINTER_TYPE) break; case NEGATE_EXPR: if (ARITHMETIC_TYPE_P (type1)) *************** add_builtin_candidate (candidates, code, *** 1807,1818 **** case MEMBER_REF: if (TREE_CODE (type1) == POINTER_TYPE ! && (TYPE_PTRMEMFUNC_P (type2) || TYPE_PTRMEM_P (type2))) { tree c1 = TREE_TYPE (type1); ! tree c2 = (TYPE_PTRMEMFUNC_P (type2) ! ? TYPE_METHOD_BASETYPE (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (type2))) ! : TYPE_OFFSET_BASETYPE (TREE_TYPE (type2))); if (IS_AGGR_TYPE (c1) && DERIVED_FROM_P (c2, c1) && (TYPE_PTRMEMFUNC_P (type2) --- 1538,1547 ---- case MEMBER_REF: if (TREE_CODE (type1) == POINTER_TYPE ! && TYPE_PTR_TO_MEMBER_P (type2)) { tree c1 = TREE_TYPE (type1); ! tree c2 = TYPE_PTRMEM_CLASS_TYPE (type2); if (IS_AGGR_TYPE (c1) && DERIVED_FROM_P (c2, c1) && (TYPE_PTRMEMFUNC_P (type2) *************** add_builtin_candidate (candidates, code, *** 1882,1900 **** if ((TYPE_PTRMEMFUNC_P (type1) && TYPE_PTRMEMFUNC_P (type2)) || (TYPE_PTRMEM_P (type1) && TYPE_PTRMEM_P (type2))) break; ! if ((TYPE_PTRMEMFUNC_P (type1) || TYPE_PTRMEM_P (type1)) ! && null_ptr_cst_p (args[1])) { type2 = type1; break; } ! if ((TYPE_PTRMEMFUNC_P (type2) || TYPE_PTRMEM_P (type2)) ! && null_ptr_cst_p (args[0])) { type1 = type2; break; } ! /* FALLTHROUGH */ case LT_EXPR: case GT_EXPR: case LE_EXPR: --- 1611,1627 ---- if ((TYPE_PTRMEMFUNC_P (type1) && TYPE_PTRMEMFUNC_P (type2)) || (TYPE_PTRMEM_P (type1) && TYPE_PTRMEM_P (type2))) break; ! if (TYPE_PTR_TO_MEMBER_P (type1) && null_ptr_cst_p (args[1])) { type2 = type1; break; } ! if (TYPE_PTR_TO_MEMBER_P (type2) && null_ptr_cst_p (args[0])) { type1 = type2; break; } ! /* Fall through. */ case LT_EXPR: case GT_EXPR: case LE_EXPR: *************** add_builtin_candidate (candidates, code, *** 2060,2071 **** break; /* Otherwise, the types should be pointers. */ ! if (!(TREE_CODE (type1) == POINTER_TYPE ! || TYPE_PTRMEM_P (type1) ! || TYPE_PTRMEMFUNC_P (type1)) ! || !(TREE_CODE (type2) == POINTER_TYPE ! || TYPE_PTRMEM_P (type2) ! || TYPE_PTRMEMFUNC_P (type2))) return; /* We don't check that the two types are the same; the logic --- 1787,1794 ---- break; /* Otherwise, the types should be pointers. */ ! if (!(TYPE_PTR_P (type1) || TYPE_PTR_TO_MEMBER_P (type1)) ! || !(TYPE_PTR_P (type2) || TYPE_PTR_TO_MEMBER_P (type2))) return; /* We don't check that the two types are the same; the logic *************** add_builtin_candidate (candidates, code, *** 2083,2090 **** if (type2 && !same_type_p (type1, type2) && TREE_CODE (type1) == TREE_CODE (type2) && (TREE_CODE (type1) == REFERENCE_TYPE ! || (TREE_CODE (type1) == POINTER_TYPE ! && TYPE_PTRMEM_P (type1) == TYPE_PTRMEM_P (type2)) || TYPE_PTRMEMFUNC_P (type1) || IS_AGGR_TYPE (type1) || TREE_CODE (type1) == ENUMERAL_TYPE)) --- 1806,1813 ---- if (type2 && !same_type_p (type1, type2) && TREE_CODE (type1) == TREE_CODE (type2) && (TREE_CODE (type1) == REFERENCE_TYPE ! || (TYPE_PTR_P (type1) && TYPE_PTR_P (type2)) ! || (TYPE_PTRMEM_P (type1) && TYPE_PTRMEM_P (type2)) || TYPE_PTRMEMFUNC_P (type1) || IS_AGGR_TYPE (type1) || TREE_CODE (type1) == ENUMERAL_TYPE)) *************** add_builtin_candidate (candidates, code, *** 2101,2108 **** } tree ! type_decays_to (type) ! tree type; { if (TREE_CODE (type) == ARRAY_TYPE) return build_pointer_type (TREE_TYPE (type)); --- 1824,1830 ---- } tree ! type_decays_to (tree type) { if (TREE_CODE (type) == ARRAY_TYPE) return build_pointer_type (TREE_TYPE (type)); *************** type_decays_to (type) *** 2125,2135 **** filter out the invalid set. */ static void ! add_builtin_candidates (candidates, code, code2, fnname, args, flags) ! struct z_candidate **candidates; ! enum tree_code code, code2; ! tree fnname, *args; ! int flags; { int ref1, i; int enum_p = 0; --- 1847,1855 ---- filter out the invalid set. */ static void ! add_builtin_candidates (struct z_candidate **candidates, enum tree_code code, ! enum tree_code code2, tree fnname, tree *args, ! int flags) { int ref1, i; int enum_p = 0; *************** add_builtin_candidates (candidates, code *** 2194,2200 **** case GT_EXPR: case GE_EXPR: enum_p = 1; ! /* FALLTHROUGH */ default: ref1 = 0; --- 1914,1920 ---- case GT_EXPR: case GE_EXPR: enum_p = 1; ! /* Fall through. */ default: ref1 = 0; *************** add_builtin_candidates (candidates, code *** 2302,2317 **** add_conv_candidate. */ static struct z_candidate* ! add_template_candidate_real (candidates, tmpl, ctype, explicit_targs, ! arglist, return_type, access_path, ! conversion_path, flags, obj, strict) ! struct z_candidate **candidates; ! tree tmpl, ctype, explicit_targs, arglist, return_type; ! tree access_path; ! tree conversion_path; ! int flags; ! tree obj; ! unification_kind_t strict; { int ntparms = DECL_NTPARMS (tmpl); tree targs = make_tree_vec (ntparms); --- 2022,2032 ---- add_conv_candidate. */ static struct z_candidate* ! add_template_candidate_real (struct z_candidate **candidates, tree tmpl, ! tree ctype, tree explicit_targs, tree arglist, ! tree return_type, tree access_path, ! tree conversion_path, int flags, tree obj, ! unification_kind_t strict) { int ntparms = DECL_NTPARMS (tmpl); tree targs = make_tree_vec (ntparms); *************** add_template_candidate_real (candidates, *** 2337,2343 **** if (i != 0) return NULL; ! fn = instantiate_template (tmpl, targs); if (fn == error_mark_node) return NULL; --- 2052,2058 ---- if (i != 0) return NULL; ! fn = instantiate_template (tmpl, targs, tf_none); if (fn == error_mark_node) return NULL; *************** add_template_candidate_real (candidates, *** 2406,2420 **** static struct z_candidate * ! add_template_candidate (candidates, tmpl, ctype, explicit_targs, ! arglist, return_type, access_path, ! conversion_path, flags, strict) ! struct z_candidate **candidates; ! tree tmpl, ctype, explicit_targs, arglist, return_type; ! tree access_path; ! tree conversion_path; ! int flags; ! unification_kind_t strict; { return add_template_candidate_real (candidates, tmpl, ctype, --- 2121,2130 ---- static struct z_candidate * ! add_template_candidate (struct z_candidate **candidates, tree tmpl, tree ctype, ! tree explicit_targs, tree arglist, tree return_type, ! tree access_path, tree conversion_path, int flags, ! unification_kind_t strict) { return add_template_candidate_real (candidates, tmpl, ctype, *************** add_template_candidate (candidates, tmpl *** 2425,2436 **** static struct z_candidate * ! add_template_conv_candidate (candidates, tmpl, obj, arglist, return_type, ! access_path, conversion_path) ! struct z_candidate **candidates; ! tree tmpl, obj, arglist, return_type; ! tree access_path; ! tree conversion_path; { return add_template_candidate_real (candidates, tmpl, NULL_TREE, NULL_TREE, --- 2135,2143 ---- static struct z_candidate * ! add_template_conv_candidate (struct z_candidate **candidates, tree tmpl, ! tree obj, tree arglist, tree return_type, ! tree access_path, tree conversion_path) { return add_template_candidate_real (candidates, tmpl, NULL_TREE, NULL_TREE, *************** add_template_conv_candidate (candidates, *** 2438,2484 **** conversion_path, 0, obj, DEDUCE_CONV); } ! static int ! any_viable (cands) ! struct z_candidate *cands; ! { ! for (; cands; cands = cands->next) ! if (pedantic ? cands->viable == 1 : cands->viable) ! return 1; ! return 0; ! } ! ! static int ! any_strictly_viable (cands) ! struct z_candidate *cands; { ! for (; cands; cands = cands->next) ! if (cands->viable == 1) ! return 1; ! return 0; ! } ! static struct z_candidate * ! splice_viable (cands) ! struct z_candidate *cands; ! { ! struct z_candidate **p = &cands; ! for (; *p; ) { ! if (pedantic ? (*p)->viable == 1 : (*p)->viable) ! p = &((*p)->next); else ! *p = (*p)->next; } ! return cands; } static tree ! build_this (obj) ! tree obj; { /* Fix this to work on non-lvalues. */ return build_unary_op (ADDR_EXPR, obj, 0); --- 2145,2199 ---- conversion_path, 0, obj, DEDUCE_CONV); } + /* The CANDS are the set of candidates that were considered for + overload resolution. Return the set of viable candidates. If none + of the candidates were viable, set *ANY_VIABLE_P to true. STRICT_P + is true if a candidate should be considered viable only if it is + strictly viable. */ ! static struct z_candidate* ! splice_viable (struct z_candidate *cands, ! bool strict_p, ! bool *any_viable_p) { ! struct z_candidate *viable; ! struct z_candidate **last_viable; ! struct z_candidate **cand; ! viable = NULL; ! last_viable = &viable; ! *any_viable_p = false; ! cand = &cands; ! while (*cand) { ! struct z_candidate *c = *cand; ! if (strict_p ? c->viable == 1 : c->viable) ! { ! *last_viable = c; ! *cand = c->next; ! c->next = NULL; ! last_viable = &c->next; ! *any_viable_p = true; ! } else ! cand = &c->next; } ! return viable ? viable : cands; ! } ! ! static bool ! any_strictly_viable (struct z_candidate *cands) ! { ! for (; cands; cands = cands->next) ! if (cands->viable == 1) ! return true; ! return false; } static tree ! build_this (tree obj) { /* Fix this to work on non-lvalues. */ return build_unary_op (ADDR_EXPR, obj, 0); *************** build_this (obj) *** 2489,2497 **** both are extern "C". */ static inline int ! equal_functions (fn1, fn2) ! tree fn1; ! tree fn2; { if (DECL_LOCAL_FUNCTION_P (fn1) || DECL_LOCAL_FUNCTION_P (fn2) || DECL_EXTERN_C_FUNCTION_P (fn1)) --- 2204,2210 ---- both are extern "C". */ static inline int ! equal_functions (tree fn1, tree fn2) { if (DECL_LOCAL_FUNCTION_P (fn1) || DECL_LOCAL_FUNCTION_P (fn2) || DECL_EXTERN_C_FUNCTION_P (fn1)) *************** equal_functions (fn1, fn2) *** 2499,2504 **** --- 2212,2250 ---- return fn1 == fn2; } + /* Print information about one overload candidate CANDIDATE. MSGSTR + is the text to print before the candidate itself. + + NOTE: Unlike most diagnostic functions in GCC, MSGSTR is expected + to have been run through gettext by the caller. This wart makes + life simpler in print_z_candidates and for the translators. */ + + static void + print_z_candidate (const char *msgstr, struct z_candidate *candidate) + { + if (TREE_CODE (candidate->fn) == IDENTIFIER_NODE) + { + if (TREE_VEC_LENGTH (candidate->convs) == 3) + inform ("%s %D(%T, %T, %T) ", msgstr, candidate->fn, + TREE_TYPE (TREE_VEC_ELT (candidate->convs, 0)), + TREE_TYPE (TREE_VEC_ELT (candidate->convs, 1)), + TREE_TYPE (TREE_VEC_ELT (candidate->convs, 2))); + else if (TREE_VEC_LENGTH (candidate->convs) == 2) + inform ("%s %D(%T, %T) ", msgstr, candidate->fn, + TREE_TYPE (TREE_VEC_ELT (candidate->convs, 0)), + TREE_TYPE (TREE_VEC_ELT (candidate->convs, 1))); + else + inform ("%s %D(%T) ", msgstr, candidate->fn, + TREE_TYPE (TREE_VEC_ELT (candidate->convs, 0))); + } + else if (TYPE_P (candidate->fn)) + inform ("%s %T ", msgstr, candidate->fn); + else if (candidate->viable == -1) + inform ("%J%s %+#D ", candidate->fn, msgstr, candidate->fn); + else + inform ("%J%s %+#D", candidate->fn, msgstr, candidate->fn); + } + static void print_z_candidates (struct z_candidate *candidates) { *************** print_z_candidates (struct z_candidate * *** 2528,2557 **** } } ! str = "candidates are:"; ! for (; candidates; candidates = candidates->next) { ! if (TREE_CODE (candidates->fn) == IDENTIFIER_NODE) { ! if (TREE_VEC_LENGTH (candidates->convs) == 3) ! error ("%s %D(%T, %T, %T) ", str, candidates->fn, ! TREE_TYPE (TREE_VEC_ELT (candidates->convs, 0)), ! TREE_TYPE (TREE_VEC_ELT (candidates->convs, 1)), ! TREE_TYPE (TREE_VEC_ELT (candidates->convs, 2))); ! else if (TREE_VEC_LENGTH (candidates->convs) == 2) ! error ("%s %D(%T, %T) ", str, candidates->fn, ! TREE_TYPE (TREE_VEC_ELT (candidates->convs, 0)), ! TREE_TYPE (TREE_VEC_ELT (candidates->convs, 1))); ! else ! error ("%s %D(%T) ", str, candidates->fn, ! TREE_TYPE (TREE_VEC_ELT (candidates->convs, 0))); } ! else if (TYPE_P (candidates->fn)) ! error ("%s %T ", str, candidates->fn); ! else ! cp_error_at ("%s %+#D%s", str, candidates->fn, ! candidates->viable == -1 ? " " : ""); ! str = " "; } } --- 2274,2300 ---- } } ! if (!candidates) ! return; ! ! str = _("candidates are:"); ! print_z_candidate (str, candidates); ! if (candidates->next) { ! /* Indent successive candidates by the width of the translation ! of the above string. */ ! size_t len = gcc_gettext_width (str) + 1; ! char *spaces = alloca (len); ! memset (spaces, ' ', len-1); ! spaces[len - 1] = '\0'; ! ! candidates = candidates->next; ! do { ! print_z_candidate (spaces, candidates); ! candidates = candidates->next; } ! while (candidates); } } *************** merge_conversion_sequences (tree user_se *** 2591,2604 **** per [dcl.init.ref], so we ignore temporary bindings. */ static struct z_candidate * ! build_user_type_conversion_1 (totype, expr, flags) ! tree totype, expr; ! int flags; { struct z_candidate *candidates, *cand; tree fromtype = TREE_TYPE (expr); tree ctors = NULL_TREE, convs = NULL_TREE; tree args = NULL_TREE; /* We represent conversion within a hierarchy using RVALUE_CONV and BASE_CONV, as specified by [over.best.ics]; these become plain --- 2334,2346 ---- per [dcl.init.ref], so we ignore temporary bindings. */ static struct z_candidate * ! build_user_type_conversion_1 (tree totype, tree expr, int flags) { struct z_candidate *candidates, *cand; tree fromtype = TREE_TYPE (expr); tree ctors = NULL_TREE, convs = NULL_TREE; tree args = NULL_TREE; + bool any_viable_p; /* We represent conversion within a hierarchy using RVALUE_CONV and BASE_CONV, as specified by [over.best.ics]; these become plain *************** build_user_type_conversion_1 (totype, ex *** 2684,2690 **** So we pass fromtype as CTYPE to add_*_candidate. */ if (TREE_CODE (fn) == TEMPLATE_DECL) ! cand = add_template_candidate (&candidates, fn, fromtype, NULL_TREE, args, totype, TYPE_BINFO (fromtype), conversion_path, --- 2426,2433 ---- So we pass fromtype as CTYPE to add_*_candidate. */ if (TREE_CODE (fn) == TEMPLATE_DECL) ! cand = add_template_candidate (&candidates, fn, fromtype, ! NULL_TREE, args, totype, TYPE_BINFO (fromtype), conversion_path, *************** build_user_type_conversion_1 (totype, ex *** 2699,2724 **** if (cand) { ! tree ics = implicit_conversion ! (totype, TREE_TYPE (TREE_TYPE (cand->fn)), ! 0, convflags); cand->second_conv = ics; if (ics == NULL_TREE) cand->viable = 0; ! else if (cand->viable == 1 && ICS_BAD_FLAG (ics)) cand->viable = -1; } } } ! if (! any_viable (candidates)) return 0; - candidates = splice_viable (candidates); cand = tourney (candidates); - if (cand == 0) { if (flags & LOOKUP_COMPLAIN) --- 2442,2466 ---- if (cand) { ! tree ics = implicit_conversion (totype, ! TREE_TYPE (TREE_TYPE (cand->fn)), ! 0, convflags); cand->second_conv = ics; if (ics == NULL_TREE) cand->viable = 0; ! else if (candidates->viable == 1 && ICS_BAD_FLAG (ics)) cand->viable = -1; } } } ! candidates = splice_viable (candidates, pedantic, &any_viable_p); ! if (!any_viable_p) return 0; cand = tourney (candidates); if (cand == 0) { if (flags & LOOKUP_COMPLAIN) *************** build_user_type_conversion_1 (totype, ex *** 2759,2767 **** } tree ! build_user_type_conversion (totype, expr, flags) ! tree totype, expr; ! int flags; { struct z_candidate *cand = build_user_type_conversion_1 (totype, expr, flags); --- 2501,2507 ---- } tree ! build_user_type_conversion (tree totype, tree expr, int flags) { struct z_candidate *cand = build_user_type_conversion_1 (totype, expr, flags); *************** build_user_type_conversion (totype, expr *** 2775,2857 **** return NULL_TREE; } - /* Find the possibly overloaded set of functions corresponding to a - call of the form SCOPE::NAME (...). NAME might be a - TEMPLATE_ID_EXPR, OVERLOAD, _DECL, IDENTIFIER_NODE or LOOKUP_EXPR. */ - - tree - resolve_scoped_fn_name (tree scope, tree name) - { - tree fn; - tree template_args = NULL_TREE; - bool is_template_id = TREE_CODE (name) == TEMPLATE_ID_EXPR; - - if (is_template_id) - { - template_args = TREE_OPERAND (name, 1); - name = TREE_OPERAND (name, 0); - } - if (TREE_CODE (name) == OVERLOAD) - name = DECL_NAME (get_first_fn (name)); - else if (TREE_CODE (name) == LOOKUP_EXPR) - name = TREE_OPERAND (name, 0); - - if (TREE_CODE (scope) == NAMESPACE_DECL) - fn = lookup_namespace_name (scope, name); - else if (!CLASS_TYPE_P (scope)) - { - error ("`%T' is not a class type", scope); - return error_mark_node; - } - else - { - if (!TYPE_BEING_DEFINED (scope) - && !COMPLETE_TYPE_P (complete_type (scope))) - { - error ("incomplete type '%T' cannot be used to name a scope", - scope); - return error_mark_node; - } - - if (BASELINK_P (name)) - fn = name; - else - fn = lookup_member (scope, name, /*protect=*/1, /*prefer_type=*/0); - if (fn && current_class_type) - fn = (adjust_result_of_qualified_name_lookup - (fn, scope, current_class_type)); - - /* It might be the name of a function pointer member. */ - if (fn && TREE_CODE (fn) == FIELD_DECL) - fn = resolve_offset_ref (build_offset_ref (scope, fn)); - } - - if (!fn) - { - error ("'%D' has no member named '%E'", scope, name); - return error_mark_node; - } - if (is_template_id) - { - tree fns = fn; - - if (BASELINK_P (fn)) - fns = BASELINK_FUNCTIONS (fns); - fns = build_nt (TEMPLATE_ID_EXPR, fns, template_args); - if (BASELINK_P (fn)) - BASELINK_FUNCTIONS (fn) = fns; - else - fn = fns; - } - - return fn; - } - /* Do any initial processing on the arguments to a function call. */ static tree ! resolve_args (args) ! tree args; { tree t; for (t = args; t; t = TREE_CHAIN (t)) --- 2515,2524 ---- return NULL_TREE; } /* Do any initial processing on the arguments to a function call. */ static tree ! resolve_args (tree args) { tree t; for (t = args; t; t = TREE_CHAIN (t)) *************** resolve_args (args) *** 2865,2889 **** error ("invalid use of void expression"); return error_mark_node; } - else if (TREE_CODE (arg) == OFFSET_REF) - arg = resolve_offset_ref (arg); arg = convert_from_reference (arg); TREE_VALUE (t) = arg; } return args; } ! /* Return an expression for a call to FN (a namespace-scope function) ! with the ARGS. */ ! ! tree ! build_new_function_call (fn, args) ! tree fn, args; { ! struct z_candidate *candidates = 0, *cand; tree explicit_targs = NULL_TREE; int template_only = 0; /* Check FN and ARGS. */ my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL || TREE_CODE (fn) == TEMPLATE_DECL --- 2532,2568 ---- error ("invalid use of void expression"); return error_mark_node; } arg = convert_from_reference (arg); TREE_VALUE (t) = arg; } return args; } ! /* Perform overload resolution on FN, which is called with the ARGS. ! ! Return the candidate function selected by overload resolution, or ! NULL if the event that overload resolution failed. In the case ! that overload resolution fails, *CANDIDATES will be the set of ! candidates considered, and ANY_VIABLE_P will be set to true or ! false to indicate whether or not any of the candidates were ! viable. ! ! The ARGS should already have gone through RESOLVE_ARGS before this ! function is called. */ ! ! static struct z_candidate * ! perform_overload_resolution (tree fn, ! tree args, ! struct z_candidate **candidates, ! bool *any_viable_p) { ! struct z_candidate *cand; tree explicit_targs = NULL_TREE; int template_only = 0; + *candidates = NULL; + *any_viable_p = true; + /* Check FN and ARGS. */ my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL || TREE_CODE (fn) == TEMPLATE_DECL *************** build_new_function_call (fn, args) *** 2900,2968 **** template_only = 1; } ! if (really_overloaded_fn (fn) ! || TREE_CODE (fn) == TEMPLATE_DECL) ! { ! tree t1; ! args = resolve_args (args); ! if (args == error_mark_node) ! return error_mark_node; ! for (t1 = fn; t1; t1 = OVL_NEXT (t1)) ! { ! tree t = OVL_CURRENT (t1); ! if (TREE_CODE (t) == TEMPLATE_DECL) ! add_template_candidate ! (&candidates, t, NULL_TREE, explicit_targs, args, ! NULL_TREE, ! /*access_path=*/NULL_TREE, /*conversion_path=*/NULL_TREE, ! LOOKUP_NORMAL, DEDUCE_CALL); ! else if (! template_only) ! add_function_candidate ! (&candidates, t, NULL_TREE, args, /*access_path=*/NULL_TREE, ! /*conversion_path=*/NULL_TREE, LOOKUP_NORMAL); ! } ! if (! any_viable (candidates)) ! { ! if (candidates && ! candidates->next) ! return build_function_call (candidates->fn, args); ! error ("no matching function for call to `%D(%A)'", ! DECL_NAME (OVL_CURRENT (fn)), args); ! if (candidates) ! print_z_candidates (candidates); ! return error_mark_node; ! } ! candidates = splice_viable (candidates); ! cand = tourney (candidates); ! if (cand == 0) ! { ! error ("call of overloaded `%D(%A)' is ambiguous", ! DECL_NAME (OVL_FUNCTION (fn)), args); ! print_z_candidates (candidates); ! return error_mark_node; ! } ! return build_over_call (cand, args, LOOKUP_NORMAL); } ! /* This is not really overloaded. */ ! fn = OVL_CURRENT (fn); ! return build_function_call (fn, args); } static tree ! build_object_call (obj, args) ! tree obj, args; { struct z_candidate *candidates = 0, *cand; tree fns, convs, mem_args = NULL_TREE; tree type = TREE_TYPE (obj); if (TYPE_PTRMEMFUNC_P (type)) { --- 2579,2729 ---- template_only = 1; } ! /* Add the various candidate functions. */ ! add_candidates (fn, args, explicit_targs, template_only, ! /*conversion_path=*/NULL_TREE, ! /*access_path=*/NULL_TREE, ! LOOKUP_NORMAL, ! candidates); ! *candidates = splice_viable (*candidates, pedantic, any_viable_p); ! if (!*any_viable_p) ! return NULL; ! cand = tourney (*candidates); ! return cand; ! } ! /* Return an expression for a call to FN (a namespace-scope function, ! or a static member function) with the ARGS. */ ! ! tree ! build_new_function_call (tree fn, tree args) ! { ! struct z_candidate *candidates, *cand; ! bool any_viable_p; ! args = resolve_args (args); ! if (args == error_mark_node) ! return error_mark_node; ! cand = perform_overload_resolution (fn, args, &candidates, &any_viable_p); ! if (!cand) ! { ! if (!any_viable_p && candidates && ! candidates->next) ! return build_function_call (candidates->fn, args); ! if (TREE_CODE (fn) == TEMPLATE_ID_EXPR) ! fn = TREE_OPERAND (fn, 0); ! if (!any_viable_p) ! error ("no matching function for call to `%D(%A)'", ! DECL_NAME (OVL_CURRENT (fn)), args); ! else ! error ("call of overloaded `%D(%A)' is ambiguous", ! DECL_NAME (OVL_CURRENT (fn)), args); ! if (candidates) ! print_z_candidates (candidates); ! return error_mark_node; ! } ! return build_over_call (cand, LOOKUP_NORMAL); ! } ! ! /* Build a call to a global operator new. FNNAME is the name of the ! operator (either "operator new" or "operator new[]") and ARGS are ! the arguments provided. *SIZE points to the total number of bytes ! required by the allocation, and is updated if that is changed here. ! *COOKIE_SIZE is non-NULL if a cookie should be used. If this ! function determines that no cookie should be used, after all, ! *COOKIE_SIZE is set to NULL_TREE. */ ! ! tree ! build_operator_new_call (tree fnname, tree args, tree *size, tree *cookie_size) ! { ! tree fns; ! struct z_candidate *candidates; ! struct z_candidate *cand; ! bool any_viable_p; ! ! args = tree_cons (NULL_TREE, *size, args); ! args = resolve_args (args); ! if (args == error_mark_node) ! return args; ! ! fns = lookup_function_nonclass (fnname, args); ! ! /* Figure out what function is being called. */ ! cand = perform_overload_resolution (fns, args, &candidates, &any_viable_p); ! ! /* If no suitable function could be found, issue an error message ! and give up. */ ! if (!cand) ! { ! if (!any_viable_p) ! error ("no matching function for call to `%D(%A)'", ! DECL_NAME (OVL_CURRENT (fns)), args); ! else ! error ("call of overloaded `%D(%A)' is ambiguous", ! DECL_NAME (OVL_CURRENT (fns)), args); ! if (candidates) ! print_z_candidates (candidates); ! return error_mark_node; } ! /* If a cookie is required, add some extra space. Whether ! or not a cookie is required cannot be determined until ! after we know which function was called. */ ! if (*cookie_size) ! { ! bool use_cookie = true; ! if (!abi_version_at_least (2)) ! { ! tree placement = TREE_CHAIN (args); ! /* In G++ 3.2, the check was implemented incorrectly; it ! looked at the placement expression, rather than the ! type of the function. */ ! if (placement && !TREE_CHAIN (placement) ! && same_type_p (TREE_TYPE (TREE_VALUE (placement)), ! ptr_type_node)) ! use_cookie = false; ! } ! else ! { ! tree arg_types; ! arg_types = TYPE_ARG_TYPES (TREE_TYPE (cand->fn)); ! /* Skip the size_t parameter. */ ! arg_types = TREE_CHAIN (arg_types); ! /* Check the remaining parameters (if any). */ ! if (arg_types ! && TREE_CHAIN (arg_types) == void_list_node ! && same_type_p (TREE_VALUE (arg_types), ! ptr_type_node)) ! use_cookie = false; ! } ! /* If we need a cookie, adjust the number of bytes allocated. */ ! if (use_cookie) ! { ! /* Update the total size. */ ! *size = size_binop (PLUS_EXPR, *size, *cookie_size); ! /* Update the argument list to reflect the adjusted size. */ ! TREE_VALUE (args) = *size; ! } ! else ! *cookie_size = NULL_TREE; ! } ! ! /* Build the CALL_EXPR. */ ! return build_over_call (cand, LOOKUP_NORMAL); } static tree ! build_object_call (tree obj, tree args) { struct z_candidate *candidates = 0, *cand; tree fns, convs, mem_args = NULL_TREE; tree type = TREE_TYPE (obj); + bool any_viable_p; if (TYPE_PTRMEMFUNC_P (type)) { *************** build_object_call (obj, args) *** 3031,3046 **** } } ! if (! any_viable (candidates)) { error ("no match for call to `(%T) (%A)'", TREE_TYPE (obj), args); print_z_candidates (candidates); return error_mark_node; } - candidates = splice_viable (candidates); cand = tourney (candidates); - if (cand == 0) { error ("call of `(%T) (%A)' is ambiguous", TREE_TYPE (obj), args); --- 2792,2806 ---- } } ! candidates = splice_viable (candidates, pedantic, &any_viable_p); ! if (!any_viable_p) { error ("no match for call to `(%T) (%A)'", TREE_TYPE (obj), args); print_z_candidates (candidates); return error_mark_node; } cand = tourney (candidates); if (cand == 0) { error ("call of `(%T) (%A)' is ambiguous", TREE_TYPE (obj), args); *************** build_object_call (obj, args) *** 3053,3059 **** DECL_NAME here. */ if (TREE_CODE (cand->fn) == FUNCTION_DECL && DECL_OVERLOADED_OPERATOR_P (cand->fn) == CALL_EXPR) ! return build_over_call (cand, mem_args, LOOKUP_NORMAL); obj = convert_like_with_context (TREE_VEC_ELT (cand->convs, 0), obj, cand->fn, -1); --- 2813,2819 ---- DECL_NAME here. */ if (TREE_CODE (cand->fn) == FUNCTION_DECL && DECL_OVERLOADED_OPERATOR_P (cand->fn) == CALL_EXPR) ! return build_over_call (cand, LOOKUP_NORMAL); obj = convert_like_with_context (TREE_VEC_ELT (cand->convs, 0), obj, cand->fn, -1); *************** build_object_call (obj, args) *** 3063,3072 **** } static void ! op_error (code, code2, arg1, arg2, arg3, problem) ! enum tree_code code, code2; ! tree arg1, arg2, arg3; ! const char *problem; { const char *opname; --- 2823,2830 ---- } static void ! op_error (enum tree_code code, enum tree_code code2, ! tree arg1, tree arg2, tree arg3, const char *problem) { const char *opname; *************** op_error (code, code2, arg1, arg2, arg3, *** 3090,3095 **** --- 2848,2858 ---- case ARRAY_REF: error ("%s for 'operator[]' in '%E[%E]'", problem, arg1, arg2); break; + + case REALPART_EXPR: + case IMAGPART_EXPR: + error ("%s for '%s' in '%s %E'", problem, opname, opname, arg1); + break; default: if (arg2) *************** op_error (code, code2, arg1, arg2, arg3, *** 3106,3114 **** convert E1 to E2 in [expr.cond]. */ static tree ! conditional_conversion (e1, e2) ! tree e1; ! tree e2; { tree t1 = non_reference (TREE_TYPE (e1)); tree t2 = non_reference (TREE_TYPE (e2)); --- 2869,2875 ---- convert E1 to E2 in [expr.cond]. */ static tree ! conditional_conversion (tree e1, tree e2) { tree t1 = non_reference (TREE_TYPE (e1)); tree t2 = non_reference (TREE_TYPE (e2)); *************** conditional_conversion (e1, e2) *** 3150,3155 **** --- 2911,2918 ---- if (!same_type_p (TYPE_MAIN_VARIANT (t1), TYPE_MAIN_VARIANT (t2))) conv = build_conv (BASE_CONV, t2, conv); + else + conv = build_conv (RVALUE_CONV, t2, conv); return conv; } else *************** conditional_conversion (e1, e2) *** 3168,3183 **** arguments to the conditional expression. */ tree ! build_conditional_expr (arg1, arg2, arg3) ! tree arg1; ! tree arg2; ! tree arg3; { tree arg2_type; tree arg3_type; tree result; tree result_type = NULL_TREE; ! int lvalue_p = 1; struct z_candidate *candidates = 0; struct z_candidate *cand; --- 2931,2943 ---- arguments to the conditional expression. */ tree ! build_conditional_expr (tree arg1, tree arg2, tree arg3) { tree arg2_type; tree arg3_type; tree result; tree result_type = NULL_TREE; ! bool lvalue_p = true; struct z_candidate *candidates = 0; struct z_candidate *cand; *************** build_conditional_expr (arg1, arg2, arg3 *** 3189,3211 **** { if (pedantic) pedwarn ("ISO C++ forbids omitting the middle term of a ?: expression"); ! arg1 = arg2 = save_expr (arg1); } /* [expr.cond] The first expr ession is implicitly converted to bool (clause _conv_). */ ! arg1 = cp_convert (boolean_type_node, arg1); /* If something has already gone wrong, just pass that fact up the tree. */ ! if (arg1 == error_mark_node ! || arg2 == error_mark_node ! || arg3 == error_mark_node ! || TREE_TYPE (arg1) == error_mark_node ! || TREE_TYPE (arg2) == error_mark_node ! || TREE_TYPE (arg3) == error_mark_node) return error_mark_node; /* [expr.cond] --- 2949,2973 ---- { if (pedantic) pedwarn ("ISO C++ forbids omitting the middle term of a ?: expression"); ! ! /* Make sure that lvalues remain lvalues. See g++.oliva/ext1.C. */ ! if (real_lvalue_p (arg1)) ! arg2 = arg1 = stabilize_reference (arg1); ! else ! arg2 = arg1 = save_expr (arg1); } /* [expr.cond] The first expr ession is implicitly converted to bool (clause _conv_). */ ! arg1 = perform_implicit_conversion (boolean_type_node, arg1); /* If something has already gone wrong, just pass that fact up the tree. */ ! if (error_operand_p (arg1) ! || error_operand_p (arg2) ! || error_operand_p (arg3)) return error_mark_node; /* [expr.cond] *************** build_conditional_expr (arg1, arg2, arg3 *** 3238,3248 **** type of the other and is an rvalue. --Both the second and the third operands have type void; the ! result is of type void and is an rvalue. */ ! if ((TREE_CODE (arg2) == THROW_EXPR) ! ^ (TREE_CODE (arg3) == THROW_EXPR)) ! result_type = ((TREE_CODE (arg2) == THROW_EXPR) ! ? arg3_type : arg2_type); else if (VOID_TYPE_P (arg2_type) && VOID_TYPE_P (arg3_type)) result_type = void_type_node; else --- 3000,3026 ---- type of the other and is an rvalue. --Both the second and the third operands have type void; the ! result is of type void and is an rvalue. ! ! We must avoid calling force_rvalue for expressions of type ! "void" because it will complain that their value is being ! used. */ ! if (TREE_CODE (arg2) == THROW_EXPR ! && TREE_CODE (arg3) != THROW_EXPR) ! { ! if (!VOID_TYPE_P (arg3_type)) ! arg3 = force_rvalue (arg3); ! arg3_type = TREE_TYPE (arg3); ! result_type = arg3_type; ! } ! else if (TREE_CODE (arg2) != THROW_EXPR ! && TREE_CODE (arg3) == THROW_EXPR) ! { ! if (!VOID_TYPE_P (arg2_type)) ! arg2 = force_rvalue (arg2); ! arg2_type = TREE_TYPE (arg2); ! result_type = arg2_type; ! } else if (VOID_TYPE_P (arg2_type) && VOID_TYPE_P (arg3_type)) result_type = void_type_node; else *************** build_conditional_expr (arg1, arg2, arg3 *** 3252,3258 **** return error_mark_node; } ! lvalue_p = 0; goto valid_operands; } /* [expr.cond] --- 3030,3036 ---- return error_mark_node; } ! lvalue_p = false; goto valid_operands; } /* [expr.cond] *************** build_conditional_expr (arg1, arg2, arg3 *** 3287,3319 **** { arg2 = convert_like (conv2, arg2); arg2 = convert_from_reference (arg2); - /* That may not quite have done the trick. If the two types - are cv-qualified variants of one another, we will have - just used an IDENTITY_CONV. (There's no conversion from - an lvalue of one class type to an lvalue of another type, - even a cv-qualified variant, and we don't want to lose - lvalue-ness here.) So, we manually add a NOP_EXPR here - if necessary. */ - if (!same_type_p (TREE_TYPE (arg2), arg3_type)) - arg2 = build1 (NOP_EXPR, arg3_type, arg2); arg2_type = TREE_TYPE (arg2); } else if (conv3 && !ICS_BAD_FLAG (conv3)) { arg3 = convert_like (conv3, arg3); arg3 = convert_from_reference (arg3); - if (!same_type_p (TREE_TYPE (arg3), arg2_type)) - arg3 = build1 (NOP_EXPR, arg2_type, arg3); arg3_type = TREE_TYPE (arg3); } } /* [expr.cond] If the second and third operands are lvalues and have the same type, the result is of that type and is an lvalue. */ ! if (real_lvalue_p (arg2) && real_lvalue_p (arg3) && ! same_type_p (arg2_type, arg3_type)) { result_type = arg2_type; goto valid_operands; --- 3065,3110 ---- { arg2 = convert_like (conv2, arg2); arg2 = convert_from_reference (arg2); arg2_type = TREE_TYPE (arg2); } else if (conv3 && !ICS_BAD_FLAG (conv3)) { arg3 = convert_like (conv3, arg3); arg3 = convert_from_reference (arg3); arg3_type = TREE_TYPE (arg3); } + + /* If, after the conversion, both operands have class type, + treat the cv-qualification of both operands as if it were the + union of the cv-qualification of the operands. + + The standard is not clear about what to do in this + circumstance. For example, if the first operand has type + "const X" and the second operand has a user-defined + conversion to "volatile X", what is the type of the second + operand after this step? Making it be "const X" (matching + the first operand) seems wrong, as that discards the + qualification without actuall performing a copy. Leaving it + as "volatile X" seems wrong as that will result in the + conditional expression failing altogether, even though, + according to this step, the one operand could be converted to + the type of the other. */ + if ((conv2 || conv3) + && CLASS_TYPE_P (arg2_type) + && TYPE_QUALS (arg2_type) != TYPE_QUALS (arg3_type)) + arg2_type = arg3_type = + cp_build_qualified_type (arg2_type, + TYPE_QUALS (arg2_type) + | TYPE_QUALS (arg3_type)); } /* [expr.cond] If the second and third operands are lvalues and have the same type, the result is of that type and is an lvalue. */ ! if (real_lvalue_p (arg2) ! && real_lvalue_p (arg3) ! && same_type_p (arg2_type, arg3_type)) { result_type = arg2_type; goto valid_operands; *************** build_conditional_expr (arg1, arg2, arg3 *** 3326,3337 **** cv-qualified) class type, overload resolution is used to determine the conversions (if any) to be applied to the operands (_over.match.oper_, _over.built_). */ ! lvalue_p = 0; if (!same_type_p (arg2_type, arg3_type) && (CLASS_TYPE_P (arg2_type) || CLASS_TYPE_P (arg3_type))) { tree args[3]; tree conv; /* Rearrange the arguments so that add_builtin_candidate only has to know about two args. In build_builtin_candidates, the --- 3117,3129 ---- cv-qualified) class type, overload resolution is used to determine the conversions (if any) to be applied to the operands (_over.match.oper_, _over.built_). */ ! lvalue_p = false; if (!same_type_p (arg2_type, arg3_type) && (CLASS_TYPE_P (arg2_type) || CLASS_TYPE_P (arg3_type))) { tree args[3]; tree conv; + bool any_viable_p; /* Rearrange the arguments so that add_builtin_candidate only has to know about two args. In build_builtin_candidates, the *************** build_conditional_expr (arg1, arg2, arg3 *** 3350,3362 **** If the overload resolution fails, the program is ill-formed. */ ! if (!any_viable (candidates)) { op_error (COND_EXPR, NOP_EXPR, arg1, arg2, arg3, "no match"); print_z_candidates (candidates); return error_mark_node; } - candidates = splice_viable (candidates); cand = tourney (candidates); if (!cand) { --- 3142,3154 ---- If the overload resolution fails, the program is ill-formed. */ ! candidates = splice_viable (candidates, pedantic, &any_viable_p); ! if (!any_viable_p) { op_error (COND_EXPR, NOP_EXPR, arg1, arg2, arg3, "no match"); print_z_candidates (candidates); return error_mark_node; } cand = tourney (candidates); if (!cand) { *************** build_conditional_expr (arg1, arg2, arg3 *** 3387,3402 **** We need to force the lvalue-to-rvalue conversion here for class types, so we get TARGET_EXPRs; trying to deal with a COND_EXPR of class rvalues that isn't wrapped with a TARGET_EXPR plays havoc with exception ! regions. ! ! We use ocp_convert rather than build_user_type_conversion because the ! latter returns NULL_TREE on failure, while the former gives an error. */ arg2 = force_rvalue (arg2); ! arg2_type = TREE_TYPE (arg2); arg3 = force_rvalue (arg3); ! arg3_type = TREE_TYPE (arg3); if (arg2 == error_mark_node || arg3 == error_mark_node) return error_mark_node; --- 3179,3193 ---- We need to force the lvalue-to-rvalue conversion here for class types, so we get TARGET_EXPRs; trying to deal with a COND_EXPR of class rvalues that isn't wrapped with a TARGET_EXPR plays havoc with exception ! regions. */ arg2 = force_rvalue (arg2); ! if (!CLASS_TYPE_P (arg2_type)) ! arg2_type = TREE_TYPE (arg2); arg3 = force_rvalue (arg3); ! if (!CLASS_TYPE_P (arg2_type)) ! arg3_type = TREE_TYPE (arg3); if (arg2 == error_mark_node || arg3 == error_mark_node) return error_mark_node; *************** build_conditional_expr (arg1, arg2, arg3 *** 3454,3471 **** cv-qualification of either the second or the third operand. The result is of the common type. */ else if ((null_ptr_cst_p (arg2) ! && (TYPE_PTR_P (arg3_type) || TYPE_PTRMEM_P (arg3_type) ! || TYPE_PTRMEMFUNC_P (arg3_type))) || (null_ptr_cst_p (arg3) ! && (TYPE_PTR_P (arg2_type) || TYPE_PTRMEM_P (arg2_type) ! || TYPE_PTRMEMFUNC_P (arg2_type))) || (TYPE_PTR_P (arg2_type) && TYPE_PTR_P (arg3_type)) || (TYPE_PTRMEM_P (arg2_type) && TYPE_PTRMEM_P (arg3_type)) ! || (TYPE_PTRMEMFUNC_P (arg2_type) ! && TYPE_PTRMEMFUNC_P (arg3_type))) { result_type = composite_pointer_type (arg2_type, arg3_type, arg2, arg3, "conditional expression"); arg2 = perform_implicit_conversion (result_type, arg2); arg3 = perform_implicit_conversion (result_type, arg3); } --- 3245,3261 ---- cv-qualification of either the second or the third operand. The result is of the common type. */ else if ((null_ptr_cst_p (arg2) ! && (TYPE_PTR_P (arg3_type) || TYPE_PTR_TO_MEMBER_P (arg3_type))) || (null_ptr_cst_p (arg3) ! && (TYPE_PTR_P (arg2_type) || TYPE_PTR_TO_MEMBER_P (arg2_type))) || (TYPE_PTR_P (arg2_type) && TYPE_PTR_P (arg3_type)) || (TYPE_PTRMEM_P (arg2_type) && TYPE_PTRMEM_P (arg3_type)) ! || (TYPE_PTRMEMFUNC_P (arg2_type) && TYPE_PTRMEMFUNC_P (arg3_type))) { result_type = composite_pointer_type (arg2_type, arg3_type, arg2, arg3, "conditional expression"); + if (result_type == error_mark_node) + return error_mark_node; arg2 = perform_implicit_conversion (result_type, arg2); arg3 = perform_implicit_conversion (result_type, arg3); } *************** build_conditional_expr (arg1, arg2, arg3 *** 3478,3522 **** valid_operands: result = fold (build (COND_EXPR, result_type, arg1, arg2, arg3)); /* Expand both sides into the same slot, hopefully the target of the ?: expression. We used to check for TARGET_EXPRs here, but now we sometimes wrap them in NOP_EXPRs so the test would fail. */ ! if (!lvalue_p && IS_AGGR_TYPE (result_type)) ! result = build_target_expr_with_type (result, result_type); /* If this expression is an rvalue, but might be mistaken for an lvalue, we must add a NON_LVALUE_EXPR. */ if (!lvalue_p && real_lvalue_p (result)) ! result = build1 (NON_LVALUE_EXPR, result_type, result); return result; } tree ! build_new_op (code, flags, arg1, arg2, arg3) ! enum tree_code code; ! int flags; ! tree arg1, arg2, arg3; { struct z_candidate *candidates = 0, *cand; ! tree fns, mem_arglist = NULL_TREE, arglist, fnname; enum tree_code code2 = NOP_EXPR; tree conv; ! bool viable_candidates; ! if (arg1 == error_mark_node ! || arg2 == error_mark_node ! || arg3 == error_mark_node) return error_mark_node; - /* This can happen if a template takes all non-type parameters, e.g. - undeclared_template<1, 5, 72>a; */ - if (code == LT_EXPR && TREE_CODE (arg1) == TEMPLATE_DECL) - { - error ("`%D' must be declared before use", arg1); - return error_mark_node; - } - if (code == MODIFY_EXPR) { code2 = TREE_CODE (arg3); --- 3268,3392 ---- valid_operands: result = fold (build (COND_EXPR, result_type, arg1, arg2, arg3)); + /* We can't use result_type below, as fold might have returned a + throw_expr. */ + /* Expand both sides into the same slot, hopefully the target of the ?: expression. We used to check for TARGET_EXPRs here, but now we sometimes wrap them in NOP_EXPRs so the test would fail. */ ! if (!lvalue_p && CLASS_TYPE_P (TREE_TYPE (result))) ! result = get_target_expr (result); /* If this expression is an rvalue, but might be mistaken for an lvalue, we must add a NON_LVALUE_EXPR. */ if (!lvalue_p && real_lvalue_p (result)) ! result = build1 (NON_LVALUE_EXPR, TREE_TYPE (result), result); return result; } + /* OPERAND is an operand to an expression. Perform necessary steps + required before using it. If OPERAND is NULL_TREE, NULL_TREE is + returned. */ + + static tree + prep_operand (tree operand) + { + if (operand) + { + operand = convert_from_reference (operand); + if (CLASS_TYPE_P (TREE_TYPE (operand)) + && CLASSTYPE_TEMPLATE_INSTANTIATION (TREE_TYPE (operand))) + /* Make sure the template type is instantiated now. */ + instantiate_class_template (TYPE_MAIN_VARIANT (TREE_TYPE (operand))); + } + + return operand; + } + + /* Add each of the viable functions in FNS (a FUNCTION_DECL or + OVERLOAD) to the CANDIDATES, returning an updated list of + CANDIDATES. The ARGS are the arguments provided to the call, + without any implicit object parameter. The EXPLICIT_TARGS are + explicit template arguments provided. TEMPLATE_ONLY is true if + only template functions should be considered. CONVERSION_PATH, + ACCESS_PATH, and FLAGS are as for add_function_candidate. */ + + static void + add_candidates (tree fns, tree args, + tree explicit_targs, bool template_only, + tree conversion_path, tree access_path, + int flags, + struct z_candidate **candidates) + { + tree ctype; + tree non_static_args; + + ctype = conversion_path ? BINFO_TYPE (conversion_path) : NULL_TREE; + /* Delay creating the implicit this parameter until it is needed. */ + non_static_args = NULL_TREE; + + while (fns) + { + tree fn; + tree fn_args; + + fn = OVL_CURRENT (fns); + /* Figure out which set of arguments to use. */ + if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)) + { + /* If this function is a non-static member, prepend the implicit + object parameter. */ + if (!non_static_args) + non_static_args = tree_cons (NULL_TREE, + build_this (TREE_VALUE (args)), + TREE_CHAIN (args)); + fn_args = non_static_args; + } + else + /* Otherwise, just use the list of arguments provided. */ + fn_args = args; + + if (TREE_CODE (fn) == TEMPLATE_DECL) + add_template_candidate (candidates, + fn, + ctype, + explicit_targs, + fn_args, + NULL_TREE, + access_path, + conversion_path, + flags, + DEDUCE_CALL); + else if (!template_only) + add_function_candidate (candidates, + fn, + ctype, + fn_args, + access_path, + conversion_path, + flags); + fns = OVL_NEXT (fns); + } + } + tree ! build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3, ! bool *overloaded_p) { struct z_candidate *candidates = 0, *cand; ! tree arglist, fnname; ! tree args[3]; enum tree_code code2 = NOP_EXPR; tree conv; ! bool strict_p; ! bool any_viable_p; ! if (error_operand_p (arg1) ! || error_operand_p (arg2) ! || error_operand_p (arg3)) return error_mark_node; if (code == MODIFY_EXPR) { code2 = TREE_CODE (arg3); *************** build_new_op (code, flags, arg1, arg2, a *** 3526,3538 **** else fnname = ansi_opname (code); ! if (TREE_CODE (arg1) == OFFSET_REF) ! arg1 = resolve_offset_ref (arg1); ! arg1 = convert_from_reference (arg1); ! if (CLASS_TYPE_P (TREE_TYPE (arg1)) ! && CLASSTYPE_TEMPLATE_INSTANTIATION (TREE_TYPE (arg1))) ! /* Make sure the template type is instantiated now. */ ! instantiate_class_template (TYPE_MAIN_VARIANT (TREE_TYPE (arg1))); switch (code) { --- 3396,3402 ---- else fnname = ansi_opname (code); ! arg1 = prep_operand (arg1); switch (code) { *************** build_new_op (code, flags, arg1, arg2, a *** 3550,3573 **** break; } ! if (arg2) ! { ! if (TREE_CODE (arg2) == OFFSET_REF) ! arg2 = resolve_offset_ref (arg2); ! arg2 = convert_from_reference (arg2); ! if (CLASS_TYPE_P (TREE_TYPE (arg2)) ! && CLASSTYPE_TEMPLATE_INSTANTIATION (TREE_TYPE (arg2))) ! instantiate_class_template (TYPE_MAIN_VARIANT (TREE_TYPE (arg2))); ! } ! if (arg3) ! { ! if (TREE_CODE (arg3) == OFFSET_REF) ! arg3 = resolve_offset_ref (arg3); ! arg3 = convert_from_reference (arg3); ! if (CLASS_TYPE_P (TREE_TYPE (arg3)) ! && CLASSTYPE_TEMPLATE_INSTANTIATION (TREE_TYPE (arg3))) ! instantiate_class_template (TYPE_MAIN_VARIANT (TREE_TYPE (arg3))); ! } if (code == COND_EXPR) { --- 3414,3421 ---- break; } ! arg2 = prep_operand (arg2); ! arg3 = prep_operand (arg3); if (code == COND_EXPR) { *************** build_new_op (code, flags, arg1, arg2, a *** 3592,3680 **** arglist = tree_cons (NULL_TREE, arg2, arglist); arglist = tree_cons (NULL_TREE, arg1, arglist); ! fns = lookup_function_nonclass (fnname, arglist); ! ! if (fns && TREE_CODE (fns) == TREE_LIST) ! fns = TREE_VALUE (fns); ! for (; fns; fns = OVL_NEXT (fns)) { ! tree fn = OVL_CURRENT (fns); ! if (TREE_CODE (fn) == TEMPLATE_DECL) ! add_template_candidate (&candidates, fn, NULL_TREE, NULL_TREE, ! arglist, TREE_TYPE (fnname), ! /*access_path=*/NULL_TREE, ! /*conversion_path=*/NULL_TREE, ! flags, DEDUCE_CALL); ! else ! add_function_candidate (&candidates, fn, NULL_TREE, ! arglist, ! /*access_path=*/NULL_TREE, ! /*conversion_path=*/NULL_TREE, ! flags); ! } - if (IS_AGGR_TYPE (TREE_TYPE (arg1))) - { fns = lookup_fnfields (TYPE_BINFO (TREE_TYPE (arg1)), fnname, 1); if (fns == error_mark_node) return fns; } - else - fns = NULL_TREE; ! if (fns) { ! tree conversion_path = BASELINK_BINFO (fns); ! ! mem_arglist = tree_cons (NULL_TREE, build_this (arg1), TREE_CHAIN (arglist)); ! for (fns = BASELINK_FUNCTIONS (fns); fns; fns = OVL_NEXT (fns)) ! { ! tree fn = OVL_CURRENT (fns); ! tree this_arglist; ! tree access_path = TYPE_BINFO (TREE_TYPE (arg1)); ! ! if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE) ! this_arglist = mem_arglist; ! else ! this_arglist = arglist; ! ! if (TREE_CODE (fn) == TEMPLATE_DECL) ! /* A member template. */ ! add_template_candidate (&candidates, fn, ! BINFO_TYPE (conversion_path), ! NULL_TREE, ! this_arglist, TREE_TYPE (fnname), ! access_path, conversion_path, ! flags, DEDUCE_CALL); ! else ! add_function_candidate ! (&candidates, fn, BINFO_TYPE (conversion_path), this_arglist, ! access_path, conversion_path, flags); ! } } ! { ! tree args[3]; ! ! /* Rearrange the arguments for ?: so that add_builtin_candidate only has ! to know about two args; a builtin candidate will always have a first ! parameter of type bool. We'll handle that in ! build_builtin_candidate. */ ! if (code == COND_EXPR) ! { ! args[0] = arg2; ! args[1] = arg3; ! args[2] = arg1; ! } ! else ! { ! args[0] = arg1; ! args[1] = arg2; ! args[2] = NULL_TREE; ! } ! ! add_builtin_candidates (&candidates, code, code2, fnname, args, flags); ! } switch (code) { --- 3440,3484 ---- arglist = tree_cons (NULL_TREE, arg2, arglist); arglist = tree_cons (NULL_TREE, arg1, arglist); ! /* Add namespace-scope operators to the list of functions to ! consider. */ ! add_candidates (lookup_function_nonclass (fnname, arglist), ! arglist, NULL_TREE, false, NULL_TREE, NULL_TREE, ! flags, &candidates); ! /* Add class-member operators to the candidate set. */ ! if (CLASS_TYPE_P (TREE_TYPE (arg1))) { ! tree fns; fns = lookup_fnfields (TYPE_BINFO (TREE_TYPE (arg1)), fnname, 1); if (fns == error_mark_node) return fns; + if (fns) + add_candidates (BASELINK_FUNCTIONS (fns), arglist, + NULL_TREE, false, + BASELINK_BINFO (fns), + TYPE_BINFO (TREE_TYPE (arg1)), + flags, &candidates); } ! /* Rearrange the arguments for ?: so that add_builtin_candidate only has ! to know about two args; a builtin candidate will always have a first ! parameter of type bool. We'll handle that in ! build_builtin_candidate. */ ! if (code == COND_EXPR) { ! args[0] = arg2; ! args[1] = arg3; ! args[2] = arg1; ! } ! else ! { ! args[0] = arg1; ! args[1] = arg2; ! args[2] = NULL_TREE; } ! add_builtin_candidates (&candidates, code, code2, fnname, args, flags); switch (code) { *************** build_new_op (code, flags, arg1, arg2, a *** 3686,3700 **** operators. The built-in candidate set for COMPONENT_REF would be empty too, but since there are no such built-in operators, we accept non-strict matches for them. */ ! viable_candidates = any_strictly_viable (candidates); break; default: ! viable_candidates = any_viable (candidates); break; } ! if (! viable_candidates) { switch (code) { --- 3490,3505 ---- operators. The built-in candidate set for COMPONENT_REF would be empty too, but since there are no such built-in operators, we accept non-strict matches for them. */ ! strict_p = true; break; default: ! strict_p = pedantic; break; } ! candidates = splice_viable (candidates, strict_p, &any_viable_p); ! if (!any_viable_p) { switch (code) { *************** build_new_op (code, flags, arg1, arg2, a *** 3710,3716 **** code = PREINCREMENT_EXPR; else code = PREDECREMENT_EXPR; ! return build_new_op (code, flags, arg1, NULL_TREE, NULL_TREE); /* The caller will deal with these. */ case ADDR_EXPR: --- 3515,3522 ---- code = PREINCREMENT_EXPR; else code = PREDECREMENT_EXPR; ! return build_new_op (code, flags, arg1, NULL_TREE, NULL_TREE, ! overloaded_p); /* The caller will deal with these. */ case ADDR_EXPR: *************** build_new_op (code, flags, arg1, arg2, a *** 3728,3736 **** } return error_mark_node; } - candidates = splice_viable (candidates); - cand = tourney (candidates); if (cand == 0) { if (flags & LOOKUP_COMPLAIN) --- 3534,3541 ---- } return error_mark_node; } + cand = tourney (candidates); if (cand == 0) { if (flags & LOOKUP_COMPLAIN) *************** build_new_op (code, flags, arg1, arg2, a *** 3743,3749 **** if (TREE_CODE (cand->fn) == FUNCTION_DECL) { ! extern int warn_synth; if (warn_synth && fnname == ansi_assopname (NOP_EXPR) && DECL_ARTIFICIAL (cand->fn) --- 3548,3556 ---- if (TREE_CODE (cand->fn) == FUNCTION_DECL) { ! if (overloaded_p) ! *overloaded_p = true; ! if (warn_synth && fnname == ansi_assopname (NOP_EXPR) && DECL_ARTIFICIAL (cand->fn) *************** build_new_op (code, flags, arg1, arg2, a *** 3758,3768 **** : candidates->fn); } ! return build_over_call ! (cand, ! TREE_CODE (TREE_TYPE (cand->fn)) == METHOD_TYPE ! ? mem_arglist : arglist, ! LOOKUP_NORMAL); } /* Check for comparison of different enum types. */ --- 3565,3571 ---- : candidates->fn); } ! return build_over_call (cand, LOOKUP_NORMAL); } /* Check for comparison of different enum types. */ *************** builtin: *** 3887,3907 **** PLACEMENT is the corresponding placement new call, or NULL_TREE. */ tree ! build_op_delete_call (code, addr, size, flags, placement) ! enum tree_code code; ! tree addr, size, placement; ! int flags; { tree fn = NULL_TREE; ! tree fns, fnname, fntype, argtypes, args, type; int pass; if (addr == error_mark_node) return error_mark_node; ! type = TREE_TYPE (TREE_TYPE (addr)); ! while (TREE_CODE (type) == ARRAY_TYPE) ! type = TREE_TYPE (type); fnname = ansi_opname (code); --- 3690,3706 ---- PLACEMENT is the corresponding placement new call, or NULL_TREE. */ tree ! build_op_delete_call (enum tree_code code, tree addr, tree size, ! int flags, tree placement) { tree fn = NULL_TREE; ! tree fns, fnname, argtypes, args, type; int pass; if (addr == error_mark_node) return error_mark_node; ! type = strip_array_types (TREE_TYPE (TREE_TYPE (addr))); fnname = ansi_opname (code); *************** build_op_delete_call (code, addr, size, *** 3912,3918 **** the lookup selects a placement deallocation function, the program is ill-formed. ! Therefore, we ask lookup_fnfields to complain ambout ambiguity. */ { fns = lookup_fnfields (TYPE_BINFO (type), fnname, 1); if (fns == error_mark_node) --- 3711,3717 ---- the lookup selects a placement deallocation function, the program is ill-formed. ! Therefore, we ask lookup_fnfields to complain about ambiguity. */ { fns = lookup_fnfields (TYPE_BINFO (type), fnname, 1); if (fns == error_mark_node) *************** build_op_delete_call (code, addr, size, *** 3931,3940 **** /* Find the allocation function that is being called. */ call_expr = placement; - /* Sometimes we have a COMPOUND_EXPR, rather than a simple - CALL_EXPR. */ - while (TREE_CODE (call_expr) == COMPOUND_EXPR) - call_expr = TREE_OPERAND (call_expr, 1); /* Extract the function. */ alloc_fn = get_callee_fndecl (call_expr); my_friendly_assert (alloc_fn != NULL_TREE, 20020327); --- 3730,3735 ---- *************** build_op_delete_call (code, addr, size, *** 3954,3974 **** addr = cp_convert (ptr_type_node, addr); /* We make two tries at finding a matching `operator delete'. On ! the first pass, we look for an one-operator (or placement) operator delete. If we're not doing placement delete, then on the second pass we look for a two-argument delete. */ for (pass = 0; pass < (placement ? 1 : 2); ++pass) { - if (pass == 0) - argtypes = tree_cons (NULL_TREE, ptr_type_node, argtypes); - else - /* Normal delete; now try to find a match including the size - argument. */ - argtypes = tree_cons (NULL_TREE, ptr_type_node, - tree_cons (NULL_TREE, sizetype, - void_list_node)); - fntype = build_function_type (void_type_node, argtypes); - /* Go through the `operator delete' functions looking for one with a matching type. */ for (fn = BASELINK_P (fns) ? BASELINK_FUNCTIONS (fns) : fns; --- 3749,3759 ---- addr = cp_convert (ptr_type_node, addr); /* We make two tries at finding a matching `operator delete'. On ! the first pass, we look for a one-operator (or placement) operator delete. If we're not doing placement delete, then on the second pass we look for a two-argument delete. */ for (pass = 0; pass < (placement ? 1 : 2); ++pass) { /* Go through the `operator delete' functions looking for one with a matching type. */ for (fn = BASELINK_P (fns) ? BASELINK_FUNCTIONS (fns) : fns; *************** build_op_delete_call (code, addr, size, *** 3977,3989 **** { tree t; ! /* Exception specifications on the `delete' operator do not ! matter. */ ! t = build_exception_variant (TREE_TYPE (OVL_CURRENT (fn)), ! NULL_TREE); ! /* We also don't compare attributes. We're really just ! trying to check the types of the first two parameters. */ ! if (comptypes (t, fntype, COMPARE_NO_ATTRIBUTES)) break; } --- 3762,3791 ---- { tree t; ! /* The first argument must be "void *". */ ! t = TYPE_ARG_TYPES (TREE_TYPE (OVL_CURRENT (fn))); ! if (!same_type_p (TREE_VALUE (t), ptr_type_node)) ! continue; ! t = TREE_CHAIN (t); ! /* On the first pass, check the rest of the arguments. */ ! if (pass == 0) ! { ! tree a = argtypes; ! while (a && t) ! { ! if (!same_type_p (TREE_VALUE (a), TREE_VALUE (t))) ! break; ! a = TREE_CHAIN (a); ! t = TREE_CHAIN (t); ! } ! if (!a && !t) ! break; ! } ! /* On the second pass, the second argument must be ! "size_t". */ ! else if (pass == 1 ! && same_type_p (TREE_VALUE (t), sizetype) ! && TREE_CHAIN (t) == void_list_node) break; } *************** build_op_delete_call (code, addr, size, *** 4002,4008 **** /* If the FN is a member function, make sure that it is accessible. */ if (DECL_CLASS_SCOPE_P (fn)) ! enforce_access (type, fn); if (pass == 0) args = tree_cons (NULL_TREE, addr, args); --- 3804,3810 ---- /* If the FN is a member function, make sure that it is accessible. */ if (DECL_CLASS_SCOPE_P (fn)) ! perform_or_defer_access_check (TYPE_BINFO (type), fn); if (pass == 0) args = tree_cons (NULL_TREE, addr, args); *************** build_op_delete_call (code, addr, size, *** 4010,4016 **** args = tree_cons (NULL_TREE, addr, build_tree_list (NULL_TREE, size)); ! return build_function_call (fn, args); } /* If we are doing placement delete we do nothing if we don't find a --- 3812,3826 ---- args = tree_cons (NULL_TREE, addr, build_tree_list (NULL_TREE, size)); ! if (placement) ! { ! /* The placement args might not be suitable for overload ! resolution at this point, so build the call directly. */ ! mark_used (fn); ! return build_cxx_call (fn, args, args); ! } ! else ! return build_function_call (fn, args); } /* If we are doing placement delete we do nothing if we don't find a *************** build_op_delete_call (code, addr, size, *** 4018,4024 **** if (placement) return NULL_TREE; ! error ("no suitable `operator delete' for `%T'", type); return error_mark_node; } --- 3828,3835 ---- if (placement) return NULL_TREE; ! error ("no suitable `operator %s' for `%T'", ! operator_name_info[(int)code].name, type); return error_mark_node; } *************** build_op_delete_call (code, addr, size, *** 4026,4040 **** BASETYPE_PATH, give an error. The most derived class in BASETYPE_PATH is the one used to qualify DECL. */ ! int ! enforce_access (basetype_path, decl) ! tree basetype_path; ! tree decl; { ! int accessible; ! ! accessible = accessible_p (basetype_path, decl); ! if (!accessible) { if (TREE_PRIVATE (decl)) cp_error_at ("`%+#D' is private", decl); --- 3837,3848 ---- BASETYPE_PATH, give an error. The most derived class in BASETYPE_PATH is the one used to qualify DECL. */ ! bool ! enforce_access (tree basetype_path, tree decl) { ! my_friendly_assert (TREE_CODE (basetype_path) == TREE_VEC, 20030624); ! ! if (!accessible_p (basetype_path, decl)) { if (TREE_PRIVATE (decl)) cp_error_at ("`%+#D' is private", decl); *************** enforce_access (basetype_path, decl) *** 4043,4054 **** else cp_error_at ("`%+#D' is inaccessible", decl); error ("within this context"); ! return 0; } ! return 1; } /* Perform the conversions in CONVS on the expression EXPR. FN and ARGNUM are used for diagnostics. ARGNUM is zero based, -1 indicates the `this' argument of a method. INNER is nonzero when --- 3851,3890 ---- else cp_error_at ("`%+#D' is inaccessible", decl); error ("within this context"); ! return false; } ! return true; } + /* Initialize a temporary of type TYPE with EXPR. The FLAGS are a + bitwise or of LOOKUP_* values. If any errors are warnings are + generated, set *DIAGNOSTIC_FN to "error" or "warning", + respectively. If no diagnostics are generated, set *DIAGNOSTIC_FN + to NULL. */ + + static tree + build_temp (tree expr, tree type, int flags, + void (**diagnostic_fn)(const char *, ...)) + { + int savew, savee; + + savew = warningcount, savee = errorcount; + expr = build_special_member_call (NULL_TREE, + complete_ctor_identifier, + build_tree_list (NULL_TREE, expr), + TYPE_BINFO (type), + flags); + if (warningcount > savew) + *diagnostic_fn = warning; + else if (errorcount > savee) + *diagnostic_fn = error; + else + *diagnostic_fn = NULL; + return expr; + } + + /* Perform the conversions in CONVS on the expression EXPR. FN and ARGNUM are used for diagnostics. ARGNUM is zero based, -1 indicates the `this' argument of a method. INNER is nonzero when *************** static tree *** 4061,4069 **** convert_like_real (tree convs, tree expr, tree fn, int argnum, int inner, bool issue_conversion_warnings) { - int savew, savee; - tree totype = TREE_TYPE (convs); if (ICS_BAD_FLAG (convs) && TREE_CODE (convs) != USER_CONV --- 3897,3904 ---- convert_like_real (tree convs, tree expr, tree fn, int argnum, int inner, bool issue_conversion_warnings) { tree totype = TREE_TYPE (convs); + void (*diagnostic_fn)(const char *, ...); if (ICS_BAD_FLAG (convs) && TREE_CODE (convs) != USER_CONV *************** convert_like_real (tree convs, tree expr *** 4093,4099 **** if (issue_conversion_warnings) expr = dubious_conversion_warnings ! (totype, expr, "argument", fn, argnum); switch (TREE_CODE (convs)) { case USER_CONV: --- 3928,3934 ---- if (issue_conversion_warnings) expr = dubious_conversion_warnings ! (totype, expr, "converting", fn, argnum); switch (TREE_CODE (convs)) { case USER_CONV: *************** convert_like_real (tree convs, tree expr *** 4117,4123 **** } else args = build_this (expr); ! expr = build_over_call (cand, args, LOOKUP_NORMAL); /* If this is a constructor or a function returning an aggr type, we need to build up a TARGET_EXPR. */ --- 3952,3958 ---- } else args = build_this (expr); ! expr = build_over_call (cand, LOOKUP_NORMAL); /* If this is a constructor or a function returning an aggr type, we need to build up a TARGET_EXPR. */ *************** convert_like_real (tree convs, tree expr *** 4135,4169 **** if (IS_AGGR_TYPE (totype) && (inner >= 0 || !lvalue_p (expr))) { ! savew = warningcount, savee = errorcount; ! expr = build_special_member_call ! (NULL_TREE, complete_ctor_identifier, ! build_tree_list (NULL_TREE, expr), TYPE_BINFO (totype), ! /* Core issue 84, now a DR, says that we don't allow UDCs ! for these args (which deliberately breaks copy-init of an ! auto_ptr from an auto_ptr). */ ! LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING|LOOKUP_NO_CONVERSION); ! ! /* Tell the user where this failing constructor call came from. */ ! if (fn) { ! if (warningcount > savew) ! warning ! (" initializing argument %P of `%D' from result of `%D'", ! argnum, fn, convfn); ! else if (errorcount > savee) ! error (" initializing argument %P of `%D' from result of `%D'", argnum, fn, convfn); ! } ! else ! { ! if (warningcount > savew) ! warning (" initializing temporary from result of `%D'", ! convfn); ! else if (errorcount > savee) ! error (" initializing temporary from result of `%D'", ! convfn); } expr = build_cplus_new (totype, expr); } --- 3970,3993 ---- if (IS_AGGR_TYPE (totype) && (inner >= 0 || !lvalue_p (expr))) { ! expr = (build_temp ! (expr, totype, ! /* Core issue 84, now a DR, says that we don't ! allow UDCs for these args (which deliberately ! breaks copy-init of an auto_ptr from an ! auto_ptr). */ ! LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING|LOOKUP_NO_CONVERSION, ! &diagnostic_fn)); ! ! if (diagnostic_fn) { ! if (fn) ! diagnostic_fn (" initializing argument %P of `%D' from result of `%D'", argnum, fn, convfn); ! else ! diagnostic_fn ! (" initializing temporary from result of `%D'", convfn); } expr = build_cplus_new (totype, expr); } *************** convert_like_real (tree convs, tree expr *** 4172,4178 **** case IDENTITY_CONV: if (type_unknown_p (expr)) expr = instantiate_type (totype, expr, tf_error | tf_warning); ! return expr; case AMBIG_CONV: /* Call build_user_type_conversion again for the error. */ return build_user_type_conversion --- 3996,4015 ---- case IDENTITY_CONV: if (type_unknown_p (expr)) expr = instantiate_type (totype, expr, tf_error | tf_warning); ! /* Convert a non-array constant variable to its underlying ! value, unless we are about to bind it to a reference, in ! which case we need to leave it as an lvalue. */ ! if (inner >= 0 ! && TREE_CODE (TREE_TYPE (expr)) != ARRAY_TYPE) ! expr = decl_constant_value (expr); ! if (CHECK_COPY_CONSTRUCTOR_P (convs)) ! /* Generate a temporary copy purely to generate the required ! diagnostics. */ ! build_temp ! (build_dummy_object ! (build_qualified_type (totype, TYPE_QUAL_CONST)), ! totype, LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING, &diagnostic_fn); ! return expr; case AMBIG_CONV: /* Call build_user_type_conversion again for the error. */ return build_user_type_conversion *************** convert_like_real (tree convs, tree expr *** 4188,4216 **** if (expr == error_mark_node) return error_mark_node; - /* Convert a non-array constant variable to its underlying value, unless we - are about to bind it to a reference, in which case we need to - leave it as an lvalue. */ - if (TREE_CODE (convs) != REF_BIND - && TREE_CODE (TREE_TYPE (expr)) != ARRAY_TYPE) - expr = decl_constant_value (expr); - switch (TREE_CODE (convs)) { case RVALUE_CONV: if (! IS_AGGR_TYPE (totype)) return expr; ! /* else fall through */ case BASE_CONV: if (TREE_CODE (convs) == BASE_CONV && !NEED_TEMPORARY_P (convs)) { /* We are going to bind a reference directly to a base-class subobject of EXPR. */ ! tree base_ptr = build_pointer_type (totype); ! /* Build an expression for `*((base*) &expr)'. */ expr = build_unary_op (ADDR_EXPR, expr, 0); ! expr = perform_implicit_conversion (base_ptr, expr); expr = build_indirect_ref (expr, "implicit conversion"); return expr; } --- 4025,4052 ---- if (expr == error_mark_node) return error_mark_node; switch (TREE_CODE (convs)) { case RVALUE_CONV: if (! IS_AGGR_TYPE (totype)) return expr; ! /* Else fall through. */ case BASE_CONV: if (TREE_CODE (convs) == BASE_CONV && !NEED_TEMPORARY_P (convs)) { /* We are going to bind a reference directly to a base-class subobject of EXPR. */ ! if (CHECK_COPY_CONSTRUCTOR_P (convs)) ! /* Generate a temporary copy purely to generate the required ! diagnostics. */ ! build_temp (build_dummy_object (TREE_TYPE (expr)), ! TREE_TYPE (expr), ! LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING, ! &diagnostic_fn); /* Build an expression for `*((base*) &expr)'. */ expr = build_unary_op (ADDR_EXPR, expr, 0); ! expr = perform_implicit_conversion (build_pointer_type (totype), ! expr); expr = build_indirect_ref (expr, "implicit conversion"); return expr; } *************** convert_like_real (tree convs, tree expr *** 4218,4235 **** /* Copy-initialization where the cv-unqualified version of the source type is the same class as, or a derived class of, the class of the destination [is treated as direct-initialization]. [dcl.init] */ ! savew = warningcount, savee = errorcount; ! expr = build_special_member_call (NULL_TREE, complete_ctor_identifier, ! build_tree_list (NULL_TREE, expr), ! TYPE_BINFO (totype), ! LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING); ! if (fn) ! { ! if (warningcount > savew) ! warning (" initializing argument %P of `%D'", argnum, fn); ! else if (errorcount > savee) ! error (" initializing argument %P of `%D'", argnum, fn); ! } return build_cplus_new (totype, expr); case REF_BIND: --- 4054,4063 ---- /* Copy-initialization where the cv-unqualified version of the source type is the same class as, or a derived class of, the class of the destination [is treated as direct-initialization]. [dcl.init] */ ! expr = build_temp (expr, totype, LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING, ! &diagnostic_fn); ! if (diagnostic_fn && fn) ! diagnostic_fn (" initializing argument %P of `%D'", argnum, fn); return build_cplus_new (totype, expr); case REF_BIND: *************** convert_like_real (tree convs, tree expr *** 4237,4245 **** tree ref_type = totype; /* If necessary, create a temporary. */ ! if (NEED_TEMPORARY_P (convs) || !non_cast_lvalue_p (expr)) { tree type = TREE_TYPE (TREE_OPERAND (convs, 0)); expr = build_target_expr_with_type (expr, type); } --- 4065,4090 ---- tree ref_type = totype; /* If necessary, create a temporary. */ ! if (NEED_TEMPORARY_P (convs) || !lvalue_p (expr)) { tree type = TREE_TYPE (TREE_OPERAND (convs, 0)); + + if (!CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (ref_type))) + { + /* If the reference is volatile or non-const, we + cannot create a temporary. */ + cp_lvalue_kind lvalue = real_lvalue_p (expr); + + if (lvalue & clk_bitfield) + error ("cannot bind bitfield `%E' to `%T'", + expr, ref_type); + else if (lvalue & clk_packed) + error ("cannot bind packed field `%E' to `%T'", + expr, ref_type); + else + error ("cannot bind rvalue `%E' to `%T'", expr, ref_type); + return error_mark_node; + } expr = build_target_expr_with_type (expr, type); } *************** convert_like_real (tree convs, tree expr *** 4273,4327 **** LOOKUP_NORMAL|LOOKUP_NO_CONVERSION); } ! /* Build a call to __builtin_trap which can be used in an expression. */ static tree ! call_builtin_trap () { ! tree fn = get_identifier ("__builtin_trap"); ! if (IDENTIFIER_GLOBAL_VALUE (fn)) ! fn = IDENTIFIER_GLOBAL_VALUE (fn); ! else ! abort (); fn = build_call (fn, NULL_TREE); ! fn = build (COMPOUND_EXPR, integer_type_node, fn, integer_zero_node); return fn; } /* ARG is being passed to a varargs function. Perform any conversions ! required. Array/function to pointer decay must have already happened. ! Return the converted value. */ tree ! convert_arg_to_ellipsis (arg) ! tree arg; { if (TREE_CODE (TREE_TYPE (arg)) == REAL_TYPE && (TYPE_PRECISION (TREE_TYPE (arg)) < TYPE_PRECISION (double_type_node))) ! /* Convert `float' to `double'. */ ! arg = cp_convert (double_type_node, arg); ! else ! /* Convert `short' and `char' to full-size `int'. */ ! arg = default_conversion (arg); arg = require_complete_type (arg); ! if (arg != error_mark_node ! && !pod_type_p (TREE_TYPE (arg))) ! { ! /* Undefined behavior [expr.call] 5.2.2/7. We used to just warn ! here and do a bitwise copy, but now cp_expr_size will abort if we ! try to do that. ! If the call appears in the context of a sizeof expression, ! there is no need to emit a warning, since the expression won't be ! evaluated. We keep the builtin_trap just as a safety check. */ ! if (!skip_evaluation) ! warning ("cannot pass objects of non-POD type `%#T' through `...'; " ! "call will abort at runtime", TREE_TYPE (arg)); ! arg = call_builtin_trap (); ! } return arg; } --- 4118,4179 ---- LOOKUP_NORMAL|LOOKUP_NO_CONVERSION); } ! /* Build a call to __builtin_trap which can be used as an expression of ! type TYPE. */ static tree ! call_builtin_trap (tree type) { ! tree fn = IDENTIFIER_GLOBAL_VALUE (get_identifier ("__builtin_trap")); + my_friendly_assert (fn != NULL, 20030927); fn = build_call (fn, NULL_TREE); ! fn = build (COMPOUND_EXPR, type, fn, error_mark_node); ! fn = force_target_expr (type, fn); return fn; } /* ARG is being passed to a varargs function. Perform any conversions ! required. Return the converted value. */ tree ! convert_arg_to_ellipsis (tree arg) { + /* [expr.call] + + The lvalue-to-rvalue, array-to-pointer, and function-to-pointer + standard conversions are performed. */ + arg = decay_conversion (arg); + /* [expr.call] + + If the argument has integral or enumeration type that is subject + to the integral promotions (_conv.prom_), or a floating point + type that is subject to the floating point promotion + (_conv.fpprom_), the value of the argument is converted to the + promoted type before the call. */ if (TREE_CODE (TREE_TYPE (arg)) == REAL_TYPE && (TYPE_PRECISION (TREE_TYPE (arg)) < TYPE_PRECISION (double_type_node))) ! arg = convert_to_real (double_type_node, arg); ! else if (INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (arg))) ! arg = perform_integral_promotions (arg); arg = require_complete_type (arg); ! if (arg != error_mark_node ! && !pod_type_p (TREE_TYPE (arg))) ! { ! /* Undefined behavior [expr.call] 5.2.2/7. We used to just warn ! here and do a bitwise copy, but now cp_expr_size will abort if we ! try to do that. ! If the call appears in the context of a sizeof expression, ! there is no need to emit a warning, since the expression won't be ! evaluated. We keep the builtin_trap just as a safety check. */ ! if (!skip_evaluation) ! warning ("cannot pass objects of non-POD type `%#T' through `...'; " ! "call will abort at runtime", TREE_TYPE (arg)); ! arg = call_builtin_trap (TREE_TYPE (arg)); ! } return arg; } *************** convert_arg_to_ellipsis (arg) *** 4329,4337 **** /* va_arg (EXPR, TYPE) is a builtin. Make sure it is not abused. */ tree ! build_x_va_arg (expr, type) ! tree expr; ! tree type; { if (processing_template_decl) return build_min (VA_ARG_EXPR, type, expr); --- 4181,4187 ---- /* va_arg (EXPR, TYPE) is a builtin. Make sure it is not abused. */ tree ! build_x_va_arg (tree expr, tree type) { if (processing_template_decl) return build_min (VA_ARG_EXPR, type, expr); *************** build_x_va_arg (expr, type) *** 4344,4351 **** if (! pod_type_p (type)) { /* Undefined behavior [expr.call] 5.2.2/7. */ ! warning ("cannot receive objects of non-POD type `%#T' through `...'", ! type); } return build_va_arg (expr, type); --- 4194,4203 ---- if (! pod_type_p (type)) { /* Undefined behavior [expr.call] 5.2.2/7. */ ! warning ("cannot receive objects of non-POD type `%#T' through `...'; \ ! call will abort at runtime", ! type); ! return call_builtin_trap (type); } return build_va_arg (expr, type); *************** build_x_va_arg (expr, type) *** 4356,4371 **** type, or the passed type if there is no change. */ tree ! cxx_type_promotes_to (type) ! tree type; { tree promote; ! if (TREE_CODE (type) == ARRAY_TYPE) ! return build_pointer_type (TREE_TYPE (type)); ! ! if (TREE_CODE (type) == FUNCTION_TYPE) ! return build_pointer_type (type); promote = type_promotes_to (type); if (same_type_p (type, promote)) --- 4208,4220 ---- type, or the passed type if there is no change. */ tree ! cxx_type_promotes_to (tree type) { tree promote; ! /* Perform the array-to-pointer and function-to-pointer ! conversions. */ ! type = type_decays_to (type); promote = type_promotes_to (type); if (same_type_p (type, promote)) *************** cxx_type_promotes_to (type) *** 4379,4408 **** conversions. Return the converted value. */ tree ! convert_default_arg (type, arg, fn, parmnum) ! tree type; ! tree arg; ! tree fn; ! int parmnum; { if (TREE_CODE (arg) == DEFAULT_ARG) { ! /* When processing the default args for a class, we can find that ! there is an ordering constraint, and we call a function who's ! default args have not yet been converted. For instance, ! class A { ! A (int = 0); ! void Foo (A const & = A ()); ! }; ! We must process A::A before A::Foo's default arg can be converted. ! Remember the dependent function, so do_pending_defargs can retry, ! and check loops. */ ! unprocessed_defarg_fn (fn); ! ! /* Don't return error_mark node, as we won't be able to distinguish ! genuine errors from this case, and that would lead to repeated ! diagnostics. Just make something of the right type. */ ! return build1 (NOP_EXPR, type, integer_zero_node); } if (fn && DECL_TEMPLATE_INFO (fn)) --- 4228,4243 ---- conversions. Return the converted value. */ tree ! convert_default_arg (tree type, tree arg, tree fn, int parmnum) { + /* If the ARG is an unparsed default argument expression, the + conversion cannot be performed. */ if (TREE_CODE (arg) == DEFAULT_ARG) { ! error ("the default argument for parameter %d of `%D' has " ! "not yet been parsed", ! parmnum, fn); ! return error_mark_node; } if (fn && DECL_TEMPLATE_INFO (fn)) *************** convert_default_arg (type, arg, fn, parm *** 4434,4448 **** type TYPE. */ tree ! type_passed_as (type) ! tree type; { /* Pass classes with copy ctors by invisible reference. */ if (TREE_ADDRESSABLE (type)) type = build_reference_type (type); else if (PROMOTE_PROTOTYPES && INTEGRAL_TYPE_P (type) ! && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)) type = integer_type_node; return type; --- 4269,4284 ---- type TYPE. */ tree ! type_passed_as (tree type) { /* Pass classes with copy ctors by invisible reference. */ if (TREE_ADDRESSABLE (type)) type = build_reference_type (type); else if (PROMOTE_PROTOTYPES && INTEGRAL_TYPE_P (type) ! && COMPLETE_TYPE_P (type) ! && INT_CST_LT_UNSIGNED (TYPE_SIZE (type), ! TYPE_SIZE (integer_type_node))) type = integer_type_node; return type; *************** type_passed_as (type) *** 4451,4458 **** /* Actually perform the appropriate conversion. */ tree ! convert_for_arg_passing (type, val) ! tree type, val; { if (val == error_mark_node) ; --- 4287,4293 ---- /* Actually perform the appropriate conversion. */ tree ! convert_for_arg_passing (tree type, tree val) { if (val == error_mark_node) ; *************** convert_for_arg_passing (type, val) *** 4461,4483 **** val = build1 (ADDR_EXPR, build_reference_type (type), val); else if (PROMOTE_PROTOTYPES && INTEGRAL_TYPE_P (type) ! && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)) ! val = default_conversion (val); return val; } /* Subroutine of the various build_*_call functions. Overload resolution has chosen a winning candidate CAND; build up a CALL_EXPR accordingly. ARGS is a TREE_LIST of the unconverted arguments to the call. FLAGS is a bitmask of various LOOKUP_* flags which apply to the call itself. */ static tree ! build_over_call (cand, args, flags) ! struct z_candidate *cand; ! tree args; ! int flags; { tree fn = cand->fn; tree convs = cand->convs; tree converted_args = NULL_TREE; tree parm = TYPE_ARG_TYPES (TREE_TYPE (fn)); --- 4296,4341 ---- val = build1 (ADDR_EXPR, build_reference_type (type), val); else if (PROMOTE_PROTOTYPES && INTEGRAL_TYPE_P (type) ! && COMPLETE_TYPE_P (type) ! && INT_CST_LT_UNSIGNED (TYPE_SIZE (type), ! TYPE_SIZE (integer_type_node))) ! val = perform_integral_promotions (val); return val; } + /* Returns true iff FN is a function with magic varargs, i.e. ones for + which no conversions at all should be done. This is true for some + builtins which don't act like normal functions. */ + + static bool + magic_varargs_p (tree fn) + { + if (DECL_BUILT_IN (fn)) + switch (DECL_FUNCTION_CODE (fn)) + { + case BUILT_IN_CLASSIFY_TYPE: + case BUILT_IN_CONSTANT_P: + case BUILT_IN_NEXT_ARG: + case BUILT_IN_STDARG_START: + case BUILT_IN_VA_START: + return true; + + default:; + } + + return false; + } + /* Subroutine of the various build_*_call functions. Overload resolution has chosen a winning candidate CAND; build up a CALL_EXPR accordingly. ARGS is a TREE_LIST of the unconverted arguments to the call. FLAGS is a bitmask of various LOOKUP_* flags which apply to the call itself. */ static tree ! build_over_call (struct z_candidate *cand, int flags) { tree fn = cand->fn; + tree args = cand->args; tree convs = cand->convs; tree converted_args = NULL_TREE; tree parm = TYPE_ARG_TYPES (TREE_TYPE (fn)); *************** build_over_call (cand, args, flags) *** 4485,4497 **** int i = 0; int is_method = 0; /* Give any warnings we noticed during overload resolution. */ if (cand->warnings) for (val = cand->warnings; val; val = TREE_CHAIN (val)) joust (cand, WRAPPER_ZC (TREE_VALUE (val)), 1); if (DECL_FUNCTION_MEMBER_P (fn)) ! enforce_access (cand->access_path, fn); if (args && TREE_CODE (args) != TREE_LIST) args = build_tree_list (NULL_TREE, args); --- 4343,4402 ---- int i = 0; int is_method = 0; + /* In a template, there is no need to perform all of the work that + is normally done. We are only interested in the type of the call + expression, i.e., the return type of the function. Any semantic + errors will be deferred until the template is instantiated. */ + if (processing_template_decl) + { + tree expr; + tree return_type; + return_type = TREE_TYPE (TREE_TYPE (fn)); + expr = build (CALL_EXPR, return_type, fn, args); + if (!VOID_TYPE_P (return_type)) + require_complete_type (return_type); + return convert_from_reference (expr); + } + /* Give any warnings we noticed during overload resolution. */ if (cand->warnings) for (val = cand->warnings; val; val = TREE_CHAIN (val)) joust (cand, WRAPPER_ZC (TREE_VALUE (val)), 1); if (DECL_FUNCTION_MEMBER_P (fn)) ! { ! /* If FN is a template function, two cases must be considered. ! For example: ! ! struct A { ! protected: ! template void f(); ! }; ! template struct B { ! protected: ! void g(); ! }; ! struct C : A, B { ! using A::f; // #1 ! using B::g; // #2 ! }; ! ! In case #1 where `A::f' is a member template, DECL_ACCESS is ! recorded in the primary template but not in its specialization. ! We check access of FN using its primary template. ! ! In case #2, where `B::g' has a DECL_TEMPLATE_INFO simply ! because it is a member of class template B, DECL_ACCESS is ! recorded in the specialization `B::g'. We cannot use its ! primary template because `B::g' and `B::g' may have ! different access. */ ! if (DECL_TEMPLATE_INFO (fn) ! && is_member_template (DECL_TI_TEMPLATE (fn))) ! perform_or_defer_access_check (cand->access_path, ! DECL_TI_TEMPLATE (fn)); ! else ! perform_or_defer_access_check (cand->access_path, fn); ! } if (args && TREE_CODE (args) != TREE_LIST) args = build_tree_list (NULL_TREE, args); *************** build_over_call (cand, args, flags) *** 4585,4594 **** /* Ellipsis */ for (; arg; arg = TREE_CHAIN (arg)) ! converted_args ! = tree_cons (NULL_TREE, ! convert_arg_to_ellipsis (TREE_VALUE (arg)), ! converted_args); converted_args = nreverse (converted_args); --- 4490,4503 ---- /* Ellipsis */ for (; arg; arg = TREE_CHAIN (arg)) ! { ! tree a = TREE_VALUE (arg); ! if (magic_varargs_p (fn)) ! /* Do no conversions for magic varargs. */; ! else ! a = convert_arg_to_ellipsis (a); ! converted_args = tree_cons (NULL_TREE, a, converted_args); ! } converted_args = nreverse (converted_args); *************** build_over_call (cand, args, flags) *** 4649,4664 **** else if (TREE_CODE (arg) == TARGET_EXPR || TYPE_HAS_TRIVIAL_INIT_REF (DECL_CONTEXT (fn))) { - tree address; tree to = stabilize_reference (build_indirect_ref (TREE_VALUE (args), 0)); val = build (INIT_EXPR, DECL_CONTEXT (fn), to, arg); ! address = build_unary_op (ADDR_EXPR, val, 0); ! /* Avoid a warning about this expression, if the address is ! never used. */ ! TREE_USED (address) = 1; ! return address; } } else if (DECL_OVERLOADED_OPERATOR_P (fn) == NOP_EXPR --- 4558,4568 ---- else if (TREE_CODE (arg) == TARGET_EXPR || TYPE_HAS_TRIVIAL_INIT_REF (DECL_CONTEXT (fn))) { tree to = stabilize_reference (build_indirect_ref (TREE_VALUE (args), 0)); val = build (INIT_EXPR, DECL_CONTEXT (fn), to, arg); ! return val; } } else if (DECL_OVERLOADED_OPERATOR_P (fn) == NOP_EXPR *************** build_over_call (cand, args, flags) *** 4667,4675 **** { tree to = stabilize_reference (build_indirect_ref (TREE_VALUE (converted_args), 0)); arg = build_indirect_ref (TREE_VALUE (TREE_CHAIN (converted_args)), 0); ! val = build (MODIFY_EXPR, TREE_TYPE (to), to, arg); return val; } --- 4571,4606 ---- { tree to = stabilize_reference (build_indirect_ref (TREE_VALUE (converted_args), 0)); + tree type = TREE_TYPE (to); + tree as_base = CLASSTYPE_AS_BASE (type); arg = build_indirect_ref (TREE_VALUE (TREE_CHAIN (converted_args)), 0); ! if (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (as_base))) ! val = build (MODIFY_EXPR, TREE_TYPE (to), to, arg); ! else ! { ! /* We must only copy the non-tail padding parts. Use ! CLASSTYPE_AS_BASE for the bitwise copy. */ ! tree to_ptr, arg_ptr, to_as_base, arg_as_base, base_ptr_type; ! tree save_to; ! ! to_ptr = save_expr (build_unary_op (ADDR_EXPR, to, 0)); ! arg_ptr = build_unary_op (ADDR_EXPR, arg, 0); ! ! base_ptr_type = build_pointer_type (as_base); ! to_as_base = build_nop (base_ptr_type, to_ptr); ! to_as_base = build_indirect_ref (to_as_base, 0); ! arg_as_base = build_nop (base_ptr_type, arg_ptr); ! arg_as_base = build_indirect_ref (arg_as_base, 0); ! ! save_to = build_indirect_ref (to_ptr, 0); ! ! val = build (MODIFY_EXPR, as_base, to_as_base, arg_as_base); ! val = convert_to_void (val, NULL); ! val = build (COMPOUND_EXPR, type, val, save_to); ! TREE_NO_UNUSED_WARNING (val) = 1; ! } ! return val; } *************** static GTY(()) tree java_iface_lookup_fn *** 4756,4763 **** _Jv_LookupInterfaceMethodIdx(). */ static tree ! build_java_interface_fn_ref (fn, instance) ! tree fn, instance; { tree lookup_args, lookup_fn, method, idx; tree klass_ref, iface, iface_ref; --- 4687,4693 ---- _Jv_LookupInterfaceMethodIdx(). */ static tree ! build_java_interface_fn_ref (tree fn, tree instance) { tree lookup_args, lookup_fn, method, idx; tree klass_ref, iface, iface_ref; *************** build_java_interface_fn_ref (fn, instanc *** 4783,4789 **** /* Get the java.lang.Class pointer for the interface being called. */ iface = DECL_CONTEXT (fn); ! iface_ref = lookup_field (iface, get_identifier ("class$"), 0, 0); if (!iface_ref || TREE_CODE (iface_ref) != VAR_DECL || DECL_CONTEXT (iface_ref) != iface) { --- 4713,4719 ---- /* Get the java.lang.Class pointer for the interface being called. */ iface = DECL_CONTEXT (fn); ! iface_ref = lookup_field (iface, get_identifier ("class$"), 0, false); if (!iface_ref || TREE_CODE (iface_ref) != VAR_DECL || DECL_CONTEXT (iface_ref) != iface) { *************** build_java_interface_fn_ref (fn, instanc *** 4818,4825 **** call to a function with the indicated NAME. */ tree ! in_charge_arg_for_name (name) ! tree name; { if (name == base_ctor_identifier || name == base_dtor_identifier) --- 4748,4754 ---- call to a function with the indicated NAME. */ tree ! in_charge_arg_for_name (tree name) { if (name == base_ctor_identifier || name == base_dtor_identifier) *************** build_special_member_call (tree instance *** 4929,4936 **** current_in_charge_parm, integer_zero_node), current_vtt_parm, vtt); - if (TREE_VIA_VIRTUAL (binfo)) - binfo = binfo_for_vbase (class_type, current_class_type); my_friendly_assert (BINFO_SUBVTT_INDEX (binfo), 20010110); sub_vtt = build (PLUS_EXPR, TREE_TYPE (vtt), vtt, BINFO_SUBVTT_INDEX (binfo)); --- 4858,4863 ---- *************** build_special_member_call (tree instance *** 4943,4948 **** --- 4870,4920 ---- flags); } + /* Return the NAME, as a C string. The NAME indicates a function that + is a member of TYPE. *FREE_P is set to true if the caller must + free the memory returned. + + Rather than go through all of this, we should simply set the names + of constructors and destructors appropriately, and dispense with + ctor_identifier, dtor_identifier, etc. */ + + static char * + name_as_c_string (tree name, tree type, bool *free_p) + { + char *pretty_name; + + /* Assume that we will not allocate memory. */ + *free_p = false; + /* Constructors and destructors are special. */ + if (IDENTIFIER_CTOR_OR_DTOR_P (name)) + { + pretty_name + = (char *) IDENTIFIER_POINTER (constructor_name (type)); + /* For a destructor, add the '~'. */ + if (name == complete_dtor_identifier + || name == base_dtor_identifier + || name == deleting_dtor_identifier) + { + pretty_name = concat ("~", pretty_name, NULL); + /* Remember that we need to free the memory allocated. */ + *free_p = true; + } + } + else if (IDENTIFIER_TYPENAME_P (name)) + { + pretty_name = concat ("operator ", + type_as_string (TREE_TYPE (name), + TFF_PLAIN_IDENTIFIER), + NULL); + /* Remember that we need to free the memory allocated. */ + *free_p = true; + } + else + pretty_name = (char *) IDENTIFIER_POINTER (name); + + return pretty_name; + } + /* Build a call to "INSTANCE.FN (ARGS)". */ tree *************** build_new_method_call (tree instance, tr *** 4955,4979 **** tree access_binfo; tree optype; tree mem_args = NULL_TREE, instance_ptr; ! tree name, pretty_name; tree user_args; tree call; int template_only = 0; my_friendly_assert (instance != NULL_TREE, 20020729); ! if (instance == error_mark_node || fns == error_mark_node || args == error_mark_node) return error_mark_node; /* Process the argument list. */ user_args = args; args = resolve_args (args); if (args == error_mark_node) return error_mark_node; - if (TREE_CODE (instance) == OFFSET_REF) - instance = resolve_offset_ref (instance); if (TREE_CODE (TREE_TYPE (instance)) == REFERENCE_TYPE) instance = convert_from_reference (instance); basetype = TYPE_MAIN_VARIANT (TREE_TYPE (instance)); --- 4927,4970 ---- tree access_binfo; tree optype; tree mem_args = NULL_TREE, instance_ptr; ! tree name; tree user_args; tree call; + tree fn; + tree class_type; int template_only = 0; + bool any_viable_p; + tree orig_instance; + tree orig_fns; + tree orig_args; my_friendly_assert (instance != NULL_TREE, 20020729); ! if (error_operand_p (instance) ! || error_operand_p (fns) || args == error_mark_node) return error_mark_node; + orig_instance = instance; + orig_fns = fns; + orig_args = args; + + if (processing_template_decl) + { + instance = build_non_dependent_expr (instance); + if (!BASELINK_P (fns) + && TREE_CODE (fns) != PSEUDO_DTOR_EXPR + && TREE_TYPE (fns) != unknown_type_node) + fns = build_non_dependent_expr (fns); + args = build_non_dependent_args (orig_args); + } + /* Process the argument list. */ user_args = args; args = resolve_args (args); if (args == error_mark_node) return error_mark_node; if (TREE_CODE (TREE_TYPE (instance)) == REFERENCE_TYPE) instance = convert_from_reference (instance); basetype = TYPE_MAIN_VARIANT (TREE_TYPE (instance)); *************** build_new_method_call (tree instance, tr *** 4981,4989 **** if (!BASELINK_P (fns)) { - call = build_field_call (instance_ptr, fns, args); - if (call) - return call; error ("call to non-function `%D'", fns); return error_mark_node; } --- 4972,4977 ---- *************** build_new_method_call (tree instance, tr *** 5016,5022 **** return error_mark_node; } ! name = DECL_NAME (get_first_fn (fns)); if (IDENTIFIER_CTOR_OR_DTOR_P (name)) { --- 5004,5011 ---- return error_mark_node; } ! fn = get_first_fn (fns); ! name = DECL_NAME (fn); if (IDENTIFIER_CTOR_OR_DTOR_P (name)) { *************** build_new_method_call (tree instance, tr *** 5025,5084 **** my_friendly_assert (name != ctor_identifier, 20000408); /* Similarly for destructors. */ my_friendly_assert (name != dtor_identifier, 20000408); - - if (name == complete_ctor_identifier - || name == base_ctor_identifier) - pretty_name = constructor_name (basetype); - else - pretty_name = dtor_identifier; } - else - pretty_name = name; ! if (fns) { ! tree fn; ! tree class_type = (conversion_path ! ? BINFO_TYPE (conversion_path) ! : NULL_TREE); ! mem_args = tree_cons (NULL_TREE, instance_ptr, args); ! for (fn = fns; fn; fn = OVL_NEXT (fn)) ! { ! tree t = OVL_CURRENT (fn); ! tree this_arglist; ! /* We can end up here for copy-init of same or base class. */ ! if ((flags & LOOKUP_ONLYCONVERTING) ! && DECL_NONCONVERTING_P (t)) ! continue; ! if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t)) ! this_arglist = mem_args; ! else ! this_arglist = args; ! if (TREE_CODE (t) == TEMPLATE_DECL) ! /* A member template. */ ! add_template_candidate (&candidates, t, ! class_type, ! explicit_targs, ! this_arglist, optype, ! access_binfo, ! conversion_path, ! flags, ! DEDUCE_CALL); ! else if (! template_only) ! add_function_candidate (&candidates, t, ! class_type, ! this_arglist, ! access_binfo, ! conversion_path, ! flags); ! } } ! if (! any_viable (candidates)) { /* XXX will LOOKUP_SPECULATIVELY be needed when this is done? */ if (flags & LOOKUP_SPECULATIVELY) --- 5014,5069 ---- my_friendly_assert (name != ctor_identifier, 20000408); /* Similarly for destructors. */ my_friendly_assert (name != dtor_identifier, 20000408); } ! /* It's OK to call destructors on cv-qualified objects. Therefore, ! convert the INSTANCE_PTR to the unqualified type, if necessary. */ ! if (DECL_DESTRUCTOR_P (fn)) { ! tree type = build_pointer_type (basetype); ! if (!same_type_p (type, TREE_TYPE (instance_ptr))) ! instance_ptr = build_nop (type, instance_ptr); ! } ! class_type = (conversion_path ? BINFO_TYPE (conversion_path) : NULL_TREE); ! mem_args = tree_cons (NULL_TREE, instance_ptr, args); ! for (fn = fns; fn; fn = OVL_NEXT (fn)) ! { ! tree t = OVL_CURRENT (fn); ! tree this_arglist; ! /* We can end up here for copy-init of same or base class. */ ! if ((flags & LOOKUP_ONLYCONVERTING) ! && DECL_NONCONVERTING_P (t)) ! continue; ! if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t)) ! this_arglist = mem_args; ! else ! this_arglist = args; ! ! if (TREE_CODE (t) == TEMPLATE_DECL) ! /* A member template. */ ! add_template_candidate (&candidates, t, ! class_type, ! explicit_targs, ! this_arglist, optype, ! access_binfo, ! conversion_path, ! flags, ! DEDUCE_CALL); ! else if (! template_only) ! add_function_candidate (&candidates, t, ! class_type, ! this_arglist, ! access_binfo, ! conversion_path, ! flags); } ! candidates = splice_viable (candidates, pedantic, &any_viable_p); ! if (!any_viable_p) { /* XXX will LOOKUP_SPECULATIVELY be needed when this is done? */ if (flags & LOOKUP_SPECULATIVELY) *************** build_new_method_call (tree instance, tr *** 5086,5105 **** if (!COMPLETE_TYPE_P (basetype)) cxx_incomplete_type_error (instance_ptr, basetype); else ! error ("no matching function for call to `%T::%D(%A)%#V'", ! basetype, pretty_name, user_args, ! TREE_TYPE (TREE_TYPE (instance_ptr))); print_z_candidates (candidates); return error_mark_node; } - candidates = splice_viable (candidates); - cand = tourney (candidates); if (cand == 0) { ! error ("call of overloaded `%D(%A)' is ambiguous", pretty_name, ! user_args); print_z_candidates (candidates); return error_mark_node; } --- 5071,5103 ---- if (!COMPLETE_TYPE_P (basetype)) cxx_incomplete_type_error (instance_ptr, basetype); else ! { ! char *pretty_name; ! bool free_p; ! ! pretty_name = name_as_c_string (name, basetype, &free_p); ! error ("no matching function for call to `%T::%s(%A)%#V'", ! basetype, pretty_name, user_args, ! TREE_TYPE (TREE_TYPE (instance_ptr))); ! if (free_p) ! free (pretty_name); ! } print_z_candidates (candidates); return error_mark_node; } + cand = tourney (candidates); if (cand == 0) { ! char *pretty_name; ! bool free_p; ! ! pretty_name = name_as_c_string (name, basetype, &free_p); ! error ("call of overloaded `%s(%A)' is ambiguous", pretty_name, ! user_args); print_z_candidates (candidates); + if (free_p) + free (pretty_name); return error_mark_node; } *************** build_new_method_call (tree instance, tr *** 5125,5149 **** flags |= LOOKUP_NONVIRTUAL; if (TREE_CODE (TREE_TYPE (cand->fn)) == METHOD_TYPE) ! call = build_over_call (cand, mem_args, flags); else { ! call = build_over_call (cand, args, flags); /* In an expression of the form `a->f()' where `f' turns out to be a static member function, `a' is none-the-less evaluated. */ ! if (instance && TREE_SIDE_EFFECTS (instance)) call = build (COMPOUND_EXPR, TREE_TYPE (call), instance, call); } ! return call; } ! /* Returns nonzero iff standard conversion sequence ICS1 is a proper subsequence of ICS2. */ ! static int ! is_subseq (ics1, ics2) ! tree ics1, ics2; { /* We can assume that a conversion of the same code between the same types indicates a subsequence since we only get --- 5123,5151 ---- flags |= LOOKUP_NONVIRTUAL; if (TREE_CODE (TREE_TYPE (cand->fn)) == METHOD_TYPE) ! call = build_over_call (cand, flags); else { ! call = build_over_call (cand, flags); /* In an expression of the form `a->f()' where `f' turns out to be a static member function, `a' is none-the-less evaluated. */ ! if (!is_dummy_object (instance_ptr) && TREE_SIDE_EFFECTS (instance)) call = build (COMPOUND_EXPR, TREE_TYPE (call), instance, call); } ! ! if (processing_template_decl && call != error_mark_node) ! return build_min_non_dep ! (CALL_EXPR, call, ! build_min_nt (COMPONENT_REF, orig_instance, orig_fns), ! orig_args); return call; } ! /* Returns true iff standard conversion sequence ICS1 is a proper subsequence of ICS2. */ ! static bool ! is_subseq (tree ics1, tree ics2) { /* We can assume that a conversion of the same code between the same types indicates a subsequence since we only get *************** is_subseq (ics1, ics2) *** 5166,5172 **** ICS2. We can get a USER_CONV when we are comparing the second standard conversion sequence of two user conversion sequences. */ ! return 0; ics2 = TREE_OPERAND (ics2, 0); --- 5168,5174 ---- ICS2. We can get a USER_CONV when we are comparing the second standard conversion sequence of two user conversion sequences. */ ! return false; ics2 = TREE_OPERAND (ics2, 0); *************** is_subseq (ics1, ics2) *** 5174,5194 **** && same_type_p (TREE_TYPE (ics2), TREE_TYPE (ics1)) && same_type_p (TREE_TYPE (TREE_OPERAND (ics2, 0)), TREE_TYPE (TREE_OPERAND (ics1, 0)))) ! return 1; } } /* Returns nonzero iff DERIVED is derived from BASE. The inputs may be any _TYPE nodes. */ ! int ! is_properly_derived_from (derived, base) ! tree derived; ! tree base; { if (!IS_AGGR_TYPE_CODE (TREE_CODE (derived)) || !IS_AGGR_TYPE_CODE (TREE_CODE (base))) ! return 0; /* We only allow proper derivation here. The DERIVED_FROM_P macro considers every class derived from itself. */ --- 5176,5194 ---- && same_type_p (TREE_TYPE (ics2), TREE_TYPE (ics1)) && same_type_p (TREE_TYPE (TREE_OPERAND (ics2, 0)), TREE_TYPE (TREE_OPERAND (ics1, 0)))) ! return true; } } /* Returns nonzero iff DERIVED is derived from BASE. The inputs may be any _TYPE nodes. */ ! bool ! is_properly_derived_from (tree derived, tree base) { if (!IS_AGGR_TYPE_CODE (TREE_CODE (derived)) || !IS_AGGR_TYPE_CODE (TREE_CODE (base))) ! return false; /* We only allow proper derivation here. The DERIVED_FROM_P macro considers every class derived from itself. */ *************** is_properly_derived_from (derived, base) *** 5203,5210 **** modify it accordingly. */ static void ! maybe_handle_implicit_object (ics) ! tree* ics; { if (ICS_THIS_FLAG (*ics)) { --- 5203,5209 ---- modify it accordingly. */ static void ! maybe_handle_implicit_object (tree *ics) { if (ICS_THIS_FLAG (*ics)) { *************** maybe_handle_implicit_object (ics) *** 5219,5225 **** tree reference_type; /* The `this' parameter is a pointer to a class type. Make the ! implict conversion talk about a reference to that same class type. */ reference_type = TREE_TYPE (TREE_TYPE (*ics)); reference_type = build_reference_type (reference_type); --- 5218,5224 ---- tree reference_type; /* The `this' parameter is a pointer to a class type. Make the ! implicit conversion talk about a reference to that same class type. */ reference_type = TREE_TYPE (TREE_TYPE (*ics)); reference_type = build_reference_type (reference_type); *************** maybe_handle_implicit_object (ics) *** 5239,5246 **** leave *ICS unchanged and return NULL_TREE. */ static tree ! maybe_handle_ref_bind (ics) ! tree* ics; { if (TREE_CODE (*ics) == REF_BIND) { --- 5238,5244 ---- leave *ICS unchanged and return NULL_TREE. */ static tree ! maybe_handle_ref_bind (tree *ics) { if (TREE_CODE (*ics) == REF_BIND) { *************** maybe_handle_ref_bind (ics) *** 5263,5270 **** 0: ics1 and ics2 are indistinguishable */ static int ! compare_ics (ics1, ics2) ! tree ics1, ics2; { tree from_type1; tree from_type2; --- 5261,5267 ---- 0: ics1 and ics2 are indistinguishable */ static int ! compare_ics (tree ics1, tree ics2) { tree from_type1; tree from_type2; *************** compare_ics (ics1, ics2) *** 5314,5320 **** { /* XXX Isn't this an extension? */ /* Both ICS are bad. We try to make a decision based on what ! would have happenned if they'd been good. */ if (ICS_USER_FLAG (ics1) > ICS_USER_FLAG (ics2) || ICS_STD_RANK (ics1) > ICS_STD_RANK (ics2)) return -1; --- 5311,5317 ---- { /* XXX Isn't this an extension? */ /* Both ICS are bad. We try to make a decision based on what ! would have happened if they'd been good. */ if (ICS_USER_FLAG (ics1) > ICS_USER_FLAG (ics2) || ICS_STD_RANK (ics1) > ICS_STD_RANK (ics2)) return -1; *************** compare_ics (ics1, ics2) *** 5434,5458 **** for pointers A*, except opposite: if B is derived from A then A::* converts to B::*, not vice versa. For that reason, we switch the from_ and to_ variables here. */ ! else if (TYPE_PTRMEM_P (from_type1) ! && TYPE_PTRMEM_P (from_type2) ! && TYPE_PTRMEM_P (to_type1) ! && TYPE_PTRMEM_P (to_type2)) ! { ! deref_to_type1 = TYPE_OFFSET_BASETYPE (TREE_TYPE (from_type1)); ! deref_to_type2 = TYPE_OFFSET_BASETYPE (TREE_TYPE (from_type2)); ! deref_from_type1 = TYPE_OFFSET_BASETYPE (TREE_TYPE (to_type1)); ! deref_from_type2 = TYPE_OFFSET_BASETYPE (TREE_TYPE (to_type2)); ! } ! else if (TYPE_PTRMEMFUNC_P (from_type1) ! && TYPE_PTRMEMFUNC_P (from_type2) ! && TYPE_PTRMEMFUNC_P (to_type1) ! && TYPE_PTRMEMFUNC_P (to_type2)) { ! deref_to_type1 = TYPE_PTRMEMFUNC_OBJECT_TYPE (from_type1); ! deref_to_type2 = TYPE_PTRMEMFUNC_OBJECT_TYPE (from_type2); ! deref_from_type1 = TYPE_PTRMEMFUNC_OBJECT_TYPE (to_type1); ! deref_from_type2 = TYPE_PTRMEMFUNC_OBJECT_TYPE (to_type2); } if (deref_from_type1 != NULL_TREE --- 5431,5447 ---- for pointers A*, except opposite: if B is derived from A then A::* converts to B::*, not vice versa. For that reason, we switch the from_ and to_ variables here. */ ! else if ((TYPE_PTRMEM_P (from_type1) && TYPE_PTRMEM_P (from_type2) ! && TYPE_PTRMEM_P (to_type1) && TYPE_PTRMEM_P (to_type2)) ! || (TYPE_PTRMEMFUNC_P (from_type1) ! && TYPE_PTRMEMFUNC_P (from_type2) ! && TYPE_PTRMEMFUNC_P (to_type1) ! && TYPE_PTRMEMFUNC_P (to_type2))) { ! deref_to_type1 = TYPE_PTRMEM_CLASS_TYPE (from_type1); ! deref_to_type2 = TYPE_PTRMEM_CLASS_TYPE (from_type2); ! deref_from_type1 = TYPE_PTRMEM_CLASS_TYPE (to_type1); ! deref_from_type2 = TYPE_PTRMEM_CLASS_TYPE (to_type2); } if (deref_from_type1 != NULL_TREE *************** compare_ics (ics1, ics2) *** 5600,5607 **** /* The source type for this standard conversion sequence. */ static tree ! source_type (t) ! tree t; { for (;; t = TREE_OPERAND (t, 0)) { --- 5589,5595 ---- /* The source type for this standard conversion sequence. */ static tree ! source_type (tree t) { for (;; t = TREE_OPERAND (t, 0)) { *************** source_type (t) *** 5618,5625 **** is actually used. */ static void ! add_warning (winner, loser) ! struct z_candidate *winner, *loser; { winner->warnings = tree_cons (NULL_TREE, build_zc_wrapper (loser), --- 5606,5612 ---- is actually used. */ static void ! add_warning (struct z_candidate *winner, struct z_candidate *loser) { winner->warnings = tree_cons (NULL_TREE, build_zc_wrapper (loser), *************** add_warning (winner, loser) *** 5634,5642 **** 0: cand1 and cand2 are indistinguishable */ static int ! joust (cand1, cand2, warn) ! struct z_candidate *cand1, *cand2; ! int warn; { int winner = 0; int i, off1 = 0, off2 = 0, len; --- 5621,5627 ---- 0: cand1 and cand2 are indistinguishable */ static int ! joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn) { int winner = 0; int i, off1 = 0, off2 = 0, len; *************** joust (cand1, cand2, warn) *** 5734,5778 **** /* warn about confusing overload resolution for user-defined conversions, either between a constructor and a conversion op, or between two conversion ops. */ ! if (winner && cand1->second_conv ! && ((DECL_CONSTRUCTOR_P (cand1->fn) ! != DECL_CONSTRUCTOR_P (cand2->fn)) ! /* Don't warn if the two conv ops convert to the same type... */ ! || (! DECL_CONSTRUCTOR_P (cand1->fn) ! && ! same_type_p (TREE_TYPE (TREE_TYPE (cand1->fn)), ! TREE_TYPE (TREE_TYPE (cand2->fn)))))) { ! int comp = compare_ics (cand1->second_conv, cand2->second_conv); ! if (comp != winner) { ! struct z_candidate *w, *l; ! tree convn; ! if (winner == 1) ! w = cand1, l = cand2; ! else ! w = cand2, l = cand1; ! if (DECL_CONTEXT (cand1->fn) == DECL_CONTEXT (cand2->fn) ! && ! DECL_CONSTRUCTOR_P (cand1->fn) ! && ! DECL_CONSTRUCTOR_P (cand2->fn) ! && (convn = standard_conversion ! (TREE_TYPE (TREE_TYPE (l->fn)), ! TREE_TYPE (TREE_TYPE (w->fn)), NULL_TREE)) ! && TREE_CODE (convn) == QUAL_CONV) ! /* Don't complain about `operator char *()' beating ! `operator const char *() const'. */; ! else if (warn && warn_conversion) { ! tree source = source_type (TREE_VEC_ELT (w->convs, 0)); ! if (! DECL_CONSTRUCTOR_P (w->fn)) ! source = TREE_TYPE (source); ! warning ("choosing `%D' over `%D'", w->fn, l->fn); ! warning (" for conversion from `%T' to `%T'", ! source, TREE_TYPE (w->second_conv)); ! warning (" because conversion sequence for the argument is better"); } ! else ! add_warning (w, l); } } if (winner) --- 5719,5770 ---- /* warn about confusing overload resolution for user-defined conversions, either between a constructor and a conversion op, or between two conversion ops. */ ! if (winner && warn_conversion && cand1->second_conv ! && (!DECL_CONSTRUCTOR_P (cand1->fn) || !DECL_CONSTRUCTOR_P (cand2->fn)) ! && winner != compare_ics (cand1->second_conv, cand2->second_conv)) { ! struct z_candidate *w, *l; ! bool give_warning = false; ! ! if (winner == 1) ! w = cand1, l = cand2; ! else ! w = cand2, l = cand1; ! ! /* We don't want to complain about `X::operator T1 ()' ! beating `X::operator T2 () const', when T2 is a no less ! cv-qualified version of T1. */ ! if (DECL_CONTEXT (w->fn) == DECL_CONTEXT (l->fn) ! && !DECL_CONSTRUCTOR_P (w->fn) && !DECL_CONSTRUCTOR_P (l->fn)) { ! tree t = TREE_TYPE (TREE_TYPE (l->fn)); ! tree f = TREE_TYPE (TREE_TYPE (w->fn)); ! ! if (TREE_CODE (t) == TREE_CODE (f) && POINTER_TYPE_P (t)) { ! t = TREE_TYPE (t); ! f = TREE_TYPE (f); } ! if (!comp_ptr_ttypes (t, f)) ! give_warning = true; ! } ! else ! give_warning = true; ! ! if (!give_warning) ! /*NOP*/; ! else if (warn) ! { ! tree source = source_type (TREE_VEC_ELT (w->convs, 0)); ! if (! DECL_CONSTRUCTOR_P (w->fn)) ! source = TREE_TYPE (source); ! warning ("choosing `%D' over `%D'", w->fn, l->fn); ! warning (" for conversion from `%T' to `%T'", ! source, TREE_TYPE (w->second_conv)); ! warning (" because conversion sequence for the argument is better"); } + else + add_warning (w, l); } if (winner) *************** joust (cand1, cand2, warn) *** 5808,5814 **** TREE_VEC_LENGTH (cand1->convs) - (DECL_NONSTATIC_MEMBER_FUNCTION_P (cand1->fn) - DECL_CONSTRUCTOR_P (cand1->fn))); - /* HERE */ if (winner) return winner; } --- 5800,5805 ---- *************** joust (cand1, cand2, warn) *** 5865,5871 **** if (DECL_P (cand1->fn) && DECL_P (cand2->fn) && equal_functions (cand1->fn, cand2->fn)) return 1; ! tweak: /* Extension: If the worst conversion for one candidate is worse than the --- 5856,5862 ---- if (DECL_P (cand1->fn) && DECL_P (cand2->fn) && equal_functions (cand1->fn, cand2->fn)) return 1; ! tweak: /* Extension: If the worst conversion for one candidate is worse than the *************** tweak: *** 5889,5897 **** if (winner) { if (warn) ! pedwarn ("ISO C++ says that `%D' and `%D' are ambiguous \ ! even though the worst conversion for the former is better than the worst \ ! conversion for the latter", w->fn, l->fn); else add_warning (w, l); return winner; --- 5880,5893 ---- if (winner) { if (warn) ! { ! pedwarn ("\ ! ISO C++ says that these are ambiguous, even \ ! though the worst conversion for the first is better than \ ! the worst conversion for the second:"); ! print_z_candidate (_("candidate 1:"), w); ! print_z_candidate (_("candidate 2:"), l); ! } else add_warning (w, l); return winner; *************** conversion for the latter", w->fn, l->fn *** 5908,5915 **** algorithm. */ static struct z_candidate * ! tourney (candidates) ! struct z_candidate *candidates; { struct z_candidate *champ = candidates, *challenger; int fate; --- 5904,5910 ---- algorithm. */ static struct z_candidate * ! tourney (struct z_candidate *candidates) { struct z_candidate *champ = candidates, *challenger; int fate; *************** tourney (candidates) *** 5960,5977 **** /* Returns nonzero if things of type FROM can be converted to TO. */ ! int ! can_convert (to, from) ! tree to, from; { return can_convert_arg (to, from, NULL_TREE); } /* Returns nonzero if ARG (of type FROM) can be converted to TO. */ ! int ! can_convert_arg (to, from, arg) ! tree to, from, arg; { tree t = implicit_conversion (to, from, arg, LOOKUP_NORMAL); return (t && ! ICS_BAD_FLAG (t)); --- 5955,5970 ---- /* Returns nonzero if things of type FROM can be converted to TO. */ ! bool ! can_convert (tree to, tree from) { return can_convert_arg (to, from, NULL_TREE); } /* Returns nonzero if ARG (of type FROM) can be converted to TO. */ ! bool ! can_convert_arg (tree to, tree from, tree arg) { tree t = implicit_conversion (to, from, arg, LOOKUP_NORMAL); return (t && ! ICS_BAD_FLAG (t)); *************** can_convert_arg (to, from, arg) *** 5979,5990 **** /* Like can_convert_arg, but allows dubious conversions as well. */ ! int ! can_convert_arg_bad (to, from, arg) ! tree to, from, arg; { ! tree t = implicit_conversion (to, from, arg, LOOKUP_NORMAL); ! return !!t; } /* Convert EXPR to TYPE. Return the converted expression. --- 5972,5981 ---- /* Like can_convert_arg, but allows dubious conversions as well. */ ! bool ! can_convert_arg_bad (tree to, tree from, tree arg) { ! return implicit_conversion (to, from, arg, LOOKUP_NORMAL) != 0; } /* Convert EXPR to TYPE. Return the converted expression. *************** can_convert_arg_bad (to, from, arg) *** 5994,6006 **** doing a bad conversion, convert_like will complain. */ tree ! perform_implicit_conversion (type, expr) ! tree type; ! tree expr; { tree conv; ! if (expr == error_mark_node) return error_mark_node; conv = implicit_conversion (type, TREE_TYPE (expr), expr, LOOKUP_NORMAL); --- 5985,5995 ---- doing a bad conversion, convert_like will complain. */ tree ! perform_implicit_conversion (tree type, tree expr) { tree conv; ! if (error_operand_p (expr)) return error_mark_node; conv = implicit_conversion (type, TREE_TYPE (expr), expr, LOOKUP_NORMAL); *************** make_temporary_var_for_ref_to_temp (tree *** 6087,6109 **** return var; } ! /* Convert EXPR to the indicated reference TYPE, in a way suitable ! for initializing a variable of that TYPE. If DECL is non-NULL, ! it is the VAR_DECL being initialized with the EXPR. (In that ! case, the type of DECL will be TYPE.) If DECL is non-NULL, then ! CLEANUP must also be non-NULL, and with *CLEANUP initialized to ! NULL. Upon return, if *CLEANUP is no longer NULL, it will be a ! CLEANUP_STMT that should be inserted after the returned ! expression is used to initialize DECL. ! Return the converted expression. */ tree ! initialize_reference (type, expr, decl, cleanup) ! tree type; ! tree expr; ! tree decl; ! tree *cleanup; { tree conv; --- 6076,6094 ---- return var; } ! /* Convert EXPR to the indicated reference TYPE, in a way suitable for ! initializing a variable of that TYPE. If DECL is non-NULL, it is ! the VAR_DECL being initialized with the EXPR. (In that case, the ! type of DECL will be TYPE.) If DECL is non-NULL, then CLEANUP must ! also be non-NULL, and with *CLEANUP initialized to NULL. Upon ! return, if *CLEANUP is no longer NULL, it will be a CLEANUP_STMT ! that should be inserted after the returned expression is used to ! initialize DECL. ! Return the converted expression. */ tree ! initialize_reference (tree type, tree expr, tree decl, tree *cleanup) { tree conv; *************** initialize_reference (type, expr, decl, *** 6171,6176 **** --- 6156,6169 ---- remember that the conversion was required. */ if (TREE_CODE (conv) == BASE_CONV && !NEED_TEMPORARY_P (conv)) { + void (*diagnostic_fn) (const char *, ...); + if (CHECK_COPY_CONSTRUCTOR_P (conv)) + /* Generate a temporary copy purely to generate the required + diagnostics. */ + build_temp (build_dummy_object (TREE_TYPE (expr)), + TREE_TYPE (expr), + LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING, + &diagnostic_fn); base_conv_type = TREE_TYPE (conv); conv = TREE_OPERAND (conv, 0); } *************** initialize_reference (type, expr, decl, *** 6181,6187 **** /*fn=*/NULL_TREE, /*argnum=*/0, /*inner=*/-1, /*issue_conversion_warnings=*/true); ! if (!real_non_cast_lvalue_p (expr)) { tree init; tree type; --- 6174,6180 ---- /*fn=*/NULL_TREE, /*argnum=*/0, /*inner=*/-1, /*issue_conversion_warnings=*/true); ! if (!real_lvalue_p (expr)) { tree init; tree type; *************** initialize_reference (type, expr, decl, *** 6190,6195 **** --- 6183,6198 ---- type = TREE_TYPE (expr); var = make_temporary_var_for_ref_to_temp (decl, type); layout_decl (var, 0); + /* If the rvalue is the result of a function call it will be + a TARGET_EXPR. If it is some other construct (such as a + member access expression where the underlying object is + itself the result of a function call), turn it into a + TARGET_EXPR here. It is important that EXPR be a + TARGET_EXPR below since otherwise the INIT_EXPR will + attempt to make a bitwise copy of EXPR to intialize + VAR. */ + if (TREE_CODE (expr) != TARGET_EXPR) + expr = get_target_expr (expr); /* Create the INIT_EXPR that will initialize the temporary variable. */ init = build (INIT_EXPR, type, var, expr); diff -Nrc3pad gcc-3.3.3/gcc/cp/cfns.gperf gcc-3.4.0/gcc/cp/cfns.gperf *** gcc-3.3.3/gcc/cp/cfns.gperf 2003-05-02 21:01:23.000000000 +0000 --- gcc-3.4.0/gcc/cp/cfns.gperf 2003-07-25 13:57:43.000000000 +0000 *************** *** 2,13 **** #ifdef __GNUC__ __inline #endif ! static unsigned int hash PARAMS ((const char *, unsigned int)); #ifdef __GNUC__ __inline #endif ! const char * libc_name_p PARAMS ((const char *, unsigned int)); %} # The standard C library functions, for feeding to gperf; the result is used # by nothrow_libfn_p. # --- 2,14 ---- #ifdef __GNUC__ __inline #endif ! static unsigned int hash (const char *, unsigned int); #ifdef __GNUC__ __inline #endif ! const char * libc_name_p (const char *, unsigned int); %} + %% # The standard C library functions, for feeding to gperf; the result is used # by nothrow_libfn_p. # diff -Nrc3pad gcc-3.3.3/gcc/cp/cfns.h gcc-3.4.0/gcc/cp/cfns.h *** gcc-3.3.3/gcc/cp/cfns.h 2003-05-02 21:01:23.000000000 +0000 --- gcc-3.4.0/gcc/cp/cfns.h 2003-07-26 19:31:30.000000000 +0000 *************** *** 1,14 **** ! /* C code produced by gperf version 2.7.2 */ ! /* Command-line: gperf -o -C -E -k '1-6,$' -j1 -D -N libc_name_p ../../../src-3.3/gcc/cp/cfns.gperf */ #ifdef __GNUC__ __inline #endif ! static unsigned int hash PARAMS ((const char *, unsigned int)); #ifdef __GNUC__ __inline #endif ! const char * libc_name_p PARAMS ((const char *, unsigned int)); ! /* maximum key range = 480, duplicates = 1 */ #ifdef __GNUC__ __inline --- 1,44 ---- ! /* ANSI-C code produced by gperf version 3.0.1 */ ! /* Command-line: gperf -o -C -E -k '1-6,$' -j1 -D -N libc_name_p -L ANSI-C ../../gcc/gcc/cp/cfns.gperf */ ! ! #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ ! && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ ! && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ ! && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ ! && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ ! && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ ! && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ ! && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ ! && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ ! && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ ! && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ ! && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ ! && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ ! && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ ! && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ ! && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ ! && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ ! && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ ! && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ ! && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ ! && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ ! && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ ! && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) ! /* The character set is not based on ISO-646. */ ! #error "gperf generated tables don't work with this execution character set. Please report a bug to ." ! #endif ! ! #line 1 "../../gcc/gcc/cp/cfns.gperf" ! #ifdef __GNUC__ __inline #endif ! static unsigned int hash (const char *, unsigned int); #ifdef __GNUC__ __inline #endif ! const char * libc_name_p (const char *, unsigned int); ! /* maximum key range = 391, duplicates = 0 */ #ifdef __GNUC__ __inline *************** inline *** 18,71 **** #endif #endif static unsigned int ! hash (str, len) ! register const char *str; ! register unsigned int len; { static const unsigned short asso_values[] = { ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 0, 0, ! 1, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 106, 76, 0, ! 21, 0, 0, 11, 43, 26, 0, 66, 106, 17, ! 121, 0, 17, 0, 7, 0, 3, 19, 49, 1, ! 3, 41, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, ! 483, 483, 483, 483, 483, 483 }; register int hval = len; switch (hval) { default: ! case 6: ! hval += asso_values[(unsigned char)str[5]]; case 5: hval += asso_values[(unsigned char)str[4]]; case 4: hval += asso_values[(unsigned char)str[3]]; case 3: hval += asso_values[(unsigned char)str[2]]; case 2: hval += asso_values[(unsigned char)str[1]]; case 1: hval += asso_values[(unsigned char)str[0]]; break; --- 48,103 ---- #endif #endif static unsigned int ! hash (register const char *str, register unsigned int len) { static const unsigned short asso_values[] = { ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 0, 0, ! 1, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 28, 90, 0, ! 95, 0, 51, 93, 114, 26, 109, 124, 5, 1, ! 6, 13, 37, 128, 3, 0, 0, 49, 38, 0, ! 104, 45, 0, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, ! 400, 400, 400, 400, 400, 400, 400 }; register int hval = len; switch (hval) { default: ! hval += asso_values[(unsigned char)str[5]+1]; ! /*FALLTHROUGH*/ case 5: hval += asso_values[(unsigned char)str[4]]; + /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; + /*FALLTHROUGH*/ case 3: hval += asso_values[(unsigned char)str[2]]; + /*FALLTHROUGH*/ case 2: hval += asso_values[(unsigned char)str[1]]; + /*FALLTHROUGH*/ case 1: hval += asso_values[(unsigned char)str[0]]; break; *************** hash (str, len) *** 77,318 **** __inline #endif const char * ! libc_name_p (str, len) ! register const char *str; ! register unsigned int len; { enum { TOTAL_KEYWORDS = 156, MIN_WORD_LENGTH = 3, MAX_WORD_LENGTH = 10, ! MIN_HASH_VALUE = 3, ! MAX_HASH_VALUE = 482 }; static const char * const wordlist[] = { "cos", - "feof", - "free", - "sqrt", - "wcsrtombs", - "pow", "towctrans", ! "wcsstr", "wcstombs", ! "strstr", ! "ferror", ! "wcsxfrm", ! "wcsftime", ! "exit", ! "exp", ! "modf", ! "strxfrm", ! "wmemset", ! "memset", ! "strftime", ! "frexp", "time", "ctime", ! "wcstod", ! "fwide", ! "wcscmp", ! "wmemmove", ! "strtod", ! "fmod", ! "wcschr", "wcsrchr", ! "strcmp", ! "wctype", ! "toupper", ! "towupper", ! "strchr", "strrchr", "wmemcmp", ! "iswctype", ! "gmtime", ! "difftime", ! "btowc", ! "iswprint", ! "iswxdigit", ! "cosh", ! "memcmp", ! "wmemchr", ! "isupper", ! "iswupper", ! "iswdigit", ! "memchr", ! "isxdigit", ! "wmemcpy", ! "mbtowc", ! "setbuf", ! "mbstowcs", "wcscpy", ! "memmove", ! "vswprintf", ! "acos", ! "mbrtowc", ! "wcrtomb", ! "mbsrtowcs", ! "atof", "strcpy", - "setlocale", - "wcscat", - "isdigit", - "log10", "tolower", "floor", "towlower", ! "strcat", ! "log", ! "mktime", ! "wcstoul", ! "fseek", ! "memcpy", "wcstok", ! "strtoul", ! "wcscspn", ! "islower", ! "div", ! "iswlower", ! "atexit", "strtok", ! "setvbuf", ! "strcspn", ! "isspace", "iswspace", ! "asctime", ! "wctob", ! "wcsncmp", ! "atoi", ! "ldexp", ! "strncmp", ! "wcspbrk", ! "wctomb", ! "swprintf", ! "sprintf", ! "strpbrk", ! "abs", "fabs", ! "wcsncpy", ! "ispunct", ! "iswpunct", ! "strncpy", ! "iswgraph", ! "isprint", ! "isgraph", ! "wcscoll", ! "wcstol", "vsprintf", ! "strcoll", ! "strtol", "sscanf", ! "clearerr", ! "swscanf", ! "sinh", ! "wcsncat", ! "getenv", ! "ceil", ! "clock", ! "wctrans", ! "strncat", "ldiv", ! "iswcntrl", ! "wcsspn", ! "iscntrl", ! "sin", ! "strspn", ! "mbsinit", ! "longjmp", "rand", "srand", ! "labs", "tanh", ! "calloc", ! "atol", ! "localtime", ! "realloc", ! "malloc", ! "atan2", ! "tan", ! "wcslen", ! "strlen", ! "iswalpha", ! "localeconv", ! "asin", ! "iswalnum", ! "isalnum", ! "isalpha", ! "mblen", ! "mbrlen", ! "atan", ! "signal" }; static const short lookup[] = { ! -1, -1, -1, 0, 1, -1, -1, -1, ! -1, -1, -1, 2, -1, -1, -1, -1, ! -1, 3, -1, -1, 4, -1, 5, 6, ! 7, -1, -1, -1, -1, 8, -1, -1, ! -1, 9, 10, 11, -1, -1, 12, 13, ! 14, -1, 15, -1, 16, 17, 18, 19, ! -1, 20, 21, 22, 23, 24, -1, -1, ! -1, -1, 25, -1, 26, 27, -1, 28, ! 29, 30, -1, 31, 32, -1, 33, -1, ! 34, 35, 36, -1, 37, -1, -1, 38, ! 39, -1, -1, -1, 40, 41, -1, -1, ! 42, 43, 44, 45, 46, 47, -1, 48, ! 49, 50, 51, -1, 52, -1, -1, 53, ! 54, 55, 56, 57, -1, 58, 59, -273, ! 62, 63, -1, 64, -96, -2, 65, 66, ! 67, -1, 68, -1, 69, 70, 71, -1, ! 72, -1, -1, 73, -1, -1, -1, 74, ! 75, 76, -1, 77, -1, -1, 78, -1, ! -1, 79, 80, 81, 82, 83, 84, 85, ! -1, -1, 86, 87, 88, -1, 89, 90, ! -1, 91, -1, 92, -1, 93, -1, -1, ! -1, 94, -1, -1, 95, -1, 96, -1, ! -1, -1, -1, 97, 98, 99, -1, 100, ! -1, 101, 102, 103, -1, -1, -1, -1, ! -1, 104, -1, 105, 106, -1, -1, -1, ! -1, -1, 107, -1, -1, -1, -1, 108, ! -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 109, -1, -1, 110, -1, 111, -1, ! -1, -1, -1, -1, 112, 113, -1, 114, ! -1, 115, 116, 117, -1, 118, 119, 120, ! -1, -1, 121, 122, -1, 123, -1, 124, ! -1, -1, -1, -1, -1, -1, -1, 125, ! -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 126, 127, -1, -1, -1, 128, 129, ! -1, -1, -1, 130, 131, -1, -1, 132, ! 133, 134, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 135, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, ! 136, -1, -1, -1, 137, 138, -1, -1, ! -1, -1, 139, -1, 140, -1, -1, -1, ! -1, -1, -1, -1, -1, 141, -1, 142, ! -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, 143, 144, -1, -1, -1, -1, ! -1, -1, -1, -1, 145, -1, -1, -1, ! -1, -1, 146, -1, -1, -1, -1, -1, ! -1, 147, 148, -1, -1, -1, -1, -1, ! -1, 149, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, 150, -1, -1, -1, -1, -1, ! -1, -1, -1, 151, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 152, -1, ! -1, -1, -1, -1, -1, -1, 153, -1, ! -1, -1, -1, -1, -1, 154, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, 155 }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) --- 109,327 ---- __inline #endif const char * ! libc_name_p (register const char *str, register unsigned int len) { enum { TOTAL_KEYWORDS = 156, MIN_WORD_LENGTH = 3, MAX_WORD_LENGTH = 10, ! MIN_HASH_VALUE = 9, ! MAX_HASH_VALUE = 399 }; static const char * const wordlist[] = { + "wcsstr", + "strstr", "cos", "towctrans", ! "memmove", ! "wcstol", ! "wcscoll", "wcstombs", ! "strtol", ! "strcoll", ! "wcslen", "time", "ctime", ! "strlen", ! "iswctype", ! "wmemchr", "wcsrchr", ! "ceil", ! "sin", "strrchr", + "tan", + "iscntrl", + "acos", + "wmemmove", + "wcsrtombs", + "wctrans", "wmemcmp", ! "pow", ! "atol", ! "wcsncmp", ! "memset", ! "free", ! "strncmp", ! "wmemset", ! "wcsspn", ! "wcstoul", ! "strspn", ! "strtoul", ! "asctime", ! "atan2", ! "asin", ! "atan", ! "ferror", ! "iswalnum", ! "wcscat", ! "realloc", ! "strcat", "wcscpy", ! "memcpy", "strcpy", "tolower", "floor", + "iswcntrl", + "atoi", + "clearerr", + "swscanf", + "wcsncat", + "islower", + "strncat", + "btowc", + "localtime", + "wctomb", + "isalnum", + "isprint", + "mblen", + "wcstod", + "log10", + "strtod", + "wcrtomb", + "abs", + "setlocale", + "wcschr", + "mbrlen", + "memchr", + "strchr", + "labs", + "iswpunct", + "exit", + "sqrt", + "swprintf", + "wctype", + "mbsrtowcs", + "wcscspn", + "getenv", + "strcspn", "towlower", ! "atof", "wcstok", ! "localeconv", "strtok", ! "calloc", ! "malloc", ! "isalpha", ! "iswlower", "iswspace", ! "wcsxfrm", ! "signal", ! "strxfrm", ! "wcsftime", ! "feof", ! "strftime", ! "wcscmp", "fabs", ! "memcmp", ! "strcmp", "vsprintf", ! "fwide", ! "gmtime", ! "sprintf", ! "exp", ! "wmemcpy", ! "iswprint", "sscanf", ! "wcsncpy", ! "strncpy", ! "isspace", ! "toupper", ! "wctob", ! "div", ! "mbtowc", "ldiv", ! "log", ! "mktime", ! "isupper", ! "atexit", ! "modf", ! "mbstowcs", ! "mbrtowc", ! "ispunct", ! "iswalpha", ! "setvbuf", "rand", "srand", ! "frexp", ! "towupper", ! "mbsinit", ! "cosh", ! "vswprintf", ! "iswupper", ! "wcspbrk", ! "fmod", ! "strpbrk", ! "sinh", "tanh", ! "iswdigit", ! "clock", ! "longjmp", ! "ldexp", ! "setbuf", ! "fseek", ! "iswgraph", ! "difftime", ! "iswxdigit", ! "isdigit", ! "isxdigit", ! "isgraph" }; static const short lookup[] = { ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, ! -1, -1, 1, -1, -1, -1, 2, -1, -1, -1, ! -1, -1, 3, 4, -1, 5, 6, 7, 8, 9, ! 10, 11, 12, 13, 14, -1, -1, -1, 15, 16, ! 17, 18, 19, 20, 21, 22, -1, -1, 23, 24, ! -1, 25, 26, 27, -1, 28, 29, 30, 31, 32, ! 33, -1, 34, 35, -1, 36, 37, 38, -1, 39, ! 40, -1, 41, -1, -1, -1, -1, -1, -1, 42, ! -1, 43, -1, 44, -1, 45, 46, -1, 47, -1, ! 48, 49, 50, 51, 52, -1, -1, 53, 54, 55, ! -1, -1, -1, 56, -1, 57, 58, -1, 59, 60, ! 61, 62, 63, 64, 65, -1, 66, 67, -1, 68, ! -1, 69, 70, 71, 72, 73, 74, 75, -1, -1, ! -1, -1, -1, 76, 77, 78, -1, -1, 79, 80, ! 81, 82, -1, 83, 84, -1, 85, 86, 87, -1, ! 88, 89, 90, 91, -1, -1, -1, 92, -1, 93, ! -1, 94, -1, 95, -1, 96, 97, -1, 98, -1, ! 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, ! -1, 109, 110, 111, 112, -1, 113, -1, -1, 114, ! -1, -1, -1, 115, -1, -1, -1, 116, 117, -1, ! 118, -1, -1, -1, -1, 119, 120, 121, -1, 122, ! 123, -1, -1, 124, -1, 125, 126, -1, 127, -1, ! 128, -1, -1, 129, 130, -1, -1, -1, -1, -1, ! -1, 131, 132, -1, -1, -1, -1, 133, 134, 135, ! -1, -1, -1, -1, -1, 136, -1, 137, -1, -1, ! -1, 138, -1, -1, -1, -1, -1, -1, 139, 140, ! -1, 141, -1, -1, 142, -1, 143, -1, -1, 144, ! -1, 145, -1, -1, -1, -1, 146, -1, -1, -1, ! -1, -1, -1, 147, -1, -1, -1, -1, -1, 148, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 149, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 150, -1, -1, -1, -1, -1, ! 151, -1, -1, 152, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 153, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 155 }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) *************** libc_name_p (str, len) *** 330,350 **** if (*str == *s && !strcmp (str + 1, s + 1)) return s; } - else if (index < -TOTAL_KEYWORDS) - { - register int offset = - 1 - TOTAL_KEYWORDS - index; - register const char * const *wordptr = &wordlist[TOTAL_KEYWORDS + lookup[offset]]; - register const char * const *wordendptr = wordptr + -lookup[offset + 1]; - - while (wordptr < wordendptr) - { - register const char *s = *wordptr; - - if (*str == *s && !strcmp (str + 1, s + 1)) - return s; - wordptr++; - } - } } } return 0; --- 339,344 ---- diff -Nrc3pad gcc-3.3.3/gcc/cp/ChangeLog gcc-3.4.0/gcc/cp/ChangeLog *** gcc-3.3.3/gcc/cp/ChangeLog 2004-02-14 20:18:15.000000000 +0000 --- gcc-3.4.0/gcc/cp/ChangeLog 2004-04-19 01:58:35.000000000 +0000 *************** *** 1,16911 **** ! 2004-02-14 Release Manager ! ! * GCC 3.3.3 Released. ! ! 2004-02-05 Giovanni Bajo ! ! PR c++/13086 ! * init.c (build_delete): Emit a more informative error message in ! case of an incomplete type, and on the correct source line. ! ! 2004-01-30 Giovanni Bajo ! ! PR c++/13683 ! * call.c (convert_arg_to_ellipsis): Don't emit a warning if within ! a sizeof expression.block ! ! 2004-01-29 Aldy Hernandez ! ! Backport: ! ! 2004-01-17 Fred Fish ! ! PR c++/11895 ! * cp/decl.c (reshape_init): Handle VECTOR_TYPE like ARRAY_TYPE, ! except don't call array_type_nelts() with a VECTOR_TYPE. ! ! 2004-01-29 Aldy Hernandez ! ! Backport: ! 2003-06-03 Jason Merrill ! ! * cp/cp-tree.h (CP_AGGREGATE_TYPE_P): Accept vectors. ! ! * cp/decl.c (reshape_init): Handle vectors. ! ! * testsuite/g++.dg/init/array10.C: New. ! ! 2004-01-25 Kriang Lerdsuwanakij ! ! PR c++/13797 ! * pt.c (instantiate_class_template): Add an error_mark_node ! check. ! (tsubst_decl) : Likewise. ! ! Backport from mainline ! 2003-05-09 Kriang Lerdsuwanakij ! ! PR c++/10555, c++/10576 ! * pt.c (lookup_template_class): Handle class template with ! multiple levels of parameters when one of the levels contain ! errors. ! ! 2004-01-21 Gabriel Dos Reis ! ! Backport from mainline ! 2004-01-16 Mark Mitchell ! ! PR c++/13574 ! * decl.c (compute_array_index_type): Fix grammar in comment. ! * init.c (build_zero_init): Handle zero-sized arrays correctly. ! ! 2004-01-21 Gabriel Dos Reis ! Backport from mainline ! 2004-01-16 Mark Mitchell ! PR c++/13478 ! * call.c (initialize_reference): Pass -1 for inner parameter to ! convert_like_real. ! ! 2004-01-21 Gabriel Dos Reis ! Backport from mainline ! 2004-01-05 Mark Mitchell ! PR c++/13057 ! * class.c (build_clone): Copy type attributes from the original ! function to the clone. ! ! 2004-01-21 Gabriel Dos Reis ! Backport from mainline ! 2003-12-28 Mark Mitchell ! PR c++/13009 ! * call.c (build_special_member_call): Do not assume that we have a ! pointer to the complete object in an assignment operator. ! ! 2004-01-20 Kriang Lerdsuwanakij ! PR c++/13289 ! * pt.c (instantiate_decl): Set DECL_TEMPLATE_INSTANTIATED before ! calling regenerate_decl_from_template. ! ! 2004-01-14 Gabriel Dos Reis ! Backport from mainline ! 2004-01-05 Mark Mitchell ! ! PR c++/12816 ! * class.c (build_vtbl_ref_1): Do not unconditionally mark vtable ! references as constant. ! ! 2004-01-11 Gabriel Dos Reis ! PR c++/13544 ! * decl.c (build_enumerator): Set DECL_CONTEXT after the enumerator ! has been pushed. ! (pushdecl): Don't use DECL_NAMESPACE_SCOPE_P to test whether a ! decl has a namespace-scope; that isn't really what it means. ! 2004-01-02 Matthias Klose ! Backport from mainline: ! 2003-12-28 Mark Mitchell ! PR c++/13081 ! * decl.c (duplicate_decls): Preserve inline-ness when redeclaring ! a function template. ! 2003-12-20 Andrew Pinski ! Backport from mainline: ! 2003-12-30 Nathan Sidwell ! PR c++/13507 ! * decl.c (duplicate_decls): Use build_type_attribute_variant to ! merge attributes. ! 2003-12-30 Nathan Sidwell ! PR c++/13445 ! * pt.c (instantiate_class_template): Push to class's scope before ! tsubsting base. ! 2003-12-28 Roger Sayle ! PR c++/13070 ! * decl.c (duplicate_decls): When setting the type of an anticipated ! declaration, merge the existing type attributes. ! 2003-12-27 Giovanni Bajo ! Backport from mainline: ! 2003-12-16 Giovanni Bajo ! PR c++/2294 ! * decl.c (push_overloaded_decl): always construct an OVERLOAD ! if the declaration comes from an using declaration. ! 2003-12-26 Gabriel Dos Reis ! Backport from mainline: ! 2003-12-16 Mark Mitchell ! PR c++/12696 ! * decl.c (reshape_init): Recover quickly from errors. ! 2003-12-26 Gabriel Dos Reis ! ! Backport from mainline: ! 2003-12-22 Mark Mitchell ! ! PR C++/12862 ! * decl.c (pushdecl): Look up all namespace-scope entities in their ! corresponding namespace. ! ! 2003-12-22 Andrew Pinski ! ! PR c++/5050 ! * tree.c (cp_start_inlining): Remove. ! (cp_end_inlining): Remove. ! * cp-lang.c (LANG_HOOKS_TREE_INLINING_START_INLINING): Do not define. ! (LANG_HOOKS_TREE_INLINING_END_INLINING): Do not define. ! * cp-tree.h (cp_start_inlining): Do not declare. ! (cp_end_inlining): Do not declare. ! ! 2003-12-21 Mark Mitchell ! ! PR c++/11554 ! * init.c (sort_mem_initializers): Add warning. ! ! 2003-12-19 Jason Merrill ! ! PR c++/13371 ! * typeck.c (build_modify_expr): Stabilize lhs if we're narrowing. ! ! 2003-12-18 Jason Merrill ! ! PR c++/12253 ! * init.c (build_vec_init): Initialization of an element from ! an initializer list is also a full-expression. ! ! 2003-12-18 Kriang Lerdsuwanakij ! ! PR c++/13262 ! * pt.c (instantiate_decl): Wrap push_nested_class and ! pop_nested_class around cp_finish_decl call for static member ! variable. ! ! 2003-12-06 Mark Mitchell ! ! PR c++/13323 ! * class.c (same_signature_p): Handle conversion operators ! correctly. ! (check_for_override): Likewise. ! ! 2003-11-14 Bernardo Innocenti ! ! Backport from 3.4-branch. ! ! 2003-06-25 Giovanni Bajo ! ! PR c++/2094 ! * pt.c (unify): Add support for PTRMEM_CST and ! FIELD_DECL unification. ! ! 2003-11-08 Bernardo Innocenti ! ! Backport from 3.4-branch. ! ! 2003-10-08 Giovanni Bajo ! ! * cp_tree.h: Added TFF_NO_FUNCTION_ARGUMENTS. ! * error.c (dump_function_decl): Use it to skip the dump of the ! arguments. ! (dump_expr): When dumping a declaration found within an ! expression, always set TFF_NO_FUNCTION_ARGUMENTS ! in the flags. ! ! 2003-10-23 Jason Merrill ! ! PR c++/12726 ! * tree.c (build_target_expr_with_type): Don't call force_rvalue ! for CONSTRUCTORs. ! ! 2003-10-16 Release Manager ! ! * GCC 3.3.2 Released. ! ! 2003-10-15 Kriang Lerdsuwanakij ! ! PR c++/12369 ! * decl.c (grokdeclarator): Handle TEMPLATE_ID_EXPR if friend ! is a member of other class. ! * friend.c (do_friend): Don't build TEMPLATE_DECL if friend ! is a specialization of function template. ! ! 2003-10-15 Kriang Lerdsuwanakij ! ! PR c++/7939 ! * typeck.c (comptypes): Don't ICE when its first argument is ! error_mark_node. ! (compparms): Reverse the arguments of same_type_p. ! ! 2003-10-14 Jason Merrill ! ! PR c++/11878 ! * tree.c (build_target_expr_with_type): Call force_rvalue for ! classes with non-trivial copy ctors. ! ! PR c++/11063 ! * typeck.c (build_modify_expr): Call convert rather than abort. ! ! 2003-10-06 Mark Mitchell ! ! PR c++/10147 ! * call.c (initialize_reference): Tweak error message. ! ! PR c++/12337 ! * init.c (build_new_1): Make sure that the expression returned is ! not an lvalue. ! ! PR c++/12344, c++/12236, c++/8656 ! * decl.c (start_function): Do not ignore attributes embedded in a ! function declarator. ! ! 2003-10-04 Roger Sayle ! ! PR c++/11409 ! * class.c (resolve_address_of_overloaded_function): When building ! list of matching non-template function decls, ignore anticipated ! declarations of undeclared or shadowed GCC builtins. ! ! 2003-10-02 Mark Mitchell ! ! PR c++/12486 ! * typeck.c (finish_class_member_access_expr): Issue diagnostic ! on erroneous use of qualified name. ! ! 2003-07-09 Mark Mitchell ! ! * cp-tree.h (break_out_calls): Remove declaration. ! * tree.c (break_out_calls): Remove. ! * typeck.c (build_modify_expr): Avoid invalid sharing of trees. ! ! 2003-09-18 Mark Mitchell ! ! * class.c (resolve_address_of_overloaded_function): Replace ! complain parameter with flags parameter. ! (instantiate_type): Adjust accordingly. ! ! 2003-09-17 Mark Mitchell ! ! PR c++/11991 ! * typeck2.c (incomplete_type_diagnostic): Robustify. ! ! PR c++/12266 ! * cp-tree.h (tsubst_flags_t): Add tf_conv. ! * class.c (standard_conversion): Pass tf_conv to ! instantiate_type. ! (resolve_address_of_overloaded_function): Do not call mark_used ! when just checking conversions. ! ! 2003-09-14 Mark Mitchell ! ! PR c++/3907 ! * cp-tree.h (innermost_scope_is_class_p): New function. ! * class.c (maybe_note_name_used_in_class): Refine test for whether ! or not we are in a class scope. ! * decl.c (innermost_scope_is_class_p): Define. ! ! 2003-09-14 Mark Mitchell ! ! * class.c (layout_class_type): Make DECL_MODE match TYPE_MODE for ! an bit-field whose width exceeds that of its type. ! ! 2003-09-09 Steven Bosscher ! ! PR c++/11595 ! * decl.c (define_label): Remove unreachable timevar pop. ! Always return the decl, even if the definition is invalid. ! ! 2003-09-08 Mark Mitchell ! ! PR c++/11786 ! * decl2.c (add_function): Do not complain about seeing the same ! non-function twice. ! ! 2003-09-08 Mark Mitchell ! ! PR c++/5296 ! * pt.c (try_one_overload): Add addr_p parameter. ! (resolve_overloaded_unification): Pass it. ! ! 2003-09-07 Jason Merrill ! ! PR c++/12181 ! * typeck.c (build_modify_expr): Don't always stabilize the lhs and ! rhs. Do stabilize the lhs of a MODIFY_EXPR used on the lhs. ! ! 2003-09-06 Mark Mitchell ! ! PR c++/11867 ! * call.c (standard_conversion): Improve comments. ! (perform_direct_initialization): Make sure we return an expression ! of the correct type. ! * typeck.c (build_static_cast): Check for ambiguity and ! accessibility when performing conversions. ! ! 2003-09-05 Mark Mitchell ! ! PR c++/12163 ! * call.c (perform_direct_initialization): Correct logic for ! direct-initialization of a class type. ! ! PR c++/12146 ! * pt.c (lookup_template_function): Robustify. ! ! 2003-09-04 Mark Mitchell ! ! Revert this patch: ! * class.c (include_empty_classes): Correct logic for ABI version 1. ! ! 2003-09-03 Mark Mitchell ! ! PR c++/12053 ! * class.c (include_empty_classes): Correct logic for ABI version 1. ! ! 2003-09-01 Mark Mitchell ! ! PR c++/12114 ! * cp-tree.h (initialize_reference): Change prototype. ! * call.c (initialize_reference): Add cleanup parameter. ! * decl.c (grok_reference_init): Likewise. ! (check_initializer): Likewise. ! (cp_finish_decl): Insert a CLEANUP_STMT if necessary. ! (duplicate_decls): When replacing an anticipated builtin, do not ! honor TREE_NOTHROW. ! * typeck.c (convert_for_initialization): Correct call to ! initialize_reference. ! ! 2003-08-29 Mark Mitchell ! ! PR c++/11928 ! * search.c (add_conversions): Avoid adding two conversion ! operators for the same type. ! ! 2003-08-20 Kaveh R. Ghazi ! ! * cp-tree.h (build_function_call_real): Remove unused parameter. ! * typeck.c (build_function_call_real): Likewise. Caller changed. ! * decl.c (binding_table_reverse_maybe_remap): Initialize variable. ! ! 2003-08-19 Gabriel Dos Reis ! ! PR c++/5293 ! * call.c (initialize_reference): Improve diagnostic. ! ! 2003-08-04 Release Manager ! ! * GCC 3.3.1 Released. ! ! 2003-08-04 Mark Mitchell ! ! PR c++/11713 ! * search.c (setup_class_bindings): Handle conversion operators ! specially. ! ! 2003-07-24 Alexandre Oliva ! ! PR c++/10796 ! * decl.c (finish_enum): Make sure the underlying integer type has ! the same precision as some full integer type. Reverts part ! 2003-06-27's patch that didn't play any role in fixing the PR. ! ! 2003-07-24 Mark Mitchell ! ! * cp-tree.h (convert_to_base_statically): Declare. ! * call.c (build_special_member_call): Convert INSTANCE to the base ! type. ! * class.c (convert_to_base_statically): New method. ! * init.c (construct_virtual_base): Use it. ! * method.c (do_build_assign_ref): Fix typo in comment. ! ! 2003-07-24 Kriang Lerdsuwanakij ! ! PR c++/11513 ! * cp-tree.h (PROCESSING_REAL_TEMPLATE_DECL_P): Use current_scope. ! ! 2003-07-23 Mark Mitchell ! ! PR c++/11645 ! * cp-tree.h (accessible_base_p): Declare. ! * call.c (build_over_call): Use it. ! * search.c (accessible_base_p): New function, split out from ... ! (lookup_base): ... here. ! ! 2003-07-23 Nathan Sidwell ! ! PR c++/11282 ! * decl.c: (reshape_init): Always advance *INITP. ! ! 2003-07-19 Mark Mitchell ! ! PR c++/11546 ! * pt.c (lookup_template_class): Treat TYPE_DECLs as TEMPLATE_DECLs ! where appropriate. ! ! 2003-07-14 Mark Mitchell ! ! PR c++/7053 ! * pt.c (unregister_specialization): Rename to ... ! (reregister_specialization): ... this. ! (tsubst_friend_function): Use it. ! (regenerate_decl_from_template): Likewise. ! ! 2003-07-14 Kriang Lerdsuwanakij ! ! PR c++/11154 ! * pt.c (more_specialized_class): Add full_args parameter. ! (most_specialized_class): Adjust calls to more_specialized_class. ! * cp-tree.h (more_specialized_class): Adjust declaration. ! ! 2003-07-13 Mark Mitchell ! ! PR c++/11503 ! * cp-tree.h (DECL_SELF_REFERENCE_P): New macro. ! (SET_DECL_SELF_REFERENCE_P): Likewise. ! * class.c (build_self_reference): Use SET_DECL_SELF_REFERENCE_P. ! * pt.c (tsubst_decl): Copy it. ! * search.c (lookup_base): Use DECL_SELF_REFERENCE_P. ! ! 2003-07-11 Danny Smith ! ! Backport from mainline. ! ! 2003-05-21 Danny Smith ! ! PR c++/9738 ! * decl.c (duplicate_decls): Re-invoke make_decl_rtl ! if the old decl had instantiated DECL_RTL. ! (Based on Richard Henderson 2003-05-13 patch to c-decl.c). ! 2003-07-11 Mark Mitchell ! PR c++/8164 ! * decl.c (duplicate_decls): Avoid mangling names unnecessarily. ! 2003-07-10 Mark Mitchell ! PR c++/10558 ! * parse.y (class_template_ok_as_expr): New variable. ! (template_arg_1): New non-terminal. ! (primary): Issue errors about uses of class templates as ! expressions. ! 2003-07-09 Mark Mitchell ! PR c++/10032 ! * decl.c (cxx_init_decl_processing): With -pedantic, pedwarns are ! still errors. ! PR c++/10527 ! * error.c (decl_to_string): Do not print default argument ! expressions. ! 2003-07-10 Kriang Lerdsuwanakij ! PR c++/10849 ! * decl2.c (handle_class_head_apparent_template): New function. ! * cp-tree.h (handle_class_head_apparent_template): Add declaration. ! * parse.y (class_head_defn): Use it. ! * search.c (type_access_control): Revert my 2003-05-25 change. ! 2003-07-06 Mark Mitchell ! PR c++/11236 ! * cvt.c (convert_to_void): Treat an overloaded function like ! "((void) 0)" after issuing a diagnostic. ! PR c++/11345 ! * search.c (lookup_base_r): Remove is_non_public and ! within_current_scope parameters. Remove other dead code. ! (lookup_base): Adjust call to lookup_base_r. ! (adjust_result_of_qualified_name_lookup): Improve comment. ! * semantics.c (finish_call_expr): Use maybe_dummy_object. ! 2003-07-05 Mark Mitchell ! PR c++/11431 ! * typeck.c (build_static_cast): Check for reference conversions ! earlier. ! 2003-07-01 Mark Mitchell ! PR c++/6949 ! * decl2.c (grokfield): Create TEMPLATE_DECLs for methods in local ! classes. ! 2003-07-01 Mark Mitchell ! * call.c (resolve_scoped_fn_name): Return error_mark_node for ! erroneous cases. ! PR c++/11137 ! * decl2.c (generate_ctor_or_dtor_function): Tolerate a ! non-existant ssdf_decls array. ! (finish_file): Call generator_ctor_or_dtor_function when there are ! static constructors or destructors and no other static ! initializations. ! PR c++/11149 ! * call.c (resolve_scoped_fn_name): Check that the qualifying scope ! is a class type. ! 2003-07-01 Mark Mitchell ! PR c++/9559 ! * decl2.c (grokfield): Do not build NOP_EXPRs around the ! error_mark_node. ! 2003-06-30 Giovanni Bajo ! * mangle.c (write_expression): Exit gracefully when trying to ! mangle a CALL_EXPR. ! 2003-06-30 Giovanni Bajo ! PR c++/11106 ! * error.c (dump_decl): Call dump_decl to dump the DECL_NAME for a ! USING_DECL, instead of print_tree_identifier. ! 2003-06-27 Mark Mitchell ! PR c++/10468 ! * pt.c (tsubst): Handle qualified TYPEOF_TYPEs correctly. ! PR c++/10796 ! * decl.c (finish_enum): Implement DR377. ! * decl.c (cp_finish_decl): Don't make variables with reference ! type readonly while they are being initialized. ! 2003-06-26 Mark Mitchell ! PR c++/11332 ! * typeck.c (build_static_cast): Avoid returning expressions with ! reference type. ! 2003-06-25 Mark Mitchell ! PR c++/10990 ! * search.c (lookup_base_r): Rely on accessible_p, rather than ! trying to emulate that logic here. ! PR c++/10931 ! * call.c (convert_like): Pass issue_conversion_warnings. ! (convert_like_with_context): Likewise. ! (convert_like_real): Add issue_conversion_warnings parameter. ! (perform_direct_initialization_if_possible): New function. ! * cp-tree.h (perform_direct_initialization_if_possible): Declare it. ! * typeck.c (check_for_casting_away_constness): New function. ! (build_static_cast): Rewrite. ! 2003-06-23 Mark Mitchell ! PR c++/5754 ! * parse.y (structsp): Improve error handling of invalid nested ! template classes. ! 2003-06-23 Jakub Jelinek ! * mangle.c: Include ggc.h, gt-cp-mangle.h. ! (mangle_conv_op_name_for_type): Use htab_create_ggc instead of ! htab_create. ! * config-lang.in (gtfiles): Add cp/mangle.c. ! * Make-lang.in (gt-cp-mangle.h): Depend on s-gtype. ! (cp/mangle.o): Depend on gt-cp-mangle.h. ! 2003-06-23 Jakub Jelinek ! * mangle.c (hash_type): val is the TREE_LIST itself, not a pointer ! to it. ! 2003-06-21 Gabriel Dos Reis ! PR c++/10784 ! * call.c (joust): Warn about choosing conversion sequence only if ! -Wconversion. ! ! 2003-06-21 Gabriel Dos Reis ! PR c++/10864 ! * call.c (op_error): Tidy. ! * error.c (dump_expr): Properly format 'T()' when T is an ! aggregate type. ! 2003-06-21 Gabriel Dos Reis ! PR c++/10915 ! * decl.c (grok_op_properties): Warn possible confusing conversion ! only if -Wconversion. ! 2003-06-20 Mark Mitchell ! PR c++/10845 ! * pt.c (try_class_unification): Correct handling of member class templates. ! 2003-06-19 Mark Mitchell ! ! PR c++/10939 ! * Make-lang.in (decl.o): Depend on input.h. ! * decl.c (input.h): Include it. ! (cp_finish_decl): Revert previous change: ! 2003-06-19 Mark Mitchell ! * decl.c (cp_finish_decl): Remove support for RESULT_DECLs. ! Don't check building_stmt_tree. ! * pt.c (tsubst_decl): Do not try to substitute into non-dependent ! functions. ! ! PR c++/9649 ! * cp-tree.h (pushdecl_class_level): Change prototype. ! (push_class_level_binding): Likewise. ! * decl.c (add_binding): Reject duplicate static data members. ! (pushdecl_class_level): Return a value indicating whether or not ! the binding was valid. ! (push_class_level_binding): Likewise. ! * semantics.c (finish_member_declaration): Don't keep invalid ! declarations. ! ! 2003-06-19 Mark Mitchell ! ! PR c++/11041 ! * call.c (initialize_reference): Do not use cp_finish_decl to emit ! temporary variables. ! * cp-tree.h (static_aggregates): Declare. ! (pushdecl_top_level_and_finish): Likewise. ! * decl.c (pushdecl_top_level_1): New function. ! (pushdecl_top_level): Use it. ! (pushdecl_top_level_and_finish): New function. ! (initialize_local_var): Remove redundant code. ! (cp_finish_decl): Remove support for RESULT_DECLs. Don't check ! building_stmt_tree. ! * decl.h (static_aggregates): Remove. ! * decl2.c (get_guard): Use pushdecl_top_level_and_finish. ! * rtti.c (get_tinfo_decl): Use pushdecl_top_level_and_finish. ! (tinfo_base_init): Likewise. ! ! 2003-06-19 Matt Austern ! ! PR c++/11228 ! * init.c (build_zero_init): Assert that number of array elements ! is an integer constant. ! (build_default_init) Don't use build_zero_init for arrays with ! variable number of elements. ! ! 2003-06-17 Mark Mitchell ! ! * mangle.c (mangle_conv_op_name_for_type): Correct sprintf format ! string again. ! ! 2003-06-17 Mark Mitchell ! ! * mangle.c (mangle_conv_op_name_for_type): Correct sprintf format ! string. ! ! 2003-06-17 Jason Merrill ! ! PR c++/10929 ! * decl.c (grokfndecl): Don't mark a function inline for ! -finline-functions if it isn't defined. ! ! 2003-06-17 Mark Mitchell ! ! PR c++/10712 ! * class.c (handle_using_decl): Robustify. ! ! PR c++/11105 ! * cp-tree.h (DECL_CONV_FN_TYPE): New method. ! * decl.c (lookup_name_real): Backport conversion operator code ! from mainline. ! * mangle.c (struct globals): Remove internal_mangling_p. ! (write_unqualified_name): Use DECL_CONV_FN_TYPE. ! (write_template_parm): Don't write out the level number. ! (conv_type_names): New variable. ! (hash_type): New function. ! (compare_type): Likewise. ! (mangle_conv_op_name_for_type): Don't try to mangle conversion ! operator names. ! * search.c (lookup_conversion_operator): New function. ! (lookup_fnfields_1): Use it. ! ! 2003-06-12 Mark Mitchell ! ! PR c++/10635 ! * typeck.c (build_c_cast): Check that the destination type is ! complete. ! ! 2003-06-10 Jason Merrill ! ! PR c++/10968 ! * pt.c (mark_decl_instantiated): Clear DECL_COMDAT. ! ! 2003-06-09 Zack Weinberg ! ! PR 8861 ! * mangle.c (write_real_cst): New function. Implement ! ABI-compliant mangling of floating-point literals when ! -fabi-version>=2; provide backward compatibility with 3.3 when ! -fabi-version=1 (with warning). Clarify commentary. ! (write_template_arg_literal): Use write_real_cst. ! ! 2003-06-08 Kriang Lerdsuwanakij ! ! PR c++/11039 ! * decl2.c (handle_class_head): Remove implicitness in typename ! appeared as elaborated type specifier in declaration. ! ! 2003-06-03 Kriang Lerdsuwanakij ! ! PR c++/10940 ! * pt.c (check_explicit_specialization): Check for 'static' ! earlier. ! ! 2003-05-31 Kriang Lerdsuwanakij ! ! PR c++/10956 ! * pt.c (instantiate_decl): Don't use full template arguments if ! we are dealing with specializations. ! ! 2003-05-29 Gabriel Dos Reis ! ! * decl.c (ENABLE_CHECKING_SCOPES): New macro. ! (binding_depth): Unconditionally define. ! (is_class_level): Likewise. ! (indent): Likewise. Take an indenting parameter. ! (push_binding_level): Remove conditional definittion. ! (pop_binding_level): Likewise. ! (suspend_binding_level): Likewise. ! (resume_binding_level): Likewise. ! (pushlevel): Likewise. ! (pushlevel_class): Likewise. ! (poplevel_class): Likewise. ! (pop_everything): Likewise. ! ! 2003-05-27 Gabriel Dos Reis ! ! * decl.c (global_scope_p): New macro. ! (pop_binding_level): Use it. ! (suspend_binding_level): Likewise. ! (global_bindings_p): Likewise. ! (print_other_binding_stack): Likewise. ! (print_binding_stack): Likewise. ! (maybe_push_to_top_level): Likewise. ! (pushdecl_namespace_level): Likewise. ! (start_decl): Likewise. ! (cp_finish_decl): Likewise. ! (start_function): Likewise. ! (cxx_init_decl_processing): Don't refer to global_binding_level. ! (global_binding_level): Remove. ! ! 2003-05-25 Kriang Lerdsuwanakij ! ! PR c++/10849 ! * search.c (type_access_control): Don't check access when ! processing_specialization. ! ! 2003-05-23 Kriang Lerdsuwanakij ! ! PR c++/10682 ! * pt.c (instantiate_class_template): Use DECL_ARTIFICIAL to ! check for implicitly created typedef to an enum. ! ! 2003-05-20 Gabriel Dos Reis ! * decl.c (free_binding_entry): Fix thinko. ! 2003-05-19 Gabriel Dos Reis ! * cp-tree.h (struct binding_entry_s): New datatype. ! (binding_table): Declare. ! (binding_entry): Likewise. ! (bt_foreach_proc): Likewise. ! (binding_table_foreach): Likewise. ! (binding_table_find): Likewise. ! (cxx_remember_type_decls): Likewise. ! (CLASSTYPE_TAGS): Remove. ! (CLASSTYPE_NESTED_UDTS): New macro. ! (struct lang_type_class): Remove tags field. Add nested_types. ! * decl.c (ENTRY_INDEX): New macro. ! (free_binding_entry): New free list. ! (binding_entry_make): New function. ! (binding_entry_free): Likewise. ! (struct binding_table_s): New datatype. ! (SCOPE_DEFAULT_HT_SIZE): New macro. ! (CLASS_SCOPE_HT_SIZE): Likewise. ! (NAMESPACE_ORDINARY_HT_SIZE): Likewise. ! (NAMESPACE_STD_HT_SIZE): Likewise. ! (GLOBAL_SCOPE_HT_SIZE): Likewise. ! (binding_table_construct): New function. ! (binding_table_free): Likewise. ! (binding_table_new): Likewise. ! (binding_table_expand): Likewise. ! (binding_table_insert): Likewise. ! (binding_table_find): Likewise. ! (binding_table_find_anon_type): Likewise. ! (binding_table_reverse_maybe_remap): Likewise. ! (binding_table_remove_anonymous_types): Likewise. ! (binding_table_foreach): Likewise. ! (struct cp_binding_level): Remove tags field. Add type_decls. ! (pop_binding_level): Free binding_entries if possible. ! (kept_level_p): Tidy. ! (poplevel): Remove unused variable tags. ! (bt_print_entry): New function. ! (print_binding_level): Use it. ! (push_namespace): Construct binding table. ! (maybe_process_template_type_declaration): Tidy. ! (pushtag): Likewise. ! (clear_anon_tags): Likewise. ! (cxx_remember_type_decls): New function. ! (lookup_tag): Tidy. ! (lookup_tag_reverse): Likewise. ! (cxx_init_decl_processing): Construct binding_table for the global scope. ! (store_parm_decls): Remove pointless code. ! (gettags): Remove. ! (storetags): Likewise. ! * class.c (unreverse_member_declarations): Don't touch ! CLASSTYPE_TAGS. ! (pushclass): Remember CLASSTYPE_NESTED_UTDS. ! * pt.c (instantiate_class_template): Remove reference to ! CLASSTYPE_TAGS. Remeber CLASSTYPE_NESTED_UTDS. ! (bt_instantiate_type_proc): New function. ! (do_type_instantiation): Use it. ! * search.c (lookup_field_r): Use binding_table_find. ! * semantics.c (begin_class_definition): Remove reference to ! CLASSTYPE_TAGS. Nullify CLASSTYPE_NESTED_UTDS. ! ! 2003-05-15 Jason Merrill ! ! PR c++/5388 ! * call.c (conditional_conversion): Don't consider implicit ! conversions if T2 is a base of T1. ! * cp-tree.h (DERIVED_FROM_P, UNIQUELY_DERIVED_FROM_P): Make boolean. ! (ACCESSIBLY_UNIQUELY_DERIVED_P, PUBLICLY_UNIQUELY_DERIVED_P): Likewise. ! ! PR c++/10661 ! * pt.c (instantiate_class_template): Also instantiate our ! enclosing class. ! ! 2003-05-13 Release Manager ! ! * GCC 3.3 Released. ! ! 2003-05-02 Richard Henderson ! ! PR c++/10570 ! * cfns.gperf: Comment out POSIX thread cancellation points, ! plus abort and raise. ! * cfns.h: Regenerate. ! ! 2003-05-01 Mark Mitchell ! ! * decl2.c (comdat_linkage): Don't externalize explicit ! instantiations. ! ! 2003-04-29 Mark Mitchell ! ! PR c++/10551 ! * pt.c (mark_decl_instantiated): Defer all explicit instantiations ! that have not yet been written out. ! ! PR c++/10549 ! * class.c (layout_class_type): Mark overlong bitfields as having ! the maximum size permitted by their type, after layout. ! ! 2003-04-29 Mark Mitchell ! ! PR c++/10527 ! * error.c (dump_expr): Correctly handling of NEW_EXPR.4 ! ! 2003-04-29 Kriang Lerdsuwanakij ! ! * lang-options.h: Fix typo. ! ! 2003-04-29 Mark Mitchell ! PR c++/10515 ! * cp-tree.h (lookup_field_1): Declare it. ! * search.c (lookup_field_1): Make it public. ! * decl.c (reshape_init): Handle designated initializers. ! 2003-04-29 Mark Mitchell ! * decl.c (maybe_commonize_var): Further tweak support for systems ! without weak symbols. ! 2003-04-27 Mark Mitchell ! * decl.c (maybe_commonize_var): Fix thinko in last patch. ! PR c++/10506 ! * method.c (use_thunk): Decrement immediate_size_expand. ! PR c++/10503 ! * cp-tree.h (DECL_VAR_MARKED_P): New macro. ! (DECL_MAYBE_TEMPLATE): Remove. ! * class.c (fixed_type_or_null): Avoid infinite recursion. ! 2003-04-27 Mark Mitchell ! * decl.c (maybe_commonize_var): Make the code match the comments. ! * pt.c (instantiate_decl): Move call to import_export_decl. ! 2003-04-25 Mark Mitchell ! * decl2.c (finish_file): Don't call import_export_decl for ! functions that are not defined. ! (handle_class_head): Robustify. ! * pt.c (instantiate_decl): Do not call cp_finish_decl for ! variables that are not defined. ! 2003-04-23 Mark Mitchell ! PR c++/10471 ! * call.c (build_cxx_call): Robustify. ! 2003-04-23 Mark Mitchell ! PR c++/10451 ! * decl.c (grokdeclarator): Correct logic for "mutable" errors. ! 2003-04-22 Mark Mitchell ! PR c++/10446 ! * search.c (lookup_fnfields_1): Handle empty slots in the method ! vector. ! 2003-04-22 Mark Mitchell ! PR c++/10428 ! * decl.c (check_elaborated_type_specifier): New function, split ! out from ... ! (xref_tag): ... here. Use the new function in more places. ! 2003-04-21 Mark Mitchell ! * call.c (build_over_call): Use build_cxx_call. ! (build_cxx_call): New method, split out of build_over_call. ! * cp-tree.h (language_function): Add can_throw. ! (build_cxx_call): Declare it. ! * decl.c (finish_function): If a function does not contain any ! calls to functions that can throw an exception, indicate that ! fact. ! * decl2.c (mark_used): Do not defer the instantiation of ! functions, if the current function does not throw. ! * optimize.c (maybe_clone_body): Copy TREE_NOTHROW to the clones. ! * pt.c (instantiate_decl): Make sure import_export_decl is called ! before emitting things. ! * rtti.c (throw_bad_cast): Use build_cxx_call. ! (build_dynamic_cast_1): Likewise. ! * typeck.c (build_function_call): Likewise. ! 2003-04-21 Nathan Sidwell ! PR c++/9881 ! * typeck.c (build_unary_op): Fold all COMPONENT_REF addr ! expressions. Reverts my 2002-08-08 patch. ! 2003-04-20 Nathan Sidwell ! PR c++/10405 ! * search.c (lookup_field_1): Final scan goes backwards for ! types, forwards for non-types. ! 2003-04-15 Jason Merrill ! * decl2.c (mark_used): Don't instantiate anything if ! skip_evaluation. ! 2003-04-15 Mark Mitchell ! * init.c (build_new_1): Use nullexp instead of null_node to avoid ! unwanted macro expansion. ! 2003-04-14 Ziemowit Laski ! * tree.c (build_cplus_array_type_1): Do not call ! uses_template_parms() on a NULL index_type. ! 2003-04-14 Andreas Schwab ! * init.c (build_new_1): Test use_cookie instead of cookie_size to ! avoid code-gen bug on ia64. ! 2003-04-13 Mark Mitchell ! PR c++/10300 ! * init.c (build_new_1): Correct logic for checking whether the ! return value from the allocation function was zero. ! 2003-03-31 Mark Mitchell ! PR c++/10278 ! * spew.c (yyerror): Avoid crashing at all costs. ! 2003-03-31 Jason Merrill ! PR java/10145 ! * class.c (check_field_decl): Don't set DECL_ALIGN. ! 2003-03-30 Mark Mitchell ! PR c++/7647 ! * search.c (lookup_field_1): Add want_type parameter. ! (lookup_field_r): Adjust call to lookup_field_1. ! 2003-03-28 Jason Merrill ! PR c++/10245 ! * cvt.c (force_rvalue): New fn. ! * call.c (build_conditional_expr): Use it. ! * cp-tree.h: Declare it. ! 2003-03-28 Nathan Sidwell ! PR c++/10047 ! * decl2.c (finish_file): Don't warn about explicitly instantiated ! inline decls. ! 2003-03-27 Nathan Sidwell ! PR c++/10158 ! * spew.c (snarf_method):Set DECL_INITIALIZED_IN_CLASS for ! members. ! * pt.c (instantiate_decl): Only reduce the template args for ! friends that are not defined in class. ! 2003-03-24 Nathan Sidwell ! PR c++/9898, PR c++/383, DR 322 ! * pt.c (maybe_adjust_types_for_deduction) [DEDUCE_CONV]: Look ! through reference types on both PARM and ARG. ! PR c++/10199 ! * call.c (build_method_call): Deal with LOOKUP_EXPR. ! * semantics.c (finish_object_call_expr): Use build_method_call ! when in a template decl. ! 2003-03-23 Mark Mitchell ! PR c++/7086 ! * semantics.c (genrtl_named_return_value): Adjust calls to ! put_var_into_stack. ! * typeck.c (cxx_mark_addressable): Likewise. ! 2003-03-20 Mark Mitchell ! PR c++/6412 ! * cp/decl2.c (arg_assoc_class): Correct check for namespace-scope ! friends. ! * cp/pt.c (instantiate_class_template): Fix formatting. ! 2003-03-19 Jason Merrill ! PR c++/8316, c++/9315, c++/10136 ! * call.c (joust): Improve wording. ! 2003-03-18 Roger Sayle ! PR c++/10031 ! * decl.c (duplicate_decls): Use the new type when prototyping ! anticipated decls, even when the types match. This defines the ! exception list for the built-in function. ! 2003-03-17 Jason Merrill ! PR c++/10091 ! * typeck.c (build_class_member_access_expr): Compare ! TYPE_MAIN_VARIANTs. ! * decl.c (finish_function): Don't skip a block. ! PR c++/9993 ! * decl.c (finish_function): Only allow the NRVO to use variables ! declared at function scope. ! 2003-03-17 Nathan Sidwell ! PR c++/9629 ! * cp-tree.h (struct language_function): Add in_base_initializer. ! (in_base_initializer): define it. ! (expand_member_init): Remove INIT param. ! * init.c (expand_member_init): Remove INIT param, return the member. ! (emit_mem_initializers): Set in_base_initializer. ! * class.c (build_base_path): Check in_base_initializer. ! * parse.y (begin_member_init): New reduction. ! (member_init): Use it. ! * pt.c (tsubst_initializer_list): Set in_base_initializer. ! 2003-03-15 Kriang Lerdsuwanakij ! PR c++/6440 ! * pt.c (maybe_process_partial_specialization): Handle ! member class template when enclosing class template is ! explicit specialized. ! (most_general_template): Stop looking when DECL is already ! specialized. ! 2003-03-13 Jason Merrill ! PR c++/9420 ! * search.c (lookup_conversions): Call complete_type here. ! * call.c (implicit_conversion): Not here. ! 2003-03-13 Jason Merrill ! PR c++/9336 ! * decl2.c (lookup_arg_dependent): Handle error_mark_node. ! 2003-03-13 Mark Mitchell ! * decl2.c (do_nonmember_using_decl): Correct handling of ! simultaneous type/non-type bindings. ! 2003-03-13 Mark Mitchell ! * call.c (initialize_reference): Remove bogus assertion. ! * decl.c (build_ptrmemfunc_type): Revert change of 2003-03-09. ! 2003-03-12 Andrew Lewycky ! PR c++/7050 ! * expr.c (cxx_expand_expr): Return const0_rtx for throw ! expressions. ! 2003-03-11 Mark Mitchell ! PR c++/9474 ! * decl2.c (do_nonmember_using_decl): Do not call duplicate decls ! to merge old and new declarations. ! 2003-03-11 Mark Mitchell ! PR c++/9924 ! * decl2.c (do_nonmember_using_decl): Ignore anticipated builtins. ! 2003-03-11 Jason Merrill ! PR c++/9820 ! * search.c (lookup_member): Fix handling of functions in a class ! being defined. ! 2003-03-11 Mark Mitchell ! PR c++/8700 ! * call.c (print_z_candidates): Avoid printing duplicates. ! 2003-03-11 Jason Merrill ! PR c++/8660 ! * decl2.c (check_classfn): A member template only matches a ! member template. ! 2003-03-10 Devang Patel ! PR c++/9394 ! * g++spec.c (lang_specific_driver): Use DEFAULT_WORD_SWITCH_TAKES_ARG. ! 2003-03-10 Jason Merrill ! PR c++/9798 ! * decl.c (push_using_directive): Push before recursing. ! PR c++/9868 ! * call.c (resolve_scoped_fn_name): Handle the case of a function ! pointer member. ! * init.c (build_offset_ref): Handle getting a FIELD_DECL for NAME. ! * decl2.c (build_offset_ref_call_from_tree): Only mess with 'this' ! argument in the pointer-to-member case. ! 2003-03-09 Mark Mitchell ! PR c++/9373 ! * cp-lang.c (cxx_get_alias_set): Use alias set zero for ! pointers to member functions. ! PR c++/8534 ! * decl.c (build_ptrmemfunc_type): Do not allow default arugments ! in pointer-to-member-function types. ! 2003-03-09 Mark Mitchell ! PR c++/9912 ! * cp-tree.h (is_ancestor): New function. ! * decl2.c (is_namespace_ancestor): Rename to ... ! (is_ancestor): ... this. ! (namespace_ancestor): Use it. ! (set_decl_namespace): Likewise. ! (handle_class_head): Check for invalid class definitions. ! 2003-03-10 Gabriel Dos Reis ! Compile-time improvement: 2/n. ! * cp-tree.h (struct cxx_binding): New datatype; ! (struct lang_identifier): Use it. ! (LOCAL_BINDING_P): Adjust definition. ! (INHERITED_VALUE_BINDING_P): Likewise. ! (BINDING_SCOPE): Likewise. ! (BINDING_HAS_LEVEL_P): Likewise. ! (BINDING_VALUE): Likewise. ! (BINDING_TYPE): Likewise. ! (IDENTIFIER_VALUE): Likewise. ! (struct tree_binding): Remove. ! (TS_CP_BINDING): Likewise. ! ((union lang_tree_node): Remove field "binding". ! (cxx_binding_clear): New macro. ! (binding_for_name): Adjust return type. ! (qualified_lookup_using_namespace): Adjust prototype. ! (lookup_using_namespace): Adjust prototype. ! (cxx_scope_find_binding_for_name): Declare. ! * cp-tree.def: Remove CPLUS_BINDING definition. ! * parse.y (parse_scoped_id): Don't type-abuse of 'id'. Allocate ! temporary cxx_binding on stack. Simplify. ! * decl.c (push_binding): Adjust local variable type. ! (add_binding): Likewise. ! (push_class_binding): Likewise. ! (pop_binding): Likewise. ! (poplevel): Likewise. ! (poplevel_class): Likewise. ! (free_bindings): Adjust type. ! (find_binding): Adjust return type, add a third parameter. Remove ! non-useful assertion now that we use static typing. ! (cxx_scope_find_binding_for_name): New function. ! (binding_for_name): Use it. Adjust local variable type. Simplify. ! (namespace_binding): Simplify. ! (set_namespace_binding): Likewise. ! (set_identifier_type_value_with_scope): Adjust local variable type. ! (lookup_tag): Don't type-abuse of local variable 'old'. ! (lookup_namespace_name): Likewise. Allocate binding on stack. ! (select_decl): Adjust prototype. ! (unqualified_namespace_lookup): Allocate binding on stack. ! Don't type-abuse of local variable 'val'. ! (lookup_name_real): Likewise. ! (maybe_inject_for_scope_var): Adjust local variable type. ! (cp_tree_node_structure): Remove CPLUS_BINDING case label. ! (namespace_binding): Adjust logic, simplify. ! (BINDING_LEVEL): Adjust definition. ! (push_class_level_binding): Adjust local variable type. ! (struct cxx_saved_binding): Adjust field 'binding' type. ! * decl2.c (ambiguous_decl): Adjust prototype. ! (lookup_using_namespace): Adjust local variable type. ! (qualified_lookup_using_namespace): Catch type error and correct ! ensueing logic error. ! (do_nonmember_using_decl): Adjust local variable type. Allocate ! temporary cxx_binding on stack. ! (do_toplevel_using_decl): Adjust local variable type. ! * ptree.c (cxx_print_cxx_binding): New function. ! (cxx_print_identifier): Use it. ! (cxx_print_xnode): Delete CPLUS_BINDING case label. ! 2003-03-09 Kriang Lerdsuwanakij ! PR c++/9970 ! * decl.c (duplicate_decls): Only copy DECL_THUNKS for virtual functions. ! 2003-03-07 Matt Austern ! ! * cp-tree.h (struct lang_type_class): add field for key method ! (cp_global_trees): rename dynamic_classes to keyed_classes ! (key_method): add definition ! * class.c (finish_struct_1): compute class's key method, and add ! the class to keyed_classes list if there is no key method. ! * decl.c (finish_function): add class to keyed_classes list if we ! see a definition of the class's key method. ! * pt.c (instantiate_class_template): add template specialization ! of a dynamic class to keyed_classes list. ! * decl2.c (key_method): remove ! (finish_file): iterate only through keyed_classes list when ! deciding whether to emit vtables, remove class from its list after ! we do the emission. ! ! 2003-03-08 Mark Mitchell ! ! PR c++/9809 ! * call.c (add_function_candidate): Skip builtin fuctions that have ! not yet been declared. ! ! 2003-03-07 Mark Mitchell ! ! * call.c (reference_binding): Remove REF_IS_VAR parameter. ! (implicit_conversion): Adjust call to reference_binding. ! (make_temporary_var_for_ref_to_type): Add TYPE parameter. ! (initialize_reference): Adjust handling for references bound to ! rvalues. ! * cp-tree.h (make_temporary_var_for_ref_to_temp): Change ! prototype. ! (real_non_cast_lvalue_p): New method. ! * cvt.c (build_up_reference): Adjust use of ! make_temporary_var_for_ref_to_temp. ! * tree.c (real_non_cast_lvalue_p): New method. ! ! 2003-03-06 Mark Mitchell ! ! * call.c (merge_conversion_sequences): New function. ! (build_conv): Set ICS_USER_FLAG for USER_CONVs. ! (convert_class_to_reference): Correct handling of second ! standard conversion sequence in a user-defined conversion ! sequence. ! (build_user_type_conversion_1): Use merge_conversion_sequences. ! * cp-tree.def: Add comments for CONV nodes. ! ! 2003-03-06 Mark Mitchell ! ! PR c++/9965 ! * call.c (reference_binding): Add ref_is_var parameter. ! (implicit_conversion): Adjust call to reference_binding. ! (initialize_reference): Likewise. ! ! PR c++/9400 ! * decl.c (pushdecl): Don't check for shadowing of DECL_ARTIFICIAL ! PARM_DECLs. ! ! 2003-03-06 Mark Mitchell ! ! PR c++/9791 ! * class.c (get_basefndecls): Use lookup_fnfields_1. ! ! 2003-03-02 Matt Austern ! ! * decl.c (cp_binding_level): Add static_decls varray member. ! (add_decl_to_level): Add static/inline namespace scope ! declarations to static_decls array. ! (wrapup_global_for_namespace): Pass static_decls only, instead of ! all decls, to wrapup_global_declarations/check_global_declarations. ! (push_namespace): Initialize static_decls for ordinary namespaces. ! (cxx_init_decl_processing): Initialize static_decls for global ! namespace. ! ! 2003-03-05 Mark Mitchell ! ! * class.c (end_of_class): Correct thinko. ! ! 2003-03-04 Gabriel Dos Reis ! ! * cp-tree.h (cxx_saved_binding): Declare. ! (struct saved_scope): Adjust type of field 'old_binding'. ! * decl.c (cxx_saved_binding_make): New macro. ! (struct cxx_saved_binding): Define. ! (store_bindings): Adjust prototype. Use cxx_saved_binding to save ! C++ bindings. ! (maybe_push_to_top_level): Adjust local variable type. ! (pop_from_top_level): Likewise. ! ! 2003-03-03 Jason Merrill ! ! * decl.c (finish_enum): Do set the type in a template. Simplify. ! * pt.c (tsubst_enum, tsubst_copy): Revert last patch. ! ! 2003-03-03 Mark Mitchell ! ! PR c++/9878 ! * call.c (convert_class_to_reference): Correct conversion ! sequences. ! (reference_binding): Add ref_bound_directly_to_rvalue_p parameter. ! (implicit_conversion): Adjust call to reference_binding. ! (add_candidate): Change type of candidates parameter. ! (add_function_candidate): Likewise. ! (add_conv_candidate): Likewise. ! (build_builtin_candidate): Likewise. ! (add_builtin_candidate): Likewise. ! (add_builtin_candidates): Likewise. ! (add_template_candidate_real): Likewise. ! (add_template_candidate): Likewise. ! (add_template_conv_candidate): Likewise. ! (build_user_type_conversion_1): Adjust accordingly. ! (build_object_call): Likewise. ! (build_conditional_expr): Likewise. ! (add_candidates): Likewise. ! (build_new_op): Likewise. ! (convert_like_real): Use USER_CONV_CAND. Use build_nop. ! (build_new_method_call): Adjust calls to add_function_candidate. ! (make_temporary_var_for_ref_to_temp): New function. ! (initialize_reference): Add decl parameter. ! * class.c (build_rtti_vtbl_entries): Use build_address and ! build_nop. ! * cp-tree.h (initialize_reference): Change prototype. ! (make_temporary_var_for_ref_to_temp): New function. ! (build_type_conversion): Change prototype. ! (build_address): New function. ! (build_nop): Likewise. ! * cvt.c (cp_convert_to_pointer): Adjust call to ! build_type_conversion. Avoid indicating redundant NOP_EXPRs. ! Use build_nop. ! (convert_to_pointer_force): Use build_nop. ! (build_up_reference): Use make_temporary_var_for_ref_to_temp. ! (convert_to_reference): Adjust call to build_type_conversion. ! (ocp_convert): Likewise. ! (build_type_conversion): Remove for_sure parameter. ! * decl.c (grok_reference_init): Use initialize_reference. ! * typeck.c (build_address): New function. ! (build_nop): Likewise. ! (build_unary_op): Use them. ! (build_ptrmemfunc): Tidy slightly. ! (convert_for_initialization): Adjust call to ! initialize_reference. ! * typeck2.c (store_init_value): Remove #if 0'd code. ! ! 2003-03-02 Ashif Harji ! ! * lang-specs.h (default_compilers): Add -no-integrated-cpp flag to ! invoke an external cpp during compilation. ! ! 2003-02-28 Mark Mitchell ! ! PR c++/9892 ! * pt.c (instantiate_decl): Clear DECL_RTL for a VAR_DECL when ! instantiating it. ! ! 2003-02-28 Mark Mitchell ! ! PR c++/9879 ! * cp-tree.h (build_zero_init): Add parameter. ! * decl.c (cp_finish_decl): Adjust call. ! * init.c (build_zero_init): Add nelts parameter. Adjust recursive ! calls. ! (build_default_init): Add nelts parameter. Adjust calls to ! build_zero_init. ! (build_new_1): Adjust call to build_default_init. ! * typeck2.c (process_init_constructor): Adjust call to build_zero_init. ! ! 2003-02-27 Devang Patel ! ! * decl.c (finish_enum): Merge two 'for' loops. Copy value node if required. ! Postpone enum setting for template decls. ! (build_enumerator): Delay copying value node until finish_enum (). Remove ! #if 0'ed code. ! * pt.c (tsubst_enum): Set TREE_TYPE and copy value node. ! (tsubst_copy): Add check for enum type. ! ! ! 2003-02-25 Mark Mitchell ! ! PR c++/9829 ! * decl.c (grokdeclarator): Handle SCOPE_REFs whose second argument ! is a NAMESPACE_DECL. ! ! 2003-02-24 Gabriel Dos Reis ! ! * decl.c (add_binding): Time TV_NAME_LOOKUP. ! (push_class_binding): Likewise. ! (set_namespace_binding): Likewise. ! ! 2003-02-24 Kriang Lerdsuwanakij ! ! PR c++/9602 ! * typeck2.c (abstract_virtuals_error): Don't check when we ! are processing a template. ! ! 2003-02-23 Kriang Lerdsuwanakij ! ! PR c++/7982 ! * decl.c (warn_about_implicit_typename_lookup): Handle TYPEOF_TYPE. ! ! 2003-02-21 Mark Mitchell ! ! PR c++/9749 ! * decl.c (grokdeclarator): Do not allow parameters with variably ! modified types. ! ! PR c++/9727 ! * decl2.c (push_scope): Don't pushclass for non-class types. ! (pop_scope): Don't popclass either. ! ! PR c++/8906 ! * decl.c (lookup_name_real): Use IMPLICIT_TYPENAME_P. ! * decl2.c (handle_class_head): Check it. ! ! PR c++/8724 ! * call.c (build_method_call): Make sure that the type destroyed in ! an explicit destructor call is complete. ! ! 2003-02-20 Mark Mitchell ! ! PR c++/9729 ! * mangle.c (mangle_conv_op_name_for_type): Issue an error message ! when the G++ 3.2 ABI prevents correct compilation. ! ! 2003-02-18 Mark Mitchell ! ! PR c++/9704 ! * class.c (layout_class_type): In the 3.2 ABI, take into account ! trailing bit fields when computing CLASSTYPE_SIZE_UNIT. ! ! 2003-02-18 Matt Austern ! ! * cp/cp-lang.c: Change lang hooks so that final_write_globals does ! nothing for C++. ! * cp/decl.c (wrapup_globals_for_namespace): Remove special ! handling of global namespace. ! ! 2003-02-18 Jason Merrill ! ! PR c++/9623 ! * decl.c (reshape_init): Don't mess with initializer labels. ! ! 2003-02-18 Kriang Lerdsuwanakij ! ! PR c++/9459 ! * error.c (dump_type_prefix): Handle TYPEOF_TYPE. ! (dump_type_suffix): Likewise. ! ! 2003-02-17 Michael Elizabeth Chastain ! ! PR debug/9717 ! * class.c (build_base_field): Mark fields for base classes with ! DECL_IGNORED_P. ! ! 2003-02-13 Andrew Pinski ! ! * decl.c: (define_label): Fix warning for return 0 instead of NULL. ! ! 2003-02-13 Gabriel Dos Reis ! ! * Make-lang.in (cp/decl2.o): Add dependency on timevar.h ! * decl2.c: Include "timevar.h". ! (namespace_ancestor): Time name lookup. ! (add_using_namespace): Likewise. ! (lookup_using_namespace): Likewise. ! (qualified_lookup_using_namespace): Likewise. ! (decl_namespace): Likewise. ! (lookup_arg_dependent): Likewise. ! * lex.c (do_identifier): Likewise. ! (do_scoped_id): Likewise. ! * pt.c (lookup_template_class): Likewise. ! ! 2003-02-12 Gabriel Dos Reis ! ! * decl.c (define_label): Don't forget to pop TV_NAME_LOOKUP. ! ! 2003-02-11 Gabriel Dos Reis ! ! * decl.c: Include "timevar.h". ! (poplevel): Time name lookup. ! (find_binding): Likewise. ! (push_namespace): Likewise. ! (pop_nested_namespace): Likewise. ! (store_bindings): Likewise. ! (maybe_push_to_top_level): Likewise. ! (pop_from_top_level): Likewise. ! (push_local_name): Likewise. ! (pushtag): Likewise. ! (pushdecl): Likewise. ! (pushdecl_with_scope): Likewise. ! (pushdecl_namespace_level): Likewise. ! (pushdecl_top_level): Likewise. ! (pushdecl_class_level): Likewise. ! (push_class_level_binding): Likewise. ! (push_using_decl): Likewise. ! (push_using_directive): Likewise. ! (push_overloaded_decl): Likewise. ! (lookup_label): Likewise. ! (define_label): Likewise. ! (lookup_tag): Likewise. ! (lookup_tag_reverse): Likewise. ! (lookup_namespace_name): Likewise. ! (select_decl): Likewise. ! (unqualified_namespace_lookup): Likewise. ! (lookup_name_real): Likewise. ! (lookup_name_current_level): Likewise. ! (lookup_type_current_level): Likewise. ! (maybe_inject_for_scope_var): Likewise. ! (xref_tag): Likewise. ! ! * Make-lang.in (cp/decl.o): Add dependency on timevar.h ! ! 2003-02-03 Mark Mitchell ! ! PR c++/7129 ! * operators.def: Add ?=. ! ! 2003-01-31 Kriang Lerdsuwanakij ! ! PR c++/8849 ! * error.c (dump_expr): Handle BASELINK. ! * pt.c (resolve_overloaded_unification): Handle FUNCTION_DECL. ! ! 2003-01-31 Kriang Lerdsuwanakij ! ! PR c++/9453 ! * friend.c (is_friend): Always accept when SUPPLICANT is still ! a TEMPLATE_DECL. ! * pt.c (push_access_scope_real): Call push_to_top_level for ! function in namespace scope. ! (push_access_scope): Remove ARGS argument, all caller adjusted. ! (pop_access_scope): Call pop_from_top_level for function in ! namespace scope. ! (regenerate_decl_from_template): Use push_access_scope_real. ! ! 2003-01-29 Nathan Sidwell ! ! PR c++/9437 ! * pt.c (unify): Don't unify '*T' with 'U C::*'. ! ! 2003-01-27 Jeffrey D. Oldham ! ! PR c++/47 ! * cp-tree.h (lookup_nested_field): Add declaration. ! * decl.c (lookup_name_real): Call lookup_nested_field. ! * search.c (lookup_nested_field): Add function. ! ! 2003-01-26 Christian Cornelssen ! ! * Make-lang.in (c++.install-common, c++.install-man) ! (c++.uninstall): Prepend $(DESTDIR) to destination paths in ! all (un)installation commands. ! (c++.install-common): Rewrite $(LN) commands to support ! DESTDIR with "ln" as well as with "ln -s". ! ! 2003-01-24 Kaveh R. Ghazi ! ! * decl2.c (check_classfn): Fix uninitialized warning. ! ! 2003-01-22 Mark Mitchell ! ! PR c++/9328 ! * error.c (dump_decl): For an OVERLOAD, just print the name of the ! function; it doesn't make sense to try to print its type. ! * semantics.c (finish_typeof): Issue errors about invalid uses. ! ! 2003-01-22 Josef Zlomek ! ! PR/9386, PR/8801 ! 2002-12-27 Mark Mitchell ! * typeck.c (build_class_member_access_expr): Fix anonymous union ! handling. ! ! 2003-01-17 Jason Merrill ! ! PR c++/9167, c++/9358 ! * decl.c (require_complete_types_for_parms): Also update DECL_ARG_TYPE. ! ! 2003-01-17 Jason Merrill ! ! PR c++/9342 ! * call.c (build_conditional_expr): Always do lvalue-rvalue ! conversion. ! ! 2003-01-16 Jason Merrill ! ! PR c++/8564 ! * init.c (build_vec_init): Re-add maxindex parm. ! (perform_member_init, build_aggr_init): Pass it. ! (build_new_1): Pass it. Use an incomplete array type for full_type. ! * typeck.c (build_modify_expr): Pass it. ! * cp-tree.h: Adjust. ! ! 2003-01-13 Jason Merrill ! ! PR c++/8748 ! * class.c (build_base_path): Take the address before calling save_expr. ! ! * call.c (build_user_type_conversion_1): Do set ICS_BAD_FLAG if ! all the ambiguous conversions are bad. ! ! * class.c (maybe_warn_about_overly_private_class): Don't stop ! searching when we find a nonprivate method. ! ! 2003-01-09 Jakub Jelinek ! ! * decl.c (start_decl): Only check DECL_THREAD_LOCAL for VAR_DECLs. ! ! 2003-01-09 Jakub Jelinek ! ! * decl.c (start_decl): Don't set DECL_COMMON for __thread variables. ! ! 2003-01-07 Kriang Lerdsuwanakij ! ! PR c++/9030 ! * decl.c (make_typename_type): Check access only when tf_error. ! (make_unbound_class_template): Likewise. ! * pt.c (saved_access_scope): New variable. ! (push_access_scope_real): New function. ! (push_access_scope): Likewise. ! (pop_access_scope): Likewise. ! (tsubst_default_argument): Use them. ! (instantiate_template): Likewise. ! (regenerate_decl_from_template): Likewise. ! (instantiate_decl): Likewise. ! (get_mostly_instantiated_function_type): Likewise. ! ! 2003-01-06 Mark Mitchell ! ! PR c++/9165 ! * decl2.c (build_cleanup): Mark the object as used. ! ! 2003-01-03 Nathan Sidwell ! ! PR c++/45, c++/3784 ! * tree.c (cp_tree_equal, TEMPLATE_PARM_INDEX): The types must be ! the same too. ! ! 2002-12-30 Nathan Sidwell ! ! PR c++/9054 ! * class.c (layout_class_type): Set DECL_CONTEXT of type for base. ! * dump.c (cp_dump_tree, RECORD_TYPE): Deal with type for base types. ! ! 2002-12-26 Nathan Sidwell ! ! PR c++/4803 ! * decl2.c (mark_used): Defer inline functions. ! (finish_file): Merge deferred_fns loops. Check all used ! inline functions have a definition. ! * method.c (make_thunk): Thunks are not inline. ! ! PR c++/5116, c++/764 ! * call.c (build_new_op): Make sure template class operands are ! instantiated. ! ! 2002-12-24 Nathan Sidwell ! ! PR C++/7964 ! * cp-tree.h (resolve_scoped_fn_name): Prototype. ! * call.c (resolve_scoped_fn_name): New function. Deal with ! more template expansion. Broken out of ... ! * parse.y (parse_finish_call_expr): ... here. Call it. ! * decl2.c (build_expr_from_tree, CALL_EXPR): Use ! resolve_scoped_fn_name and build_call_from_tree. ! ! PR c++/9053 ! * decl.c (duplicate_decls): Templates may be disambiguated by ! return type. ! ! PR c++/8702 ! * decl2.c (check_classfn): Use lookup_fnfield_1. List all ! conversion operators on failure. ! ! 2002-12-22 Nathan Sidwell ! ! PR c++/8572 ! * cp-tree.h (grokoptypename): Add SCOPE parameter. ! * decl2.c (grokoptypename): Add SCOPE parameter. tsubst the type ! if in a template scope. ! * parse.y (unoperator): Return the scope. ! (operator_name): Adjust grokoptypename call. ! ! 2002-12-22 Kriang Lerdsuwanakij ! ! * cp-tree.h (make_unbound_class_template): Use tsubst_flags_t. ! * decl.c (make_unbound_class_template): Adjust. Check for tf_error. ! * pt.c (tsubst) [OFFSET_TYPE]: Check for tf_error. ! ! 2002-12-18 Kriang Lerdsuwanakij ! ! PR c++/8099 ! * friend.c (make_friend_class): Allow partial specialization ! when declaration is not a template friend. ! ! 2002-12-18 Kriang Lerdsuwanakij ! ! PR c++/3663 ! * pt.c (lookup_template_class): Copy TREE_PRIVATE and ! TREE_PROTECTED to created decl nodes. ! ! 2002-12-18 Mark Mitchell ! ! * class.c (build_base_field): Do not set DECL_PACKED on the ! FIELD_DECL. ! ! 2002-12-18 Kriang Lerdsuwanakij ! ! * parse.y (bad_parm): Add missing argument to error function call. ! ! 2002-12-18 Kriang Lerdsuwanakij ! ! PR c++/8442 ! * decl2.c (handle_class_head): Verify if the looked up name is a ! type or template. ! * pt.c (convert_template_argument): Fix type or template template ! parameter decision logic. ! ! 2002-12-13 Gabriel Dos Reis ! ! PR C++/8031 ! * cvt.c (convert_to_pointer_force): Don't try comparing against ! erronous type. ! ! 2002-12-13 Geoffrey Keating ! ! * cp-tree.h: Have the multiple-include guards around ! the entire file. ! ! 2002-12-10 Mark Mitchell ! ! PR c++/8372 ! * pt.c (tsubst_copy): Handle destructor names more correctly. ! ! 2002-12-10 Matt Austern ! ! * cp-tree.h: get rid of needs_virtual_reinit bit. ! ! 2002-12-09 Mark Mitchell ! ! * NEWS: Document removal of in-class initialization extension for ! static data members of non-arithmetic, non-enumeration type. ! * decl.c (check_static_variable_definition): Do not allow that ! extension. ! * decl2.c (grokfield): Do not call digest_init when processing ! templates. ! ! 2002-12-05 Kaveh R. Ghazi ! ! * error.c (dump_expr): Fix format specifier warning. ! ! 2002-12-04 Geoffrey Keating ! ! * class.c (finish_struct_1): Correct comment. ! * cp-tree.c (DECL_SORTED_FIELDS): Likewise. ! ! 2002-12-04 Gabriel Dos Reis ! ! PR C++/8799 ! * error.c (dump_expr): Don't ever try to dump a non-existent ! expression. ! ! 2002-12-03 Jason Merrill ! ! PR c++/8674 ! * call.c (build_over_call): Check specifically for TARGET_EXPR ! when eliding. ! ! PR c++/8461, c++/8625 ! * call.c (convert_for_arg_passing): Don't mess with error_mark_node. ! (cp_convert_parm_for_inlining): Remove. ! * cp-lang.c (LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING): ! Remove. ! * cp-tree.h (ADDR_IS_INVISIREF): Remove. ! * except.c (stabilize_throw_expr): Remove ADDR_IS_INVISIREF code. ! ! * call.c (build_user_type_conversion_1): Don't set ICS_BAD_FLAG on ! an ambiguous conversion. ! ! 2002-12-03 Mark Mitchell ! ! PR c++/8688 ! * decl.c (reshape_init): Handle erroneous initializers. ! ! 2002-12-02 Mark Mitchell ! ! PR c++/8720 ! * spew.c (remove_last_token): Make sure that last_chunk is set ! correctly. ! ! PR c++/8615 ! * error.c (dump_expr): Handle character constants with ! TREE_OVERFLOW set. ! ! 2002-12-02 Kriang Lerdsuwanakij ! ! DR 180 ! * decl.c (grokdeclarator): Require class-key for all friend class. ! Output the correct type and context in the error message. ! ! 2002-12-01 Mark Mitchell ! ! PR c++/5919 ! * pt.c (unify): Use variably_modified_type_p to test validity of ! template argument types. ! ! PR c++/8727 ! * cp-tree.h (lang_type_class): Add typeinfo_var. ! (CLASSTYPE_TYPEINFO_VAR): New macro. ! * rtti.c (get_tinfo_decl): Use it. ! ! PR c++/8663 ! * init.c (expand_member_init): Always get the main variant of a ! base class. ! ! 2002-12-01 Mark Mitchell ! ! PR c++/8332 ! PR c++/8493 ! * decl.c (cxx_init_decl_processing): Use size_type_node, not ! c_size_type_node. ! * decl2.c (coerce_new_type): Likewise. ! * except.c (do_allocate_exception): Likewise. ! ! 2002-11-30 Mark Mitchell ! ! PR c++/8227 ! * decl.c (layout_var_decl): Deal gracefully with erroneous types. ! (check_initializer): Validate the type of the initialized ! variable, even if the initializer is absent. ! * typeck.c (cp_type_quals): Deal gracefully with erroneous types. ! ! PR c++/8214 ! * typeck.c (convert_for_assignment): Do not use ! decl_constant_value on the operand. ! ! PR c++/8511 ! * pt.c (instantiate_decl): Handle template friends defined outside ! of the class correctly. ! ! 2002-11-29 Joe Buck ! ! * parse.y (class_head_defn): Set CLASSTYPE_DECLARED_CLASS for ! anonymous structs. ! ! 2002-11-29 Mark Mitchell ! ! * class.c (walk_subobject_offsets): Recur on binfos as well as on ! types. ! (layout_nonempty_base_or_field): Pass it a binfo when processing a ! base class. ! (layout_empty_base): Likewise. ! (build_base_field): Likewise. ! ! 2002-11-27 Mark Mitchell ! ! * class.c (build_base_field): Make sure we get the canonical base ! when descending through primary bases. ! ! 2002-11-26 Geoffrey Keating ! ! * decl.c (check_initializer): Don't error on initialisation of ! a scalar with a brace-enclosed expression. ! ! 2002-11-26 Nathan Sidwell ! ! * cp-tree.h (DECL_LANG_FLAG_4): Document more uses. ! (template_parms_equal): Remove prototype. ! * typeck.c (buuld_indirect_ref): Reformat. ! ! 2002-11-25 Mark Mitchell ! ! * tree.c (cp_build_qualified_type_real): Correct handling of ! array types. ! * class.c (walk_subobject_offsets): Fix thinko. ! (build_base_field): Record offsets of empty bases in primary ! virtual bases. ! (layout_class_type): Record offsets of empty bases in fields. ! ! * search.c (is_subobject_of_p_1): Fix thinko. ! (lookup_field_queue_p): Likewise. ! ! 2002-11-24 Mark Mitchell ! ! * class.c (layout_class_type): Reuse tail padding when laying out ! virtual bases. ! ! 2002-11-22 Mark Mitchell ! ! * rtti.c (qualifier_flags): Fix thinko. ! ! 2002-11-21 Glen Nakamura ! ! PR c++/8342 ! * typeck.c (get_member_function_from_ptrfunc): Make sure that a ! SAVE_EXPR for instance_ptr doesn't get evaluated first inside one ! of the branches of a COND_EXPR. ! ! 2002-11-19 Mark Mitchell ! ! * pt.c (for_each_template_parm): Free allocated memory. ! * search.c (is_subobject_of_p_1): New function. ! (is_subobject_of_p): Avoid walking virtual bases multiple times. ! ! 2002-11-19 Jason Thorpe ! ! * g++spec.c (lang_specific_spec_functions): New. ! ! 2002-11-15 Kazu Hirata ! ! * ChangeLog: Follow spelling conventions. ! * class.c: Likewise. ! * decl2.c: Likewise. ! ! 2002-11-14 Zack Weinberg ! ! * search.c (dfs_push_decls): Do not try to reorder elements ! 3..n of method_vec if method_vec has only two elements. ! Reverse order of two tests to avoid accessing unallocated ! memory. ! ! 2002-11-14 Mark Mitchell ! ! * class.c (dfs_find_final_overrider): Adjust so that the most ! derived object is a binfo, rather than a class type. ! (find_final_overrider): Likewise. ! (add_vcall_offset_vtbl_entries_1): Simplify accordingly. ! (add_vcall_offset): Likewise. ! ! 2002-11-09 Kriang Lerdsuwanakij ! PR c++/8389 ! * pt.c (instantiate_template): Push class scope for member functions. ! (get_mostly_instantiated_function_type): Likewise. Don't call ! tsubst on context. Remove CONTEXTP and TPARMSP parameters. ! * cp-tree.h (get_mostly_instantiated_function_type): Adjust. ! * mangle.c (write_encoding, write_unqualified_name): Adjust. ! ! 2002-11-07 Mark Mitchell ! ! * class.c (add_vcall_offset_vtbl_entries_1): Correct ordering of ! vcall offfsets. Split out ... ! (add_vcall_offset): ... new function. ! ! PR c++/8338 ! * pt.c (for_each_template_parm): Add htab parameter. ! (process_partial_specialization): Adjust call. ! (push_template_decl_real): Likewise. ! (pair_fn_data): Add visited. ! (for_each_template_parm_r): Avoid walking duplicates more than ! once. ! (uses_template_parms): Adjust call to for_each_template_parm. ! ! 2002-11-07 Mark Mitchell ! ! * class.c (add_implicitly_declared_members): Put implicitly ! declared functions at the end of TYPE_METHODs when -fabi-version ! is at least 2. ! ! 2002-11-05 Geoffrey Keating ! ! * decl2.c (finish_file): Correct spelling. ! ! 2002-11-03 Mark Mitchell ! ! * call.c (build_special_member_call): Do not try to lookup VTTs by ! name. ! * class.c (vtbl_init_data): Add generate_vcall_entries. ! (get_vtable_decl): Do not look up virtual tables by name. ! (copy_virtuals): Do not use BV_USE_VCALL_INDEX_P. ! (set_primary_base): Do not set CLASSTYPE_RTTI. ! (determine_primary_base): Likewise. ! (get_matching_virtual): Remove. ! (get_vcall_index): New function. ! (update_vtable_entry_for_fn): Do not try to use virtual thunks ! when they are not required. Assign vcall indices at this point. ! (finish_struct_1): Do not set CLASSTYPE_NEEDS_VIRTUAL_REINIT. ! Do update dynamic_classes. ! (build_vtt): Do not add VTTs to the symbol table. ! (build_ctor_vtbl_group): Likewise. ! (build_vtbl_initializer): Simplify handling of vcall indices. ! (build_vcall_offset_vtbl_entries): Pretend to build vcall offsets ! for the most derived class. ! (add_vcall_offset_vtbl_entries_1): But do not actually add them to ! the vtable. ! * cp-tree.h (dynamic_classes): New macro. ! (lang_type_class): Remove rtti. Add vtables. Add vcall_indices. ! (CLASSTYPE_RTTI): Remove. ! (CLASSTYPE_NEEDS_VIRTUAL_REINIT): Remove. ! (CLASSTYPE_VCALL_INDICES): New macro. ! (CLASSTYPE_VTABLES): Likewise. ! (BV_USE_VCALL_INDEX_P): Remove. ! (build_vtable_path): Remove. ! * decl2.c (finish_vtable_vardecl): Remove. ! (key_method): Remove #if 0'd code. ! (finish_vtable_vardecl): Rename to ... ! (maybe_emit_vtables): ... this. ! (finish_file): Use it. ! * search.c (look_for_overrides_here): Update comment. ! ! 2002-11-01 Zack Weinberg ! ! PR c/7353 redux ! * decl2.c (grokfield): Reject TYPE_DECLs with initializers. ! ! 2002-10-30 Jason Merrill ! ! PR c++/8186 ! * cp-tree.h (ADDR_IS_INVISIREF): New macro. ! * call.c (convert_for_arg_passing): Set it. ! * except.c (stabilize_throw_expr): Recurse for such an arg. ! ! 2002-10-31 Mark Mitchell ! ! * cp-tree.h (lang_decl_flags): Remove init_priority. ! (lang_decl): Add delta. ! (GLOBAL_INIT_PRIORITY): Remove. ! (THUNK_DELTA): Revise definition. ! * decl2.c (start_objects): Don't set GLOBAL_INIT_PRIORITY. ! * dump.c (cp_dump_tree): Don't dump it. ! ! 2002-10-30 Mark Mitchell ! ! PR c++/8160 ! * typeck2.c (process_init_constructor): Call complete_array_type. ! ! PR c++/8149 ! * decl.c (make_typename_type): Issue errors about invalid results. ! ! 2002-10-30 Kriang Lerdsuwanakij ! ! Core issue 287, PR c++/7639 ! * cp-tree.h (lang_type_class): Add decl_list field. ! (CLASSTYPE_DECL_LIST): New macro. ! (maybe_add_class_template_decl_list): Add declaration. ! * class.c (duplicate_tag_error): Initialize CLASSTYPE_DECL_LIST. ! (unreverse_member_declarations): Reverse CLASSTYPE_DECL_LIST. ! (maybe_add_class_template_decl_list): New function. ! (add_implicitly_declared_members): Use it. ! * decl.c (maybe_process_template_type_declaration): Likewise. ! (pushtag): Likewise. ! * friend.c (add_friend): Likewise. ! (make_friend_class): Likewise. ! * semantics.c (finish_member_declaration): Likewise. ! (begin_class_definition): Initialize CLASSTYPE_DECL_LIST. ! * pt.c (instantiate_class_template): Use CLASSTYPE_DECL_LIST ! to process members and friends in the order of declaration. ! ! 2002-10-29 Mark Mitchell ! ! PR c++/8287 ! * decl.c (finish_destructor_body): Create the label to jump to ! when returning from a destructor here. ! (finish_function_body): Rather than here. ! ! 2002-10-25 Zack Weinberg ! ! PR c++/7266 ! * decl.c (grokdeclarator): Check that TREE_OPERAND 0 of a ! SCOPE_REF is not null before dereferencing it. ! ! 2002-10-25 Mark Mitchell ! ! * call.c (build_over_call): Use DECL_CONTEXT, not ! DECL_VIRTUAL_CONTEXT. ! * class.c (modify_vtable_entry): Don't mess with ! DECL_VIRTUAL_CONTEXT. ! (set_vindex): Remove. ! (set_primary_base): Remove vfuns_p parameter. ! (determine_primary_base): Likewise. ! (modify_all_vtables): Likewise. ! (layout_class_type): Likewise. Adjust calls to other functions ! accordingly. ! (finish_struct_1): Adjust calls to modified functions. Set ! DECL_VINDEX here. ! * cp-tree.h (lang_type_class): Remove vsize. ! (CLASSTYPE_VSIZE): Remove. ! (lang_decl): Remove thunks. ! (DECL_THUNKS): Adjust. ! (DECL_VIRTUAL_CONTEXT): Remove. ! (duplicate_decls): Don't copy it. ! * pt.c (build_template_decl): Don't set it. ! (tsubst_decl): Likewise. ! * typeck.c (expand_ptrmemfunc_cst): Don't use it. ! ! * class.c (build_vtbl_initializer): Don't use build_vtable_entry. ! (build_vtable_entry): Remove. ! * cp-tree.h (BINFO_VIRTUALS): Expand documentation. ! (lang_decl): Add thunks. ! (DECL_THUNKS): New macro. ! * decl.c (duplicate_decls): Copy it. ! * method.c (make_thunk): Simplify, and add thunks to DECL_THUNKS. ! * semantics.c (emit_associated_thunks): Simplify. ! ! 2002-10-24 David Edelsohn ! ! PR c++/7228 ! * cp-tree.h (CLASSTYPE_READONLY_FIELDS_NEED_INIT): Check that ! lang_type structure exists before accessing field. ! (SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT): New macro. ! (CLASSTYPE_REF_FIELDS_NEED_INIT): Similar. ! (SET_CLASSTYPE_REF_FIELDS_NEED_INIT): New macro. ! * class.c (check_field_decls): Use new macros. ! * typeck2.c (process_init_constructor): Remove redundant check for ! existence of lang_type structure. ! ! 2002-10-24 Mark Mitchell ! ! * class.c (end_of_base): New method. ! (end_of_class): Use it. Check indirect virtual bases. ! ! * class.c (check_field_decls): Fix typo. ! ! 2002-10-23 Mark Mitchell ! ! PR c++/8067 ! * decl.c (maybe_inject_for_scope_var): Ignore __FUNCTION__ and ! related variables. ! ! PR c++/7679 ! * spew.c (next_token): Do not return an endless stream of ! END_OF_SAVED_INPUT tokens. ! (snarf_method): Add three END_OF_SAVED_INPUT tokens to the end of ! the cached token stream. ! (snarf_defarg): Likewise. ! ! 2002-10-23 Zack Weinberg ! ! * cp-lang.c (cp_var_mod_type_p): New: C++ hook for ! variably_modified_type_p. ! * cp-tree.h: Remove prototype of variably_modified_type_p. ! * tree.c (variably_modified_type_p): Remove; now implemented ! in language-independent code. ! ! 2002-10-22 Mark Mitchell ! ! PR c++/6579 ! * spew.c (snarf_parenthesized_expression): New function. ! (snarf_block): Use it. ! ! 2002-10-22 Richard Henderson ! ! * method.c (use_thunk): Always compute vcall_value; assert that ! it is not zero. Use can_output_mi_thunk; use output_mi_thunk ! for vcall thunks as well. ! ! 2002-10-21 Mark Mitchell ! ! * class.c (empty_base_at_nonzero_offset_p): New function. ! (layout_nonempty_base_or_field): Do not check for conflicts when ! laying out a virtual base using the GCC 3.2 ABI. ! (build_base_field): Correct checking for presence of empty classes ! at nonzero offsets when clearing CLASSTYPE_NEARLY_EMPTY_P. ! ! * class.c (include_empty_classes): Use normalize_rli. ! (layout_class_type): Likewise. ! ! * decl.c (reshape_init): Tweak handling of character arrays. ! ! PR c++/8218 ! * cp-tree.h (lang_type_class): Add contains_empty_class_p. ! (CLASSTYPE_CONTAINS_EMPTY_CLASS_P): New macro. ! * class.c (check_bases): Update CLASSTYPE_CONTAINS_EMPTY_CLASS_P. ! (check_field_decls): Likewise. ! (layout_class_type): Likewise. ! (finish_struct_1): Initialize it. ! (walk_subobject_offsets): Use it to prune searches. ! ! 2002-10-20 Mark Mitchell ! ! * method.c (use_thunk): Compute the vcall index as a HOST_WIDE_INT. ! * optimize.c (optimize_function): Replace ASM_OUTPUT_MI_THUNK with ! TARGET_ASM_OUTPUT_MI_THUNK in comments. ! ! 2002-10-18 Zack Weinberg ! ! * decl.c (start_decl): Point users of the old initialized- ! typedef extension at __typeof__. ! ! 2002-10-18 Mark Mitchell ! ! * Make-lang.in (method.o): Depend on TARGET_H. ! * method.c (target.h): Include it. ! (use_thunk): Use target hooks. Use vcall thunks, if available. ! ! 2002-10-18 Mark Mitchell ! ! * class.c (base_derived_from): Make sure return value is a bool. ! ! 2002-10-18 Mark Mitchell ! ! * class.c (find_final_overrider_data_s): Remove overriding_fn and ! overriding_base. ! (dfs_base_derived_from): New function. ! (base_derived_from): Likewise. ! (dfs_find_final_overrider): Use base_derived_from. ! (find_final_overrider): Adjust. ! ! 2002-10-18 Jason Merrill ! ! PR c++/8080 ! * semantics.c (finish_for_cond, finish_while_cond): Don't mess ! with condition decls in a template. ! ! 2002-10-17 Nathan Sidwell ! ! * class.c (add_method): Compare template parms too. ! ! 2002-10-17 Mark Mitchell ! ! PR c++/7584 ! * class.c (handle_using_decl): Allow the declaration used to be ! from an ambiguous base. ! ! * pt.c (convert_template_argument): Revert this change: ! 2002-10-16 Mark Mitchell ! * pt.c (convert_template_argument): Do not fold non-type ! template rguments when inside a template. ! ! * init.c (expand_default_init): Handle brace-enclosed initializers ! correctly. ! ! 2002-10-16 Mark Mitchell ! ! * mangle.c (write_expression): Correct handling of enumeration ! constants. ! (write_template_arg): Likewise. ! * pt.c (convert_template_argument): Do not fold non-type template ! arguments when inside a template. ! ! PR c++/7478 ! * cvt.c (convert_to_reference): Allow references as the incoming ! type. ! ! 2002-10-16 Mark Mitchell ! ! PR c++/7524 ! * method.c (do_build_assign_ref): Use cp_build_qualified_type, not ! build_qualified_type. ! ! 2002-10-15 Richard Henderson ! ! * error.c (dump_expr): Use real_to_decimal directly, and with ! the new arguments. ! ! 2002-10-15 Mark Mitchell ! ! * decl.c (reshape_init): Fix typo. ! ! * cp-tree.h (operator_name_info_t): Add arity. ! * lex.c (init_operators): Initialize it. ! * mangle.c (write_conversion_operator_name): New function. ! (write_unqualified_name): Use it. ! (write_template_args): Accept template arguments as a TREE_LIST. ! (write_expression): Adjust handling of qualified names to match ! specification. ! ! 2002-10-15 Jason Merrill ! ! * call.c (call_builtin_trap): New fn. ! (convert_arg_to_ellipsis): Use it. Downgrade error to warning. ! (build_call): Don't set current_function_returns_abnormally outside ! a function. ! ! 2002-10-14 Mark Mitchell ! ! * class.c (check_field_decls): Remove empty_p parameter. Instead, ! clear CLASSTYPE_EMPTY_P. ! (build_base_field): Likewise. ! (build_base_fields): Likewise. ! (check_bases_and_members): Likewise. ! (create_vtbl_ptr): Likewise. ! (layout_class_type): Likewise. Ensure that empty classes have ! size zero when used as base classes in the 3.2 ABI. ! (finish_struct_1): Initialize CLASSTYPE_EMPTY_P and ! CLASSTYPE_NEARLY_EMPTY_P. Adjust calls to avoid passing empty_p ! parameter. ! (is_empty_class): Correct definition when using post-3.2 ABI. ! * cp-tree.h (lang_type_class): Add empty_p. ! (CLASSTYPE_EMPTY_P): New macro. ! ! 2002-10-12 Nathan Sidwell ! ! * init.c (build_delete): Do not apply save_expr for arrays. ! (build_vec_delete): Likewise. ! ! 2002-10-14 Mark Mitchell ! ! * decl.c (layout_var_decl): Call layout_decl even for variables ! whose type is an array with unspecified bounds. ! ! PR c++/7176 ! * lex.c (do_identifier): Add another option for the parsing ! parameter. ! * parse.y (do_id): Use it. ! ! 2002-10-11 Gabriel Dos Reis ! ! PRs C++/6803, C++/7721 and C++/7803 ! * decl.c (grokdeclarator): Gracefully handle template-name as ! decl-specifier. ! ! 2002-10-11 Jason Molenda ! ! * init.c (build_field_list): Provide uses_unions_p with a default ! value. ! ! 2002-10-11 Mark Mitchell ! ! PR c++/5661 ! * cp-tree.h (variably_modified_type_p): New function. ! (grokdeclarator) Tighten check for variably modified types as ! fields. ! * pt.c (convert_template_argument): Do not allow variably modified ! types as template arguments. ! * tree.c (variably_modified_type_p): New function. ! ! * NEWS: Document removal of "new X = ..." extension. ! * class.c (initialize_array): Set TREE_HAS_CONSTRUCTOR on ! brace-enclosed initializers. ! * cp-tree.h (CP_AGGREGATE_TYPE_P): New macro. ! (initialize_local_var): Remove declaration. ! (expand_static_init): Likewise. ! * decl.c (next_initializable_field): New function. ! (reshape_init): Likewise. ! (check_initializer): Use them. Build dynamic initializer for ! aggregates here too. ! (initialize_local_var): Simplify, and incorporate cleanup ! insertion code as well. ! (destroy_local_var): Remove. ! (cp_finish_decl): Tidy. ! (expand_static_init): Fold checks for whether or not a variable ! needs initialization into this function. Simplify. ! * decl2.c (do_static_initialization): Simplify. ! * init.c (build_init): Do not set TREE_SIDE_EFFECTS when it will ! be done for us automatically. ! (expand_default_init): Handle brace-enclosed initializers ! correctly. ! (expand_aggr_init_1): Remove RTL-generation code. ! (build_vec_init): Remove "new X = ..." support. ! * parse.y (new_initializer): Likewise. ! * rtti.c (get_pseudo_ti_init): Set TREE_HAS_CONSTRUCTOR on ! brace-enclosed initializer. ! (create_pseudo_type_info): Likewise. ! * typeck2.c (store_init_value): Don't try to handle digest_init ! being called more than once. ! (digest_init): Tidy handling of brace-enclosed initializers. ! ! 2002-10-10 Kaveh R. Ghazi ! ! * decl.c (typename_hash): Use htab_hash_pointer. ! ! 2002-10-10 Jim Wilson ! ! * decl.c (duplicate_decls): Don't call decl_attributes. ! ! 2002-10-09 Zack Weinberg ! ! PR c/7353 ! * decl.c (start_decl): Unconditionally issue error for ! 'typedef foo = bar'. ! (cp_finish_decl): Remove special case for TYPE_DECL with initializer. ! (grokdeclarator): Remove redundant error for 'typedef foo = bar'. ! ! 2002-10-09 Kaveh R. Ghazi ! ! * decl2.c (prune_vtable_vardecl): Delete unused function. ! ! 2002-10-03 Mark Mitchell ! ! PR c++/7754 ! * decl2.c (finish_anon_union): Do not expand anonymous unions when ! procesing template functions. ! * pt.c (tsubst_decl, case VAR_DECL): Try to complete the variable ! type. Call layout_decl. ! (tsubst_expr, case DECL_STMT): Handle anonymous unions. ! ! 2002-10-07 Richard Henderson ! ! * decl2.c, pt.c: Revert c++/7754 fix. ! ! 2002-10-05 Kriang Lerdsuwanakij ! ! PR c++/7804 ! * error.c (dump_expr) [REAL_CST]: Output in decimal format. ! ! 2002-10-03 Mark Mitchell ! ! PR c++/7931 ! * pt.c (for_each_template_parm_r): Handle BASELINKs. ! ! PR c++/7754 ! * decl2.c (finish_anon_union): Do not expand anonymous unions when ! procesing template functions. ! * pt.c (tsubst_decl, case VAR_DECL): Try to complete the variable ! type. Call layout_decl. ! (tsubst_expr, case DECL_STMT): Handle anonymous unions. ! ! 2002-10-03 Mark Mitchell ! ! PR c++/8006 ! * mangle.c (CLASSTYPE_TEMPLATE_ID_P): Handle instances of template ! template parameters. ! (globals): Add entity and need_abi_warning. ! (decl_is_template_id): Use TYPE_TEMPLATE_INFO, not ! CLASSTYPE_TEMPLATE_INFO. ! (is_std_substitution): Use CLASSTYPE_TI_TEMPLATE, not ! TYPE_TI_TEMPLATE. ! (write_prefix): Handle typename types correctly. ! (write_template_prefix): Handle template template parameters ! correctly. ! (start_mangling): Add entity parameter. ! (finish_mangling): Warn about names whose mangling will change. ! (mangle_decl_string): Adjust. ! (mangle_type_string): Likewise. ! (mangle_special_for_type): Likewise. ! (mangle_ctor_vtbl_for_type): Likewise. ! (mangle_thunk): Likewise. ! (mangle_guard_variable): Likewise. ! (mangle_ref_init_variable): Likewise. ! ! 2002-10-02 Mark Mitchell ! ! PR c++/7188. ! * cp-tree.def (CTOR_INITIALIZER): Use one slot, not two. ! * cp-tree.h (emit_base_init): Rename to .... ! (emit_mem_initializers): ... this. ! (expand_member_init): Change prototype. ! * init.c (perform_member_init): Compute explicit, rather than ! requiring it as a parameter. ! (sort_member_init): Rename to ... ! (sort_mem_initializers): ... this. Process bases and data members ! together. ! (sort_base_init): Remove. ! (emit_base_init): Rename to ... ! (emit_mem_initializers): ... this. ! (expand_aggr_vbase_init_1): Remove. ! (construct_virtual_bases): Rename to ... ! (construct_virtual_base): ... this. ! (expand_member_init): Rework handling of base initializers. ! * method.c (do_build_copy_constructor): Use ! finish_mem_initializers. ! * parse.y (member_init): Adjust calls to expand_member_init. ! * pt.c (tsubst_expr): Simplify CTOR_INITIALIZER case. ! (tsubst_initializer_list): Use expand_member_init. ! * semantics.c (finish_mem_intiailizers): Simplify. ! ! 2002-10-02 Matt Austern ! * decl.c (walk_vtables_r): Fixed typo that caused result to ! never get a nonzero value. ! ! 2002-10-02 Roger Sayle ! ! PR optimization/6627 ! * cp-tree.h (enum ptrmemfunc_vbit_where_t): Delete definition ! from here, and move it to tree.h. ! * decl.c (cxx_init_decl_processing): If storing the vbit ! in function pointers, ensure that force_align_functions_log ! is atleast one. ! ! 2002-10-02 Matt Austern ! ! * class.c (check_field_decls): Changed warning about const member ! variables so that it doesn't get issued for a class aggregate. ! ! 2002-10-01 Mark Mitchell ! ! * decl.c (cp_finish_decl): Make sure array types are laid out, ! even if the array bounds are unknown. ! ! 2002-10-01 Steve Ellcey ! ! * class.c (build_vtbl_initializer): Change build_c_cast ! to build1. ! ! 2002-10-01 Mark Mitchell ! ! * decl.c (cp_finish_decl): Make sure array types are laid out, ! even if the array bounds are unknown. ! ! * decl.c (cp_finish_decl): Correct check for dynamic ! initialization of thread-local storage. ! ! 2002-09-30 Nathan Sidwell ! ! * tree.c (really_overloaded_fn): TEMPLATE_ID_EXPRs are also ! overloaded. ! ! 2002-09-30 Steve Ellcey ! ! * class.c (build_vtbl_initializer): Add cast. ! (add_vcall_offset_vtbl_entries_1): ! Use TARGET_VTABLE_DATA_ENTRY_DISTANCE for offset. ! ! 2002-09-30 Mark Mitchell ! ! * class.c (walk_subobject_offsets): Correct the calculation of ! offsets for virtual bases. Correct the counting of array ! elements. ! (layout_nonempty_base_or_field): Simplify. Correct the ! calculation of offsets to be propagated through the binfo ! hierarchy. ! (build_base_field): Avoid creating a FIELD_DECL for empty bases. ! Add the FIELD_DECL to TYPE_FIELDS. ! (build_base_fields): Adjust accordingly. ! (layout_virtual_bases): Use build_base_field. ! (end_of_class): Return a tree, not an integer. ! (warn_about_ambiguous_direct_bases): Rename to ... ! (warn_about_ambiguous_bases): ... this. ! (include_empty_classes): New function. ! (layout_class_type): Create an alternative version of the type to ! be used when as a base class type. Do not call ! finish_record_layout until we are done laying out the class. ! * cp-tree.h (lang_type_class): Remove size, size_unit. Add ! as_base. ! (CLASSTYPE_SIZE): Reimplement. ! (CLASSTYPE_SIZE_UNIT): Likewise. ! (CLASSTYPE_ALIGN): Likweise. ! (CLASSTYPE_USER_ALIGN): Likewise. ! (CLASSTYPE_AS_BASE): New macro. ! (DECL_INITIALIZED_P): Likewise. ! (extract_init): Remove prototype. ! (build_forced_zero_init): Rename to ... ! (build_zero_init): ... this. ! (force_store_init_value): Remove. ! * decl.c (obscure_complex_init): Remove. ! (duplicate_decls): Copy DECL_INITIALIZED_P. ! (check_initializer): Do not leave junk in DECL_INITIAL. ! (cp_finish_decl): Handle zero-initialization of entities with ! static storage duration. ! * expr.c (extract_init): Remove. ! * init.c (build_forced_zero_init): Remove. ! (build_zero_init): New function. ! (build_default_init): Use it. ! (build_field_list): Skip FIELD_DECLs for base subobjects. ! (push_base_cleanups): Likewise. ! * method.c (do_build_assign_ref): Likewise. ! (synthesize_exception_spec): Likewise. ! * pt.c (tsubst_decl): Clear DECL_INITIALIZED_P. ! (regenerate_decl_from_template): To not set DECL_INITIAL for a ! static data member whose initialization took place in its class. ! (instantiate_decl): Do not pass an initializer to cp_finish_decl ! in that situation. ! * search.c (dfs_push_decls): Skip FIELD_DECLs for base subobjects. ! (dfs_unuse_fields): Likewise. ! * tree.c (pod_type_p): Handle error_mark_node. ! (zero_init_p): Likewise. ! * typeck.c (lookup_anon_field): Skip FIELD_DECLs for base ! subobjects. ! * typeck2.c (store_init_value): Remove #if 0'd code. ! (force_store_init_value): Remove. ! (process_init_constructor): Use build_zero_init. ! ! 2002-09-29 Nathan Sidwell ! ! PR c++/7788 ! * rtti.c (unemitted_tinfo_decl_p): Check it has a field. ! 2002-09-29 Kazu Hirata ! * cp-tree.h: Fix comment typos. ! * decl.c: Likewise. ! * pt.c: Likewise. ! 2002-09-25 Mark Mitchell ! * cp/class.c (contains_empty_class_p): New method. ! (walk_subobject_offsets): Correct computation of field offset. ! (layout_empty_base): Correct placement of emtpy base classes. ! (layout_class_type): Warn about ABI changes. ! 2002-09-23 Mark Mitchell ! * cp/class.c (layout_virtual_bases): Do not round the size of the ! type to a multiple of the alignment before laying out virtual bases. ! (layout_class_type): Correct handling of bit-fields that are wider ! than their type inside unions. Round the size of the type to a ! even number of bytes when computing the size without virtual ! bases. ! * cp/cp-tree.h (abi_version_at_least): New macro. ! 2002-09-21 Kazu Hirata ! * ChangeLog: Follow spelling conventions. ! * ChangeLog.2: Likewise. ! * call.c: Likewise. * class.c: Likewise. - * cp-tree.h: Likewise. - * cvt.c: Likewise. - * decl.c: Likewise. * decl2.c: Likewise. * except.c: Likewise. - * friend.c: Likewise. - * g++spec.c: Likewise. - * init.c: Likewise. - * lex.c: Likewise. - * mangle.c: Likewise. - * method.c: Likewise. - * operators.def: Likewise. - * optimize.c: Likewise. - * pt.c: Likewise. - * rtti.c: Likewise. - * search.c: Likewise. - * semantics.c: Likewise. - * spew.c: Likewise. - * tree.c: Likewise. - * typeck.c: Likewise. - - 2002-09-18 Devang Patel - - * cp/cp-tree.h: New prototype for walk_vtabls(). - * cp/decl.c (walk_vtables_r): New function. - (struct cp_binding_level): Add new members, namespaces, - names_size and vtables. - (add_decl_to_level): Add decl in namespaces or vtables - chain, if conditions match. - (walk_vtables): New function. - (walk_namespaces_r): Travers separate namespace chain - for namespace decls. - (wrapup_globals_for_namespace): Use names_size instead - of list_length(). - * cp/decl2.c (finish_file): Use walk_vtables() instead of - walk_globals() to walk vtable decls. - - 2002-09-18 Nathan Sidwell - - * decl.c (grokdeclarator): Use assert, not internal_error. Don't - ICE with invalid pointers & references. - - 2002-09-17 Zack Weinberg - - * Make-lang.in: Remove all references to the demangler. - * cxxfilt.c: Moved to binutils. - - 2002-09-16 Nathan Sidwell - - PR c++/7718 - * pt.c (tsubst_decl): Remove assert. - - Remove DR 295 implementation. - * pt.c (check_cv_quals_for_unify): Disable function & method cases. - * tree.c (cp_build_qualified_type_real): Likewise. Don't warn - about ignoring volatile qualifiers. - - * search.c (lookup_member): Correct documentation. - - 2002-09-16 Geoffrey Keating - - * cp-tree.h (union lang_tree_node): Add chain_next option. - - 2002-09-16 Nathan Sidwell - - * parse.y (parse_finish_call_expr): Check lookup_member result. - - PR c++/7015 - * semantic.c (finish_asm_stmt): Fix operand/output_operands - thinko. - * typeck.c (c_expand_asm_operands): Protect from error_mark_node. - - 2002-09-15 Nathan Sidwell - - PR c++/7919 - * call.c (build_over_call): Convert this pointer for fns found by - using decls. - - 2002-09-15 Kazu Hirata - - * ChangeLog: Follow spelling conventions. - * ChangeLog.1: Likewise. - - 2002-09-14 Nathan Sidwell - - PR c++/7768 - * pt.c (build_template_decl): Copy DECL_DESTRUCTOR_P. - - 2002-09-14 Kazu Hirata - - * error.c: Fix comment formatting. - * except.c: Likewise. * expr.c: Likewise. - * friend.c: Likewise. - * g++spec.c: Likewise. * init.c: Likewise. - * lex.c: Likewise. * mangle.c: Likewise. - * method.c: Likewise. * optimize.c: Likewise. - * pt.c: Likewise. - * rtti.c: Likewise. - * search.c: Likewise. - * semantics.c: Likewise. - * spew.c: Likewise. - * tree.c: Likewise. * typeck.c: Likewise. * typeck2.c: Likewise. ! 2002-09-13 Matt Austern ! ! PR C++/7828 ! * cp/cp-tree.h, cp/tree.c: New function non_cast_lvalue_p. ! * cp/call.c: Change call-by-const-reference mechanism to use ! non_cast_lvalue_p when deciding whether the create a temporary. ! We need a temporary when passing, e.g. (long) x by const ref. ! ! 2002-09-13 Nathan Sidwell ! ! * pt.c (unify, ARRAY_TYPE): Element type can be more qualified. ! ! 2002-09-13 Kazu Hirata ! ! * decl.c: Fix comment formatting. ! * decl2.c: Likewise. ! ! 2002-09-12 Kazu Hirata ! ! * call.c: Fix comment formatting. ! * class.c: Likewise. ! * cp-lang.c: Likewise. ! * cp-tree.h: Likewise. ! * cvt.c: Likewise. ! ! 2002-09-11 Zack Weinberg ! ! * Make-lang.in: Build cp/cxxfilt.o from $(srcdir)/cp/cxxfilt.c, ! and c++filt from cxxfilt.o + version.o + $(LIBDEPS). ! * cxxfilt.c: New file: split from libiberty/cplus-dem.c, with ! minor adjustments (use version_string, eliminate yet another ! duplicate of xmalloc) ! ! 2002-09-08 Kaveh R. Ghazi ! ! * cp-tree.h (require_complete_eh_spec_types): Add prototype. ! ! 2002-09-05 Jason Merrill ! ! * typeck2.c (add_exception_specifier): Only pedwarn for an ! incomplete type. ! (require_complete_eh_spec_types): New fn. ! (cxx_incomplete_type_diagnostic): Also support pedwarning. ! * typeck.c (complete_type_or_diagnostic): Likewise. ! * call.c (build_call): Call require_complete_eh_spec_types. ! * rtti.c (get_pseudo_ti_desc): Give an error rather than aborting ! on an incomplete type. ! ! 2002-09-04 Jakub Jelinek ! ! * decl.c (start_cleanup_fn): Clear interface_only before ! start_function, restore it afterwards. ! ! 2002-08-31 Jason Merrill ! ! * cp-lang.c (cp_expr_size): Allow initialization from a ! CONSTRUCTOR. ! ! 2002-08-30 Richard Henderson ! ! PR opt/7515 ! * tree.c: Include target.h. ! (cp_cannot_inline_tree_fn): Don't auto-inline functions that ! don't bind locally. ! * Makefile.in (tree.o): Update. ! ! 2002-08-27 Mark Mitchell ! ! * class.c (layout_virtual_bases): Warn about bugs in G++ that ! result in incorrect object layouts. ! (layout_class_type): Likewise. ! ! 2002-08-24 Matt Austern ! ! * tree.c (lvalue_p_1): Add argument for whether casts of lvalues ! are allowable. ! (real_lvalue_p): Update caller. ! (lvalue_p): Ditto. ! (non_cast_lvalue_or_else): New. ! * tree.h: Declare it. ! * typeck.c (build_unary_op): Use non_cast_lvalue_or_else. ! ! 2002-08-22 Mark Mitchell ! ! * typeck.c (build_class_member_access_expr): Handle COMPOUND_EXPR ! and COND_EXPR specially; fix error message output. ! ! 2002-08-22 Jason Merrill ! ! * pt.c (tsubst_expr): RETURN_EXPR is now RETURN_STMT_EXPR. ! * semantics.c (nullify_returns_r): Likewise. ! ! 2002-08-17 Gabriel Dos Reis ! ! Fix PR/7621 ! * typeck.c (finish_class_member_access_expr): Diagnose cases where ! name lookup finds nothing. ! ! 2002-08-15 Jason Merrill ! ! * semantics.c (finish_then_clause): Remove redundant assignment. ! (finish_if_stmt, begin_switch_stmt, finish_switch_stmt): Move the ! extra binding level outside the if/switch statement. ! (finish_while_cond, finish_for_cond): Rewrite complex condition ! into the loop body. ! ! 2002-08-15 Alexandre Oliva ! * parse.y (sizeof, alignof, typeof): New non-terminals to ! increment skip_evaluation. Replace terminals with them and ! decrement skip_evaluation at the end of rules using them. ! * decl2.c (mark_used): Don't assemble_external if ! skipping evaluation. ! 2002-08-15 Gabriel Dos Reis ! Fix PR/7504 ! * parse.y (parse_finish_call_expr): Handle incomplete ! type used to name a scope. ! 2002-08-15 Nathan Sidwell ! PR c++/7598 ! * typeck.c (build_unary_op): Fold offsetof idiom. Fixes ! regression caused by my 2002-08-08 patch. ! 2002-08-13 Mark Mitchell ! * decl.c (pushdecl_class_level): Honor requests to bind names to ! OVERLOADs. ! 2002-08-11 Kaveh R. Ghazi ! * decl2.c (build_call_from_tree): Fix uninitialized variable. ! * parse.y (parse_finish_call_expr): Likewise. ! * repo.c (old_args, old_dir, old_main): Const-ify. ! 2002-08-11 Gabriel Dos Reis ! * decl.c (duplicate_decls): Replace DECL_SOURCE_FILE + ! DECL_SOURCE_LINE with DECL_SOURCE_LOCATION. ! * optimize.c (maybe_clone_body): Likewise. ! * pt.c (tsubst_enum): Likewise. ! (lookup_template_class): Likewise. ! * tree.c (cp_copy_res_decl_for_inlining): Likewise. ! 2002-08-10 Neil Booth ! * lang-specs.h: Remove -ansi. ! 2002-08-10 Nathan Sidwell ! * tree.c (maybe_dummy_object): Replace // with /* */ ! 2002-08-09 Mark Mitchell ! * call.c (standard_conversion): Use build_ptrmem_type. ! * cp-tree.h (build_ptrmem_type): New function. ! (adjust_result_of_qualified_name_lookup): Likewise. ! * decl.c (grokvardecl): Do not look for OFFSET_TYPEs to indicate ! static data members. ! (build_ptrmem_type): New function. ! (grokdeclarator): Do not use build_offset_type when encountering a ! qualified name. ! * parse.y (parse_finish_call_expr): Use ! adjust_result_of_qualified_name_lookup. ! * search.c (adjust_result_of_qualified_name_lookup): New function. ! * typeck.c (qualify_type_recursive): Use TYPE_PTRMEM_* rather than ! accessing OFFSET_TYPEs directly. ! 2002-08-08 Mike Stump ! * call.c (add_builtin_candidate): legal -> valid, illegal -> invalid. ! (type_decays_to): Likewise. ! * class.c (find_final_overrider): Likewise. ! (maybe_note_name_used_in_class): Likewise. ! * decl.c (current_tmpl_spec_kind): Likewise. ! (add_binding): Likewise. ! (push_class_binding): Likewise. ! (duplicate_decls): Likewise. ! (layout_var_decl): Likewise. ! (grokfndecl): Likewise. ! (grokdeclarator): Likewise. ! (check_default_argument): Likewise. ! * decl2.c (handle_class_head): Likewise. ! * error.c (dump_template_decl): Likewise. ! * init.c (build_offset_ref): Likewise. ! * pt.c (check_specialization_scope): Likewise. ! (determine_specialization): Likewise. ! (check_explicit_specialization): Likewise. ! (maybe_check_template_type): Likewise. ! (process_partial_specialization): Likewise. ! (check_default_tmpl_args): Likewise. ! (push_template_decl_real): Likewise. ! (convert_template_argument): Likewise. ! (try_class_unification): Likewise. ! (get_bindings_real): Likewise. ! (do_decl_instantiation): Likewise. ! * semantics.c (begin_function_definition): Likewise. ! (finish_member_declaration): Likewise. ! (check_multiple_declarators): Likewise. ! * typeck.c (comp_array_types): Likewise. ! (comptypes): Likewise. ! (expr_sizeof): Likewise. ! (build_binary_op): Likewise. ! (dubious_conversion_warnings): Likewise. ! (check_return_expr): Likewise. ! 2002-08-08 Mark Mitchell ! * typeck.c (build_class_member_access_expr): Do not return ! error_mark_node when no error has occurred. ! 2002-08-08 Nathan Sidwell ! * typeck.c (build_component_addr): Remove. ! (build_unary_op): Just check it's not a bitfield, and then build ! an ADDR_EXPR. ! 2002-08-08 Nathan Sidwell ! * class.c (convert_to_base): Correct check for error_mark_node. ! (create_vtable_ptr): Remove unused VFUNS_P parm. ! 2002-08-08 Nathan Sidwell ! * cp/Make-lang.in (c++.mostlyclean): Remove coverage files. ! 2002-08-07 Mark Mitchell ! Rework build_component_ref. ! * call.c (build_vfield_ref): Do not go through build_component_ref. ! (build_field_call): Use build_class_member_access_expr. ! (build_user_type_conversion_1): Use BASELINK_FUNCTIONS. ! (build_object_call): Likewise. ! * class.c (convert_to_base): New function. ! (type_requires_array_cookie): Use BASELINK_FUNCTIONS. ! (instantiate_type): Handle BASELINKs. ! * cp-tree.def (BASELINK): New tree code. ! * cp-tree.h (BASELINK_P): Reimplement. ! (SET_BASELINK_P): Remove. ! (BASELINK_BINFO): Reimplement. ! (BASELINK_FUNCTIONS): Likewise. ! (BASELINK_ACCESS_BINFO): Likewise. ! (BASELINK_OPTYPE): Likewise. ! (convert_to_base): New function. ! (name_p): Likewise. ! (build_object_ref): Remove. ! (build_component_ref_1): Likewise. ! (build_component_ref): Likewise. ! (build_x_component_ref): Likewise. ! (build_class_member_access_expr): New function. ! (finish_class_member_access_expr): Likewise. ! (build_ptrmemfunc_access_expr): Likewise. ! * decl.c (grokdeclarator): Handle BASELINKs. ! * decl2. (build_expr_from_tree): Handle COMPONENT_REFs by using ! finish_class_member_access_expr. ! (arg_assoc): Handle BASELINKs. ! (do_class_using_decl): Likewise. ! * error.c (dump_decl): Likewise. ! (dump_expr): Use build_ptrmemfunc_access_expr. ! * except.c (dtor_nothrow): Use CLASSTYPE_DESTRUCTORS to find ! destructors. ! (build_throw): Use BASELINK_FUNCTIONS. ! * init.c (perform_member_init): Use ! build_class_member_access_expr. ! (build_offset_ref): Handle BASELINKs. Use ! build_class_member_access_expr. ! * method.c (hack_identifier): Likewise. ! * parse.y (do_id): Use BASELINK, not TREE_LIST. ! (primary): Remove uses of build_object_ref. ! * pt.c (lookup_template_function): Handle BASELINKs. ! (resolve_overloaded_unification): Likewise. ! * search.c (build_baselink): Build a BASELINK, not a TREE_LIST. ! (lookup_field): Use BASELINK, not TREE_LIST. ! (lookup_fnfiels): Likewise. ! (setup_class_bindings): Likewise. ! * semantics.c (finish_object_call_expr): Do not use ! build_method_call when we already know what function is being ! called. ! * spew.c (identifier_type): Use BASELINK, not TREE_LIST. ! * tree.c (really_overloaded_fn): Use OVL_CHAIN for OVERLOADs, not ! TREE_CHAIN. ! (name_p): New function. ! * typeck.c (build_object_ref): Remove. ! (build_component_ref_1): Likewise. ! (build_x_component_ref): Likewise. ! (build_class_member_access_expr): New function. (finish_class_member_access_expr): Likewise. - (build_ptrmemfunc_access_expr): Likewise. - (get_member_function_from_ptrfunc): Use - build_ptrmemfunc_access_expr. - (build_binary_op): Likewise. - (build_unary_op): Likewise. - (build_ptrmemfunc): Likewise. - (pfn_from_ptrmemfunc): Likewise. - * typeck2.c (build_m_component_ref): Adjust comment. - - 2002-08-07 Neil Booth - - * Make-lang.in (CXX_C_OBJS): Update. - * cp-lang.c (LANG_HOOKS_DECODE_OPTION): Use c_common_decode_option. - * cp-tree.h (cxx_decode_option): Remove. - * decl2.c (compare_options, lang_f_options, unsupported_options, - cxx_decode_option): Remove. - - 2002-08-06 Gabriel Dos Reis - - * typeck.c (build_x_unary_op): Handle pointer-to-member. - - 2002-08-05 Geoffrey Keating - - * class.c: Don't include obstack.h. - (popclass): - * decl2.c: Delete bogus comment. - * error.c: Don't include obstack.h. - * except.c: Likewise. - (dump_type): Correct comment. - * method.c: Don't include obstack.h. - * tree.c: Likewise. - - 2002-08-04 Gabriel Dos Reis - - Fix PR/2213 - * cvt.c (cp_convert_to_pointer): Reject conversions from integral - expressions to pointer-to-data-member of pointer-to-member-functions. - - 2002-08-04 Geoffrey Keating - - * cvt.c (ocp_convert): Delete obsolete code. - * parse.y (permanent_obstack): Delete declaration. - * pt.c (permanent_obstack): Delete declaration. - * repo.c (permanent_obstack): Delete declaration. - (open_repo_file): Use xmalloc instead of permanent_obstack. - (init_repo): Use xstrdup instead of permanent_obstack. - - 2002-08-04 Nathan Sidwell - - * cp-tree.h (VF_DERIVED_VALUE): Remove. - * class.c (finish_struct_1): Use VF_BINFO_VALUE not VF_DERIVED_VALUE. - - 2002-08-03 Nathan Sidwell - - PR 7470. - C++ ABI change - vfunc ordering. - * class.c (add_virtual_function): Remove. - (dfs_modify_all_vtables): Take list of all declared - virtuals. Assign all that are not in primary base. - (check_for_override): Adjust comments. - (create_vtable_ptr): Take single list of virtuals. Build chain - of declared virtuals here. - (layout_class_type): Take single list of virtuals. Adjust. - (finish_struct_1): Keep virtuals on single list. Adjust. - - 2002-08-02 Mark Mitchell - - * init.c (build_member_call): Use build_new_method_call, not - build_method_call. - - 2002-08-02 Krister Walfridsson - - * Make-lang.in (spew.o, lex.o, pt.o): Add path to parse.h dependencies. - - 2002-08-02 Mark Mitchell - - * call.c (build_method_call): Issue a more helpful error message - about ambiguous method names. - - 2002-08-02 Nathan Sidwell - - * tree.c (build_shared_int_cst): Make cache file scope, and - GTY it. - - 2002-08-02 Jason Merrill - - * cp-lang.c (LANG_HOOKS_EXPR_SIZE): Define. - (cp_expr_size): New fn. - * call.c (build_over_call): Lose empty class hackery. - (convert_arg_to_ellipsis): Promote non-POD warning to error. - * typeck.c (build_modify_expr): Don't use save_expr on an lvalue. - - * semantics.c (expand_body): Do tree optimization in the function - context, too. - - 2002-08-01 Neil Booth - - * cp-tree.h: Move all warning and flag declarations to c-common.h. - * decl.c: Move all warning and flag variables to c-common.c. - * decl2.c: Move all warning and flag variables to c-common.c. - * lex.c (flag_digraphs): Remove. - (warn_traditional): Now in c-common.c. - - 2002-07-31 Mark Mitchell - - * call.c (build_field_call): Do not look up the field by name. - (build_method_call): Simplify. - (struct z_candidate): Add access_path and conversion_path. Remove - basetype_path. - (convert_class_to_reference): Adjust use of - add_function_candidate. - (add_candidate): Add conversion_path argument. - (add_function_candidate): Use it. - (add_conv_dndidate): Likewise. - (build_builtin_candidate): Likewise. - (add_template_candidate_real): Add conversion_path argument. - (add_template_conv_candidate): Likewise. - (add_template_candidate): Likewise. - (build_user_type_conversion_1): Use it. - (build_new_function_call): Remove name lookup code. Adjust use of - add_template_candidate and add_function_candidate. - (build_new_op): Likewise. - (convert_like_real): Use build_special_member_call. - (build_over_call): Use cand->conversion_path. - (build_special_member_call): New method. - (build_new_method_call): Remove name lookup code. - * cp-tree.def (OFFSET_REF): Update documentation. - (TEMPLATE_ID_EXPR): Likewise. - * cp-tree.h (BASELINK_ACCESS_BINFO): New macro. - (BASELINK_OPTYPE): Likewise. - (build_new_method_call): Adjust prototype. - (build_special_member_call): New method. - (build_baselink): New method. - (build_offset_ref_call_from_tree): Likewise. - (build_call_from_tree): Likewise. - (finish_qualified_call_expr): Remove. - (finish_call_expr): Adjust prototype. - (build_x_function_call): Remove. - * cvt.c (ocp_convert): Use build_special_member_call. - * decl2.c (reparse_absdcl_as_expr): Use finish_call_expr. - (build_expr_from_tree): Adjust handling for TEMPLATE_ID_EXPR and - CALL_EXPR. - (build_offset_ref_call_from_tree): New function. - (build_call_from_tree): Likewise. - * init.c (expand_cleanup): Use build_special_member_call. - (expand_default_init): Likewise. - (build_member_call): Use finish_call_expr. - (build_new_1): Use build_special_member_call. - (push_base_cleanups): Likewise. - * method.c (do_build_assign_ref): Likewise. - * parse.y (template_id): Do not pass a COMPONENT_REF to - lookup_template_function. - (primary): Use parse_finish_call_epxr, not finish_call_expr. - (parse_finish_call_expr): New function. - * pt.c (lookup_template_function): Add assertions. - * search.c (lookup_base): Allow T to be a binfo. - (build_baselink): New function. - (lookup_member): Use it. - * semantics.c (finish_call_expr): Do not do name lookup. - (finish_object_call_expr): Remove #if 0'd code. - (finish_qualified_call_expr): Remove. - * typeck.c (build_x_function_call): Remove. - (build_static_case): Use build_special_member_call. - * typeck2.c (build_functional_cast): Likewise. - - 2002-07-30 Franz Sirl - - * lang-specs.h: Remove __GXX_ABI_VERSION, moved to gcc.c. - - 2002-07-30 Gabriel Dos Reis - - * cp-tree.h (VF_DERIVED_VALUE): Restore from previous deletion. - - 2002-07-30 Nathan Sidwell - - * cp-tree.h (CLASSTYPE_VFIELDS, VF_*, BV_*): Add more - documentation. - - 2002-07-29 Alan Modra - - * cp-tree.h: Comment typo fix. - - 2002-07-29 Richard Earnshaw - - * spew.c (space_for_token): Allocate zeroed memory for a new token - chunk. - - 2002-07-27 Roger Sayle - - * decl.c (builtin_function_1): No need to explicitly mark - BUILT_IN_RETURN and BUILT_IN_EH_RETURN as noreturn. - - 2002-07-27 Roger Sayle - - * decl2.c (cxx_decode_option): Support -fno-builtin-foo. - - 2002-07-26 Jason Merrill - - * call.c (build_over_call): Likewise. - (cp_convert_parm_for_inlining): New fn. - (convert_for_arg_passing): New fn. - (convert_default_arg, build_over_call): Use it. - (type_passed_as): New fn. - * pt.c (tsubst_decl): Use it. - * decl2.c (cp_build_parm_decl): New fn. - (build_artificial_parm): Use it. - (start_static_storage_duration_function): Likewise. - * decl.c (start_cleanup_fn, grokdeclarater): Likewise. - (grokparms): Don't mess with DECL_ARG_TYPE. - * typeck.c (convert_arguments): Use convert_for_arg_passing. - * cp-lang.c (LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING): - Define. - * cp-tree.h: Declare new fns. - - 2002-07-26 Neil Booth - - * cp-tree.h (flag_operator_names): Remove. - * decl2.c (flag_operator_names): Remove. - (lang_f_options): Remove operator-names. - * lex.c (D_OPNAME): Remove. - (reswords): Remove operator names. - (rid_to_yy): Remove operator names. - (init_reswords): No need to handle D_OPNAME. - * spew.c (read_process_identifier): There are no operator - names. - - 2002-07-26 Jason Merrill - - * dump.c (cp_dump_tree): Call c_dump_tree. - * Make-lang.in (CXX_C_OBJS): Add c-dump.o. - - 2002-07-25 Neil Booth - - * error.c (print_whitespace): Remove. - * g++spec.c (LIBUNWIND): Move. - * mangle.c (mangled_position, write_signed_number): Remove. - - 2002-07-25 Neil Booth - - * decl2.c (cxx_decode_option): Similarly. - - 2002-07-25 Gabriel Dos Reis - - * cp-tree.h (cxx_sizeof_nowarn): Now a macro. - (cxx_sizeof_or_alignof_type): Take a third argument. - (cxx_sizeof): Adjust definition. - (cxx_alignof): Likewise. - * init.c (build_delete): Use cxx_sizeof_nowarn to reflect reality. - * typeck.c (cxx_sizeof_or_alignof_type): Take a third argument for - complaining. - (c_sizeof_nowarn): Remove definition. - (build_unary_op): Use cxx_sizeof_nowarn. - - 2002-07-24 Geoffrey Keating - - * tree.c (cp_build_qualified_type_real): When copying - pointer-to-method types, unshare the record that holds - the cached pointer-to-member-function type. - - 2002-07-23 Neil Booth - - * cp-tree.h (FILE_FUNCTION_PREFIX_LEN): Remove. ! 2002-07-23 Gabriel Dos Reis ! ! Fix PR/7363: ! * typeck.c (cxx_sizeof_or_alignof_type): New function. ! (c_sizeof): Remove definition. ! (expr_sizeof): Use cxx_sizeof. ! * decl2.c (build_expr_from_tree): Use cxx_sizeof_or_alignof_type. ! * decl.c (finish_destructor_body): Use cxx_sizeof. ! * semantics.c (finish_alignof): Likewise. ! (finish_alignof): Use cxx_alignof. ! * cp-tree.h (cxx_sizeof, cxx_alignof): New macros. ! (cxx_sizeof_or_alignof_type): Declare. ! (my_friendly_assert): Move to ../c-common.h. ! ! 2002-07-23 Neil Booth ! ! * class.c, method.c, pt.c, search.c: Don't define obstack macros. ! ! 2002-07-22 Kriang Lerdsuwanakij ! ! PR c++/7347, c++/7348 ! * cp-tree.h (tsubst_flags_t): Add tf_parsing. ! * decl.c (make_typename_type): Use it. ! (make_unbound_class_template): Likewise. ! (lookup_name_real): Don't call type_access_control if scope is ! template parameter dependent. ! * parse.y (template_arg): Call make_unbound_class_template with ! tf_parsing set. ! (nest_name_specifier): Call make_typename_type with tf_parsing set. ! (typename_sub0): Likewise. ! (typename_sub1): Likewise. ! (instantiate_decl): Push class scope. ! * pt.c (regenerate_decl_from_template): Call pushclass and popclass ! for both static variable and member function template. ! (instantiate_decl) Call pushclass and popclass when tsubst'ing type ! and arguments. ! * search.c (type_access_control): Do type access for TEMPLATE_DECL ! too. ! ! 2002-07-20 Roger Sayle ! ! * decl2.c (cxx_decode_option): Simplify -fhandle-exceptions ! test by using positive_option. Make whitespace consistent. ! ! 2002-07-20 Gabriel Dos Reis ! ! * spew.c (struct unparsed_test): Replace 'filename' and 'lineno' ! members with 'locus'. Adjust use throughout. ! (struct feed): Likewise. ! (alloc_unparsed_test): Change prototype, take a 'const location_t *'. ! Adjust use. ! (snarf_defarg): Use error(), not error_with_file_and_line(). ! ! 2002-07-19 Chris Demetriou ! ! * lang-specs.h (@c++): Include "%2" (cc1plus_spec) wherever ! cpp_options is included. ! ! 2002-07-17 Kriang Lerdsuwanakij ! ! PR c++/2862, c++/2863 ! * pt.c (determine_specialization): Compare the length of ! TYPE_ARG_TYPES. Tidy. ! ! 2002-07-17 Kriang Lerdsuwanakij ! ! PR c++/3797 ! * decl.c (duplicate_decls): Don't propagate inlining parameters from ! olddecl to newdecl when newdecl is a specialization of the ! instantiation olddecl. ! ! 2002-07-17 Kriang Lerdsuwanakij ! ! PR c++/4802, c++/5387 ! * decl.c (make_typename_type): Use enforce_access. ! ! 2002-07-17 Scott Snyder ! ! PR c++/7320 ! * rtti.c (get_tinfo_decl): Set DECL_COMDAT. ! ! 2002-07-12 Mark Mitchell ! ! * class.c (add_method): Correct handling of conversion operators. ! ! 2002-07-11 Mark Mitchell ! ! PR c++/7224 ! * class.c (add_method): Simplify. ! ! 2002-07-11 Jason Merrill ! ! PR c++/7279 ! * tree.c (cp_copy_res_decl_for_inlining): Also copy ! TREE_ADDRESSABLE. ! ! 2002-07-10 Graham Stott ! ! * pt.c (template_parm_this_level_p, push_template_decl_real): ! Pass depth as int pointer. ! ! 2002-07-11 Tim Josling ! ! Remove front end hard coding from gengtype.c. ! ! * config-lang.in (gtfiles): Add files needed for this front end. ! ! 2002-07-10 Mark Mitchell ! ! * cp-tree.h (unqualified_name_lookup_error): Declare it. ! (begin_function_definition): Adjust prototype. ! * lex.c (unqualified_name_lookup_error): New function, split out ! from ... ! (do_identifier): ... here. ! * parse.y (parse_begin_function_definition): New function. ! (fn.def1): Use it. ! * semantics.c (begin_function_definition): Accept decl-specifiers ! and attributes as separate parameters. ! ! 2002-07-10 Jason Merrill ! ! PR c++/6255 ! * decl.c (lookup_name_real): Build a new TYPENAME_TYPE rather than ! modifying the old one. ! ! 2002-07-09 Mark Mitchell ! ! * cp-tree.h (constructor_name_p): Declare it. ! (check_template_template_default_arg): Likewise. ! * class.c (handle_using_decl): Use constructor_name_p. ! * decl.c (grokdeclarator): Likewise. ! * decl2.c (constructor_name_p): Define it. ! * init.c (build_member_call): Use constructor_name_p. ! * parse.y (template_parm): Use check_template_template_default_arg. ! * pt.c (check_explicit_specialization): Use constructor_name_p. ! * semantics.c (check_template_template_default_arg): New function. ! ! 2002-07-08 Kriang Lerdsuwanakij ! ! * pt.c (can_complete_type_without_circularity): Add static to ! function definition. ! ! 2002-07-08 Mark Mitchell ! ! * cp-tree.h (have_extern_spec): Declare it ! * decl.c (have_extern_spec): Define it. ! (start_decl): Eliminate use of used_extern_spec. ! (start_function): Likewise. ! * parse.y (have_extern_spec): Remove declaration. ! (used_extern_spec): Likewise. ! (frob_specs): Eliminate use of used_extern_spec. ! (.hush_warning): Likewise. ! ! 2002-07-07 Mark Mitchell ! ! * Make-lang.in (cp/parse.o): Depend on decl.h. ! * cp-tree.h (do_decl_instantiation): Change prototype. ! * parse.y: Include decl.h. ! (parse_decl_instantiation): New function. ! (explicit_instantiation): Use it. ! * pt.c (do_decl_instantiation): Accept a DECL, not a DECLARATOR ! and DECLSPECS. ! ! 2002-07-07 Roger Sayle ! ! * error.c (dump_function_name): Use DECL_TEMPLATE_RESULT for ! constructor and destructor tests when passed a TEMPLATE_DECL. ! ! 2002-07-05 Jason Merrill ! ! * cvt.c (cp_convert_to_pointer): Call force_fit_type for null ! pointers. ! ! PR optimization/7145 ! * tree.c (cp_copy_res_decl_for_inlining): Also copy DECL_INITIAL. ! ! 2002-07-05 Nathan Sidwell ! ! Repair damage on weak-impared targets caused by my previous patch. ! * cp-tree.h (import_export_tinfo): Add parameter. ! * decl2.c (import_export_tinfo): Add parameter, post adjust ! DECL_COMDAT. ! * rtti.c (emit_tinfo_decl): DECL_COMDAT is (nearly) always setup by ! import_export_tinfo. ! ! 2002-07-03 Kriang Lerdsuwanakij ! ! PR c++/6944 ! * init.c (build_aggr_init): Remove qualifiers of init before calling ! build_vec_init. ! (build_vec_init): Flatten multi-dimensional array during cleanup. ! (build_vec_delete_1): Abort if the type of each element is array. ! ! 2002-07-03 Graham Stott ! ! * pt.c (instantiate_class_template): Fix typo. ! ! 2002-07-02 Kriang Lerdsuwanakij ! ! * typeck2.c (cxx_incomplete_type_diagnostic): Fix typo caused ! by CVS conflict in my last patch. ! ! 2002-07-02 Kriang Lerdsuwanakij ! ! PR c++/6716 ! * pt.c (can_complete_type_without_circularity): New function. ! (instantiate_class_template): Use it. ! * typeck2.c (cxx_incomplete_type_diagnostic): Improve error ! message due to incomplete fields. ! ! 2002-07-01 Mark Mitchell ! ! PR c++/7112 ! * mangle.c (write_expression): Add mangling for sizeof when ! applied to a type. ! * operators.def: Remove stale comment. ! ! 2002-06-30 Nathan Sidwell ! ! * cp-tree.h (CPTI_TINFO_DECL_TYPE): Replace with ... ! (CPTI_TYPE_INFO_PTR_TYPE): ... this. ! (tinfo_decl_type): Replace with ... ! (type_info_ptr_type): ... this. ! (import_export_tinfo): Declare. ! (tinfo_decl_p): Rename to ... ! (unemitted_tinfo_decl_p): ... this. ! * decl2.c (import_export_decl): Break out tinfo handling into ... ! (import_export_tinfo): ... here. New function. ! (finish_file): Adjust. ! * rtti.c (TINFO_REAL_NAME): New macro. ! (init_rtti_processing): Create the tinfo types. ! (get_tinfo_decl_dynamic): Use type_info_ptr_type, get_tinfo_ptr. ! (get_tinfo_decl): Adjust. ! (get_tinfo_ptr): New function. ! (get_type_id): Use it. ! (tinfo_base_init): Create vtable decl here, if it doesn't exist. ! (ptr_initializer): Use get_tinfo_ptr. ! (ptm_initializer): Likewise. ! (synthesize_tinfo_var): Break into ... ! (get_pseudo_ti_init): ... this. Just create the initializer. ! (get_pseudo_ti_desc): .. and this. ! (create_real_tinfo_var): Remove. ! (create_pseudo_type_info): Don't create the vtable decl here. ! (get_vmi_pseudo_type_info): Remove. ! (create_tinfo_types): Adjust. ! (tinfo_decl_p): Rename to ... ! (unemitted_tinfo_decl_p): ... here. Adjust. ! (emit_tinfo_decl): Adjust. Create the initializer. ! ! 2002-06-27 Mark Mitchell ! ! PR c++/6695 ! * pt.c (tsubst_friend_class): Substitute into the context of the ! friend before using it. ! ! 2002-06-26 Mark Mitchell ! ! * cp-tree.h (xref_tag): Change prototype. ! (handle_class_head): Likewise. ! (build_x_component_ref): Likewise. ! * decl.c (cxx_init_decl_processing): Adjust call to xref_tag. ! (xref_tag): Take attributes as a separate parameter. ! (xref_tag_from_type): Adjust call to xref_tag. ! * decl2.c (build_expr_from_tree): Adjust call to ! build_x_component_ref. ! (handle_class_head): Take attributes as a separate parameter. ! * parse.y (parse_xref_tag): New function. ! (parse_handle_class_head): Likewise. ! (primary): Use parse_xref_tag. ! (class_head_decl): Use parse_handle_class_head. ! (class_head_defn): Likewise. ! * rtti.c (init_rtti_processing): Adjust call to xref_tag. ! (build_dynamic_cast_1): Likewise. ! (create_pseudo_type_info): Likewise. ! (emit_support_tinfos): Likewise. ! * typeck.c (build_object_ref): Adjust call to ! build_x_component_ref. ! (build_x_component_ref): Remove protect parameter. ! ! 2002-06-25 Mark Mitchell ! ! * call.c (build_op_delete_call): Use BASELINK_FUNCTIONS. ! * class.c (handle_using_decl): Likewise. ! (instantiate_type): Likewise. ! * cp-tree.h (BASELINK_FUNCTIONS): New macro. ! (xref_basetypes): Change prototype. ! (begin_mem_initializers): New function. ! (get_overloaded_fn): Likewise. ! * decl.c (xref_basetypes): Simplify. ! * error.c (dump_expr): Use BASELINK_FUNCTIONS. ! * init.c (build_offset_ref): Likewise. ! * parse.y (base_init): Use begin_mem_initializers(). ! (structsp): Adjust call to xref_basetypes. ! * pt.c (determine_specialization): Use BASELINK_FUNCTIONS. ! (instantiate_class_template): Adjust call to xref_basetypes. ! * semantics.c (begin_mem_initializers): New function. ! * tree.c (is_overloaded_fn): Use BASELINK_FUNCTIONS. ! (really_overlaoded_fn): Likewise. ! (get_overloaded_fn): New function.' ! (get_first_fn): USe BASELINK_FUNCTIONS. ! ! 2002-06-24 Mark Mitchell ! ! * cp-tree.h (SCALAR_TYPE_P): New macro. ! (check_for_out_of_scope_variable): New function. ! (at_class_scope_p): Likewise. ! (finish_fname): Likewise. ! * class.c (finish_struct): Use at_function_scope_p. ! * decl.c (check_for_out_of_scope_variable): New function, split ! out from do_identifier. ! (finish_enum): Use at_function_scope_p. ! * lex.c (do_identifier): Use check_for_out_of_scope_variable. ! * parse.y (VAR_FUNC_NAME): Give it . Use finish_fname. ! (primary): Use at_function_scope_p. ! * search.c (at_class_scope_p): New function. ! * semantics.c (finish_fname): Likewise. ! (check_multiple_declarators): Use at_function_scope_p. ! ! 2002-06-23 Mark Mitchell ! ! * parse.y (parse_scoped_id): New function. ! (primary): Use it. ! * cp-tree.h (do_scoped_id): Adjust declaration. ! * lex.c (do_scoped_id): Remove call to yylex. ! * decl2.c (build_expr_from_tree): Adjust use of do_scoped_id. ! * typeck2.c (add_exception_specifier): Use tree_cons, rather than ! expanding it inline. ! ! 2002-06-23 Matt Thomas ! ! * decl.c (finish_function): Change "#ifdef VMS_TARGET" to ! "#if VMS_TARGET". ! ! 2002-06-21 Kaveh R. Ghazi ! ! * mangle.c (integer_type_codes): Const-ify. ! ! 2002-06-20 Richard Henderson ! ! PR c++/6747 ! * typeck.c (mark_addressable): Don't test TREE_ADDRESSABLE early. ! Call put_var_into_stack. ! ! 2002-06-20 Kaveh R. Ghazi ! ! * spew.c (remove_last_token): Use ARRAY_SIZE in lieu of explicit ! array size calculation. ! ! 2002-06-20 Kriang Lerdsuwanakij ! ! PR c++/6892 ! * pt.c (tsubst_expr): Handle FILE_STMT. ! ! 2002-06-20 Kriang Lerdsuwanakij ! ! PR c++/6723 ! * pt.c (lookup_template_class): Don't build complete argument of ! BOUND_TEMPLATE_TEMPLATE_PARM if appeared as a default template ! argument. ! ! 2002-06-19 Akim Demaille ! ! * parse.y (TYPENAME): Rename as tTYPENAME to avoid the clash with ! decl.h's TYPENAME. ! * spew.c, lex.c: Adjust. ! * parse.y (explicit_instantiation): Add empty action to override ! the default $$ = $1 where it introduces a type clash. ! ! 2002-06-14 Jason Merrill ! ! * semantics.c (begin_for_stmt): Push the 'for' scope before ! adding the FOR_STMT. ! ! C++ ABI changes. ! * class.c (build_base_field): Set DECL_PACKED. ! (layout_class_type): Don't use tail padding of PODs. ! * mangle.c (write_unqualified_name): Fix template conversion op ! mangling. ! ! 2002-06-16 Richard Henderson ! ! PR opt/6793 ! * tree.c (cp_cannot_inline_tree_fn): Don't short-circuit test ! after template instantiation. ! ! 2002-06-16 Richard Henderson ! ! * cp-tree.h, decl2.c (flag_ms_extensions): Move to c-common. ! ! 2002-06-15 Gabriel Dos Reis ! ! * cp-tree.h (compiler_error): Remove declaration. ! * lex.c (compiler_error): Remove definition. ! ! 2002-06-14 Steve Ellcey ! ! * g++spec.c (LIBUNWIND): New. ! (lang_specific_driver): Add it if USE_UNWIND_EXCEPTIONS is set. ! ! 2002-06-13 Jessica Han ! ! * class.c (build_vtable): Use TARGET_VTABLE_ENTRY_ALIGN. ! (build_vtbl_initializer): Honor TARGET_VTABLE_DATA_ENTRY_DISTANCE. ! (build_vbase_offset_vtbl_entries): Likewise. ! * rtti.c (build_headof): Likewise. ! (get_tinfo_decl_dynamic): Likewise. ! (create_pseudo_type_info): Likewise. ! ! 2002-06-12 Stan Shebs ! ! * mpw-config.in: Remove file, no longer used. ! * mpw-make.sed: Ditto. ! ! 2002-06-07 Zack Weinberg ! ! * decl2.c: Update call to cpp_handle_option. ! ! 2002-06-07 H.J. Lu (hjl@gnu.org) ! ! * decl2.c (flag_use_cxa_atexit): Set to DEFAULT_USE_CXA_ATEXIT. ! ! 2002-06-06 Gabriel Dos Reis ! ! * error.c (cp_error_at): Fix typo. ! ! 2002-06-04 Gabriel Dos Reis ! ! * error.c (cp_diagnostic_starter): Adjust call. ! (maybe_print_instantiation_context): Change prototype to take a ! 'diagnostic_info *'. ! (print_instantiation_full_context): Likewise. ! (print_instantiation_partial_context): Likewise. ! (cp_diagnostic_starter): Likewise. ! (cp_diagnostic_finalizer): Likewise. ! (cp_print_error_function): Likewise. ! (cp_printer): Take a secondary parameter as a 'text_info *'. ! Remove output_state savings. Adjust calls. ! ! 2002-06-03 Geoffrey Keating ! ! * pt.c (inline_parm_levels): Mark for GC. ! ! * mangle.c (start_mangling): Allocate G.substitutions here... ! (init_mangle): ... rather than here. ! (finish_mangling): Clear the varray pointer when done with it. ! * spew.c (yylexstring): Don't use VARRAY_FREE. ! * search.c (bfs_walk): Don't use VARRAY_FREE. ! * decl2.c (pending_statics): Use gengtype to mark. ! (deferred_fns): Likewise. ! (ssdf_decls): Likewise. ! (init_decl2): Delete. ! * decl.c (pop_from_top_level): Don't use VARRAY_FREE. ! (cxx_init_decl_processing): Don't call init_decl2. ! (cxx_pop_function_context): Don't use VARRAY_FREE. ! * cp-tree.h (struct saved_scope): No need for special marking ! of varrays. ! (struct language_function): Likewise. ! (local_classes): Use gengtype to mark. ! (init_decl2): Delete prototype. ! * class.c (init_class_processing): Don't use ! ggc_add_tree_varray_root. ! (build_vtbl_initializer): Don't use VARRAY_FREE. ! ! * decl.c (typename_compare): Don't use same_type_p. ! ! * decl.c: Include hashtab.h instead of hash.h. ! (typename_hash): Update to use htab_h. ! (typename_compare): Likewise. ! (typename_htab): Use gengtype to mark. ! (build_typename_type): Update to use htab_h. ! * Make-lang.in (cp/decl.o): Use HASHTAB_H instead of hash.h. ! ! * Make-lang.in (gt-cp-tree.h): New rule. ! (cp/tree.o): Depend on gt-cp-tree.h. ! * config-lang.in (gtfiles): Add cp/tree.c. ! * tree.c: Include gt-cp-tree.h. ! (list_hash_table): Use gengtype to mark. ! (init_tree): Use gengtype to mark trees. ! ! * Make-lang.in (cp/decl.o): Add debug.h dependency. ! * call.c (struct z_candidate): Use gengtype. ! (USER_CONV_CAND): Use WRAPPER_ZC. ! (convert_class_to_reference): Use build_zc_wrapper. ! (build_type_conversion_1): Likewise. ! (build_over_call): Use WRAPPER_ZC. ! (add_warning): Use build_zc_wrapper. ! * cp-lang.c (LANG_HOOKS_MARK_TREE): Delete. ! * cp-tree.h (struct lang_identifier): Use gengtype. ! (struct template_parm_index_s): Likewise. ! (struct ptrmem_cst): Likewise. ! (struct tree_binding): Likewise. ! (struct tree_overload): Likewise. ! (struct tree_srcloc): Likewise. ! (struct tree_wrapper): Likewise. Also modify to have a pointer ! to struct z_candidate rather than void. ! (enum cp_tree_node_structure_enum): New. ! (union lang_tree_node): New. ! (cxx_mark_tree): Delete prototype. ! (cp_tree_node_structure): New prototype. ! (build_ptr_wrapper): Delete prototype. ! (build_int_wrapper): Delete prototype. ! (build_zc_wrapper): New prototype. ! * decl.c: Include debug.h ! (cxx_mark_tree): Delete. ! (cp_tree_node_structure): New. ! * tree.c (build_ptr_wrapper): Delete. ! (build_int_wrapper): Delete. ! (build_zc_wrapper): New. ! ! * cp-tree.h [! ENABLE_TREE_CHECKING] (LANG_TYPE_PTRMEM_CHECK): ! Correct typo. Patch from k_fukui@highway.ne.jp. ! ! * semantics.c (current_stmt_tree): Update for change to ! struct language_function. ! (finish_mem_initializers): Likewise. ! * decl.c (cxx_init_decl_processing): Don't set mark_lang_status. ! * cp-tree.h (struct language_function): Rename from ! cp_language_function. Change all uses. ! (cp_function_chain): Don't need to cast. ! ! * class.c (duplicate_tag_error): Reset discriminator. ! (check_bases_and_members): Update for data structure changes. ! * cp-tree.h (struct lang_id2): Use gengtype. ! (flagged_type_tree): Likewise. ! (SET_LANG_ID): Use GGC on struct lang_id2. ! (struct cp_language_function): Use gengtype. Remove field ! 'x_vcalls_possible_p'. ! (current_vcalls_possible_p): Delete. ! (struct lang_type_header): New. ! (struct lang_type_class): Rename from struct lang_type. Include ! struct lang_type_header. ! (struct lang_type_ptrmem): New. ! (struct lang_type): New. ! (LANG_TYPE_CLASS_CHECK): New. Use it in all the appropriate macros. ! (LANG_TYPE_PTRMEM_CHECK): New. Use it in all the appropriate macros. ! (TYPE_SET_PTRMEMFUNC_TYPE): Set discriminator, update for changes. ! (struct lang_decl_flags): Use gengtype. Add discriminators. ! (struct lang_decl): Use gengtype. Add and use discriminators. ! Update the macros that reference moved fields. ! (LANG_DECL_U2_CHECK): New function. Use it when appropriate. ! (SET_DECL_THUNK_P): Set discriminator too. ! (clear_inline_text_obstack): Delete prototype. ! (finish_inline_definitions): Delete prototype. ! (mark_pending_inlines): Delete prototype. ! (lang_check_failed): New prototype. ! * decl.c (struct named_label_use_list): Use gengtype. ! (struct named_label_list): Likewise. ! (mark_binding_level): Delete. ! (mark_named_label_lists): Delete. ! (push_local_name): Set discriminator on DECL_LANG_SPECIFIC. ! (cxx_init_decl_processing): Use generated marker routine. ! (begin_destructor_body): Delete dead set to ! current_vcalls_possible_p. ! (mark_lang_function): Delete. ! (mark_cp_function_context): Delete. ! (lang_mark_tree): Use generated marker routines. ! * decl2.c (start_objects): Set discriminator when setting ! GLOBAL_INIT_PRIORITY. ! * lex.c (retrofit_lang_decl): Set discriminators. ! (copy_lang_type): Update for changes to lang_type structure. ! (cp_make_lang_type): Set discriminator. ! * parse.y: Use gengtype on YYLVAL. Don't use dots in identifiers. ! * search.c: Include ggc.h. ! * semantics.c (anon_aggr_type_p): Use the macro, don't hand-code it. ! (finish_inline_definitions): Delete. ! * spew.c (struct token): Use gengtype. ! (struct token_chunk): New. ! (struct unparsed_text): Use gengtype. Store tokens in chunks. ! (struct feed): Use gengtype. ! (feed_obstack): Delete. ! (feed): Mark as GC root. ! (pending_inlines): Mark as GC root. ! (pending_inlines_tail): Likewise. ! (processing_these_inlines): Likewise. ! (token_obstack): Make static. ! (first_token): Likewise. ! (init_spew): Don't initialize deleted things; use gengtype for roots. ! (clear_inline_text_obstack): Delete. ! (feed_input): Use GC for struct feed. Update for changes to ! struct unparsed_text. ! (mark_pending_inlines): Delete. ! (next_token): Rename from add_token. Change all callers. Update ! for changes to struct unparsed_text. ! (space_for_token): New. ! (remove_last_token): New. ! (alloc_unparsed_text): New. ! (snarf_block): Take an unparsed_text. Update for changes to struct ! unparsed_text. ! (snarf_method): Update for changes to struct unparsed_text. ! (snarf_defarg): Update for changes to struct unparsed_text. ! * tree.c (lang_check_failed): New. ! ! * Make-lang.in (gt-cp-call.h gt-cp-decl2.h gt-cp-parse.h ! gt-cp-pt.h gt-cp-repo.h gt-cp-spew.h): New rules. ! (cp/spew.o): Add dependency on gt-.h. ! (cp/decl2.o): Add dependency on gt-.h. ! (cp/call.o): Add dependency on gt-.h. ! (cp/pt.o): Add dependency on gt-.h. ! (cp/repo.o): Add dependency on gt-.h. ! (cp/parse.o): Add dependency on gt-.h. ! * call.c: Use gengtype for roots. ! * config-lang.in (gtfiles): Add cp-tree.h decl.h lex.h call.c ! decl2.c parse.y pt.c repo.c spew.c. ! * cp-tree.h: Use gengtype for roots. ! (struct saved_scope): Use GGC, gengtype. ! (cp_parse_init): Delete prototype. ! (init_pt): Delete prototype. ! * decl.c: Use gengtype for roots. ! (mark_saved_scope): Delete. ! (cxx_init_decl_processing): Don't call deleted initilisation ! routines. ! (signed_size_zero_node): Delete, unused. ! * decl.h: Use gengtype for roots. ! * decl2.c: Use gengtype for roots. ! * lex.h: Use gengtype for roots. ! * parse.y: Use gengtype for roots. ! (cp_parse_init): Delete. ! * pt.c: Use gengtype for roots. ! (init_pt): Delete. ! * repo.c: Use gengtype for roots. ! * spew.c: Use gengtype for roots. ! ! * Make-lang.in: Allow for filename changes. Add gtype-cp.h. ! (cp/decl.o): Add dependency on gtype-cp.h. ! * decl.c: Remove use of add_deletable_root, use GTY marker instead. ! Include gtype-cp.h. Allow for filename changes. ! ! * Make-lang.in (cp/gt-decl.h): Generate using gengtype. ! (cp/decl.o): Add cp/gt-decl.h dependency. ! * config-lang.in (gtfiles): New. ! * tree.h: Rename struct binding_level to struct cp_binding_level. ! * decl.c: Rename struct binding_level to struct cp_binding_level. ! Include cp/gt-decl.h. ! (struct cp_binding_level): Use gengtype. ! (make_binding_level): Use GGC on struct cp_binding_level. ! (mark_binding_level): Use gt_ggc_m_cp_binding_level. ! (cxx_init_decl_processing): Mark free_binding_level as ! deletable. ! ! * decl.c (mark_cp_function_context): Update calling sequence. ! ! * decl.c (start_function): Don't free 'struct ! cp_language_function'. ! (pop_cp_function_context): Likewise. ! (save_function_data): Allocate it using GC. ! * semantics.c (genrtl_start_function): Don't free 'struct ! cp_language_function'. ! ! 2002-05-31 Matthew Woodcraft ! ! * lang-specs.h: Use cpp_debug_options. ! ! 2002-05-28 Zack Weinberg ! ! * mangle.c, tree.c: Include real.h. ! * Make-lang.in: Update dependency lists. ! ! 2002-05-25 Neil Booth ! ! * lex.c: Don't include c-lex.h. ! * parse.y, spew.c: Don't include c-lex.h; include c-pragma.h. ! ! 2002-05-23 Neil Booth ! ! * spew.c (yyungetc, snarf_block): Remove indent_level handling. ! ! 2002-05-22 Richard Henderson ! ! * decl.c (obscure_complex_init): Check for VAR_DECL ! before using DECL_THREAD_LOCAL. ! ! 2002-05-22 Richard Henderson ! ! * decl.c (check_tag_decl): Handle RID_THREAD. ! (obscure_complex_init): Reject run-time init of tls. ! (grokvardecl, grokdeclarator): Handle RID_THREAD. ! * lex.c (reswords): Add __thread. ! (rid_to_yy): Map RID_THREAD to SCSPEC. ! ! 2002-05-22 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_POST_OPTIONS): Use c_common_post_options. ! * cp-tree.h (cxx_post_options): Kill. ! * cp-lex.c (cxx_post_options): Kill. ! ! 2002-05-21 Richard Henderson ! ! * lex.c (rid_to_yy): Add RID_THREAD. ! ! 2002-05-21 Alexandre Oliva ! ! * init.c (build_vec_init): Test for trivial copy-assignment when ! copy-assigning arrays. ! ! 2002-05-20 Andreas Jaeger ! ! * init.c (build_default_init): Remove unused variable. ! ! 2002-05-20 Alexandre Oliva ! ! * call.c (any_strictly_viable): New. ! (build_new_op): Use it for COMPOUND_EXPR and ADDR_EXPRs. ! ! 2002-05-19 Kriang Lerdsuwanakij ! ! * error.c (dump_type) [TYPEOF_TYPE]: Fix parenthesis printing. ! ! 2002-05-19 Kriang Lerdsuwanakij ! ! PR c++/186, DR 259 ! * pt.c (do_decl_instantiation): Don't complain explicit ! instantiation after explicit specialization. ! (do_type_instantiation): Likewise. ! ! 2002-05-19 Alexandre Oliva ! ! * cp-tree.h (complete_type_or_diagnostic): Changed prototype, ! renamed from... ! (complete_type_or_else): ... this. Redefined as macro. ! (cxx_incomplete_type_diagnostic): Declare. ! (cxx_incomplete_type_error): Define as macro. ! * init.c (build_delete): Warn about incomplete types other than ! void, and use the built-in operator delete for them. ! * typeck.c (complete_type_or_diagnostic): Renamed from ! complete_type_or_else. Added warn_only argument, passed to... ! * typeck2.c (cxx_incomplete_type_diagnostic): ... this. Print ! warnings or errors depending on new warn_only argument. Renamed ! from... ! (cxx_incomplete_type_error): ... this. New implementation in ! terms of cxx_incomplete_type_diagnostic. ! ! 2002-05-18 Jason Merrill ! ! PR c++/6611 ! * decl2.c (import_export_decl): If we clear ! DECL_NOT_REALLY_EXTERN, make sure DECL_EXTERNAL is set. ! ! 2002-05-15 Kriang Lerdsuwanakij ! ! PR c++/6620 ! * pt.c (verify_class_unification): Don't check if PARM is template ! parameter dependent. Simplify. ! (unify) [TEMPLATE_PARM_INDEX]: Handle when ARG is a template ! parameter dependent expression. ! ! 2002-05-14 Jason Merrill ! ! * rtti.c (get_tinfo_decl): Don't call comdat_linkage. ! Do set DECL_COMDAT. ! (synthesize_tinfo_var): Take the public decl. ! (create_real_tinfo_var): Likewise. Check DECL_COMDAT. ! (emit_tinfo_decl): Adjust. Call import_export_decl. ! * decl2.c (import_export_decl): Simplify tinfo decl handling. ! ! 2002-05-14 Alexandre Oliva ! ! * cp-tree.h (struct lang_type): Added non_zero_init. ! (CLASSTYPE_NON_ZERO_INIT_P): New macro. ! (zero_init_p, force_store_init_value, build_forced_zero_init): Declare. ! * class.c (check_field_decls): Test non_zero_init. ! * cvt.c (convert_to_pointer_force): Use cp_convert_to_pointer for ! zero-to-NULL conversions. ! * decl.c (obscure_complex_init): Don't reset DECL_INITIAL of a ! type that needs zero-initialization without zeros. ! (check_initializer_decl): Compute zero-initializer for types ! that require a non-trivial one. ! * init.c (build_forced_zero_init): New function. ! (build_default_init): Use it. ! * tree.c (zero_init_p): New function. ! * typeck2.c (force_store_init_value): New function. ! (process_init_constructor): Create non-trivial zero-initializers ! for array members and class fields. ! ! 2002-05-14 Neil Booth ! ! * lang-specs.h: Remove redundant -lang-c++. ! ! 2002-05-13 Jason Merrill ! ! * class.c (build_vtbl_ref_1): Use fixed_type_or_null. ! (fixed_type_or_null): See through reference vars. ! (build_base_path): Vtable contents are constant. ! * typeck.c (get_member_function_from_ptrfunc): Likewise. ! ! 2002-05-12 Jason Merrill ! ! * cp-lang.c (ok_to_generate_alias_set_for_type): Backend-created ! structs are safe. ! ! 2002-05-09 Neil Booth ! ! * cp-tree.h (flag_ansi): Remove. ! * decl2.c (flag_ansi): Remove. ! (cxx_decode_option): Set flag_iso and flag_undef. ! ! 2002-05-09 Jason Merrill ! ! * typeck.c (get_member_function_from_ptrfunc): Reorganize. ! Use subtraction rather than a bitmask to get the index. ! * cvt.c (cp_convert_to_pointer): Bail on an error_mark_node. ! ! * pt.c (tsubst_expr) [ASM_STMT]: Copy ASM_INPUT_P. ! ! 2002-05-07 Neil Booth ! ! * Make-lang.in (decl2.o): Update. ! * cp-tree.h (warn_multichar): Remove. ! * decl2.c: Include c-common.h. ! (warn_multichar): Remove. ! ! 2002-05-03 Jason Merrill ! ! * tree.c (build_cplus_array_type): Only const and volatile get ! special handling. ! ! * decl.c (BOOL_TYPE_SIZE): Move default to defaults.h. ! ! 2002-04-30 Mark Mitchell ! ! ABI change, returning simple classes from functions. ! * class.c (finish_struct_bits): Only mark TREE_ADDRESSABLE if ! TYPE_HAS_TRIVIAL_INIT_REF is false or ! TYPE_HAS_NONTRIVIAL_DESTRUCTOR is true. ! ! 2002-04-30 Jason Merrill ! ! PR debug/6436 ! * decl.c (grokdeclarator): Don't override TYPE_NAME of an ! anonymous class with a typedef if there are attributes. ! ! 2002-04-29 Paul Eggert ! ! * parse.y (nomods_initdcl0): Replace $3 with $$. ! ! 2002-04-29 Jakub Jelinek ! ! PR c++/6477 ! * decl.c (follow_tag_typedef): Check if TYPE_NAME (original) is ! non-NULL first. ! ! 2002-04-29 Mark Mitchell ! ! PR c++/6492 ! * pt.c (tsubst_friend_class): If the friend has an explicit scope, ! enter that scope before name lookup. ! ! PR c++/6486 ! * method.c (do_build_copy_constructor): Avoid building ! cv-qualified reference types. ! ! 2002-04-29 Nathan Sidwell ! ! PR c++/5719 ! * decl.c (grok_op_properties): Assignment ops don't have to return ! by value. operator% should. ! ! 2002-04-28 Franz Sirl ! ! PR c/6343 ! * decl.c (duplicate_decls): Call merge_weak. ! ! 2002-04-26 Richard Henderson ! ! * parse.y (malloced_yyss, malloced_yyvs): New. ! (yyoverflow): Re-add. Set them. ! (free_parser_stacks): New. ! ! 2002-04-26 Mark Mitchell ! ! PR c++/6497 ! * method.c (do_build_assign_ref): Pass a derivation to ! build_method_call when calling base class assignment operators. ! ! 2002-04-26 Richard Henderson ! ! * parse.y (yyoverflow): Revert. ! ! 2002-04-26 Richard Henderson ! ! PR c/3581 ! * parse.y (string): Remove. Update all uses to use STRING ! instead, and not call combine_strings. ! * rtti.c (tinfo_name): Use fix_string_type. ! * semantics.c (finish_asm_stmt): Don't call combine_strings. ! * spew.c (yylexstring): New. ! (read_token): Use it. ! ! 2002-04-25 Richard Henderson ! ! PR c/2161 ! * parse.y (yyoverflow): New. ! ! 2002-04-25 Jason Merrill ! ! PR c++/5607 ! * search.c (check_final_overrider): No longer static. ! * class.c (update_vtable_entry_for_fn): Call it. ! * cp-tree.h: Adjust. ! ! 2002-04-25 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_SET_YYDEBUG): Remove. ! * cp-tree.h (cxx_set_yydebug): Die. ! * lex.c (YYDEBUG): Get from c-lex.h. ! (cxx_set_yydebug): Remove. ! * parse.y: Include c-lex.h. ! (YYDEBUG): Get from c-lex.h. ! ! 2002-04-24 Mark Mitchell ! ! PR c++/6438. ! * cvt.c (convert_to_void): Don't unconditionally make COND_EXPRs ! void. ! ! 2002-04-24 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_COMMON_ATTRIBUTE_TABLE, ! LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE, LANG_HOOKS_ATTRIBUTE_TABLE): ! Redefine. ! * cp-tree.h (cp_attribute_table): Rename. ! * decl.c (lang_attribute_table): Remove declaration. ! (cxx_init_decl_processing): Don't set it. ! * tree.c (cp_attribute_table): Rename. ! ! 2002-04-24 Jason Merrill ! ! PR c++/6331 ! * method.c (do_build_copy_constructor): Use cp_build_qualified_type. ! * typeck.c (build_modify_expr): Allow arrays to differ in cv-quals. ! The pedwarn for array assignment is now unconditional. ! * tree.c (build_cplus_array_type_1): Still process simple array types ! normally in templates. ! ! PR c++/6395 ! * decl.c (make_rtl_for_nonlocal_decl): Don't mess with #pragma i/i ! stuff for comdats. ! ! 2002-04-23 Jakub Jelinek ! ! * parse.y (check_class_key): Allow KEY to be union/enum/struct/class ! node with attributes. ! ! 2002-2-23 David O'Brien ! ! * g++spec.c (MATH_LIBRARY_PROFILE, LIBSTDCXX_PROFILE): Add. ! Use MATH_LIBRARY_PROFILE and LIBSTDCXX_PROFILE if profile flag given. ! ! 2002-04-23 Mark Mitchell ! ! PR c++/6256: ! * pt.c (tsubst_friend_class): Handle templates with explicit ! nested names. ! ! PR c++/6331: ! * typeck.c (merge_types): Remember the cv-qualification of pointer ! types when merging them. ! ! 2002-04-20 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_FUNCTION_INIT, ! LANG_HOOKS_FUNCTION_FREE, LANG_HOOKS_FUNCTION_MARK): Redefine. ! * cp-tree.h (cxx_push_function_context, cxx_pop_function_context, ! cxx_mark_function_context): New. ! * decl.c (push_cp_function_context, pop_cp_function_context, ! mark_cp_function_context): Rename for consistency. ! (cxx_init_decl_processing): Don't set old hooks. ! ! 2002-04-19 Neil Booth ! ! * call.c (convert_type_from_ellipsis): Rename, update. ! * cp-lang.c (LANG_HOOKS_TYPE_PROMOTES_TO): Redefine. ! * cp-tree.h (convert_type_from_ellipsis): Rename. ! * decl.c (cxx_init_decl_processing): Don't set hook. ! ! 2002-04-18 Neil Booth ! ! * call.c (build_new_method_call): Update. ! * cp-lang.c (LANG_HOOKS_INCOMPLETE_TYPE_ERROR): Redefine. ! * cp-tree.h (cxx_incomplete_type_error): New. ! * decl.c (grokdeclarator, grokparms): Update. ! * decl2.c (check_classfn): Update. ! * pt.c (tsubst): Update. ! * typeck.c (complete_type_or_else, expr_sizeof, ! decay_conversion): Update. ! * typeck2.c (incomplete_type_error): Rename. ! (add_exception_specifier): Update. ! ! 2002-04-18 Jason Merrill ! ! PR c++/5658 ! * search.c (setup_class_bindings): A class template qualifies as a ! type binding. ! ! 2002-04-17 Jakub Jelinek ! ! PR c++/6316 ! * decl2.c (finish_file): Clear DECL_EXTERNAL in a separate loop ! before expanding. ! ! 2002-04-16 Mark Mitchell ! ! * init.c (begin_init_stmts): Remove commented out code. ! (finish_init_stmts): Set STMT_EXPR_NO_SCOPE. ! * semantics.c (begin_gobal_stmt_expr): Adjust call to ! expand_start_stmt_expr. ! ! 2002-04-15 Mark Mitchell ! ! * decl.c (register_dtor_fn): Pass the address of dso_handle, not ! dso_handle itself, to __cxa_atexit. ! ! 2002-04-15 Gabriel Dos Reis ! ! * error.c (cxx_print_error_function): Adjust call to macros. ! ! 2002-04-14 Jakub Jelinek ! ! * class.c (layout_virtual_bases): Do all dsize computation on trees. ! ! 2002-04-14 Jason Merrill ! ! * typeck.c (get_member_function_from_ptrfunc): Don't do ! gratuitious division and multiplication on ! ptrmemfunc_vbit_in_delta targets. ! ! 2002-04-12 Mark Mitchell ! ! PR c++/5373. ! * semantics.c (finish_expr_stmt): Remember the type of the ! expression before any conversions are performed. ! ! 2002-04-12 Mark Mitchell ! ! PR c++/5189. ! * call.c (add_template_candidate_real): Do not treat member ! templates as copy constructors. ! ! 2002-04-12 Mark Mitchell ! ! * decl.c (duplicate_decls): Do not copy the RTL for a variable ! declaration if the old variable had an incomplete type and the new ! variable does not. ! (complete_vars): Do not call layout_decl for completed variables. ! ! 2002-04-12 Richard Sandiford ! ! * decl.c (duplicate_decls): Don't try to unify an implicit typedef ! with an explicit one. ! (follow_tag_typedef): New. ! (lookup_tag): Use it to extract the tag of an explicit typedef. ! (xref_tag): Likewise. ! ! 2002-04-11 Andrew Haley ! ! * typeck.c (type_after_usual_arithmetic_conversions): ! If two types have the same variant, return immediately. ! When two floating-point operands are the same precision: ! convert to float if one of the operands is float; ! if neither operand is one of the standard types, return the type ! of the first operand. ! ! 2002-04-10 Nathan Sidwell ! ! PR c++/5507 ! * decl.c (make_typename_type): Remove implicit typenameness. ! ! 2002-04-09 Jason Merrill ! ! PR optimization/6189 ! * semantics.c (genrtl_start_function): Don't free ! DECL_SAVED_FUNCTION_DATA for inline functions. ! ! * init.c (build_member_call): For now, don't convert to ! intermediate base if it would cause an error. ! ! 2002-04-08 Paolo Carlini ! ! * parse.y (namespace_qualifier, maybe_identifier, ! begin_explicit_instantiation, end_explicit_instantiation, ! apparent_template_type, .finish_template_type, ! do_id, maybe_init, defarg_again, component_decl_1): ! Add ending ';', in accordance with POSIX. ! ! 2002-04-06 Mark Mitchell ! ! PR c++/5571 ! * class.c (layout_class_type): Remember incomplete static ! variables. ! (finish_struct_1): Call complete_vars, not ! hack_incomplete_structures. ! * cp-tree.h (hack_incomplete_structures): Rename to ... ! (complete_vars): ... this. ! (struct saved_scope): Remove incomplete. ! (namespace_scope_incomplete): Remove. ! * decl.c (struct binding_level): Remove incomplete. ! (incomplete_vars): New variable. ! (mark_binding_level): Don't mark incomplete. ! (print_binding_level): Don't print it. ! (mark_saved_scope): Don't mark incomplete. ! (pushdecl): Use maybe_register_incopmlete_var. ! (cxx_init_decl_processing): Register incomplete_vars for GC. ! (start_decl_1): Clarify error message. ! (hack_incomplete_vars): Remove. ! (maybe_register_incomplete_var): New function. ! (complete_vars): Likewise. ! ! 2002-04-06 Jason Merrill ! ! PR c++/4934 ! * error.c (dump_expr) [CONVERT_EXPR]: Make sure TREE_TYPE (t) is ! set before checking it. ! ! PR c++/525 ! * init.c (build_member_call): Use build_scoped_ref. ! (resolve_offset_ref): Likewise. ! * call.c (build_scoped_method_call): Likewise. ! * tree.c (maybe_dummy_object): Kludge around current_class_type being ! wrong. ! * typeck2.c (build_scoped_ref): Return the binfo via binfo_p parm. ! * cp-tree.h: Adjust. ! ! * init.c (push_base_cleanups): Just use build_scoped_method_call. ! ! PR c++/6179 ! * method.c (implicitly_declare_fn): Pass unqualified type to ! synthesize_exception_spec. ! ! 2002-04-04 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_TRUTHVALUE_CONVERSION): Redefine. ! * cvt.c: Update comment. ! * init.c (expand_cleanup_for_base): Update. ! * semantics.c (finish_parenthesized_expr): Update. ! * typeck.c (cp_truthvalue_conversion): Update. ! ! 2002-04-04 Jason Merrill ! ! * semantics.c (finish_eh_cleanup): New fn. ! * cp-tree.h: Add prototype. ! * init.c (perform_member_init, expand_cleanup_for_base): Use ! finish_eh_cleanup. ! * cp-tree.def (SUBOBJECT, CTOR_STMT): Remove. ! * cp-tree.h: Remove references. ! * decl.c (begin_constructor_body, end_constructor_body): Likewise. ! * dump.c (cp_dump_tree): Likewise. ! * pt.c (tsubst_expr): Likewise. ! * semantics.c (genrtl_ctor_stmt, genrtl_subobject): Remove. ! (cp_expand_stmt): Remove handling of CTOR_STMT and SUBOBJECT. ! * tree.c (cp_statement_code_p): Likewise. ! ! * init.c (build_new_1): Set CLEANUP_EH_ONLY on deleting cleanup. ! ! PR c++/5636 ! * semantics.c (nullify_returns_r): Just set CLEANUP_EH_ONLY on ! cleanup for nrv. ! ! PR c++/5104 ! * typeck.c (comptypes) [FUNCTION_TYPE]: Don't compare exception ! specifiers. ! [METHOD_TYPE]: Use same code as FUNCTION_TYPE. ! ! 2002-04-03 Richard Henderson ! ! * cp-lang.c (cxx_warn_unused_global_decl): New. ! (LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL): New. ! ! 2002-04-03 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_SET_DECL_ASSEMBLER_NAME): Redefine. ! * tree.c (init_tree): Don't set hook. ! ! 2002-04-03 Roger Sayle ! ! PR c++/5998: ! * decl.c (duplicate_decls): Don't mess with assembler names when ! redeclaring builtin functions as static. ! ! 2002-04-01 Neil Booth ! ! * call.c (build_addr_func): Update. ! * class.c (resolve_address_of_overloaded_function): Update. ! * cp-lang.c (LANG_HOOKS_MARK_ADDRESSABLE): Redefine. ! * cp-tree.h (cxx_mark_addressable): New. ! * decl.c (register_dtor_fn, cxx_maybe_build_cleanup): Update. ! * decl2.c (build_cleanup): Update. ! * except.c (build_throw): Update. ! * init.c (resolve_offset_ref): Update. ! * pt.c (convert_nontype_argument): Update. ! * semantics.c (finish_asm_stmt, simplify_affr_init_exprs_r): Update. ! * typeck.c (decay_conversion, build_array_ref, build_unary_op, ! unary_complex_lvalue): Update. ! (mark_addressable): Rename. ! ! 2002-04-01 Roger Sayle ! ! PR c++/5998: ! * decl.c (duplicate_decls): Overwrite the RTL when (and only ! when) overwriting a built-in function. Don't use COPY_DECL_RTL, ! but follow the SET_DECL_RTL idiom used elsewhere in the function. ! ! 2002-04-01 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_SIGNED_TYPE, LANG_HOOKS_UNSIGNED_TYPE, ! LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE): New. ! * decl.c (grokdeclarator): Update. ! * mangle.c (write_integer_cst): Update. ! * typeck.c (build_binary_op): Update. ! ! 2002-03-31 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_UNSAFE_FOR_REEVAL): Redefine. ! * lex.c (cxx_init): Don't set hook. ! ! 2002-03-31 Neil Booth ! ! * Make-lang.in (error.o): Update. ! * cp-lang.c (LANG_HOOKS_PRINT_ERROR_FUNCTION): Redefine. ! * cp-tree.h (struct diagnostic_context): Predeclare. ! (cxx_print_error_function): New. ! * error.c: Include langhooks-def.h. ! (lang_print_error_function): Rename. Update. ! (init_error): Don't set hook. ! ! 2002-03-29 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_TYPE_FOR_MODE, LANG_HOOKS_TYPE_FOR_SIZE): ! Redefine. ! * cvt.c (cp_convert_to_pointer, type_promotes_to): Use new hooks. ! * decl.c (finish_enum): Similarly. ! * error.c (dump_type): Similarly. ! * lex.c (cxx_init): Similarly. ! * mangle.c (write_builtin_type): Similarly. ! * typeck.c (comptypes): Similarly. ! ! 2002-03-28 Roger Sayle ! ! PR c++/5998: ! * decl.c (cxx_init_decl_processing): Re-enable built-in functions ! in the g++ front-end. ! (duplicate_decl): Allow redefinition of anticipated built-ins. ! Fix inlining problem by over-writing the old DECL_RTL. ! (lookup_namespace_name): Fail to find an identifier in the ! specified namespace if its still anticipated. ! (builtin_function_1): New function split out from builtin_function ! to create a builtin in the current namespace with given context. ! (builtin_function): Call builtin_function_1 to define the ! appropriate builtins in both the std and global namespaces. ! (select_decl): Don't test for anticipated decls here. ! (unqualified_namespace_lookup): Instead ignore them whilst ! searching through scopes and namespaces. ! * decl2.c (do_nonmember_using_decl): If a using declaration ! specifies an anticipated built-in function, mark it as no longer ! anticipated in that scope. ! (ambiguous_decl): Avoid resolving to an anticipated decl. ! * lex.c (do_scoped_id): Fail to find an identifier in the global ! namespace if its still anticipated. ! ! 2002-03-29 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_MAKE_TYPE): Redefine. ! * cp-tree.h (cp_make_lang_type): Rename. ! * lex.c (cp_make_lang_type): Rename. ! (make_aggr_type): Update. ! * tree.c (init_tree): Don't set make_lang_type_fn. ! ! 2002-03-29 Jakub Jelinek ! ! PR c++/6073 ! * class.c (finish_struct_1): Update static field's DECL_MODE even ! if its type is a variant of t. ! ! 2002-03-27 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES): Redefine. ! * cp-tree.h (cxx_insert_default_attributes): New. ! * decl.c (insert_default_attributes): Rename. ! ! 2002-03-27 Mark Mitchell ! ! PR c++/4884 ! * call.c (build_op_delete_call): Allow for the fact the placement ! may be a COMPOUND_EXPR. ! ! 2002-03-27 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_EXPAND_EXPR): Redefine. ! * cp-tree.h (init_cplus_expand): Remove. ! (cxx_expand_expr): New. ! * expr.c (cplus_expand_expr): Rename cxx_expand_expr, ! fix prototype. ! (init_cplus_expand): Remove. ! * lex.c (cxx_init): Don't call init_cplus_expand. ! ! 2002-03-26 Mark Mitchell ! ! PR c++/4884. ! * init.c (build_new_1): Allow for the fact the result of ! build_function_call may be a COMPOUND_EXPR. ! ! 2002-03-26 Nathan Sidwell ! ! PR c++/5682 ! * cp-tree.h (BINFO_PRIMARY_P): Explain meaning better. ! (dfs_skip_nonprimary_vbases_unmarkedp): Remove. ! (dfs_skip_nonprimary_vbases_markedp): Remove. ! * search.c (get_shared_vbase_if_not_primary): Remove. ! (dfs_skip_nonprimary_vbases_unmarkedp): Remove. ! (dfs_skip_nonprimary_vbases_markedp): Remove. ! (dfs_unmarked_real_bases_queue_p): Just get the canonical binfo. ! (dfs_marked_real_bases_queue_p): Likewise. ! ! 2002-03-26 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_MARK_TREE): Redefine. ! * cp-tree.h (cxx_mark_tree): New. ! * decl.c (lang_mark_tree): Rename cxx_mark_tree. ! ! 2002-03-25 Neil Booth ! ! * cp-tree.h (cxx_maybe_build_cleanup): New. ! * decl.c (destroy_local_var, hack_incomplete_structures): Update. ! (maybe_build_cleanup): Rename cxx_maybe_build_cleanup. ! * tree.c (build_target_expr): Update. ! * cp-lang.c (LANG_HOOKS_MAYBE_BUILD_CLEANUP): Redefine. ! ! 2002-03-24 Neil Booth ! ! * decl2.c (cxx_decode_option): Handle -E. ! * lang-specs.h (default_compilers): Preprocess with cc1plus. ! * lex.c (cxx_init): Exit quickly if c_common_init returns NULL. ! ! 2002-03-23 Jakub Jelinek ! ! PR c++/6037 ! * decl.c (start_enum): Don't set TREE_ADDRESSABLE on TREE_LIST node. ! ! 2002-03-23 Gabriel Dos Reis ! ! * error.c (dump_type): Be careful about implicit typenames. ! ! 2002-03-21 Gabriel Dos Reis ! ! PR C++/3656 ! * semantics.c (finish_base_specifier): Handle erronous base ! classes. ! ! 2002-03-22 Zack Weinberg ! ! * error.c: Always use REAL_VALUE_TO_DECIMAL; don't test ! REAL_IS_NOT_DOUBLE. ! ! 2002-03-22 Jeff Knaggs ! ! * typeck.c (get_member_function_from_ptrfunc): Scale idx down to ! an index into the vtable_entry array regardless of ! TARGET_PTRMEMFUNC_VBIT_LOCATION. ! ! 2002-03-21 Aldy Hernandez ! ! * tree.c (cp_cannot_inline_tree_fn): Same. ! ! 2002-03-21 Neil Booth ! ! * cp-tree.h (pushdecl, pushlevel, poplevel, set_block, ! insert_block, getdecls, global_bindings_p): New. ! ! 2002-03-20 Nathan Sidwell ! ! PR c++/4361 ! * mangle.c (struct globals) Add internal_mangling_p member. ! (write_template_param): Do internal mangling, if needed. ! (mangle_conv_op_name_for_type): Request internal mangling. ! ! 2002-03-20 Jason Merrill ! ! PR c++/2136 ! * init.c (build_delete): Check access for a member op delete here. ! * decl2.c (delete_sanity): Not here. ! ! 2002-03-19 Jason Merrill ! ! PR c++/5118 ! * class.c (get_vfield_name): Use the constructor_name. ! ! 2002-03-20 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_DECL_PRINTABLE_NAME): Redefine. ! * cp-tree.h (lang_printable_name): Rename. ! * error.c (lang_decl_name): Use new hook. ! * lex.c (cxx_init): Remove old hook. ! * pt.c (tsubst_decl): Use new hook. ! * tree.c (lang_printable_name): Rename. ! ! 2002-03-18 Eric Botcazou ! ! PR c++/3882 ! * pt.c (tsubst_decl): Move __PRETTY_FUNCTION__ handling... ! (tsubst_expr) [DECL_STMT]: ...here. And substitute the initializer ! only after recording the declaration. ! ! 2002-03-18 Jason Merrill ! ! PR c++/2039 ! * init.c (resolve_offset_ref): Hand off to build_component_ref. ! ! PR c++/4222, c++/5995 ! * call.c (build_over_call): Fix empty class logic. ! ! PR c++/3870 ! * cp-tree.h (struct saved_scope): Add last_parms field. ! * decl.c (maybe_push_to_top_level): Save last_function_parms. ! (pop_from_top_level): Restore it. ! ! PR c++/4377 ! * mangle.c (write_expression): Strip NOP_EXPRs sooner. Also strip ! NON_LVALUE_EXPRs. ! ! PR c++/4003 ! * pt.c (tsubst_friend_function): Use decl_namespace_context. ! ! PR c++/3948 -- C++ ABI change, followup to 2001-12-18 patch. ! * class.c (finish_struct_bits): Also set TREE_ADDRESSABLE for a ! type with a nontrivial destructor. ! ! 2002-03-17 Jason Merrill ! ! PR c++/4460 ! * class.c (build_base_path): Virtual base layout is fixed in ! in-charge [cd]tors. ! ! 2002-03-17 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_PARSE_FILE): Redefine. ! * parse.y (yyparse): Remove macro. ! ! 2002-03-17 Jason Merrill ! ! PR c++/5757 ! * init.c (build_new_1): Pass the right pointer to op delete. ! ! 2002-03-16 Nathan Sidwell ! ! PR c++/4361 ! * cp-tree.h (CLASSTYPE_METHOD_VEC): Document where templated ! conversion operators go. ! (struct lang_decl_flags): Add template_conv_p and unused ! bitfields. ! (DECL_TEMPLATE_CONV_FN_P): New macro. ! * call.c (build_user_type_conversion_1): Don't check second type ! conversion of overload set first. ! * class.c (add_method): Make sure templated conversion operators ! all end up on slot 2. ! * lex.c (do_identifier): A conversion operator token might be ! satisfied by a templated conversion operator. ! * pt.c (check_explicit_specialization): Use ! CLASSTYPE_FIRST_CONVERSION_SLOT. ! (template_parm_this_level_p): New function. ! (push_template_decl_real): Determine DECL_TEMPLATE_CONV_FN_P. ! * search.c (lookup_fnfields_1): Template conversions will be on ! the first slot. ! * typeck.c (build_component_ref): Preserve the type of an ! conversion operator name on the overload type. ! (build_x_function_call): Retrieve the conversion operator name. ! ! 2002-03-15 Richard Henderson ! ! * init.c (build_new_1): Use size_binop instead of cp_build_binary_op. ! ! 2002-03-15 Mark Mitchell ! ! * cp-tree.h (CLEANUP_DECL): Remove. ! (CLEANUP_EXPR): Likewise. ! * decl.c (destroy_local_var): Simplify. ! (maybe_build_cleanup): Tidy. ! * dump.c (cp_dump_tree): Remove handling of CLEANUP_STMT. ! * semantics.c (cp_expand_stmt): Likewise. ! * cp/tree.c (cp_statement_code_p): Likewise. ! ! 2002-03-15 Jason Merrill ! ! PR c++/5857 ! * decl.c (duplicate_decls): Use merge_types instead of common_type. ! * typeck.c (common_type): Just hand off to ! type_after_usual_arithmetic_conversions and ! composite_pointer_type. ! (merge_types): New fn. ! (commonparms): Use it instead of common_type. ! (type_after_usual_arithmetic_conversions): Also handle COMPLEX_TYPE. ! (composite_pointer_type): Also handle attributes. ! * cp-tree.h: Declare merge_types. ! ! * decl.c (make_rtl_for_nonlocal_decl): Also defer COMDAT ! variables. ! * decl2.c (maybe_make_one_only): Also mark the decl as needed. ! ! 2002-03-14 Richard Henderson ! ! * decl.c: Include c-pragma.h. ! (start_decl, start_function): Invoke maybe_apply_pragma_weak. ! * Make-lang.in: Update dependencies. ! ! 2002-03-14 Jakub Jelinek ! ! PR c++/5908 ! * call.c (build_over_call): Set TREE_NO_UNUSED_WARNING too. ! * cvt.c (convert_to_void): Preserve TREE_NO_UNUSED_WARNING. ! ! 2002-03-12 Richard Sandiford ! ! * mangle.c (write_builtin_type): Handle 128-bit integers even if ! they are not a standard integer type. ! ! 2002-03-12 Richard Sandiford ! ! * cp-tree.h (init_init_processing): Remove declaration. ! * init.c (BI_header_type, init_init_processing): Remove old ABI stuff. ! * decl.c (cxx_init_decl_processing): Don't call init_init_processing. ! ! 2002-03-12 Kaveh R. Ghazi ! ! * cp-lang.c (tree_code_type, tree_code_length, tree_code_name): ! Define. ! * decl.c (duplicate_decls): Use TREE_CODE_LENGTH, not ! tree_code_length. ! * lex.c (cplus_tree_code_type, cplus_tree_code_length, ! cplus_tree_code_name): Delete. ! (cxx_init): Don't call add_c_tree_codes, instead set ! lang_unsafe_for_reeval. Don't try to copy into the various ! tree_code arrays. ! ! 2002-03-12 Nathan Sidwell ! ! PR c++/5659 ! * decl.c (xref_tag): Don't set CLASSTYPE_DECLARED_CLASS here. ! * decl2.c (handle_class_head): Set CLASSTYPE_DECLARED_CLASS for ! definitions. ! ! 2002-03-11 Nathan Sidwell ! ! Revert 2001-03-26 Nathan Sidwell , ! DR209 is now not a defect. ! * cp-tree.h (skip_type_access_control): Remove. ! * decl.c (grokdeclarator): Do type access control for friend ! declarations. ! * semantics.c (decl_type_access_control): Don't reset ! current_type_lookups. ! (save_type_access_control): Always save the lookups. ! (skip_type_access_control): Remove. ! (finish_class_definition): Don't change type_lookups. ! ! 2002-03-11 Nathan Sidwell ! ! Revert 2000-12-01 Nathan Sidwell , ! It is incorrect. ! * typeck.c (build_static_cast): Compare non-qualified types ! with pointer to member conversions. ! ! 2002-03-11 Dan Nicolaescu ! Daniel Berlin ! ! * cp-lang.c (ok_to_generate_alias_set_for_type): New function. ! (cxx_get_alias_set): Use it. ! ! 2002-03-10 Kaveh R. Ghazi ! ! * cp-tree.h (stabilize_expr): Prototype. ! ! 2002-03-08 Craig Rodrigues ! ! * cp-tree.h (CLEAR_BINFO_MARKED): Make both parts of ! conditional return void. ! ! 2002-03-08 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_UNSAVE): Redefine. ! * cp-tree.h (cxx_unsave): New. ! * tree.c (cp_unsave): Rename cxx_unsave, update prototype. ! (init_tree): Update. ! ! 2002-03-03 Kaveh R. Ghazi ! ! * decl.c (cxx_init_decl_processing): Use ARRAY_SIZE in lieu of ! explicit sizeof/sizeof. ! * decl2.c (cxx_decode_option): Likewise. ! * lex.c (init_reswords, REDUCE_LENGTH, TOKEN_LENGTH): Likewise. ! ! 2002-03-02 Nathan Sidwell ! ! PR c++/775 ! * decl.c (lookup_tag): Only reject enum/class mismatch, not ! class/union mismatch. ! * parse.y (check_class_key): New function. ! (structsp): Call it. ! ! 2002-03-01 Michael Matz ! ! * typeck.c (cp_pointer_int_sum): Complete inner type which is ! used later by size_in_bytes(). ! ! 2002-03-01 Phil Edwards ! ! * cp-tree.h: Require __GNUC__ to be #defined. ! (build_init): Add missing prototype. ! ! 2002-03-01 Jason Merrill ! ! * except.c: Don't include decl.h or obstack.h. Do include ! tree-inline.h. ! (build_throw): Destroy temporaries from the thrown ! expression before calling __cxa_throw. Construct a thrown ! temporary directly into the exception object. ! (stabilize_throw_expr): New function. ! (wrap_cleanups_r): New function. ! * tree.c (stabilize_expr): New function. ! * init.c (build_init): New function. ! * Make-lang.in (cp/except.o): Adjust .h deps. ! ! 2002-02-28 Jason Merrill ! ! * search.c (lookup_base_r): Don't clear is_non_public just because ! we found a friendly scope. ! ! * decl.c (finish_function): Only warn about missing return ! statement with -Wreturn-type. ! ! 2002-02-28 Neil Booth ! ! * class.c (build_clone): Update. ! * cp-lang.c (LANG_HOOKS_DUP_LANG_SPECIFIC_DECL): Redefine. ! * cp-tree.h (cxx_dup_lang_specific_decl): New. ! * lex.c (copy_lang_decl): Rename cxx_dup_lang_specific_decl. ! (copy_decl): Update. ! * method.c (make_thunk): Update. ! ! 2002-02-27 Zack Weinberg ! ! * decl2.c: Delete traditional-mode-related code copied from ! the C front end but not used, or used only to permit the ! compiler to link. ! ! 2002-02-24 Craig Rodrigues ! ! PR c++/4093 ! * cp-tree.h (SET_BINFO_MARKED): Cast false part of condition ! to void. ! ! 2002-02-22 Jakub Jelinek ! ! PR other/5746 ! * semantics.c (finish_switch_cond): Don't call get_unwidened ! if error_mark_node. ! ! 2002-02-22 Nathan Sidwell ! ! PR c++/2645, DR 295 ! * cp-tree.h (tsubst_flags_t): Add tf_ignore_bad_quals, ! tf_keep_type_decl. ! (make_typename_type): Use tsubst_flags_t. ! * decl.c (make_typename_type): Adjust. Return non-artificial ! TYPE_DECLs, if required. ! (grokdeclarator): Simplify CVR qualification handling. Allow bad ! qualifiers on typedef types. ! * decl2.c (handle_class_head): Adjust make_typename_type call. ! * parse.y (nested_name_specifier): Likewise. ! (typename_sub0): Likewise. ! (typename_sub1): Likewise. ! * pt.c (convert_template_argument): Adjust make_typename_type ! return value. ! (tsubst): Adjust cp_build_qualified_type_real calls. ! (check_cv_quals_for_unify): Cope with allowing bad qualifications ! on template type parms. ! (instantiate_decl): Recheck substitutions to give warnings on bad ! qualifications. ! * tree.c (cp_build_qualified_type_real): Use tf_allow_bad_quals. ! ! 2002-02-21 Aldy Hernandez ! ! * cp/decl.c (duplicate_decls): Merge always_inline attribute. ! ! * cp/tree.c (cp_cannot_inline_tree_fn): Do not inline at -O0 ! unless DECL_ALWAYS_INLINE. ! ! 2002-02-20 Jakub Jelinek ! ! * typeck.c (cp_pointer_int_sum): Renamed from ! pointer_int_sum, call pointer_int_sum. ! ! 2002-02-20 Jakub Jelinek ! ! * decl.c (duplicate_decls): Return 0 if issued error about ! redeclaration. ! ! 2002-02-19 Jason Merrill ! ! ABI change: Mangle `void (A::*)() const' as ! M1AKFvvE, not MK1AFvvE. ! * mangle.c (write_function_type): Write cv-quals for member ! function type here. ! (write_pointer_to_member_type): Not here. ! ! 2002-02-18 Jason Merrill ! ! * pt.c (do_type_instantiation): Don't pedwarn if in_system_header. ! (do_decl_instantiation): Likewise. ! ! 2002-02-17 Craig Rodrigues ! ! PR c++/5685 ! * decl.c (duplicate_decls): Make warning unconditional ! if duplicate default argument declarations are present. ! ! 2002-02-17 Jakub Jelinek ! ! * typeck.c (build_binary_op) [BIT_XOR_EXPR]: Remove explicit ! shortening. ! ! 2002-02-15 Nathan Sidwell ! ! * decl.c (grokdeclarator): Set typedef_decl for all TYPE_DECLs, ! remove incorrect comment. Move #if 0'd code to common path. Use ! IMPLICIT_TYPENAME_P. Simplify & reformat ARRAY_TYPE duplication. ! ! 2002-02-13 Jason Merrill ! ! * decl.c (builtin_function): Set TREE_THIS_VOLATILE on return fns. ! (finish_function): Don't warn if current_function_returns_null. ! ! * typeck2.c (digest_init): Do handle values of vector type. ! ! * typeck2.c (digest_init, process_init_constructor): Treat vectors ! like arrays. ! ! 2002-02-11 Jason Merrill ! ! * parse.y (reserved_declspecs): Don't handle attributes. ! (reserved_typespecquals): Handle them here. ! * Make-lang.in (parse.c): Adjust expected conflicts. ! ! 2002-02-08 Jakub Jelinek ! ! * parse.y (primary, primary_no_id): Use compstmt_or_stmtexpr ! instead of compstmt. ! (compstmt_or_stmtexpr): Renamed from compstmt. ! (compstmt): In addition to compstmt_or_stmtexpr clear last_expr_type. ! ! 2002-02-07 Nathan Sidwell ! ! Rename instantiate_type_flags to tsubst_flags_t & expand use. ! * cp-tree.h (instantiate_type_flags): Rename to ... ! (tsubst_flags_t): ... here. Rename itf_complain to tf_error, ! add tf_warning flag. ! (instantiate_type): Adjust prototype. ! (tsubst, tsubst_expr, tsubst_copy, lookup_template_class, ! do_type_instantiation, cp_build_qualified_type_real): Likewise. ! cp_build_qualified_type: Adjust. ! * class.c (instantiate_type): Adjust parameter. Rename itf_* to ! tf_*. ! * call.c (standard_conversion): Rename itf_* to tf_*. ! (reference_binding): Likewise. ! (convert_like_real): Likewise. ! * cvt.c (cp_convert_to_pointer): Likewise. ! (convert_to_reference): Likewise. ! * decl.c (lookup_namespace_name): Use tf_* flags. ! (make_typename_type): Likewise. ! (grokdeclarator): Likewise. ! * pt.c (convert_nontype_argument): Adjust COMPLAIN usage. ! (coerce_template_template_parms, convert_template_argument, ! coerce_template_parms, maybe_get_template_decl_from_type_decl, ! lookup_template_class, tsubst_friend_function, tsubst_friend_class, ! instantiate_class_template, tsubst_template_arg_vector, ! tsubst_template_parms, tsubst_aggr_type, tsubst_default_argument, ! tsubst_decl, tsubst_arg_types, tsubst_function_type, ! tsubst_call_declarator_parms, tsubst, tsubst_copy, tsubst_expr, ! instantiate_template, fn_type_unification, ! resolve_overloaded_unification, verify_class_unification, ! unify, get_bindings_real, do_type_instantiation, ! regenerate_decl_from_template, instantiate_decl, ! tsubst_initializer_list, tsubst_enum, ! get_mostly_instantiated_function_type, ! invalid_nontype_parm_type_p): Likewise. ! * tree.c (cp_build_qualified_type_real): Likewise. ! * typeck.c (build_binary_op): Rename itf_* to tf_*. ! (build_ptrmemfunc): Likewise. ! (convert_for_assignment): Likewise. ! ! 2002-02-07 Nathan Sidwell ! ! PR c++/109 ! * decl.c (grokdeclarator): Allow friend declarations from ! dependent types. ! * decl2.c (handle_class_head): Don't push into template parm contexts. ! * pt.c (push_template_decl_real): Template parm contexts are never ! being defined. ! ! 2002-02-05 Alexandre Oliva ! ! * class.c: Include target.h. ! (check_bitfield_decl): Disregard EMPTY_FIELD_BOUNDARY, ! BITFIELDS_NBYTES_LIMITED and PCC_BITFIELD_TYPE_MATTERS for MS ! bit-field layout. ! * Make-lang.in: Adjust deps. ! ! 2002-02-05 Jason Merrill ! ! * error.c (dump_type): Be more helpful about VECTOR_TYPE. ! ! 2002-02-04 Jakub Jelinek ! ! * semantics.c (begin_switch_stmt): Clear SWITCH_TYPE. ! (finish_switch_cond): Set SWITCH_TYPE. ! ! 2002-02-04 Richard Henderson ! ! * method.c (use_thunk): Always initialize the block tree. Reindent. ! * semantics.c (expand_body): Emit thunks after function, not before. ! ! 2002-02-04 Jason Merrill ! ! * decl.c (start_function): Call cplus_decl_attributes immediately ! after grokdeclarator. ! ! * decl.c (start_function): Combine DECL_RESULT handling code. ! ! 2002-02-03 Jason Merrill ! ! * xref.c: Remove. ! * Make-lang.in (CXX_OBJS): Remove cp/xref.o ! (cp/xref.o): Remove dependencies. ! * class.c (finish_struct_1, check_methods): Don't call xref fns. ! (finish_struct_1): Likewise. ! * friend.c (make_friend_class): Likewise. ! * lex.c (cxx_init, cxx_finish, extract_interface_info): Likewise. ! * spew.c (read_process_identifier): Likewise. ! ! 2002-02-01 Jason Merrill ! ! PR c++/4872 ! * decl.c (finish_function): Warn about a non-void function with ! no return statement and no abnormal exit. ! * cp-tree.h (struct cp_language_function): Add returns_abnormally. ! (current_function_returns_abnormally): New macro. ! * call.c (build_call): Set it. ! ! * typeck.c (build_component_ref): Always complain about offsetof ! constructs on non-PODs. Only make it an error for members of ! virtual bases. ! ! * error.c (dump_scope): Don't add TFF_DECL_SPECIFIERS. ! (dump_function_decl): Always dump parms. ! ! * decl2.c (finish_static_data_member_decl): Complain about a local ! class with a static data member. ! ! PR c++/4286 ! * search.c (lookup_field_1): Don't xref a static data member ! just because we looked it up. ! ! 2002-01-31 Jason Merrill ! ! * Make-lang.in (parse.c): Handle .output file. ! ! PR c++/3395 ! * decl.c (xref_tag): Remember early attributes in TYPE_ATTRIBUTES, ! not TREE_TYPE. ! * semantics.c (finish_class_definition): Adjust. ! ! Allow attributes in parms and casts. ! * parse.y (named_parm): Don't strip attrs. ! (declmods): Remove 'attributes' production. ! (nonempty_cv_qualifiers): Accept attributes. ! (ATTRIBUTE): Give precedence. ! * decl.c (groktypename): Handle attributes. ! (grokparms): Likewise. ! ! 2002-01-29 Jakub Jelinek ! ! * decl2.c (cxx_decode_option): Pass 0 as last argument to ! cpp_handle_option. ! * lang-specs.h: Use cpp_unique_options instead of cpp_options ! when used together with cc1_options. ! ! 2002-01-29 Nathan Sidwell ! ! PR c++/5132 ! * typeck2.c (digest_init): Make sure non-array core type is ! instantiated. ! * decl2.c (reparse_absdcl_as_casts): Just store the type in the ! constructor, rather than build a new one. ! (build_expr_from_tree, CONSTRUCTOR case): Be careful with the ! PURPOSE of constructor elts. ! ! 2002-01-23 Zack Weinberg ! ! * Make-lang.in (parse.c): Adjust expected number of ! shift-reduce conflicts. ! (decl.o): Depend on diagnostic.h. ! * decl.c: Include diagnostic.h. ! (grokdeclarator): Check for null pointer. ! (finish_function): Don't abort when ! current_binding_level->parm_flag != 1, if errors have ! occurred; throw away the statement tree and extra binding ! levels, and continue. ! * lex.c (note_list_got_semicolon): Check for null pointer. ! * method.c (hack_identifier): Just return error_mark_node if ! value is error_mark_node. ! * parse.y (primary: TYPEID(type_id)): No need to use ! TYPE_MAIN_VARIANT here. ! (handler_seq): Accept an empty list of catch clauses and ! generate a fake handler block to avoid later crashes. ! (ansi_raise_identifier): Accept the error token too. ! * semantics.c (begin_class_definition, ! finish_class_definition): Check for error_mark_node. ! ! 2002-01-23 Zack Weinberg ! ! * typeck2.c (friendly_abort): Delete definition. ! * cp-tree.h (friendly_abort): Don't prototype. ! (my_friendly_assert): Use fancy_abort. ! ! 2002-01-23 Craig Rodrigues ! ! * cp-tree.h (my_friendly_abort): Remove. ! ! 2002-01-23 Jakub Jelinek ! ! * spew.c (pending_inlines, pending_inlines_tail, ! processing_these_inlines): Make static. ! (mark_pending_inlines): Remove static. ! (begin_parsing_inclass_inline): If in function, save pi ! for GC to cp_function_chain->unparsed_inlines instead. ! (process_next_inline): Likewise. ! * cp-tree.h (struct cp_language_function): Add unparsed_inlines. ! (mark_pending_inlines): Add prototype. ! * decl.c (spew_debug): Remove unused extern. ! (mark_lang_function): Call mark_pending_inlines. ! ! 2002-01-23 Craig Rodrigues ! ! * call.c, class.c, decl.c, decl2.c, error.c, expr.c, friend.c, ! init.c, lex.c, mangle.c, method.c, pt.c, repo.c, rtti.c, search.c, ! semantics.c, spew.c, tree.c, typeck.c, typeck2.c, xref.c: ! Change my_fancy_abort() to abort(). ! ! 2002-01-23 Jason Merrill ! ! PR c++/5453 ! * class.c (fixed_type_or_null): Fix thinko. ! ! PR c++/3331 ! * init.c (resolve_offset_ref): Use build_indirect_ref. ! ! * decl2.c (grokclassfn): Don't set DECL_REGISTER on 'this'. ! ! 2002-01-22 Jason Merrill ! ! * parse.y (function_body): Suppress the block for the outermost ! curly braces. ! * decl.c (pushdecl): Don't try to skip it. ! (begin_function_body): Keep the block we create, not the next one. ! * init.c (emit_base_init): Don't mess with keep_next_level. ! ! * class.c (build_base_path): Tweak formatting. ! ! 2002-01-19 Nathan Sidwell ! ! Fix regression introduced with patch for c++/775 ! * parse.y (class_head_defn): Check for template specializations ! with a different class-key. ! ! 2002-01-17 Jason Merrill ! ! * decl.c (begin_constructor_body, begin_destructor_body): New fns. ! (begin_function_body): Call them and keep_next_level. ! * init.c (emit_base_init): Call keep_next_level. ! * semantics.c (setup_vtbl_ptr): Lose. ! * cp-tree.h (struct cp_language_function): Remove vtbls_set_up_p. ! (vtbls_set_up_p): Lose. ! * pt.c (tsubst_expr, CTOR_INITIALIZER): Call emit_base_init. ! * method.c (do_build_copy_constructor): Likewise. ! (synthesize_method): Call finish_mem_initializers. ! * parse.y (nodecls): Likewise. ! ! * error.c (dump_type_suffix): Print the exception specs before ! recursing. ! (dump_function_decl): Here, too. ! ! * cp-tree.h (TMPL_PARMS_DEPTH): Cast to signed HOST_WIDE_INT. ! ! 2002-01-10 Ira Ruben ! ! PR c++/907 ! * decl.c (start_method): Handle attrlist. ! ! 2002-01-10 Jakub Jelinek ! ! * decl2.c (max_tinst_depth): Increase default limit to 500. ! ! 2002-01-10 Graham Stott ! ! * spew.c (YYCHAR): Uppercase macro parameter and add ! parenthesis. ! (YYCODE): Likewise. ! (NAME): Uppercase macro parameter. ! ! 2002-01-09 Graham Stott ! ! * decl.h (grokdeclarator): Wrap long line. ! ! * semantics.c (FINISH_COND): Uppercase macro paramaters and ! add parenthesis. ! ! 2002-01-08 Graham Stott ! ! * xref.c (FILE_NAME_ABSOLUTE_P): Add parenthesis. ! (PALLOC): Uppercase macro parameter and whitespace. ! (SALLOC): Uppercase macro parameter. ! (SFREE): Uppercase macros parameter, add parenthese and ! whitespace. ! (STREQL): Uppercase macro parameter and whitespace. ! (STRNEQ): Likewise. ! (STRLSS): Likewise. ! (STRLEQ): Likewise. ! (STRGTR): Likewise. ! (STRGEQ): Likewise. ! ! * call.c (convert_like): Add parenthesis and wrap. ! (convert_like_with_context): Likewise. ! (ICS_RANK): Whitespace. ! (NEED_TEMPORARY_P): Remove parenthesis. ! ! * class.c (VTT_TOP_LEVEL_P): Uppercase macro parameter and ! whitespace. ! (VTT_MARKED_BINFO_P): Likewise. ! ! * decl.c (BINDING_LEVEL): Add parenthesis. ! (DEF_OPERATOR): Likewise. ! ! * mangle.c (MANGLE_TRACE): Add parenthesis. ! (MANGLE_TRACE_TREE): Likewise. ! (write_signed_number): Likewise. ! (write_unsigned_number): Likewise. ! ! * pt.c (ccat): Uppercase macro parameter. ! (cat): Likewise ! ! * search.c (SET_BINFO_ACCESS): Add parenthesis. ! ! 2002-01-07 Jason Merrill ! ! * decl2.c (coerce_new_type): Downgrade error for size_t mismatch ! to pedwarn. ! ! PR c++/3536 ! * method.c (make_thunk): If !flag_weak, give the thunk the ! function's linkage. ! (use_thunk): Here, too. ! ! 2002-01-07 Graham Stott ! ! * error.c: Update copyright date. ! (print_scope_operator): Add parenthesis. ! (print_left_paren): Likewise. ! (print_right_paren): Likewise. ! (print_left_bracket): Likewise. ! (print_right_bracket): Likewise. ! (print_template_argument_list_start): Likewise. ! (print_template_argument_list_end): Likewise. ! (print_non_consecutive_character): Likewise. ! (print_tree_identifier): Likewise. ! (print_identifier): Likewise. ! (NEXT_CODE): Uppercase macro parameter. ! (ident_fndecl): Delete unused. ! (GLOBAL_THING): Likewise. ! ! 2002-01-06 Graham Stott ! ! * cp-tree.h (VAR_OR_FUNCTION_DECL_CHECK): Add parenthesis. ! (VAR_FUNCTION_OR_PARM_DECL_CHECK): Likewise. ! (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK) Likewise. ! (RECORD_OR_UNION_TYPE_CHECK): Likewise. ! (BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK): Likewise. ! (C_IS_RESERVED_WORD): Uppercase macro parameter. ! (C_RID_YYCODE) Likewise. ! (ptrmem_cst): Use rtx. ! (LOCAL_BINDING_P): Add whitespace. ! (INHERITED_VALUE_BINDING_P): Likewise. ! (BINDING_SCOPE): Wrap long line. ! (BINDING_HAS_LEVEL_P): Remove parenthesis. ! (BINDING_VALUE): Wrap long line. ! (BINDING_TYPE): Whitespace. ! (IDENTIFIER_GLOBAL_VALUE): Add parenthesis. ! (SET_IDENTIFIER_GLOBAL_VALUE): Likewise. ! (IDENTIFIER_NAMESPACE_VALUE): Likewise. ! (SET_IDENTIFIER_NAMESPACE_VALUE: Likewise. ! (same_type_p): Uppercase macro parameters. ! (same_type_ignoring_top_level_qualifiers_p): Likewise. ! (OVL_FUNCTION): Wrap long line. ! (OVL_CHAIN): Whitespace. ! (OVL_CURRENT): Add parenthesis and whitespace. ! (OVL_NEXT): Whitespace. ! (OVL_USED): Likewise. ! (IDENTIFIER_TYPE_VALUE): Likewise. ! (REAL_IDENTIFIER_TYPE_VALUE): Remove parenthesis. ! (SET_IDENTIFIER_TYPE_VALUE): Add parenthesis and whitespace. ! (LANG_ID_FIELD): Whitespace. ! (SET_LANG_ID(NODE,VALUE,NAME): Likewise. ! (IDENTIFIER_LABEL_VALUE): Whitespace and wrap. ! (SET_IDENTIFIER_LABEL_VALUE): Whitespace. ! (IDENTIFIER_IMPLICIT_DECL): Whitespace and wrap. ! (SET_IDENTIFIER_IMPLICIT_DECL); Whitespace. ! (IDENTIFIER_ERROR_LOCUS): Whitespace and wrap. ! (SET_IDENTIFIER_ERROR_LOCUS); Whitespace. ! (IDENTIFIER_VIRTUAL_P): Likewise. ! (IDENTIFIER_OPNAME_P): Likewise. ! (IDENTIFIER_TYPENAME_P): Remove parenthesis. ! (C_TYPE_FIELDS_READONLY): Uppercase macro parameters. ! (C_SET_EXP_ORIGINAL_CODE): Likewise. ! (TYPE_ASSEMBLER_NAME_STRING): Wrap long line. ! (TYPE_ASSEMBLER_NAME_LENGTH): Likewise. ! (IS_AGGR_TYPE): Uppercase macro parameter. ! (CLASS_TYPE_P): Likewise. ! (IS_AGGR_TYPE_CODE): Uppercase macro parameter and parenthesis. ! (IS_AGGR_TYPE_2): Whitespace. ! (TAGGED_TYPE_P): Uppercase macro parameter. ! (TYPE_BUILT_IN): Whitespace. ! (TYPE_FOR_JAVA): Likewise. ! (FUNCTION_ARG_CHAIN): Remove parenthesis. ! (FUNCTION_FIRST_USER_PARMTYPE): Add parenthesis. ! (FUNCTION_FIRST_USER_PARAM): Likewise. ! (PROMOTES_TO_AGGR_TYPE): Whitespace. ! (DERIVED_FROM_P): Add parenthesis and wrap. ! (UNIQUELY_DERIVED_FROM_P): Likewise. ! (ACCESSIBLY_UNIQUELY_DERIVED_P): Likewise. ! (PUBLICLY_UNIQUELY_DERIVED_P): Likewise. ! (CLASSTYPE_USE_TEMPLATE): Whitespace. ! (CLASSTYPE_INLINE_FRIENDS): Remove parenthesis. ! (TYPE_GETS_DELETE): Add parenthesis. ! (TYPE_HAS_CONVERSION): Add parenthesis and wrap. ! (TYPE_HAS_ASSIGN_REF): Likewise, ! (TYPE_HAS_CONST_ASSIGN_REF): Likewise. ! (TYPE_HAS_INIT_REF): Likewise. ! (TYPE_HAS_CONST_INIT_REF): Likewise. ! (TYPE_BEING_DEFINED): Likewise. ! (TYPE_LANG_SPECIFIC): Likewise. ! (CLASSTYPE_RTTI): Likewise. ! (TYPE_OVERLOADS_CALL_EXPR): Likewise. ! (TYPE_OVERLOADS_ARRAY_REF): Likewise. ! (TYPE_OVERLOADS_ARROW): Likewise. ! (TYPE_USES_MULTIPLE_INHERITANCE): Likewise. ! (TYPE_USES_VIRTUAL_BASECLASSES): Add parenthesis. ! (CLASSTYPE_METHOD_VEC): Likewise. ! (CLASSTYPE_MARKED_N): Likewise. ! (CLASSTYPE_MARKED): Likewise. ! (CLASSTYPE_MARKED2): Likewise. ! (CLASSTYPE_MARKED3): Likewise. ! (CLASSTYPE_MARKED4): Likewise. ! (CLASSTYPE_MARKED5): Likewise. ! (CLASSTYPE_MARKED6): Likewise. ! (SET_CLASSTYPE_MARKED): Whitespace. ! (CLEAR_CLASSTYPE_MARKED): Likewise. ! (SET_CLASSTYPE_MARKED2): Likewise. ! (CLEAR_CLASSTYPE_MARKED2): Likewise. ! (SET_CLASSTYPE_MARKED3): Likewise. ! (CLEAR_CLASSTYPE_MARKED3): Likewise. ! (SET_CLASSTYPE_MARKED4): Likewise. ! (CLEAR_CLASSTYPE_MARKED4): Likewise. ! (SET_CLASSTYPE_MARKED5): Likewise. ! (CLEAR_CLASSTYPE_MARKED5): Likewise. ! (SET_CLASSTYPE_MARKED6): Likewise. ! (CLEAR_CLASSTYPE_MARKED6): Likewise. ! (CLASSTYPE_TAGS): Likewise. ! (CLASSTYPE_VSIZE): Likewise. ! (CLASSTYPE_VBASECLASSES): Likewise. ! (CANONICAL_BINFO): Add parenthesis. ! (CLASSTYPE_SIZE(NODE): Likewise. ! (CLASSTYPE_SIZE_UNIT): Likewise. ! (CLASSTYPE_ALIGN(NODE): Likewise. ! (CLASSTYPE_USER_ALIGN): Likewise. ! (TYPE_JAVA_INTERFACE): Likewise. ! (CLASSTYPE_PURE_VIRTUALS): Likewise. ! (CLASSTYPE_NEEDS_VIRTUAL_REINIT): Whitespace and wrap. ! (TYPE_HAS_DEFAULT_CONSTRUCTOR): Likewise. ! (CLASSTYPE_HAS_MUTABLE): Likewise. ! (CLASSTYPE_FRIEND_CLASSES): Likewise. Likewise. ! (CLASSTYPE_DECLARED_CLASS): Whitespace and wrap. ! (CLASSTYPE_READONLY_FIELDS_NEED_INIT): Likewise. ! (CLASSTYPE_REF_FIELDS_NEED_INIT): Likewise. ! (CLASSTYPE_INTERFACE_ONLY): Likewise. ! (CLASSTYPE_INTERFACE_KNOWN): Likewise. ! (CLASSTYPE_INTERFACE_UNKNOWN): Likewise. ! (SET_CLASSTYPE_INTERFACE_UNKNOWN_X): Likewise. ! (SET_CLASSTYPE_INTERFACE_UNKNOWN): Likewise. ! (SET_CLASSTYPE_INTERFACE_KNOWN): Likewise. ! (CLASSTYPE_DEBUG_REQUESTED): Whitespace and wrap. ! (BINFO_UNSHARED_MARKED): Whitespace. ! (BINFO_MARKED): Whitespace and wrap. ! (SET_BINFO_MARKED): Likewise. ! (CLEAR_BINFO_MARKED): Likewise. ! (BINFO_VTABLE_PATH_MARKED): Likewise. ! (SET_BINFO_VTABLE_PATH_MARKED): Likewise. ! (CLEAR_BINFO_VTABLE_PATH_MARKED): Likewise. ! (BINFO_SUBVTT_INDEX): Remove parenthesis. ! (BINFO_VPTR_INDEX): Likewise. ! (BINFO_PRIMARY_BASE_OF): Likewise, ! (CLASSTYPE_VFIELDS): Whitespace. ! (VF_DERIVED_VALUE): Wrap long line. ! (NAMESPACE_LEVEL): Whitespace. ! (CAN_HAVE_FULL_LANG_DECL_P): Remove parenthesis. ! (DEFARG_POINTER): Whitespace. ! (DECL_NEEDED_P): Remove parenthesis. ! (DECL_LANGUAGE): Whitespace. ! (SET_DECL_LANGUAGE): Add parenthesis. ! (DECL_CONSTRUCTOR_P): Whitespace and wrap. ! (DECL_OVERLOADED_OPERATOR_P): Remove parenthesis. ! (DECL_IN_AGGR_P): Whitespace. ! (DECL_FRIEND_P): Likewise. ! (DECL_BEFRIENDING_CLASSES): Likewise. ! (DECL_STATIC_FUNCTION_P): Whitespace and wrap. ! (DECL_NONCONVERTING_P): Whitespace. ! (DECL_PURE_VIRTUAL_P): Likewise. ! (DECL_NEEDS_FINAL_OVERRIDER_P): Likewise. ! (DECL_PENDING_INLINE_INFO): Whitespace. ! (DECL_SORTED_FIELDS): Likewise. ! (DECL_DEFERRED_FN): Likewise. ! (DECL_TEMPLATE_INFO): Likewise. ! (CLASSTYPE_TEMPLATE_INFO): Whitespace and wrap. ! (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO); Likewise. ! (SET_TYPE_TEMPLATE_INFO): Add parenthesis. ! (TMPL_ARGS_LEVEL): Likewise. ! (SET_TMPL_ARGS_LEVEL): Likewise. ! (INNERMOST_TEMPLATE_PARMS): Whitespace. ! (C_TYPEDEF_EXPLICITLY_SIGNED): Uppercase macro parameter. ! (INTEGRAL_CODE_P(CODE): Add parenthesis. ! (CP_INTEGRAL_TYPE_P): Remove parenthesis. ! (TYPE_HAS_CONSTRUCTOR): Whitespace. ! (TREE_HAS_CONSTRUCTOR): Likewise. ! (TYPE_HAS_DESTRUCTOR): Likewise. ! (TYPE_HAS_REAL_ASSIGN_REF): Likewise. ! (TYPE_HAS_COMPLEX_ASSIGN_REF): Likewise. ! (TYPE_HAS_ABSTRACT_ASSIGN_REF): Likewise. ! (TYPE_HAS_COMPLEX_INIT_REF): Likewise. ! (TYPE_HAS_NONTRIVIAL_DESTRUCTOR): Likewise. ! (TYPE_PTRMEMFUNC_P): Likewise. ! (TYPE_PTRMEMFUNC_FLAG): Likewise. ! (TYPE_GET_PTRMEMFUNC_TYPE): Likewise. ! (TYPE_SET_PTRMEMFUNC_TYPE): Likewise. ! (TYPE_PTRMEM_CLASS_TYPE): Remove parenthesis. ! (TYPE_PTRMEM_POINTED_TO_TYPE): Likewise. ! (DECL_ACCESS): Whitespace. ! (DECL_GLOBAL_CTOR_P): Remove parenthesis. ! (DECL_GLOBAL_DTOR_P): Likewise. ! (GLOBAL_INIT_PRIORITY): Likewise. ! (DECL_TEMPLATE_PARMS): Likewise. ! (DECL_TEMPLATE_RESULT): Likewise. ! (DECL_TEMPLATE_INSTANTIATIONS): Likewise. ! (DECL_TEMPLATE_SPECIALIZATIONS): Likewise. ! (DECL_IMPLICIT_TYPEDEF_P): Remove parenthesis. ! (SET_DECL_IMPLICIT_TYPEDEF_P): Likewise. ! (PRIMARY_TEMPLATE_P): Add parenthesis. ! (DECL_USE_TEMPLATE): Whitespace. ! (CLASSTYPE_IMPLICIT_INSTANTIATION): Likewise. ! (SET_CLASSTYPE_IMPLICIT_INSTANTIATION): Likewise. ! (CLASSTYPE_EXPLICIT_INSTANTIATION): Likewise. ! (SET_CLASSTYPE_EXPLICIT_INSTANTIATION): Likewise. ! (CALL_DECLARATOR_PARMS): Remove parenthesis. ! (CALL_DECLARATOR_QUALS): Likewise. ! (CALL_DECLARATOR_EXCEPTION_SPEC): Likewise. ! (TEMP_NAME_P): Wrap. ! (VFIELD_NAME_P): Likewise. ! (B_SET): Uppercase macro parameters and add parenthesis. ! (B_CLR): Likewise. ! (B_TST): Likewise. ! (LOOKUP_NAMESPACES_ONLY): Uppercase macro parameters. ! (LOOKUP_TYPES_ONLY): Uppercase macro parameters. ! (LOOKUP_QUALIFIERS_ONLY): Uppercase macro parameters. ! (same_or_base_type_p): Likewise. ! (cp_deprecated): Likewise. ! ! 2002-01-05 Richard Henderson ! ! * semantics.c (expand_body): Revert last change. ! ! 2002-01-04 Jason Merrill ! ! PR c++/4122 ! * class.c (update_vtable_entry_for_fn): Set delta to zero for a ! lost primary. ! ! * class.c (build_vtbl_initializer): Check for a lost primary ! before calculating the vtable entry to throw away. ! ! 2002-01-02 Jason Merrill ! ! * semantics.c (expand_body): Call outlining_inline_function when ! emitting an inline function out of line. ! ! 2002-01-02 Nathan Sidwell ! ! PR c++/5116, c++/764 reversion ! * call.c (build_new_op): Revert the instantiations. They are ! incorrect. ! ! 2002-01-02 Nathan Sidwell ! ! PR c++/5089 ! * decl2.c (reparse_absdcl_as_casts): Don't warn about casts to void. ! ! 2002-01-02 Nathan Sidwell ! ! PR c++/3716 ! * pt.c (tsubst_aggr_type): Move pmf handling into tsubst. ! (tsubst, case POINTER_TYPE): Handle pmfs here. ! (tsubst, case OFFSET_TYPE): Check it is not an offset to ! reference. If it is offset to FUNCTION_TYPE, create a METHOD_TYPE. ! ! 2002-01-02 Nathan Sidwell ! ! PR c++/35 ! * cp-tree.h (DECL_LANG_FLAG_0): Used for PARM_DECL too. ! (DECL_TEMPLATE_PARM_P): A PARM_DECL might be one too. ! * pt.c (process_template_parm): SET_DECL_TEMPLATE_PARM_P on the ! PARM_DECL. ! (tsubst_template_parms): Break up loop statements. ! (tsubst_decl, case PARM_DECL): Copy DECL_TEMPLATE_PARM_P. Template ! parm PARM_DECLs don't get promoted. ! ! 2002-01-02 Nathan Sidwell ! ! PR c++/5123 ! * typeck.c (build_component_ref): Cope with a TEMPLATE_ID_EXPR. ! (build_x_function_call): Cope with a COMPONENT_REF containing a ! TEMPLATE_ID_EXPR. ! ! 2002-01-02 Nathan Sidwell ! ! PR c++/5213 ! * pt.c (convert_template_argument): Be more careful determining ! when RECORD_TYPE templates are or are not templates. ! ! 2002-01-02 Nathan Sidwell ! ! PR c++/775 ! * cp-tree.h (handle_class_head): Adjust prototype. ! * decl2.c (handle_class_head): Add DEFN_P and NEW_TYPE_P ! parameters. Use for all class heads. ! * parse.y (named_class_head_sans_basetype, named_class_head, ! named_complex_class_head_sans_basetype, ! named_class_head_sans_basetype_defn, ! unnamed_class_head): Remove. ! (class_head, class_head_apparent_template): Recognize class heads ! (class_head_decl, class_head_defn): New reductions. Process class ! heads. ! (structsp): Adjust class definition and class declaration ! reductions. ! (maybe_base_class_list): Give diagnostic on empty list. ! ! 2002-01-02 Nathan Sidwell ! ! PR c++/4379 ! * typeck.c (build_x_unary_op): Don't destroy the OFFSET_REF on a ! single non-static member. ! (unary_complex_lvalue): If it cannot be a pointer to member, don't ! make it so. Check it is not pointer to reference. ! ! 2002-01-02 Nathan Sidwell ! ! PR c++/5132 ! * decl2.c (reparse_absdcl_as_casts): Don't digest_init if we ! are processing a template decl. ! ! 2002-01-02 Nathan Sidwell ! ! PR c++/5116, c++/764 ! * call.c (build_new_op): Make sure template class operands are ! instantiated. Simplify arglist construction. ! ! 2001-12-29 Nathan Sidwell ! ! * call.c (build_user_type_conversion_1): Use my_friendly_assert ! rather than if ... abort. ! * cvt.c (convert_to_reference): Likewise. ! * semantics.c (setup_vtbl_ptr): Likewise. ! * pt.c (lookup_template_class): Comment typo. ! ! 2001-12-29 Nathan Sidwell ! ! PR c++/5125 ! * pt.c (push_template_decl_real): Make sure DECL has ! DECL_LANG_SPECIFIC. ! ! 2001-12-29 Nathan Sidwell ! ! PR c++/335 ! * init.c (resolve_offset_ref): Copy cv qualifiers of this pointer ! for non-reference fields. ! * typeck.c (require_complete_type): Use resolve_offset_ref). ! ! 2001-12-26 Nathan Sidwell ! ! PR c++/196 ! * parse.y (bad_parm): Better diagnostic when given a SCOPE_REF. ! ! 2001-12-24 Nathan Sidwell ! ! PR c++/160 ! * typeck.c (build_modify_expr): Remove old unreachable code & tidy ! up. Don't stabilize_references when initializing a reference. ! ! 2001-12-23 Kaveh R. Ghazi ! ! * decl2.c (lang_f_options): Const-ify. ! ! 2001-12-20 Joseph S. Myers ! ! * config-lang.in (diff_excludes): Remove. ! ! 2001-12-19 Nathan Sidwell ! ! PR c++/90 ! * typeck.c (build_function_call_real): Use original function ! expression for errors. ! ! 2001-12-18 Jason Merrill ! ! PR c++/3242 ! * class.c (add_method): Do compare 'this' quals when trying to match a ! used function. Don't defer to another used function. ! ! 2001-12-18 Nathan Sidwell ! ! * pt.c (instantiate_clone): Remove, fold into ... ! (instantiate_template): ... here. Simplify by removing mutual ! recursion. ! * typeck2.c (build_m_component_ref): Don't cv qualify the function ! pointed to by a pointer to function. ! * class.c (delete_duplicate_fields_1): Typo. ! ! 2001-12-18 Jason Merrill ! ! C++ ABI change: destroy value arguments in caller. ! * semantics.c (genrtl_start_function, genrtl_finish_function): Don't ! create an extra binding level for the parameters. ! * decl.c (store_parm_decls): Don't do parameter cleanups. ! ! 2001-12-18 Nathan Sidwell ! ! * call.c (build_new_method_call): Use '%#V'. ! * error.c (cv_to_string): Use V parameter to determine padding. ! ! 2001-12-18 Joseph S. Myers ! ! * call.c, decl2.c, init.c: Use "built-in" and "bit-field" ! spellings in messages. ! ! 2001-12-17 Zack Weinberg ! ! * cp-tree.h: Delete #defines for cp_error, cp_warning, ! cp_pedwarn, and cp_compiler_error. ! * call.c, class.c, cp-tree.h, cvt.c, decl.c, decl2.c, error.c, ! except.c, friend.c, init.c, lex.c, method.c, parse.y, pt.c, ! rtti.c, search.c, semantics.c, spew.c, tree.c, typeck.c, ! typeck2.c: Change calls to the above macros to use their ! language-independent equivalents: error, warning, pedwarn, and ! internal_error respectively. ! ! 2001-12-16 Neil Booth ! ! * decl2.c (finish_file): Remove back_end_hook. ! ! 2001-12-16 Joseph S. Myers ! ! * ChangeLog.1, ChangeLog.2, ChangeLog, NEWS, call.c, class.c, ! cp-tree.h, decl.c, decl2.c, except.c, operators.def, optimize.c, ! pt.c, rtti.c, semantics.c, typeck.c: Fix spelling errors. ! ! 2001-12-15 Joseph S. Myers ! ! * lang-options.h: Use American spelling in messages. ! ! 2001-12-13 Jason Merrill ! ! * Make-lang.in (parse.h): Separate rule, just depend on parse.c. ! ! Use cleanups to run base and member destructors. ! * init.c (push_base_cleanups): New function, split out from... ! (build_delete): ...here. Lose !TYPE_HAS_DESTRUCTOR code. ! * decl.c (finish_destructor_body): Move vbase destruction code to ! push_base_cleanups. ! (begin_function_body, finish_function_body): New fns. ! (finish_function): Move [cd]tor handling and call_poplevel to ! finish_function_body. ! (pushdecl): Skip the new level. ! * semantics.c (genrtl_try_block): Don't call end_protect_partials. ! (setup_vtbl_ptr): Call push_base_cleanups. ! * method.c (synthesize_method): Call {begin,end}_function_body. ! * pt.c (tsubst_expr): Handle COMPOUND_STMT_BODY_BLOCK. ! * cp-tree.h: Declare new fns. ! * parse.y (function_body, .begin_function_body): New nonterminals. ! (fndef, pending_inline, function_try_block): Use function_body. ! (ctor_initializer_opt, function_try_block): No longer has a value. ! (base_init): Remove .set_base_init token. ! (.set_base_init, compstmt_or_error): Remove. ! * Make-lang.in (parse.c): Expect two fewer s/r conflicts. ! ! * optimize.c (maybe_clone_body): Fix parameter updating. ! ! 2001-12-12 Jason Merrill ! ! * decl.c (store_parm_decls): Remove parms_have_cleanups cruft. ! * semantics.c (genrtl_start_function): Don't pass ! parms_have_cleanups or push an extra binding level. ! (genrtl_finish_function): Lose cleanup_label cruft. ! ! * cp-tree.h (struct cp_language_function): Remove x_ctor_label. ! (ctor_label): Remove. ! * semantics.c (finish_return_stmt): Lose ctor_label support. ! * decl.c (finish_constructor_body, mark_lang_function): Likewise. ! * typeck.c (check_return_expr): Check DECL_DESTRUCTOR_P, not ! dtor_label. ! ! * call.c (build_new_method_call): Let resolves_to_fixed_type_p ! check for [cd]tors. ! * class.c (fixed_type_or_null, case INDIRECT_REF): Fix. ! ! * decl.c (finish_function): Check VMS_TARGET, not VMS. ! ! * decl.c (start_cleanup_fn): Remove redundant pushlevel. ! (end_cleanup_fn): And poplevel. ! ! * semantics.c (setup_vtbl_ptr): Always build a CTOR_INITIALIZER ! if we're in a template. ! ! 2001-12-12 Jakub Jelinek ! ! * cp-tree.h (DESTRUCTOR_DECL_PREFIX, DESTRUCTOR_NAME_P, ! ANON_PARMNAME_FORMAT, ANON_PARMNAME_P, DESTRUCTOR_NAME_FORMAT, ! THIS_NAME_P): Delete. ! * spew.c (read_process_identifier): Remove DESTRUCTOR_NAME_P, ! THIS_NAME_P and ANON_PARMNAME_P tests from warning about clash ! with internal naming scheme. ! * error.c (dump_decl): Remove DESTRUCTOR_NAME_P use. ! ! 2001-12-12 Nathan Sidwell ! ! * decl.c (grokdeclarator): Deprecated implicit typename use. ! ! 2001-12-11 Nathan Sidwell ! ! PR g++/51 ! * parse.y (frob_specs): Indicate it is a language linkage which ! contained the extern. ! * decl.c (grokdeclarator): Allow extern language linkage with ! other specifiers. ! ! 2001-12-10 Nathan Sidwell ! ! PR g++/72 ! * decl.c (add_binding): Don't reject duplicate typedefs involving ! template parameters. ! ! 2001-12-10 Neil Booth ! ! * parse.y, semantics.c: Similarly. ! ! 2001-12-09 Nathan Sidwell ! ! PR g++/87 ! * cp-tree.h (DECL_COPY_CONSTRUCTOR_P): Use copy_fn_p. ! (copy_args_p): Rename to ... ! (copy_fn_p): ... here. ! (grok_special_member_properties): New function. ! (grok_op_properties): Lose VIRTUALP parameter. ! (copy_assignment_arg_p): Remove. ! * call.c (build_over_call): Use copy_fn_p. ! * decl.c (grokfndecl): Reformat. Adjust call to ! grok_op_properties. ! (copy_args_p): Rename to ... ! (copy_fn_p): ... here. Reject template functions. Check for pass ! by value. ! (grok_special_member_properties): Remember special functions. ! (grok_ctor_properties): Don't remember them here, just check. ! (grok_op_properties): Likewise. ! (start_method): Call grok_special_member_properties. ! * decl2.c (grokfield): Likewise. ! (copy_assignment_arg_p): Remove. ! (grok_function_init): Don't remember abstract assignment here. ! * pt.c (instantiate_class_template): Call ! grok_special_member_properties. ! (tsubst_decl): Adjust grok_op_properties call. ! ! 2001-12-08 Aldy Hernandez ! ! * lex.c (rid_to_yy): Add RID_CHOOSE_EXPR and ! RID_TYPES_COMPATIBLE_P. ! ! 2001-12-08 John David Anglin ! ! * semantics.c (simplify_aggr_init_exprs_r): Add DIRECT_BIND flag in ! call to build_aggr_init. ! * cp-tree.h (DIRECT_BIND): Document new use of DIRECT_BIND. ! ! 2001-12-08 Neil Booth ! ! * parse.y: Replace uses of the string non-terminal with STRING. ! Don't perform string concatentaion here. ! (string): Remove non-terminal. ! * semantics.c (finish_asm_stmt): Don't concatenate strings here. ! ! 2001-12-05 Jason Merrill ! ! * cp-lang.c (LANG_HOOKS_TREE_INLINING_START_INLINING): Define. ! (LANG_HOOKS_TREE_INLINING_END_INLINING): Define. ! * tree.c (cp_start_inlining, cp_end_inlining): New fns. ! * pt.c (push_tinst_level): No longer static. ! * cp-tree.h: Declare them. ! ! * init.c (resolve_offset_ref): Don't check access for the base ! conversion to access a FIELD_DECL. ! ! * cp-tree.h (TYPE_REFFN_P): New macro. ! * decl.c (bad_specifiers): Check it, too. ! ! * rtti.c (create_pseudo_type_info): Set CLASSTYPE_INTERFACE_ONLY ! on the __*_type_info type if we haven't seen a definition. ! ! 2001-12-05 Neil Booth ! ! * decl.c: Include c-common.h. ! (shadow_warning): Move to c-common.c. ! ! Wed Dec 5 17:00:49 2001 Richard Kenner ! ! * decl.c (duplicate_decls): Don't copy DECL_NO_CHECK_MEMORY_USAGE. ! ! 2001-12-04 Nathan Sidwell ! ! * pt.c (end_template_parm_list): Clear TREE_CHAIN of each parm. ! ! 2001-12-04 Nathan Sidwell ! ! PR g++/164 ! * init.c (sort_base_init): Allow binfos to be directly specified. ! * method.c (do_build_copy_constructor): Explicitly convert to the ! base instance. ! (do_build_assign_ref): Likewise. ! ! 2001-12-03 Hans-Peter Nilsson ! ! * decl.c (xref_basetypes): Don't use C99 construct in tag_code ! declaration and initialization. ! ! 2001-12-03 Neil Booth ! ! * typeck2.c: Remove leading capital from diagnostic messages, as ! per GNU coding standards. ! ! 2001-12-03 Mumit Khan ! ! PR c++/3394 ! * decl.c (xref_basetypes): Handle attributes between ! 'class' and name. ! ! 2001-12-03 Nathan Sidwell ! ! PR g++/3381 ! * parse.y (named_complex_class_head_sans_basetype): Add new ! reduction. ! * Make-lang.in (parse.c): Adjust expected conflict count. ! ! 2001-12-03 Jason Merrill ! ! * class.c (finish_vtbls): Fill in BINFO_VPTR_FIELD in the ! immediate binfos for our virtual bases. ! ! 2001-12-02 Neil Booth ! ! * call.c (build_java_interface_fn_ref): Similarly. ! * except.c (is_admissible_throw_operand): Similarly. ! * init.c (build_java_class_ref): Similarly. ! * xref.c (open_xref_file): Similarly. ! ! 2001-12-01 Neil Booth ! ! * class.c (finish_struct): Remove trailing periods from messages. ! * decl.c (check_tag_decl): Similarly. ! * lex.c (cxx_set_yydebug): Similarly. ! * typeck2.c (friendly_abort): Similarly. ! ! 2001-11-29 Mark Mitchell ! ! PR c++/3048 ! * cp-tree.h (ovl_member): Remove. ! * decl2.c (merge_functions): Handle extern "C" functions ! specially. ! * tree.c (ovl_member): Remove. ! ! 2001-11-29 Mark Mitchell ! ! PR c++/4842 ! * class.c (get_basefndecls): Take an IDENTIFIER_NODE, not a ! FUNCTION_DECL, as input. ! (mark_overriders): Remove. ! (warn_hidden): Rework for the new ABI. ! ! 2001-11-29 Mark Mitchell ! ! PR c++/3471 ! * call.c (convert_like_real): Do not build additional temporaries ! for rvalues of class type. ! ! 2001-11-28 Nathan Sidwell ! ! * cp-tree.h (UNIQUELY_DERIVED_FROM_P): Use lookup base. ! (ACCESSIBLY_UNIQUELY_DERIVED_FROM_P): Likewise. ! (PUBLICLY_UNIQUELY_DERIVED_FROM_P: Likewise. ! (DERIVED_FROM_P): Likewise. ! (enum base_access): Renumber, add ba_quiet bit mask. ! (get_binfo): Remove. ! (get_base_distance): Remove. ! (binfo_value): Remove. ! (ACCESSIBLY_DERIVED_FROM_P): Remove. ! * call.c (standard_conversion): Use lookup_base. ! * class.c (strictly_overrides): Likewise. ! (layout_virtual_bases): Likewise. ! (warn_about_ambiguous_direct_bases): Likewise. ! (is_base_of_enclosing_class): Likewise. ! (add_vcall_offset_vtbl_entries_1): Likewise. ! * cvt.c (build_up_reference): Adjust comment. ! * init.c (build_member_call): Reformat. ! * search.c (get_binfo): Remove. ! (get_base_distance_recursive): Remove. ! (get_base_distance): Remove. ! (lookup_base_r): Tweak. ! (lookup_base): Add ba_quiet control. Complete the types here. ! (covariant_return_p): Use lookup_base. ! * tree.c (binfo_value): Remove. ! (maybe_dummy_object): Use lookup_base. ! * typeck.c (build_static_cast): Use lookup_base. ! (get_delta_difference): Likewise. ! * typeck2.c (binfo_or_else): Use lookup_base. ! (build_scoped_ref): Add back error_mark_check. ! (build_m_component_ref): Use lookup_base. ! ! 2001-11-29 Joseph S. Myers ! ! * Make-lang.in (c++.generated-manpages): New dummy target. ! ! Tue Nov 27 09:03:47 2001 Richard Kenner ! ! * Make-lang.in (cp-lang.o): Depends on c-common.h. ! * cp-lang.c (c-common.h): Include. ! (LANG_HOOKS_EXPAND_CONSTANT, LANG_HOOKS_SAFE_FROM_P): New hooks. ! * decl.c (cxx_init_decl_processing): Don't set lang_safe_from_p. ! * expr.c (init_cplus_expand): Don't set lang_expand_constant. ! ! 2001-11-26 Neil Booth ! ! * decl2.c (c_language): Move to c-common.c. ! * lex.c (cxx_post_options, cxx_init_options): Use c-common.c ! functions. ! (cxx_init): Update. ! ! 2001-11-26 Jason Merrill ! ! * call.c (joust): Remove COND_EXPR hack. ! ! 2001-11-25 Aldy Hernandez ! ! * search.c (lookup_base_r): Declare bk in variable declaration ! space. ! ! 2001-11-25 Nathan Sidwell ! ! PR g++/3145 ! * class.c (build_vbase_pointer): Remove. ! (build_vbase_path): Remove. ! (build_base_path): New function. ! * cp-tree.h (base_access, base_kind): New enumerations. ! (build_base_path): Declare. ! (convert_pointer_to_real): Remove. ! (convert_pointer_to): Remove. ! (lookup_base): Declare. ! (convert_pointer_to_vbase): Remove. ! * call.c (build_scoped_method_call): Use lookup_base & ! build_base_path instead of convert_pointer_to_real, ! get_base_distance & get_binfo. ! (build_over_call): Likewise. ! * cvt.c (cp_convert_to_pointer): Likewise. ! (convert_to_pointer_force): Likewise. ! (build_up_reference): Likewise. ! (convert_pointer_to_real): Remove. ! (convert_pointer_to): Remove. ! * init.c (dfs_initialize_vtbl_ptrs): Use build_base_path ! instead of convert_pointer_to_vbase & build_vbase_path. ! (emit_base_init): Use build_base_path instead of ! convert_pointer_to_real. ! (expand_virtual_init): Lose unrequired conversions. ! (resolve_offset_ref): Use lookup_base and build_base_path ! instead of convert_pointer_to. ! * rtti.c (build_dynamic_cast_1): Use lookup_base & ! build_base_path instead of get_base_distance & build_vbase_path. ! * search.c (get_vbase_1): Remove. ! (get_vbase): Remove. ! (convert_pointer_to_vbase): Remove. ! (lookup_base_r): New function. ! (lookup_base): New function. ! * typeck.c (require_complete_type): Use lookup_base & ! build_base_path instead of convert_pointer_to. ! (build_component_ref): Likewise. ! (build_x_function_call): Likewise. ! (get_member_function_from_ptrfunc): Likewise. ! (build_component_addr): Likewise. ! * typeck2.c (build_scoped_ref): Likewise. ! ! 2001-11-22 Bryce McKinlay ! ! * cp-tree.h (CP_TYPE_QUALS): Removed. ! * decl.c (cxx_init_decl_processing): Don't set lang_dump_tree. ! * cp-lang.c: Set LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN and ! LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN. ! * dump.c (cp_dump_tree): Use void* dump_info argument to match ! lang-hooks prototype. ! * call.c, cp-tree.h, cvt.c, decl.c, init.c, mangle.c, method.c, pt.c, ! rtti.c, semantics.c, tree.c, typeck.c, typeck2.c: All references to ! CP_TYPE_QUALS changed to cp_type_quals. ! * Make-lang.in: References to c-dump.h changed to tree-dump.h. ! (CXX_C_OBJS): Remove c-dump.o. ! ! 2001-11-21 Mark Mitchell ! ! PR c++/3637 ! * pt.c (lookup_template_class): Ensure that all specializations ! are registered on the list corresponding to the most general ! template. ! ! 2001-11-20 Mark Mitchell ! ! * call.c (non_reference): Add documentation. ! (convert_class_to_reference): Do not strip reference types ! from conversion operators. ! (maybe_handle_ref_bind): Simplify. ! (compare_ics): Correct handling of references. ! ! 2001-11-19 John Wilkinson ! ! * dump.c (dump_op): New function. ! (cp_dump_tree): Dump CLASSTYPE_TEMPLATE_SPECIALIZATION. Use ! dump_op. Dump DECL_MUTABLE, access and staticness for VAR_DECLs. ! DECL_PURE_VIRTUAL_P, DECL_VIRTUAL_P, ! ! 2001-11-19 Mark Mitchell ! ! PR4629 ! * semantics.c (finish_sizeof): Make sure that expression created ! while processing a template do not have a type. ! (finish_alignof): Likewise. ! * typeck.c (c_sizeof): Likewise. ! (expr_sizeof): Likewise. ! ! 2001-11-18 Neil Booth ! ! * lex.c (cxx_finish): Call c_common_finish. ! (finish_parse): Remove. ! ! 2001-11-17 Kriang Lerdsuwanakij ! ! * decl.c (create_array_type_for_decl): Check if NAME is NULL_TREE ! when displaying error message about missing array bounds. ! ! 2001-11-17 Kriang Lerdsuwanakij ! ! * mangle.c (write_expression): Handle CAST_EXPR, STATIC_CAST_EXPR, ! CONST_CAST_EXPR. ! * operators.def: Add CAST_EXPR, STATIC_CAST_EXPR, CONST_CAST_EXPR. ! ! 2001-11-16 Neil Booth ! ! * cp-tree.h (print_class_statistics): Restore. ! ! 2001-11-15 Jason Merrill ! ! * method.c (use_thunk): Don't emit debugging information for thunks. ! ! * parse.y: Add ... IDENTIFIER SCOPE and ... PTYPENAME SCOPE expansions. ! * decl.c (make_typename_type): Handle getting a class template. ! * search.c (lookup_field_r): A class template is good enough for ! want_type. ! ! * call.c (convert_like_real): Only use cp_convert for the bad part. ! (standard_conversion): Also allow bad int->enum. ! * typeck.c (ptr_reasonably_similar): Also allow functions to ! interconvert. Pointers to same-size integers are reasonably ! similar. ! ! * cvt.c (convert_to_void): If we build a new COND_EXPR, always ! give it void type. ! ! 2001-11-15 Nathan Sidwell ! ! PR g++/3154 ! * init.c (sort_base_init): Remove unreachable code. ! (expand_member_init): Adjust comment to reflect reality. Simplify ! and remove unreachable code. ! ! 2001-11-15 Neil Booth ! ! * cp-tree.h (init_reswords, cxx_init_decl_processing): New. ! (cxx_init): Update prototype. ! * decl.c (init_decl_processing): Rename. Move null node init ! to its creation time. ! * lex.c (cxx_init_options): Update. ! (cxx_init): Combine with old init_parse; also call ! cxx_init_decl_processing. ! ! 2001-11-14 Richard Sandiford ! ! * decl.c (check_initializer): Try to complete the type of an ! array element before checking whether it's complete. Don't ! complain about arrays with complete element types but an ! unknown size. ! (cp_finish_decl): Build the hierarchical constructor before ! calling maybe_deduce_size_from_array_init. ! ! 2001-11-14 Joseph S. Myers ! ! * Make-lang.in: Change all uses of $(manext) to $(man1ext). ! ! 2001-11-13 Nathan Sidwell ! ! PR g++/4206 ! * parse.y (already_scoped_stmt): Remove. ! (simple_stmt, WHILE & FOR): Use implicitly_scoped_stmt. ! ! 2001-11-12 H.J. Lu ! ! * cvt.c (ocp_convert): Don't warn the address of a weak ! function is always `true'. ! ! 2001-11-09 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_PRINT_DECL, LANG_HOOKS_PRINT_TYPE, ! LANG_HOOKS_PRINT_STATISTICS, LANG_HOOKS_PRINT_XNODE, ! LANG_HOOKS_PRINT_IDENTIFIER, LANG_HOOKS_SET_YYDEBUG): Override. ! * cp-tree.h (print_class_statistics): Remove. ! (cxx_print_statistics, cxx_print_xnode, cxx_print_decl, cxx_print_type, ! cxx_print_identifier, cxx_set_yydebug): New. ! * lex.c (set_yydebug): Rename c_set_yydebug. ! * ptree.c (print_lang_decl, print_lang_type, print_lang_identifier, ! lang_print_xnode): Rename. ! * tree.c (print_lang_statistics): Rename. ! ! 2001-11-09 Kaveh R. Ghazi ! ! * class.c (dump_array): Fix format specifier warning. ! ! 2001-11-09 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_NAME): Override. ! (struct lang_hooks): Constify. ! * lex.c (cxx_init_options): Update. ! (lang_identify): Remove. ! * parse.y (language_string): Remove. ! ! 2001-11-08 Andreas Franck ! ! * Make-lang.in (CXX_INSTALL_NAME, GXX_CROSS_NAME, ! DEMANGLER_CROSS_NAME): Handle program_transform_name the way ! suggested by autoconf. ! (GXX_TARGET_INSTALL_NAME, CXX_TARGET_INSTALL_NAME): Define. ! (c++.install-common): Use the transformed target alias names. ! ! 2001-11-06 Neil Booth ! ! * Make-lang.in: Update. ! * cp-lang.c: Include langhooks-def.h. ! ! 2001-11-04 Kriang Lerdsuwanakij ! ! * pt.c (tsubst_copy): Call tsubst for TYPEOF_EXPR. ! ! 2001-11-03 Kaveh R. Ghazi ! ! * lex.c (copy_lang_type): Add static prototype. ! ! 2001-11-02 Kriang Lerdsuwanakij ! ! * pt.c (unify): Handle SCOPE_REF. ! ! 2001-11-01 Jakub Jelinek ! ! * tree.c (cp_copy_res_decl_for_inlining): Adjust ! DECL_ABSTRACT_ORIGIN for the return variable. ! ! 2001-10-31 Zack Weinberg ! ! * Make-lang.in: Replace $(INTL_TARGETS) with po-generated. ! ! 2001-10-28 Joseph S. Myers ! ! * ChangeLog.1, ChangeLog.2, ChangeLog, class.c, decl2.c, search.c, ! semantics.c, spew.c: Fix spelling errors. ! ! 2001-10-27 Kriang Lerdsuwanakij ! ! * decl2.c (validate_nonmember_using_decl): Handle NAMESPACE_DECL. ! ! 2001-10-25 Zack Weinberg ! ! * cp-lang.c: Redefine LANG_HOOKS_CLEAR_BINDING_STACK to ! pop_everything. ! ! Tue Oct 23 14:00:20 2001 Richard Kenner ! ! * cp-lang.c (cxx_get_alias_set): New function. ! Point LANG_HOOKS_GET_ALIAS_SET to it. ! ! 2001-10-23 Kriang Lerdsuwanakij ! ! * cp-tree.def (UNBOUND_CLASS_TEMPLATE): New tree node. ! * cp-tree.h (make_unbound_class_template): Prototype new function. ! * decl.c (make_unbound_class_template): New function. ! * decl2.c (arg_assoc_template_arg): Handle UNBOUND_CLASS_TEMPLATE. ! * error.c (dump_type): Likewise. ! * mangle.c (write_type): Likewise. ! * parse.y (template_parm): Likewise. ! (template_argument): Use make_unbound_class_template. ! * pt.c (convert_template_argument): Handle UNBOUND_CLASS_TEMPLATE. ! (tsubst): Likewise. ! (tsubst_copy): Likewise. ! (unify): Likewise. ! * tree.c (walk_tree): Likewise. ! * typeck.c (comptypes): Likewise. ! ! 2001-10-21 Kaveh R. Ghazi ! ! * xref.c (GNU_xref_member): Use safe-ctype macros and/or fold ! extra calls into fewer ones. ! ! 2001-10-18 Alexandre Oliva ! ! * decl.c (duplicate_decls): Propagate DECL_UNINLINABLE. ! Warn when merging inline with attribute noinline. ! (start_decl, start_function): Warn if inline and attribute ! noinline appear in the same declaration. ! ! 2001-10-16 H.J. Lu ! ! * cp-tree.h (BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK): Defined ! for tree checking disabled. ! ! 2001-10-16 Hans-Peter Nilsson ! ! * cp-tree.h (VFIELD_NAME_FORMAT) [NO_DOLLAR_IN_LABEL && ! NO_DOT_IN_LABEL]: Adjust to match VFIELD_NAME. ! ! 2001-10-15 Richard Sandiford ! ! * pt.c (UNIFY_ALLOW_MAX_CORRECTION): Define. ! (unify): Only handle MINUS_EXPR specially if the above flag is set ! and the subtracted constant is 1. Clear the flag on recursive calls. ! Set it when unifying the maximum value in an INTEGER_TYPE's range. ! ! 2001-10-15 Richard Sandiford ! ! * decl.c (bad_specifiers): Don't allow exception specifications ! on any typedefs. ! ! 2001-10-14 Neil Booth ! ! * cp/lex.c (init_cp_pragma): Similarly. ! ! 2001-10-13 Kriang Lerdsuwanakij ! ! * pt.c (lookup_template_class): Build complete template arguments ! for BOUND_TEMPLATE_TEMPLATE_PARM. ! ! 2001-10-12 Kriang Lerdsuwanakij ! ! * cp-tree.h (TYPE_BINFO): Update comment. ! (BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK): New macro. ! (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO): Use template_info. ! (TYPENAME_TYPE_FULLNAME): Use TYPE_FIELDS. ! (copy_type): Prototype new function. ! * lex.c (copy_lang_decl): Gather tree node statistics. ! (copy_lang_type): New function. ! (copy_type): Likewise. ! (cp_make_lang_type): Create lang_type for ! BOUND_TEMPLATE_TEMPLATE_PARM. Set TYPE_BINFO for TYPENAME_TYPE ! and BOUND_TEMPLATE_TEMPLATE_PARM. ! * pt.c (tsubst): Use copy_type instead of copy_node. ! * search.c (lookup_field_1): Ignore TYPENAME_TYPE. ! ! 2001-10-12 Kriang Lerdsuwanakij ! ! * pt.c (determine_specialization): Ignore functions without ! DECL_TEMPLATE_INFO. ! ! 2001-10-12 Nathan Sidwell ! ! PR g++/4476 ! * typeck2.c (abstract_virtuals_error): Ignore incomplete classes. ! ! 2001-10-11 Jason Merrill ! ! * typeck2.c (store_init_value): Don't re-digest a bracketed ! initializer. ! ! * class.c (finish_struct_anon): Use TYPE_ANONYMOUS_P instead of ! ANON_AGGR_TYPE_P. ! ! 2001-10-11 Richard Henderson ! ! * class.c (build_vtable_entry_ref): Create a VTABLE_REF instead ! of an asm statement. ! (build_vtbl_ref_1): Split out from build_vtbl_ref. ! (build_vfn_ref): Use it to handle vtable descriptors before ! calling build_vtable_entry_ref. ! * decl2.c (output_vtable_inherit): Use assemble_vtable_inherit. ! ! 2001-10-10 Richard Henderson ! ! * parse.y (asm_operand): Allow named operands. ! * semantics.c (finish_asm_stmt): Tweek for changed location ! of the operand constrant. ! ! 2001-10-09 Jason Merrill ! ! * call.c (standard_conversion): Add bad conversion between ! integers and pointers. ! (convert_like_real): Don't use convert_for_initialization for bad ! conversions; complain here and use cp_convert. ! (build_over_call): Don't handle bad conversions specially. ! (perform_implicit_conversion): Allow bad conversions. ! (can_convert_arg_bad): New fn. ! * cp-tree.h: Declare it. ! * typeck.c (convert_for_assignment): Use it. ! (ptr_reasonably_similar): Any target type is similar to void. ! ! 2001-10-08 Alexandre Oliva ! ! * Make-lang.in (CXX_OBJS): Added cp-lang.o. ! (cp/cp-lang.o): New rule. ! * cp-tree.h: Declare hooks. ! * tree.c: Make hooks non-static. ! (init_tree): Don't initialize hooks here. ! * lex.c: Likewise. Move definition of lang_hooks to... ! * cp-lang.c: ... new file. ! ! 2001-10-08 Richard Henderson ! ! * cp-tree.h (struct lang_decl_flags): Remove declared_inline. ! (DECL_DECLARED_INLINE_P): Use the bit in struct c_lang_decl. ! ! 2001-10-07 Kaveh R. Ghazi ! ! * class.c (build_vtable_entry_ref): Const-ify. ! * decl.c (predefined_identifier, ! initialize_predefined_identifiers): Likewise. ! * init.c (build_new_1): Likewise. ! * lex.c (cplus_tree_code_type, cplus_tree_code_length, resword): ! Likewise. ! ! 2001-10-05 Alexandre Oliva ! ! * optimize.c (struct inline_data): Moved to ../tree-inline.c. ! (INSNS_PER_STMT): Likewise. ! (remap_decl, remap_block, copy_scopy_stmt, copy_body_r): Likewise. ! (copy_body, initialize_inlined_parameters): Likewise. ! (declare_return_variable, inlinable_function_p): Likewise. ! (expand_call_inline, expand_calls_inline): Likewise. ! (optimize_inline_calls, clone_body): Likewise. ! * tree.c (walk_tree): Moved to ../tree-inline.c. ! (walk_tree_without_duplicates): Likewise. ! (copy_tree_r, remap_save_expr): Likewise. ! ! 2001-10-04 Alexandre Oliva ! ! * Make-lang.in (cp/decl.o, cp/tree.o): Depend on tree-inline.h. ! (cp/pt.o, cp/semantics.o, cp/optimize.o): Likewise. ! * cp-tree.h (lang_decl): Moved inlined_fns to tree_decl. ! (TREE_READONLY_DECL_P, DECL_INLINED_FNS): Moved to ../tree.h. ! (flag_inline_trees): Moved declaration to ../tree-inline.h. ! (walk_tree): Moved declaration to ../tree-inline.h. ! (walk_tree_without_duplicates, copy_tree_r): Likewise. ! (remap_save_expr): Likewise. ! * decl.c: Include tree-inline.h. ! (lang_mark_tree): Don't mark inlined_fns. ! * decl2.c (flag_inline_trees): Moved defn to ../tree-inline.c. ! * optimize.c: Include tree-inline.h. ! (optimize_inline_calls): Move declaration to ../tree.h, as ! non-static. ! (remap_decl): Use language-independent constructs and hooks. ! (remap_block, copy_body_r, declare_return_variable): Likewise. ! (inlinable_function_p): Likewise. Don't test for ! DECL_LANG_SPECIFIC before DECL_INLINED_FNS as inlined_fns is ! no longer language-specific. ! (optimize_inline_calls): Likewise. Make it non-static. Moved ! call of dump_function to... ! (optimize_function): Here... ! (clone_body): New function, extracted from... ! (maybe_clone_body): ... here. Build decl_map locally and pass ! it on to clone_body. ! * pt.c, semantics.c: Include tree-inline.h. ! * tree.c: Likewise. ! (cp_walk_subtrees): New language-specific hook for tree inlining. ! (cp_cannot_inline_tree_fn, cp_add_pending_fn_decls, ! cp_is_overload_p, cp_auto_var_in_fn_p, ! cp_copy_res_decl_for_inlining): Likewise. ! (walk_tree): Move language-specific constructs into... ! (cp_walk_subtrees): this new function. ! (copy_tree_r): Use language-independent constructs and hooks. ! (init_tree): Initialize tree inlining hooks. ! (remap_save_expr): Adjust prototype so that the declaration ! does not require the definition of splay_tree. ! ! 2001-10-03 John David Anglin ! ! * rtti.c (get_tinfo_decl): Call typeinfo_in_lib_p with the type used ! to build the declaration instead of the declaration itself. ! ! 2001-10-02 Jason Merrill ! ! * decl2.c (cxx_decode_option): Add 'else'. ! ! * spew.c (end_input): No longer static. ! * cp-tree.h: Declare it. ! * parse.y (datadef): Add "error END_OF_SAVED_INPUT" expansion. ! ! 2001-10-02 Joseph S. Myers ! ! * call.c (build_over_call), typeck.c (build_function_call_real): ! Pass type attributes to check_function_format rather than name or ! assembler name. Don't require there to be a name or assembler ! name to check formats. ! ! 2001-10-02 Joseph S. Myers ! ! * decl.c (init_decl_processing): Don't call ! init_function_format_info. Initialize lang_attribute_table ! earlier. ! (builtin_function): Call decl_attributes. ! (insert_default_attributes): New. ! ! 2001-10-01 Jason Merrill ! ! * decl.c (grokdeclarator): Copy array typedef handling from C ! frontend. ! ! * decl.c (grokdeclarator): Copy too-large array handling from C ! frontend. ! ! 2001-09-29 Alexandre Oliva ! ! * config-lang.in (target_libs): Added target-gperf, so that we ! don't try to build it if C++ is disabled. ! ! 2001-09-23 Zack Weinberg ! ! * Make-lang.in (CXX_OBJS): Take out cp/errfn.o. ! (cp/errfn.o): Delete rule. ! (cp/error.o): Depend on flags.h. ! * errfn.c: Delete file. ! * cp-tree.h: Declare warn_deprecated. Remove definitions of ! TFF_NAMESPACE_SCOPE, TFF_CLASS_SCOPE, TFF_CHASE_NAMESPACE_ALIAS, ! and TFF_TEMPLATE_DEFAULT_ARGUMENTS. #define cp_error, cp_warning, ! cp_pedwarn, and cp_compiler_error to error, warning, pedwarn, and ! internal_error respectively. Make cp_deprecated into a macro. ! Don't define cp_printer typedef or declare cp_printers. ! * error.c: Include flags.h. ! Delete: struct tree_formatting_info, print_function_argument_list, ! print_declaration, print_expression, print_function_declaration, ! print_function_parameter, print_type_id, print_cv_qualifier_seq, ! print_type_specifier_seq, print_simple_type_specifier, ! print_elaborated_type_specifier, print_rest_of_abstract_declarator, ! print_parameter_declaration_clause, print_exception_specification, ! print_nested_name_specifier, and definition of cp_printers. ! (locate_error): New function. ! (cp_error_at, cp_warning_at, cp_pedwarn_at): Moved here and ! rewritten in terms of locate_error and diagnostic.c. ! (cp_tree_printer): Rename cp_printer; wire up to *_to_string ! instead of deleted print_* routines. Handle %C, %L, %O, %Q also. ! (init_error): Adjust to match. ! ! Sat Sep 22 09:15:31 2001 Richard Kenner ! ! * Make-lang.in (CXX_C_OBJS): Add attribs.o. ! ! 2001-09-21 Richard Henderson ! ! * class.c (set_vindex): Mind TARGET_VTABLE_USES_DESCRIPTORS. ! (build_vtbl_initializer): Likewise. ! (build_vfn_ref): New. ! * cp-tree.h: Declare it. ! * call.c (build_over_call): Use it. ! * decl2.c (mark_vtable_entries): Mark FDESC_EXPR. ! * typeck.c (get_member_function_from_ptrfunc): Mind descriptors. ! ! Fri Sep 21 08:16:19 2001 J"orn Rennecke ! ! * decl.c (grokdeclarator): Use C syntax for attr_flags declaration. ! ! 2001-09-21 Joseph S. Myers ! ! Table-driven attributes. ! * decl.c: Rename DECL_MACHINE_ATTRIBUTES to DECL_ATTRIBUTES. ! * decl2.c (cplus_decl_attributes): Only take one attributes ! parameter. ! * cp-tree.c (cplus_decl_attributes): Update prototype. ! * class.c (finish_struct), decl.c (start_decl, start_function), ! decl2.c (grokfield), friend.c (do_friend), parse.y ! (parse_bitfield): Update calls to cplus_decl_attributes. ! * decl.c (grokdeclarator): Take a pointer to a single ordinary ! attribute list. ! * decl.h (grokdeclarator): Update prototype. ! * decl2.c (grokfield): Take a single ordinary attribute list. ! * friend.c (do_friend): Likewise. ! * decl.c (shadow_tag, groktypename, start_decl, ! start_handler_parms, grokdeclarator, grokparms, start_function, ! start_method), decl2.c (grokfield, grokbitfield, grokoptypename), ! parse.y (parse_field, parse_bitfield, component_decl_1), pt.c ! (process_template_parm, do_decl_instantiation): Pass single ! ordinary attribute lists around. ! * decl.c (grokdeclarator): Correct handling of nested attributes. ! Revert the patch ! 1998-10-18 Jason Merrill ! * decl.c (grokdeclarator): Embedded attrs bind to the right, ! not the left. ! . ! * cp-tree.h (cp_valid_lang_attribute): Remove declaration ! (cp_attribute_table): Declare. ! * decl.c (valid_lang_attribute): Don't define. ! (lang_attribute_table): Define. ! (init_decl_processing): Initialize lang_attribute_table instead of ! valid_lang_attribute. ! * tree.c (cp_valid_lang_attribute): Remove. ! (handle_java_interface_attribute, handle_com_interface_attribute, ! handle_init_priority_attribute): New functions. ! (cp_attribute_table): New array. ! * decl2.c (import_export_class): Don't use ! targetm.valid_type_attribute. ! ! 2001-09-15 Gabriel Dos Reis ! ! * Make-lang.in (cp/error.o): Depend on real.h ! * error.c: #include "real.h" ! ! 2001-09-15 Kaveh R. Ghazi ! ! * mangle.c (mangle_conv_op_name_for_type): Use concat in lieu of ! xmalloc/strcpy/strcat. ! ! 2001-09-13 Kaveh R. Ghazi ! ! * decl.c (warn_extern_redeclared_static, cp_make_fname_decl): ! Const-ification. ! * pt.c (tsubst_decl): Likewise. ! ! 2001-09-12 Kaveh R. Ghazi ! ! * decl2.c (lang_f_options): Const-ification. ! * lex.c (cplus_tree_code_name): Likewise. ! * spew.c (yyerror): Likewise. ! ! 2001-09-06 Nathan Sidwell ! ! PR c++/3986 ! * class.c (force_canonical_binfo_r): Check & move an indirect ! primary base first. ! (force_canonical_binfo): Check that it's not already ! canonical. ! (mark_primary_virtual_base): Remove BINFO parameter. ! (mark_primary_bases): Adjust, set BINFO_LOST_PRIMARY_P here. ! ! 2001-09-06 Nathan Sidwell ! ! Remove TYPE_NONCOPIED_PARTS. ! * cp-tree.h (CLASSTYPE_INLINE_FRIENDS): Map onto ! CLASSTYPE_PURE_VIRTUALS. ! (TYPE_RAISES_EXCEPTIONS): Map onto TYPE_BINFO. ! * class.c (duplicate_tag_error): Remove TYPE_NONCOPIED_PARTS. ! (layout_class_type): Don't call fixup_inline_methods here ... ! (finish_struct_1): ... call it here. ! ! 2001-09-04 Mark Mitchell ! ! * decl.c (duplicate_decls): Remove code deadling with ! DECL_SAVED_INSNS. ! * decl2.c (finish_file): Likewise. ! * pt.c (instantiate_decl): Likewise. ! * semantics.c (expand_body): Don't defer local functions if ! they wouldn't be deferred for some other reason. Don't ! generate RTL for functions that will not be emitted. ! (genrtl_start_function): Remove code deadling with ! DECL_SAVED_INSNS. ! (genrtl_finish_function): Likewise. ! ! 2001-09-04 Nathan Sidwell ! ! PR c++/4203 ! * call.c (build_over_call): Do not optimize any empty base ! construction. ! ! 2001-08-31 Kriang Lerdsuwanakij ! ! * error.c (dump_template_decl): Output template parameters ! together with their specifiers. ! Output `class' prefix for template template parameter. ! (dump_decl): Fix formatting. ! ! 2001-08-30 Kurt Garloff ! ! * optimize.c (inlinable_function_p): Allow only smaller single ! functions. Halve inline limit after reaching recursive limit. ! ! 2001-08-30 Joern Rennecke ! Jason Merrill ! ! * class.c (build_vtable_entry_ref): Subtract in char*, not ! ptrdiff_t. ! ! 2001-08-23 Jason Merrill ! ! * tree.c (cp_build_qualified_type_real): Use get_qualified_type. ! (build_cplus_array_type): Use cp_build_qualified_type, not ! TYPE_MAIN_VARIANT, to get an unqualified version. ! ! * decl2.c (grok_alignof): Lose. ! (build_expr_from_tree): Use expr_sizeof and c_alignof_expr. ! * typeck.c (c_alignof): Lose. ! * semantics.c (finish_sizeof, finish_alignof): New. ! * parse.y: Use them. ! * cp-tree.h: Declare them. ! ! 2001-08-22 Jason Merrill ! ! * pt.c (tsubst_expr): Hand off to the TREE_CHAIN of a statement. ! Don't loop in COMPOUND_STMT, FOR_STMT or TRY_BLOCK. ! * tree.c (cp_statement_code_p): A TAG_DEFN is a statement. ! ! 2001-08-19 Jakub Jelinek ! ! * typeck2.c (add_exception_specifier): Only require complete type if ! not in processing template declaration. ! ! 2001-08-18 Kaveh R. Ghazi ! ! * decl.c: Cast argument to size_t, not HOST_WIDE_INT, in calls to ! GNU_xref_start_scope and GNU_xref_end_scope. ! ! * tree.c (TYPE_HASH): Moved to ../tree.h. ! ! 2001-08-16 Mark Mitchell ! ! * cvt.c (convert_to_void): Preserve TREE_SIDE_EFFECTS ! on COMPOUND_EXPRs. ! ! 2001-08-14 Richard Henderson ! ! * class.c, cp-tree.h (build_vfn_ref): Remove. ! * call.c, rtti.c: Replace all refernces with build_vtbl_ref. ! ! 2001-08-13 Mark Mitchell ! ! * call.c (build_over_call): Mark COMPOUND_EXPRs generated for ! empty class assignment as having side-effects to avoid ! spurious warnings. ! ! 2001-08-13 Zack Weinberg ! ! * Make-lang.in (cp/except.o): Add libfuncs.h to dependencies. ! * except.c: Include libfuncs.h. ! ! 2001-08-11 Gabriel Dos Reis ! ! * decl.c (grokdeclarator): Clarify diagnostic message. ! ! 2001-08-13 Kriang Lerdsuwanakij ! ! * decl2.c (do_nonmember_using_decl): Replace using directive ! with using declaration in the error message. ! ! 2001-08-11 Kriang Lerdsuwanakij ! ! * pt.c (maybe_fold_nontype_arg): Use TREE_TYPE of ARG as the ! criterion to avoid rebuilding expression tree instead of ! processing_template_decl. ! ! 2001-08-07 Jason Merrill ! ! Support named return value optimization for inlines, too. ! * decl.c (finish_function): Nullify returns here. ! * semantics.c (genrtl_start_function): Not here. ! (cp_expand_stmt): Don't mess with CLEANUP_STMTs. ! (nullify_returns_r): No longer static. Just clear RETURN_EXPR. ! Also nullify the CLEANUP_STMT for the nrv. ! * cp-tree.h: Declare it. ! * optimize.c (declare_return_variable): Replace the nrv with the ! return variable. ! * typeck.c (check_return_expr): Be more flexible on alignment check. ! Ignore cv-quals when checking for a matching type. ! ! 2001-08-09 Richard Henderson ! ! * decl2.c (finish_objects): Use target hooks instead of ! assemble_constructor and assemble_destructor. ! ! 2001-08-08 John David Anglin ! ! * g++spec.c (lang_specific_driver): Quote argument after `-Xlinker'. ! ! 2001-08-07 Nathan Sidwell ! ! PR c++/3820 ! Stop using TYPE_NONCOPIED_PARTS. ! * call.c (build_over_call): Be careful when copy constructing ! or assigning to an empty class. ! * class.c (check_bases_and_members): It has a ! COMPLEX_ASSIGN_REF if it has a vptr. ! (layout_class_type): Don't add empty class padding to ! TYPE_NONCOPIED_PARTS. ! (finish_struct_1): Don't add the VFIELD either. ! * cp-tree.h (TYPE_HAS_TRIVIAL_INIT_REF): Mention _copy_ ! initialization. ! ! 2001-08-07 Jason Merrill ! ! * tree.c (walk_tree): Walk siblings even if !walk_subtrees. ! ! 2001-08-06 Richard Henderson ! ! * decl2.c (finish_objects): Pass a symbol_ref and priority to ! assemble_{constructor,destructor}. Remove priority handling. ! ! 2001-08-05 Gabriel Dos Reis ! ! Don't allow template-id in using-declaration. ! * decl2.c (validate_nonmember_using_decl): Handle template-ids. ! (do_class_using_decl): Likewise. ! ! 2001-08-04 Neil Booth ! ! * cp/spew.c (read_token): No need to pop buffers. ! ! 2001-08-02 Stan Shebs ! ! * cp-tree.h (FNADDR_FROM_VTABLE_ENTRY): Remove, no longer used. ! (fnaddr_from_vtable_entry): Remove decl. ! * method.c (use_thunk): Update comment. ! ! 2001-08-01 Andrew Cagney ! ! * repo.c (get_base_filename): Change return value to const char ! pointer. ! ! 2001-08-02 Nathan Sidwell ! ! Kill -fhonor-std. ! * NEWS: Document. ! * cp-tree.h (flag_honor_std): Remove. ! (CPTI_FAKE_STD): Remove. ! (std_node): Remove comment about it being NULL. ! (fake_std_node): Remove. ! * decl.c (in_fake_std): Remove. ! (walk_namespaces_r): Remove fake_std_node check. ! (push_namespace): Remove in_fake_std code. ! (pop_namespace): Likewise. ! (lookup_name_real): Remove fake_std_node check. ! (init_decl_processing): Always create std_node. Always add ! std:: things there. ! (builtin_function): Always put non '_' fns in std. ! * decl2.c (flag_honor_std): Remove. ! (lang_f_options): Remove honor-std. ! (unsupported_options): Add honor-std. ! (set_decl_namespace): Remove fake_std_node check. ! (validate_nonmember_using_decl): Likewise. ! (do_using_directive): Likewise. ! (handle_class_head): Likewise. ! * dump.c (cp_dump_tree): Likewise. ! * except.c (init_exception_processing): Adjust. ! * init.c (build_member_call): Remove fake_std_node check. ! (build_offset_ref): Likewise. ! * lang-options.h: Remove -fhonor-std, -fno-honor-std. ! * rtti.c (init_rtti_processing): Adjust. ! ! 2001-07-31 Alexandre Petit-Bianco ! ! * tree.c (cp_tree_equal): WITH_CLEANUP_EXPR node to use its second ! operand while calling cp_tree_equal. ! ! 2001-07-31 Nathan Sidwell ! ! The 3.0 ABI no longer has vbase pointer fields. ! * cp-tree.h (VBASE_NAME, VBASE_NAME_FORMAT, VBASE_NAME_P, ! FORMAT_VBASE_NAME): Remove. ! * method.c (do_build_copy_constructor): Adjust. ! (do_build_assign_ref): Adjust. ! * search.c (lookup_field_r): Adjust. ! * typeck.c (build_component_ref): Adjust. ! ! The 3.0 ABI always has a vtable pointer at the start of every ! polymorphic class. ! * rtti.c (build_headof_sub): Remove. ! (build_headof): Adjust. ! (get_tinfo_decl_dynamic): No need to check flag_rtti ! here. Adjust. ! (create_real_tinfo_var): Explain why we need a hidden name. ! ! 2001-07-31 Nathan Sidwell ! ! PR c++/3631 ! * class.c (update_vtable_entry_for_fn): The fixed adjustment ! of a virtual thunk should be from declaring base. ! ! 2001-07-31 Nathan Sidwell ! ! * class.c (dfs_ctor_vtable_bases_queue_p): Always walk into ! the shared virtual base, so preserving inheritance graph order. ! ! 2001-07-30 Andreas Jaeger ! ! * decl2.c: Remove unused var global_temp_name_counter. ! ! 2001-07-28 Richard Henderson ! ! * method.c (pending_inlines): Remove. ! ! 2001-07-27 Nathan Sidwell ! ! * class.c (mark_primary_virtual_base): Don't adjust base ! offsets here. ! (dfs_unshared_virtual_bases): Adjust them here. ! (mark_primary_bases): Explain why we adjust at the end. ! ! 2001-07-27 Nathan Sidwell ! ! * class.c (finish_struct_1): When copying the primary base's ! VFIELD, make sure we find it is at offset zero. ! ! 2001-07-26 Kriang Lerdsuwanakij ! ! * pt.c (tsubst_template_parms): Call maybe_fold_nontype_arg and ! tsubst_expr for default template arguments. ! ! 2001-07-26 Nathan Sidwell ! ! PR c++/3621 ! * spew.c (yylex): Only copy the token's lineno, if it is ! nonzero. ! ! 2001-07-26 Nathan Sidwell ! ! PR c++/3624 ! * call.c (resolve_args): Simplify, call ! convert_from_reference. ! (build_new_op): Resolve and convert from reference ARG1 ! earlier. Adjust ARG2 & ARG3 resolve and conversion. ! ! 2001-07-26 Nathan Sidwell ! ! * decl.c (last_function_parm_tags): Remove. ! (current_function_parm_tags): Remove. ! (init_decl_processing): Adjust. ! (start_function): Adjust. ! (store_parm_decls): Adjust. ! ! PR c++/3152 ! * decl.c (grokdeclarator): Detect when a function typedef is ! declaring a function, and create last_function_parms correctly. ! ! 2001-07-25 Jason Merrill ! ! * call.c (joust): Only prefer a non-builtin candidate to a builtin ! one if they have the same signature. ! ! * cvt.c (build_up_reference): Take DECL parm. Check TREE_STATIC on ! it rather than toplevel_bindings_p. Give it a mangled name if static. ! (convert_to_reference): Adjust. ! * decl2.c (get_temp_name): Lose. ! * mangle.c (mangle_ref_init_variable): New fn. ! (mangle_guard_variable): Strip the ref-init header. ! * cp-tree.h: Adjust. ! * decl.c (cp_finish_decl): Add the DECL_STMT after processing the ! initializer. ! (grok_reference_init): Always use DECL_INITIAL. ! ! 2001-07-25 Nathan Sidwell ! ! PR c++/3416 ! * call.c (build_conditional_expr): Recheck args after ! conversions. ! * cp-tree.h (build_conditional_expr): Move to correct file. ! * typeck.c (decay_conversion): Diagnose any unknown types ! reaching here. ! (build_binary_op): Don't do initial decay or default ! conversions on overloaded functions. ! (build_static_cast): Don't do a decay conversion here. ! ! 2001-07-25 Nathan Sidwell ! ! PR c++/3543 ! * typeck.c (condition_conversion): Resolve an OFFSET_REF. ! * expr.c (cplus_expand_expr): An OFFSET_REF should never get here. ! ! 2001-07-25 Nathan Sidwell ! ! * class.c (build_vtbl_or_vbase_field): Remove, move into ... ! (create_vtbl_ptr): ... here. ! ! 2001-07-25 Nathan Sidwell ! ! * class.c (build_vbase_offset_vbtl_entries): Look for ! non-primary base of which we are a sub vtable. ! ! 2001-07-24 Phil Edwards ! ! * semantics.c (finish_this_expr): Remove unused code. ! ! 2001-07-24 Nathan Sidwell ! ! Simplify rtti, now we've only one ABI. ! * cp-tree.h (cp_tree_index): Remove CPTI_TINFO_DECL_ID, ! CPTI_TINFO_VAR_ID. ! (tinfo_decl_id, tinfo_var_id): Remove. ! (get_typeid_1): Remove. ! * rtti.c ! (init_rtti_processing): Remove tinfo_decl_id & tinfo_var_id. ! (typeid_ok_p): New function. ! (build_type_id): Call typeid_ok_p. Don't call tinfo_from_decl. ! (get_tinfo_decl): Remove old abi documentation. ! (tinfo_from_decl): Remove. ! (get_type_id): Call typeid_ok_p. Absorb get_typeid_1. ! (get_typeid_1): Remove. ! (get_base_offset): Remove. ! (synthesize_tinfo_var): Absorb get_base_offset. ! (create_real_tinfo_var): Don't use tinfo_decl_id. ! ! 2001-07-23 Graham Stott ! ! * cp/class.c (type_requires_array_cookie): Fix use of uninitialized ! variable has_two_argument_delete_p. ! ! 2001-07-21 Nathan Sidwell ! ! Remove flag_vtable_thunk. It is always on for the 3.0 ABI. ! * cp-tree.h (CPTI_DELTA2_IDENTIFIER): Remove. ! (CPTI_INDEX_IDENTIFIER): Remove. ! (CPT_PFN_OR_DELTA2_IDENTIFIER): Remove. ! (delta2_identifier): Remove. ! (index_identifier): Remove. ! (pfn_or_delta2_identifier): Remove. ! (flag_vtable_thunks): Remove. ! (VTABLE_DELTA2_NAME): Remove. ! (VTABLE_INDEX_NAME): Remove. ! (FNADDR_FROM_VTABLE_ENTRY): Adjust. ! (vfunc_ptr_type_node): Adjust. ! (VTABLE_NAME_PREFIX): Adjust. ! (build_vfn_ref): Lose first parameter. ! (fixup_all_virtual_upcast_offsets): Remove. ! * decl.c (initialize_predefined_identifiers): Remove ! delta2_identifier, index_identifier, pfn_or_delta2_identifier. ! (init_decl_processing): Remove no-vtable-thunk code. ! * decl2.c (flag_vtable_thunks): Remove. ! (mark_vtable_entries): Remove no-vtable-thunk code. ! * error.c (dump_decl): Remove no-vtable-thunk code. ! (dump_expr): Adjust ptr to member function code. ! * init.c (initialize_vtable_ptrs): Remove no-vtable-thunk ! code. ! * rtti.c (build_headof): Remove no-vtable-thunk code. ! (get_tinfo_decl_dynamic): Adjust build_vfn_ref call. ! * search.c (get_base_distance): Remove expand_upcast_fixups case. ! (virtual_context) Remove. ! (expand_upcast_fixups): Remove. ! (fixup_virtual_upcast_offsets): Remove. ! (fixup_all_virtual_upcast_offsets): Remove. ! * typeck.c (get_member_function_from_ptrfunc): Remove ! no-vtable-thunk code. ! * call.c (build_over_call): Adjust call to build_vfn_ref. ! * class.c (build_vfn_ref): Lose first parameter. Remove ! no-vtable-thunk code. ! (build_rtti_vtbl_entries): Remove no-vtable-thunk code. ! (build_vtable_entry): Remove no-vtable-thunk code. ! ! 2001-07-20 Nathan Sidwell ! ! Remove old-abi remnants. Remove comments about old abi ! behavior. Remove references to 'new-abi' in comments. ! * cp-tree.h: Adjust comments. ! (vbase_offsets_in_vtable_p): Delete. ! (vcall_offsets_in_vtable_p): Delete. ! (vptrs_present_everywhere_p): Delete. ! (all_overridden_vfuns_in_vtables_p): Delete. ! (merge_primary_and_secondary_vtables_p): Delete. ! (TYPE_CONTAINS_VPTR_P): Adjust. ! (VTT_NAME_PREFIX): Remove. ! (CTOR_VTBL_NAME_PREFIX): Remove. ! (init_vbase_pointers): Remove. ! * class.c: Adjust coments. ! (build_vbase_pointer_fields): Delete. ! (build_vbase_pointer): Remove old-abi code. ! (build_secondary_vtable): Likewise. ! (modify_all_vtables): Likewise. ! (create_vtable_ptr): Likewise. ! (layout_class_type): Likewise. ! (finish_struct_1): Likewise. ! (finish_vtbls): Likewise. ! (dfs_finish_vtbls): Delete. ! (build_vbase_offset_vtbl_entries): Remove old-abi code. ! * cvt.c: Adjust comments. ! * decl.c: Adjust comments. ! * decl2.c: Adjust comments. ! * init.c: Adjust comments. ! (construct_virtual_bases): Remove old-abi code. ! * lang-specs.h: Remove -fno-new-abi. ! * mangle.c: Adjust comments. ! * rtti.c: Adjust comments. ! (get_base_offset): Remove old-abi-code. ! * search.c: Adjust comments. ! (dfs_init_vbase_pointers): Remove. ! (dfs_vtable_path_unmark): Remove. ! (init_vbase_pointers): Remove. ! * semantics.c: Adjust comments. ! (emit_associated_thunks): Remove old-abi code. ! * typeck.c: Adjust comments. ! ! 2001-07-20 Daniel Berlin ! ! * Make-lang.in (cp/optimize.o): Depend on $(PARAMS_H), not ! params.h. ! ! 2001-07-19 Mark Mitchell ! ! * class.c (finish_struct_anon): Forbid nested classes. ! ! 2001-07-19 Neil Booth ! ! * decl2.c: Don't include dwarfout.h and dwarf2out.h. ! * optimize.c: Include debug.h. ! (maybe_clone_body): Use debug hook. ! * semantics.c: Include debug.h. ! (expand_body): Use debug hook. ! ! 2001-07-19 Neil Booth ! ! * spew.c (read_token, yyerror): Remove CPP_INT, CPP_FLOAT cases. ! ! 2001-07-18 Mark Mitchell ! ! * class.c (type_requires_array_cookie): New function. ! (check_methods): Don't try to figure out whether the type needs a ! cookie here. ! (check_bases_and_members): Set TYPE_VEC_NEW_USES_COOKIE here. ! * cp-tree.h (TYPE_VEC_DELETE_TAKES_SIZE): Remove. ! (TYPE_VEC_NEW_USES_COOKIE): Reimplement. ! * pt.c (instantiate_class_template): Don't set ! TYPE_VEC_DELETE_TAKES_SIZE. ! * NEWS: Document ABI changes from GCC 3.0. ! ! 2001-07-18 Xavier Delacour , ! Gerald Pfeifer ! ! * NEWS (Changes in GCC 3.0): Fix typo. ! ! 2001-07-13 Joseph S. Myers ! ! * decl2.c (cplus_decl_attributes): Take a pointer to the node to ! which attributes are to be attached, and a flags argument. Update ! call to decl_attributes. ! (grokfield): Update call to decl_attributes. ! * class.c (finish_struct): Update call to cplus_decl_attributes. ! * cp-tree.h (cplus_decl_attributes): Update prototype. ! * decl.c (start_decl, grokdeclarator, start_function): Update ! calls to decl_attributes and cplus_decl_attributes. ! * friend.c (do_friend): Update call to cplus_decl_attributes. ! * parse.y (parse_bitfield): Update call to cplus_decl_attributes. ! ! 2001-07-12 Mark Mitchell ! ! * decl.c (make_rtl_for_nonlocal_decl): Set DECL_C_HARD_REGISTER ! for `register' variables with an asm-specification. ! ! 2001-07-11 Mark Mitchell ! ! * semantics.c (finish_asm_stmt): Mark the output operands ! to an asm addressable, if necessary. ! ! 2001-07-11 Ben Elliston ! ! * Revert this change -- there is a subtle bug. ! ! PR c++/80 ! * decl.c (finish_enum): New "attributes" argument; pass it to ! cplus_decl_attributes. Use a narrower type if the enum is packed. ! * cp-tree.h (finish_enum): Adjust prototype. ! * parse.y (enum_head): New non-terminal. ! (structsp): Use it. Enums now may be preceded or followed by ! optional attributes -- pass their chained tree to finish_enum(). ! * pt.c (tsubst_enum): Pass NULL_TREE for the new argument. ! ! 2001-07-10 Mark Mitchell ! ! * pt.c (tsubst_decl): Set DECL_CONTEXT for namespace-scope ! variables. ! ! 2001-07-10 Jason Merrill ! ! * semantics.c (cp_expand_stmt): Fix for null ! current_function_return_value. ! ! 2001-07-10 Jan van Male ! ! * call.c (build_op_delete_call): Initialize fn. ! (convert_like_real): Delete conditional. ! (joust): Initialize *w and *l. ! * class.c: Add prototype for binfo_ctor_vtable. ! (get_primary_binfo): Initialize result. ! * init.c (build_java_class_ref): Initialize name. ! ! 2001-07-09 Erik Rozendaal ! ! * typeck.c (unary_complex_lvalue): Do not duplicate the ! argument to modify, pre-, or post-increment when used as an ! lvalue and when the argument has side-effects. ! ! 2001-07-08 Joseph S. Myers ! ! * decl.c (start_decl): Don't call SET_DEFAULT_DECL_ATTRIBUTES. ! (start_function): Don't call SET_DEFAULT_DECL_ATTRIBUTES. Call ! cplus_decl_attributes even if attrs is NULL. ! * friend.c (do_friend): Don't call SET_DEFAULT_DECL_ATTRIBUTES. ! ! 2001-07-08 Joseph S. Myers ! ! * decl.c (grokdeclarator), decl2.c (cplus_decl_attributes): Update ! calls to decl_attributes. ! ! 2001-07-06 Ira Ruben ! ! * cp-tree.def (TEMPLATE_DECL): Update comment. DECL_RESULT should ! be DECL_TEMPLATE_RESULT. ! ! 2001-07-05 Kriang Lerdsuwanakij ! ! * cp-tree.h (copy_template_template_parm): Rename to ... ! (bind_template_template_parm): ... here. ! * tree.c (copy_template_template_parm): Rename to ... ! (bind_template_template_parm): ... here. Remove the case when ! NEWARGS is NULL_TREE. ! (copy_tree_r): Don't copy TEMPLATE_TEMPLATE_PARM and ! BOUND_TEMPLATE_TEMPLATE_PARM. ! * pt.c (lookup_template_class): Adjust. ! ! 2001-07-05 Jason Merrill ! ! * cvt.c (convert_lvalue): New fn. ! * cp-tree.h: Declare it. ! * method.c (do_build_assign_ref): Use it. ! (do_build_copy_constructor): Convert parm to base types ! before calling base constructors. ! ! * typeck.c (check_return_expr): Check DECL_ALIGN instead of ! DECL_USER_ALIGN. Check flag_elide_constructors instead of ! optimize. ! * semantics.c (cp_expand_stmt): Don't destroy the named return value. ! ! 2001-07-02 Nathan Sidwell ! ! * optimize.c (optimize_inline_calls): New function, broken out ! of ... ! (optimize_function): ... here. Call it. Don't inline if it is ! a thunk. ! (dump_function): Print name of dump flag causing this dump. ! * semantics.c (expand_body): Move thunk inline check to ! optimize_function. ! ! 2001-06-29 Joseph S. Myers ! ! * typeck.c (COMP_TYPE_ATTRIBUTES): Don't define. ! (comptypes): Use target.comp_type_attributes. ! ! 2001-06-29 Nathan Sidwell ! ! * cp-tree.h (flag_dump_class_layout): Remove unneeded declaration. ! ! 2001-06-28 Gabriel Dos Reis ! ! * error.c (lang_print_error_function): Add a `diagnostic_context *' ! parameter. Tweak. ! ! 2001-06-27 Neil Booth ! ! * decl2.c (import_export_class): Update. ! ! 2001-06-26 Gabriel Dos Reis ! ! * error.c (init_error): Adjust settings. ! ! 2001-06-26 Gabriel Dos Reis ! ! * error.c (init_error): Adjust settings. ! ! 2001-06-19 Richard Sandiford ! ! * except.c (initialize_handler_parm): Expect __cxa_begin_catch to ! return pointers to data members by reference rather than by value. ! ! 2001-06-18 Jason Merrill ! ! Implement the Named Return Value optimization. ! * cp-tree.h (struct cp_language_function): Add x_return_value. ! (current_function_return_value): Now a macro. ! * decl.c: Don't define it. ! (define_label, finish_case_label): Don't clear it. ! (init_decl_processing): Don't register it with GC. ! * semantics.c (genrtl_finish_function): Don't check it for ! no_return_label. Copy the RTL from the return value to ! current_function_return_value and walk, calling... ! (nullify_returns_r): ...this new fn. ! * typeck.c (check_return_expr): Set current_function_return_value. ! ! 2001-06-15 Jason Merrill ! ! * class.c (dfs_accumulate_vtbl_inits): Just point to the base we're ! sharing a ctor vtable with. Merge code for cases 1 and 2. ! (binfo_ctor_vtable): New fn. ! (build_vtt_inits, dfs_build_secondary_vptr_vtt_inits): Use it. ! ! 2001-06-14 Jason Merrill ! ! * class.c (dfs_find_final_overrider): Fix logic. ! ! * class.c (update_vtable_entry_for_fn): Uncomment optimization to use ! virtual thunk instead of non-virtual. ! (get_matching_virtual): Uncomment. ! ! * pt.c (unify): Don't recurse between the POINTER_TYPE and the ! OFFSET_TYPE. If we're adding cv-quals, the extra ones would be on ! PARM, not ARG. ! ! 2001-06-14 Nathan Sidwell ! ! * class.c (dfs_accumulate_vtbl_inits): For case 2 & 3, make sure ! we've not emerged from the hierarchy of RTTI_BINFO on reaching ! a non-virtual base. ! ! 2001-06-13 Mark Mitchell ! ! * NEWS: Update release number. ! ! 2001-06-12 Nathan Sidwell ! ! PR c++/3130, c++/3131, c++/3132 ! * cp-tree.h (BINFO_UNSHARED_MARKED): New #define. ! * class.c (force_canonical_binfo_r): Move ! BINFO_UNSHARED_MARKED, BINFO_LOST_PRIMARY_P. Don't move ! virtual bases unless they're primary and what they're primary ! too has been moved. ! (dfs_unshared_virtual_bases): Use BINFO_UNSHARED_MARKED. Cope ! with morally virtual bases. Duplicate BINFO_LOST_PRIMARY_P and ! BINFO_PRIMARY_BASE_OF. Clear BINFO_VTABLE for all but the most ! derived binfo. ! (mark_primary_bases): Use BINFO_UNSHARED_MARKED. ! (layout_nonempty_base_or_field): Add most derived type ! parameter. Adjust. ! (layout_empty_base): Likewise. ! (build_base_field): Likewise. ! (build_base_fields): Likewise. ! (propagate_binfo_offsets): Add most derived type ! parameter. Skip non canonical virtual bases too. ! (dfs_set_offset_for_unshared_vbases): Don't skip primary ! bases. Do skip canonical bases. ! (layout_virtual_bases): Adjust. ! (layout_class_type): Adjust. ! (dfs_get_primary_binfo): Build list of virtual primary base ! candidates. ! (get_primary_binfo): Check that the shared virtual primary ! base candidate was found first. ! (accumulate_vtbl_inits): Don't do anything for non-vptr ! containing binfos. For case 1 primary virtual bases, keep ! checking that we've not emerged from the hierarchy of RTTI_BINFO. ! ! 2001-06-12 Nathan Sidwell ! ! PR c++/3089 ! * class.c (dfs_accumulate_vtbl_inits): Always walk down the ! hierarchy looking for primary bases for a ctor ! vtable. Recursively call oneself, if we meet our primary via ! this route and haven't met it yet via inheritance graph order. ! ! 2001-06-11 Mark Mitchell ! ! * lang-options.h: Emit documentation for -fno-honor-std, not ! -fhonor-std. ! ! 2001-06-10 Alexandre Oliva ! ! * typeck.c (get_member_function_from_ptrfunc) [vbit_in_delta]: ! Don't clobber delta. ! (expand_ptrmemfunc_cst) [ptrmemfunc_vbit_in_delta]: Adjust pfn. ! ! 2001-06-10 Mark Mitchell ! Gabriel Dos Reis ! ! * Make-lang.in (cp/call.o): Depend on diagnostic.h ! (cp/typeck.o): Depend on diagnostic.h ! (cp/typeck2.o): Depend on diagnostic.h ! (cp/repo.o): Depend on dignostic.h ! * typeck.c: #include diagnostic.h ! (convert_for_initialization): Remove extern declaration for ! warningcount and errorcount. ! ! * call.c: #include diagnostic.h ! (convert_like_real): Remove extern declaration for warnincount and ! errorcount. ! ! * repo.c: #include diagnostic.h ! * typeck2.c: #include diagnostic.h ! ! 2001-06-08 Nathan Sidwell ! ! * decl.c (duplicate_decls): Fix DECL_TEMPLATE_RESULT thinko ! in previous change. ! ! 2001-06-08 Nathan Sidwell ! ! PR c++/2929 ! * friend.c (do_friend): Use push_decl_namespace for classes at ! namespace scope. ! ! 2001-06-08 Nathan Sidwell ! Jason Merrill ! ! PR c++/3061 ! * class.c (build_secondary_vtable): Use assert, rather than an error ! message. ! (dfs_fixup_binfo_vtbls): BINFO_VTABLE might be NULL. ! (dfs_accumulate_vtbl_inits): A lost primary virtual base may ! be between ORIG_BINFO and RTTI_BINFO, but neither of them. ! Don't set BINFO_VTABLE for a primary virtual base. ! ! 2001-06-07 Mark Mitchell ! ! * decl.c (duplicate_decls): Update source position information ! when a template function is defined. ! ! 2001-06-07 Phil Edwards ! ! * lang-specs.h: Move -D_GNU_SOURCE to config/linux.h. ! ! 2001-06-07 Nathan Sidwell ! ! PR c++/2914 ! * decl.c (pushtag): Don't push into a complete type's scope. ! ! 2001-06-06 Jason Merrill ! ! * cp-tree.h (THUNK_GENERATE_WITH_VTABLE_P): Lose. ! (struct lang_decl_flags): Lose generate_with_vtable_p. ! (BV_GENERATE_THUNK_WITH_VTABLE_P): Lose. ! * class.c (copy_virtuals): Adjust. ! * decl2.c (mark_vtable_entries): Adjust. ! * method.c (make_thunk, build_vtable_entry): Adjust. ! * class.c (update_vtable_entry_for_fn): Only look as far as the ! first defining class. ! (build_vtbl_initializer): Put nothing in the slot for a function only ! defined in a lost primary virtual base. ! (add_vcall_offset_vtbl_entries_1): Use the same code for ! the lost primary case and the normal case. ! (dfs_unshared_virtual_bases): Don't lose a non-virtual primary base. ! (get_vfield_offset, get_derived_offset): Lose. ! (dfs_find_final_overrider): Use look_for_overrides_here. ! (get_matching_virtual): New fn. ! * semantics.c (emit_associated_thunks): Check BV_USE_VCALL_INDEX_P, ! not BV_VCALL_INDEX. ! * search.c (look_for_overrides_here): Split out from... ! (look_for_overrides_r): Here. ! ! * class.c (find_final_overrider): Return error_mark_node on error. ! ! * decl2.c (key_method): #if 0 accidental change. ! ! 2001-06-06 John David Anglin ! ! * call.c (convert_default_arg): Use INTEGRAL_TYPE_P. ! (build_over_call): Likewise. ! * decl.c (grokparms): Likewise. ! * pt.c (tsubst_decl): Likewise. ! * typeck.c (convert_arguments): Likewise. ! ! 2001-06-05 Mark Mitchell ! ! * semantics.c (begin_class_definition): Robustify. ! ! * pt.c (instantiate_decl): Tell the repository code about the ! clones, not the cloned functions. ! * repo.c (repo_template_used): Explicitly instantiate the cloned ! function, not the clones. ! ! 2001-06-05 Nathan Sidwell ! ! * call.c (build_user_type_conversion_1): Set ICS_USER_FLAG and ! ICS_BAD_FLAG on created conversion. ! (compare_ics): Break out rank. ! ! 2001-06-05 Nathan Sidwell ! ! * decl.c (xref_tag): Remove extraneous %s on dependent name ! lookup warning. ! ! 2001-06-05 Nathan Sidwell ! ! * class.c (layout_vtable_decl): Fix off by one error on ! build_index_type. ! (build_vtt): Likewise. ! (build_ctor_vtbl_group): Likewise. ! ! 2001-06-05 Nathan Sidwell ! ! * class.c (maybe_indent_hierarchy): New function. ! (dump_class_hierarchy_r): Add flags. Dump extra binfo ! information, if enabled. Use maybe_indent_hierarchy. Adjust ! output format. ! (dump_class_hierarchy): Adjust prototype. Adjust output format. ! (dump_array, dump_vtable, dump_vtt): New functions. ! (finish_struct_1): Adjust hierarchy dumping. ! (initialize_vtable): Call dump_vtable. ! (build_vtt): Call dump_vtt. ! (build_ctor_vtbl_group): Call dump_vtable. ! * decl2.c (flag_dump_class_layout): Remove. ! (cxx_decode_option): Remove dump translation unit ! and dump class hierarchy check. Call dump_switch_p. ! (finish_file): Adjust dumping. ! (dump.c): Only dump base classes if not TDF_SLIM. ! Only dump namespace members if not TDF_SLIM. ! * optimize.c (dump_function): New function. ! (optimize_function): Call dump_function. ! * semantics.c (expand_body): Use dump_enabled_p. ! ! 2001-06-01 Nathan Sidwell ! ! PR g++/2936 ! Part missed from first commit ! * decl2.c (finish_anon_union): Copy context. ! ! 2001-05-30 Nathan Sidwell ! ! PR g++/2936 ! * optimize.c (remap_decl): Remap anonymous aggregate members too. ! ! 2001-05-26 Nathan Sidwell ! ! PR g++/2823 ! * semantics.c (expand_body): Don't optimize thunks. ! ! 2001-05-25 Sam TH ! ! * cp-tree.h lex.h: Fix header include guards. ! ! 2001-05-25 Mark Mitchell ! ! * decl.c (init_decl_processing): Tweak. ! ! 2001-05-24 Mark Mitchell ! ! * decl.c (duplicate_decls): Tidy. ! (init_decl_processing): Always set flag_no_builtin. ! ! 2001-05-24 Nathan Sidwell ! ! PR c++/2184 ! * decl2.c (do_local_using_decl): Push the decls, even in a ! template. ! ! 2001-05-22 Mark Mitchell ! ! * optimize.c (initialize_inlined_parameters): Don't set ! TREE_READONLY for a VAR_DECL taking the place of an inlined ! PARM_DECL. ! ! 2001-05-22 Jason Merrill ! ! * class.c, cp-tree.h, rtti.c: Remove com_interface attribute support. ! * tree.c (cp_valid_lang_attribute): Warn about use of com_interface ! attribute. ! ! 2001-05-22 Joseph S. Myers ! ! * parse.y: Refer to compound literals as such, not as ! constructor-expressions. ! ! 2001-05-21 Mark Mitchell ! ! * call.c (build_op_delete_call): Ignore exception-specifications ! when looking for matching delete operators. ! * init.c (build_new_1): Compute whether or not the allocation ! function used is a placement allocation function or not, and ! communicate this information to build_op_delete_call. ! ! 2001-05-21 Jason Merrill ! ! * class.c (build_vtable_entry_ref): Lose vtbl parm. Fix for new abi. ! (build_vtbl_ref): Adjust. ! (dfs_accumulate_vtbl_inits): Set TREE_CONSTANT on the vtable address. ! * decl2.c (lang_f_options): Remove huge-objects, vtable-thunks. ! Re-add vtable-gc. ! (unsupported_options): Correspondingly. ! ! * decl2.c (maybe_make_one_only): Check flag_weak, not ! supports_one_only(). ! * cp-tree.def (START_CATCH_STMT): Lose. ! * dump.c (cp_dump_tree): Don't dump it. Do dump HANDLER_PARMS. ! * tree.c (cp_statement_code_p): Don't case it. ! * semantics.c (cp_expand_stmt): Likewise. ! * cp-tree.h (START_CATCH_TYPE): Lose. ! (HANDLER_TYPE): New. ! * except.c (expand_start_catch_block): Don't start any blocks. ! Return the type. ! (expand_end_catch_block): Don't end any blocks. ! * parse.y (handler): Don't pass anything from finish_handler_parms ! to finish_handler. * pt.c (tsubst_expr): Likewise. - * semantics.c (begin_handler): Call note_level_for_catch here. - (finish_handler_parms): Don't return anything. - (genrtl_catch_block, begin_catch_block): Lose. - (genrtl_handler): Call expand_start_catch here. - - 2001-05-18 Jason Merrill - - * class.c (build_vtable): Set DECL_ASSEMBLER_NAME for vtables here. - (get_vtable_decl, build_vtt): Not here. - - 2001-05-20 Nathan Sidwell - - PR c++/2781 - * optimize.c (update_cloned_parm): Copy addressability and other - flags. - - 2001-05-20 Kriang Lerdsuwanakij - - * pt.c (determine_specialization): Ignore artificial functions. - - 2001-05-20 Neil Booth - - * cp-tree.h (struct lang_identifier, C_RID_YYCODE): Update. - (C_RID_CODE): Remove. - * lex.c (cxx_init_options): Call set_identifier_size. Update. - (init_parse): Don't do it here. - - 2001-05-18 Diego Novillo - - * decl2.c (finish_objects): Use the original SYMBOL_REF from the - function declaration to avoid stripping the symbol's attributes. - - 2001-05-18 Nathan Sidwell - - * decl.c (pushdecl): Adjust error string. - (xref_tag): Adjust friend class injection warning. Remove the - inherited name from the class shadowed scope. - - 2001-05-17 Mark Mitchell - - * except.c (cp_protect_cleanup_actions): New function. - (init_exception_processing): Don't set protect_cleanup_actions - here. Do set lang_protect_cleanup_actions. - - 2001-05-16 Nathan Sidwell - - * spew.c (read_token): Call yyerror on all unexpected tokens. - - 2001-05-16 Nathan Sidwell - - * init.c (member_init_ok_or_else): Take a tree rather than - string for name. - (expand_member_init): Adjust. - - 2001-05-14 Nick Clifton - - * decl.c (duplicate_decls): Suppress warning about duplicate - decls if the first decl is a friend. - - 2001-05-12 Zack Weinberg - - * except.c (choose_personality_routine): Export. Add - explanatory comment. Take an enum languages, not a boolean. - (initialize_handler_parm): Adjust to match. - * cp-tree.h: Prototype choose_personality_routine. - * lex.c (handle_pragma_java_exceptions): New function. - (init_cp_pragma): Register #pragma GCC java_exceptions. - - 2001-05-12 Neil Booth - - * method.c (build_mangled_C99_name): Remove unused prototype. - - 2001-05-12 Alexandre Oliva - - * cp-tree.h (ptrmemfunc_vbit_where_t): Declare type. - * typeck.c (get_member_function_from_ptrfunc, - build_ptrmemfunc, expand_ptrmemfunc_cst): Take - TARGET_PTRMEMFUNC_VBIT_LOCATION into account. - - Reverted Geoff Keating's 2001-05-03's patch. - - 2001-05-11 Ira Ruben - - * cp/cp-tree.h (C_EXP_ORIGINAL_CODE): Delete; declared in c-common.h. - - 2001-05-11 Neil Booth - - * cp-tree.h (finish_label_expr, lookup_label): Delete. - * parse.y: Update for '&&'; don't issue warning here. - * semantics.c (finish_label_expr): Delete. - - 2001-05-07 Mark Mitchell - - * splay-tree.h (splay_tree_max): New function. - (splay_tree_min): Likewise. - - 2001-05-03 Geoffrey Keating - - * cp-tree.h (enum cp_tree_index): Add CPTI_PFN_VFLAG_IDENTIFIER. - (pfn_vflag_identifier): Define. - Update comment about layout of pointer functions. - (build_ptrmemfunc1): Update prototype. - (expand_ptrmemfunc_cst): Update prototype. - * decl.c (initialize_predefined_identifiers): Initialize - pfn_vflag_identifier. - (build_ptrmemfunc_type): When FUNCTION_BOUNDARY < 16, add - an extra field to the type. - * expr.c (cplus_expand_constant): Pass 'flag' between - expand_ptrmemfunc_cst and build_ptrmemfunc1. - * typeck.c (get_member_function_from_ptrfunc): When - FUNCTION_BOUNDARY < 16, look at additional field to determine - if a pointer-to-member is a real pointer or a vtable offset. - (build_ptrmemfunc1): Add new parameter to contain extra field. - (build_ptrmemfunc): Pass the extra field around. - (expand_ptrmemfunc_cst): Add new parameter to return extra field. - (pfn_from_ptrmemfunc): Ignore the extra field. - - 2001-05-03 Mark Mitchell - - * cp-tree.h (flag_inline_trees): Update documentation. - * decl.c (init_decl_processing): Adjust handling of - flag_inline_functions and flag_inline_trees to support -O3. - (grokfndecl): Set DECL_INLINE on all functions if that's what - the user requested. - (save_function_data): Clear DECL_INLINE in - current_function_cannot_inline is non-NULL. - * decl2.c (flag_inline_trees): Update documentation. - - 2001-05-03 Nathan Sidwell - - * dump.c (cp_dump_tree, USING_STMT case): New case. - * tree.c (cp_statement_code_p): Add USING_STMT. - * decl2.c (do_using_directive): Add the using directive statement. - - * tree.c (walk_tree): Reformat an if block. - - 2001-05-02 Mark Mitchell - - * decl.c (compute_array_index_type): Don't try to do anything with - the indices when processing a template. - - 2001-05-02 Kaveh R. Ghazi - - * call.c: NULL_PTR -> NULL. - * class.c: Likewise. - * cvt.c: Likewise. - * decl.c: Likewise. - * decl2.c: Likewise. - * except.c: Likewise. - * init.c: Likewise. - * rtti.c: Likewise. - * search.c: Likewise. - * tree.c: Likewise. - * typeck.c: Likewise. - * typeck2.c: Likewise. - - 2001-05-02 Mark Mitchell - - * decl2.c (do_using_directive): Revert previous patch. - - 2001-05-01 Nathan Sidwell - - * cp-tree.def (USING_STMT): New statement node. - * cp-tree.h (USING_STMT_NAMESPACE): New macro. - * decl2.c (do_using_directive): Add USING_STMT to statement - tree. Don't emit errors when processing template decl. - * pt.c (tsubst_expr, USING_STMT case): New case. - * semantics.c (cp_expand_stmt, USING_STMT case): New case. - - 2001-05-01 Nathan Sidwell - - * call.c (build_new_op): Convert args from reference here. - (build_conditional_expr): Don't convert here. - - 2001-05-01 Nathan Sidwell - - * spew.c (last_token_id): New static variable. - (read_token): Set it here. - (yyerror): Use it here. - - 2001-04-30 Richard Henderson - - * cvt.c: Downcase C_PROMOTING_INTEGER_TYPE_P invocations. - * decl.c: Likewise. - - 2001-04-30 Mark Mitchell - - * gxxint.texi: Remove. - * Make-lang.in: Remove all traces of gxxint.texi. - - Mon Apr 30 16:14:10 2001 Mark P Mitchell - - * decl2.c (start_static_initialization_or_destruction): Correct - logic to handle the -fno-use-cxa-atexit case. - - 2001-04-30 Mark Mitchell - - * optimize.c (update_cloned_parm): New function. - (maybe_clone_body): Use it. Update the `this' parameter too. - - 2001-04-29 Joseph S. Myers - - * decl2.c (unsupported_options): Add new-abi. - * lang-options.h: Remove no longer supported options. - - 2001-04-27 Nathan Sidwell - - * except.c (can_convert_eh): Don't check template parms, - typename types etc. - - 2001-04-27 Nathan Sidwell - - * optimize.c (maybe_clone_body): Copy parameter names and locations. - - 2001-04-27 Nathan Sidwell - - * cp-tree.h (adjust_clone_args): Prototype new function. - * class.c (adjust_clone_args): New function. - * decl.c (start_function): Call it for in charge ctors. - - 2001-04-26 Mark Mitchell - - * method.c (use_thunk): Make sure that thunks really are emitted - when requested. - - 2001-04-26 Nathan Sidwell - - * mangle.c (write_chars): New macro. - (hwint_to_ascii): New function - (write_number): Use it. - (write_integer_cst): Deal with really big numbers. - - 2001-04-25 Mark Mitchell - - * optimize.c (maybe_clone_body): Copy TREE_PUBLIC before emitting - the clone. - - 2001-04-25 Nathan Sidwell - - * decl.c (grokdeclarator): Set context of namespace scope - TYPE_DECLS. - - 2001-04-24 Zack Weinberg - - * cp/optimize.c: Include hashtab.h. - (struct inline_data): Add tree_pruner. - (expand_call_inline, expand_calls_inline): Use it when calling - walk_tree. - (optimize_function): Initialize and free tree_pruner. - - 2001-04-24 Nathan Sidwell - - Lazy __FUNCTION__ generation. - * cp-tree.def (FUNCTION_NAME): Remove. - * cp-tree.h (function_name_declared_p): Remove. - (cp_fname_init): Prototype. - * decl.c (init_decl_processing): Don't generate __FUNCTION__ et al ids, - don't call declare_function_name. Call start_fname_decls. - (cp_make_fname_decl): Adjust parameters. Generate the name. Don't - clobber the line number. - (cp_fname_init): New function. - (start_function): Call start_fname_decls. - (finish_function): Call finish_fname_decls. - * lex.c (reswords): Add slots for __FUNCTION__ et al. - (rid_to_yy): Add mappings for __FUNCTION__ et al. - * optimize.c (maybe_clone_body): Remove function_name_declared_p. - * parse.y (VAR_FUNC_NAME): New token. - (primary): Add VAR_FUNC_NAME. - * pt.c (tsubst_decl): Adjust a DECL_PRETTY_FUNCTION_P's - generation. - (tsubst, FUNCTION_NAME case): Remove. - (tsubst_copy, FUNCTION_NAME case): Remove. - (tsubst_expr, DECL_STMT case): Be careful with a - DECL_PRETTY_FUNCTION_P. - (instantiate_decl): Remove function_name_declared_p. - * semantics.c (begin_compound_statement): Don't call - declare_function_name here. - (setup_vtbl_ptr). Don't save & restore function_name_declared_p. - (finish_translation_unit): Call finish_fname_decls. - (expand_body): Remove function_name_declared_p. - * typeck2.c (digest_init): Allow any ERROR_MARK. - - 2001-04-24 Nathan Sidwell - - * pt.c (tsubst_decl): Use VOID_TYPE_P. - * semantics.c: Fix some typos. - - 2001-04-23 Phil Edwards - - * cp/decl2.c (flag_honor_std): Always initialize to 1. - - 2001-04-22 Kaveh R. Ghazi - - * xref.c (GNU_xref_file): Use concat in lieu of xmalloc/sprintf. - - 2001-04-23 Jason Merrill - - * except.c (build_throw): Wrap the initialization of the exception - object in a MUST_NOT_THROW_EXPR. - (do_free_exception): #if 0. - - 2001-04-20 Mark Mitchell - - * cp-tree.h (finish_enum): Change prototype. - * decl.c (finish_enum): Reorganize. - * parse.y (structsp): Adjust calls to finish_enum. - - 2001-04-20 Nathan Sidwell - - * tree.c (cp_tree_equal): Adjust final switch formatting. Add - 't' case. - - 2001-04-20 Nathan Sidwell - - * class.c (dfs_unshared_virtual_bases): Add ATTRIBUTE_UNUSED. - (layout_empty_base): Return at end flag. - (build_base_field): Likewise. - (build_base_fields): Likewise. - (layout_virtual_bases): Don't add 1 to eoc value. - (end_of_class): Use full size for empty bases. - (layout_class_type): Clear CLASSNEARLY_EMPTY_P if we appended - empty bases. Don't add 1 to eoc value. Only add trailing padding - if we're an empty class with no empty bases. - (dump_class_hierarchy): Dump size and alignment. - - 2001-04-20 Jakub Jelinek - - * call.c (maybe_handle_ref_bind): Copy ICS_USER_FLAG and - ICS_BAD_FLAG. - - 2001-04-20 Jakub Jelinek - - * search.c (lookup_field_r): If looking for type and non-TYPE_DECL - is found, look first if name does not match the structure name. - - 2001-04-19 Mark Mitchell - - * cp-tree.h (DECL_LANGUAGE): Don't assume DECL_LANG_SPECIFIC is - set. - (SET_DECL_LANGUAGE): New macro. - * decl.c (duplicate_decls): Use SET_DECL_LANGUAGE. - (pushdecl): Likewise. - (build_library_fn_1): Likewise. - (build_cp_library_fn): Likewise. - (grokfndecl): Likewise. - (grokvardecl): Mark `extern "C"' variables as having C linkage. - * decl2.c (grokclassfn): Use SET_DECL_LANGUAGE. - * lex.c (retrofit_lang_decl): Likewise. - * mangle.c (mangle_decl_string): Don't mangle the names of - variables declared with C language linkage. - * semantics.c (finish_member_declaration): Use SET_DECL_LANGUAGE. - - 2001-04-18 John David Anglin - - * semantics.c (simplify_aggr_init_exprs_r): Don't restore - flag_access_control from uninitialized storage. - - 2001-04-15 Mark Mitchell - - * cp-tree.h (TYPE_PTRMEM_CLASS_TYPE): Improve documentation. - * mangle.c (write_pointer_to_member_type): Fix mangling of - pointers to cv-qualified member function types. - - * init.c (build_delete): Create a SAVE_EXPR for the address if - we're going to use it more than once. - - 2001-04-13 Mark Mitchell - - * cp-tree.h (DELTA2_FROM_PTRMEMFUNC): Remove. - (expand_ptremfunc_cst): Change prototype. - (delta2_from_ptrmemfunc): Remove. - * expr.c (cplus_expand_constant): Adjust call to - expand_ptrmemfunc_cst. - * typeck.c (build_ptrmemfunc1): Simplify. - (build_ptrmemfunc): Make sure that casting a PTRMEM_CST still - results in a constant. - (expand_ptrmemfunc_cst): Remove idx and delta2 parameters. - (delta2_from_ptrmemfunc): Remove. - (pfn_from_ptrmemfunc): Adjust call to expand_ptrmemfunc_cst. - - 2001-04-12 Jason Merrill - - * cp-tree.h (decl_namespace_list): New macro. - (struct saved_scope): Add decl_ns_list. - * decl.c (mark_saved_scope): Mark it. - * decl2.c: Lose static decl_namespace_list. - (init_decl2): Don't save it. - - 2001-04-12 Kaveh R. Ghazi - - * cp-tree.h (warn_return_type, yylex): Delete redundant - declarations. - - * decl.c (current_class_depth, global_namespace): Likewise. - - * decl2.c (current_class_depth, flag_gnu_xref): Likewise - - * repo.c (flag_use_repository): Likewise. - - 2001-04-12 Kaveh R. Ghazi - - * cp-tree.h (pedantic, convert, global_bindings_p, insert_block, - set_block, pushdecl, getdecls, gettags, init_decl_processing, - maybe_build_cleanup, copy_lang_decl, prep_stmt, lvalue_p, - lvalue_or_else, print_lang_statistics, comp_target_types, - unsigned_type, signed_type, signed_or_unsigned_type, - build_function_call, mark_addressable, incomplete_type_error): - Delete redundant declarations. - - 2001-04-11 Jason Merrill - - * cp-tree.h (TYPE_LINKAGE_IDENTIFIER): New macro. - (TYPE_ANONYMOUS_P): New macro. - (TAGGED_TYPE_P): New macro. - * decl.c (check_tag_decl): Use TYPE_ANONYMOUS_P. - (grokfndecl, grokvardecl, grokdeclarator): Likewise. - * tree.c (no_linkage_helper): Likewise. - * semantics.c (begin_class_definition): Likewise. - * pt.c (convert_template_argument): Likewise. - * lex.c (check_for_missing_semicolon): Likewise. - - 2001-04-12 Nathan Sidwell - - * class.c (dfs_unshared_virtual_bases): New function. - (mark_primary_bases): Call it. - (check_bases): Ignore virtual bases when determining - nearly-emptiness. - - 2001-04-12 Nathan Sidwell - - * method.c (make_thunk): Clear DECL_CLONED_FUNCTION. - - 2001-04-11 Mark Mitchell - - * optimize.c (maybe_clone_body): Copy DECL_NUM_STMTS from the - cloned function to the clone. - - 2001-04-11 Kaveh R. Ghazi - - * Make-lang.in (cp/semantics.o): Depend on $(EXPR_H). - - * semantics.c: Include expr.h. - - 2001-04-11 Nathan Sidwell - - * method.c (implicitly_declare_fn): Commonize code for copy ctor - and assignment op. Set TREE_USED for parameter. - - 2001-04-10 Mark Mitchell - - * class.c (find_final_overrider_data): Add `candidates'. - (dfs_find_final_overrider): Don't issue error messages - prematurely. - (find_final_overrider): Issue error messages here. - (build_base_field): Don't warn about amgibuous direct bases here. - (warn_about_ambiguous_direct_bases): New function. - (layout_class_type): Use it. - - 2001-04-10 Richard Henderson - - * typeck.c (build_array_ref): Push the array reference inside - COMPOUND_EXPR and COND_EXPR. - - 2001-04-05 Mark Mitchell - - * cp-tree.h (DECL_THIS_INLINE): Rename to DECL_DECLARED_INLINE_P. - * decl.c (duplicate_decls): Adjust accordingly. - (maybe_commonize_var): Likewise. - (grokfndecl): Likewise. - (start_function): Likewise. - (start_method): Likewise. - * decl2.c (key_method): Likewise. - (import_export_decl): Likewise. - * method.c (implicitly_declare_fn): Likewise. - * optimize.c (maybe_clone_body): Likewise. - - 2001-04-05 Benjamin Kosnik - - * lang-specs.h: Add __DEPRECATED. - - Thu Apr 5 16:54:29 2001 J"orn Rennecke - - * search.c (get_dynamic_cast_base_type): When building a new - constant, set its type to ssizetype. - - 2001-04-04 Jakub Jelinek - - * optimize.c (expand_call_inline): Only add newly inlined statements - into inlined_stmts. - - 2001-04-03 Mark Mitchell - - * cp-tree.h (OPERATOR_ASSIGN_FORMAT): Remove. - (OPERATOR_FORMAT): Likewise. - (OPERATOR_TYPENAME_FORMAT): Likewise. - * operators.def: Remove old name-mangling information. - * decl.c (grok_op_properties): Adjust accordingly. - * lex.c (init_operators): Likewise. - * rtti.c (get_tinfo_decl): Issue error messages about types that - have variable size. - - 2001-04-03 Mark Mitchell - - * decl2.c (import_export_decl): Don't call import_export_class - when processing an inline member function. - * semantics.c (expand_body): Call import_export_decl before - emitting inline functions. - - 2001-03-28 Richard Henderson - - IA-64 ABI Exception Handling: - * cp-tree.def (EH_SPEC_BLOCK): New. - (MUST_NOT_THROW_EXPR): New. - * cp-tree.h: Update changed function declarations. - (CPTI_PUSH_EXCEPTION_IDENTIFIER): Remove. - (CPTI_CALL_UNEXPECTED): New. - (struct cp_language_function): Rename x_eh_spec_try_block - to x_eh_spec_block. - (EH_SPEC_STMTS, EH_SPEC_RAISES): New. - * decl.c (current_binding_level): If no current function - bindings, revert to scope_chain. - (initialize_predefined_identifiers): Remove __cp_push_exception. - (store_parm_decls): Use begin_eh_spec_block. - (finish_function): Use finish_eh_spec_block. - (mark_lang_function): Update for name changes. - * decl2.c (finish_file): No mark_all_runtime_matches. - * dump.c (cp_dump_tree): Handle new tree codes. - * error.c (dump_expr) [BIND_EXPR]: Fix typo. - * except.c (catch_language_init, catch_language): Remove. - (init_exception_processing): Don't set language code. - Initialize call_unexpected_node, protect_cleanup_actions, - eh_personality_libfunc, lang_eh_runtime_type. - (call_eh_info, push_eh_info, get_eh_info, get_eh_value): Remove. - (get_eh_type, get_eh_caught, get_eh_handlers): Remove. - (prepare_eh_type): Split out type canonicalizations ... - (build_eh_type_type): ... from here. - (build_eh_type_type_ref): Remove. - (mark_all_runtime_matches): Remove. - (build_exc_ptr): New. - (do_begin_catch, do_end_catch): New. - (do_pop_exception): Remove. - (build_terminate_handler): Remove. - (choose_personality_routine): Split out language choice from ... - (initialize_handler_parm): ... here. - Use MUST_NOT_THROW_EXPR. - (expand_start_catch_block): Use do_begin_catch. Simplify Java - exception object handling. - (expand_start_eh_spec, expand_end_eh_spec): Remove. - (expand_exception_blocks, alloc_eh_object): Remove. - (begin_eh_spec_block, finish_eh_spec_block): New. - (do_allocate_exception, do_free_exception): New. - (expand_throw): Merge into ... - (build_throw): ... here. Update for abi. - * expr.c (cplus_expand_expr): No expand_internal_throw. - Handle MUST_NOT_THROW_EXPR. - * pt.c (tsubst_expr): Handle EH_SPEC_BLOCK. - * semantics.c (*) Update for except.h name changes. - (genrtl_try_block): No protect_with_terminate. - (genrtl_eh_spec_block): New. - (genrtl_handler): Don't emit the goto here. - (cp_expand_stmt): Handle EH_SPEC_BLOCK. - (genrtl_finish_function): Don't expand_exception_blocks. - * tree.c (cp_statement_code_p): Handle EH_SPEC_BLOCK. - - 2001-03-28 Richard Henderson - - * decl.c (struct named_label_list): Rename eh_region to - in_try_scope, add in_catch_scope. - (struct binding_level): Rename eh_region to is_try_scope, - add is_catch_scope. - (note_level_for_try): Rename from note_level_for_eh. - (note_level_for_catch): New. - (poplevel): Copy both is_try_scope and is_catch_scope to - the named_label_list struct. - (check_previous_goto_1): Don't check for catch block via - DECL_ARTIFICIAL; use in_try_scope instead. - (check_goto): Likewise. - * cp-tree.h (note_level_for_try, note_level_for_catch): Declare. - * except.c (expand_start_catch_block): Call note_level_for_catch. - * semantics.c (begin_compound_stmt): Update for note_level_for_try. - - 2001-03-27 Richard Henderson - - * except.c: Use USING_SJLJ_EXCEPTIONS instead of - exceptions_via_longjmp. - - 2001-03-27 Phil Edwards - - * pt.c (check_default_tmpl_args): Make error messages clearer. - - 2001-03-26 Phil Edwards - - * error.c: Also undefine 'A' macro used for cp_printers definition. - - 2001-03-27 Kaveh R. Ghazi - - * Make-lang.in: Depend on $(SYSTEM_H), not system.h. - - 2001-03-26 Mike Yang - Mark Mitchell - - * dump.c (dump_access): New function. - (cp_dump_tree): Use it. Dump basetype information for class - types. - - 2001-03-26 Mark Mitchell - - * Makefile.in (optimize.o): Depend on params.h. - (duplicate_decls): Copy DECL_NUM_STMTS, not DECL_FRAME_SIZE. - (init_decl_processing): Set flag_no_inline when doing - inlining-on-trees. - * optimize.c: Include params.h. - (struct inline_data): Improve documentation of FNS. Add - FIRST_INLINED_FN, INLINED_STMTS, and CLONING_P. - (INSNS_PER_STMT): New macro. - (remap_block): Use CLONING_P. - (inlinable_function_p): Don't inline big functions. - (expand_call_inline): Keep track of how much inlining we've done. - (optimize_function): Set FIRST_INLINED_FN. - (maybe_clone_body): Set CLONING_P. - * semantics.c (simplify_aggr_init_exprs_r): Fix typing problems in - tree nodes. - (genrtl_finish_function): Clear DECL_DEFER_OUTPUT before calling - rest_of_compilation. Clear DECL_RTL for local variables - afterwards. - (clear_decl_rtl): New function. - - 2001-03-26 Nathan Sidwell - - Implement DR 209 - * cp-tree.h (skip_type_access_control, - reset_type_access_control): Prototype. - * decl.c (grokdeclarator): Access of friends is not checked. - * parse.y (component_decl_list): Reset type access control. - * semantics.c (decl_type_access_control): Clear - current_type_lookups. - (save_type_access_control): Don't save if not deferring. - (skip_type_access_control, reset_type_access_control): New - functions. - (begin_class_definition): Do type access control for basetypes. - Start deferred access control. - (finish_class_definition): Resume immediate access control if - this is a local class. - - 2001-03-25 Kaveh R. Ghazi - - * class.c (add_method): Use memcpy/memmove, not bcopy. - - * decl.c (duplicate_decls): Likewise. - - 2001-03-23 Jakub Jelinek - - * mangle.c (write_discriminator): Use `_0' for discriminator 1, - not `_'. - - 2001-03-23 Jakub Jelinek - - * decl.c (local_names): Define. - (push_local_name): New. - (grok_reference_init): Return init if initializing static reference - variable with non-constant instead of emitting it. - Move expand_static_init call to cp_finish_decl. - (layout_var_decl): Call push_local_name. - (maybe_commonize_var): Allow inlining functions even if they have - static local variables, use comdat_linkage for them if flag_weak. - (check_initializer): Call obscure_complex_init if - grok_reference_init returned nonzero. - (save_function_data): Clear x_local_names. - (pop_cp_function_context): Free x_local_names. - (mark_inlined_fns): Remove. - (mark_lang_function): Mark x_local_names. - (lang_mark_tree): Don't mark DECL_ACCESS for DECL_DISCRIMINATOR_P. - Mark inlined_fns as tree, remove call to mark_inlined_fns. - * class.c (alter_access): Ensure DECL_ACCESS is never set if - DECL_DISCRIMINATOR_P. - * cp-tree.h (cp_language_function): Add x_local_names. - (lang_decl_flags): Add discriminator into u2. - (lang_decl_inlined_fns): Remove. - (lang_decl): inlined_fns is now a TREE_VEC. - (DECL_DISCRIMINATOR_P, DECL_DISCRIMINATOR): Define. - * optimize.c (inlinable_function_p): DECL_INLINED_FNS is now a - TREE_VEC, not a custom structure. - (optimize_function): Likewise. - * mangle.c (discriminator_for_local_entity): Discriminate among - VAR_DECL local entities. - * search.c (dfs_access_in_type): If DECL_DISCRIMINATOR_P, DECL_ACCESS - is not valid. - - 2001-03-22 Bryce McKinlay - - Add support for Java interface method calls. - * cp-tree.h (struct lang_type): Add java_interface flag. - (TYPE_JAVA_INTERFACE): New macro. - * tree.c (cp_valid_lang_attribute): Handle "java_interface" attribute - by setting TYPE_JAVA_INTERFACE. - * call.c (java_iface_lookup_fn): New static. - (build_over_call): If calling a method declared in a - TYPE_JAVA_INTERFACE, call build_java_interface_fn_ref to generate the - expression which resolves the function address. - (build_java_interface_fn_ref): New function. - - 2001-03-22 Richard Henderson - - * Make-lang.in (cp/except.o): Don't depend on insn-flags.h. - * except.c: Don't include it. - - 2001-03-22 Gerald Pfeifer - based on an idea from Joe Buck - - * parse.y (bad_decl, template_arg_list_ignore, arg_list_ignore): - New nonterminals. - (data_def, component_decl): Add reductions to bad_decl. - - 2001-03-22 Jakub Jelinek - - * method.c (do_build_assign_ref): Don't use build_modify_expr for - anonymous aggregates, since they don't have assignment operator - method. - * decl.c (fixup_anonymous_aggr): Disallow ctors, dtors and copy - assignment operators for anonymous structure fields. - - 2001-03-21 Jason Merrill - - * pt.c (instantiate_decl): Abort if we see a member constant - instantiation that doesn't already have its initializer. - Downgrade explicit instantiation without definition to pedwarn. - - * cp-tree.h (DECL_TINFO_FN_P, SET_DECL_TINFO_FN_P): Remove. - * class.c (build_vtable_entry): Don't check DECL_TINFO_FN_P. - (import_export_decl): Check tinfo_decl_p, not DECL_TINFO_FN_P. - - * cp-tree.h (CLASSTYPE_VTABLE_NEEDS_WRITING): Remove. - (pending_vtables): Remove. - * decl2.c (pending_vtables): Remove. - (import_export_vtable): Use CLASSTYPE_INTERFACE_ONLY, not - CLASSTYPE_VTABLE_NEEDS_WRITING. - (import_export_class): Likewise. - (init_decl2): Don't mark pending_vtables. - * lex.c (handle_pragma_vtable): Just sorry. - * pt.c (instantiate_class_template): Don't mess with - CLASSTYPE_VTABLE_NEEDS_WRITING. - (mark_class_instantiated): Likewise. - * ptree.c (print_lang_type): Don't print it. - * semantics.c (begin_class_definition): Don't set it. - - * pt.c (template_tail): Replace with last_pending_template. - (maybe_templates, maybe_template_tail): Remove. - (add_pending_template): Adjust. - (instantiate_pending_templates): Adjust. - - * cp-tree.h (struct saved_scope): Remove lang_stack field. - (current_lang_stack): Remove. - * decl.c (maybe_push_to_top_level): Don't initialize it. - (duplicate_decls): Use current_lang_depth. - (xref_basetypes): Likewise. - * class.c (current_lang_depth): New fn. - (push_lang_context): Use more varray functionality. - (pop_lang_context): Likewise. - - * error.c (GLOBAL_THING): Always use '__'. - - 2001-03-21 Mark Mitchell - - * class.c (build_clone): Clear DECL_ASSEMBLER_NAME. - - * mangle.c (mangle_decl_string): Mangle the names of overloaded - operators, even when they have `extern "C"' linkage. - - 2001-03-19 Mark Mitchell - - * class.c (get_vtable_decl): Use SET_DECL_ASSEMBLER_NAME, - COPY_DECL_ASSEMBLER_NAME, etc. Don't set DECL_ASSEMBLER_NAME - where it's not necessary. - (add_method): Remove optimization involving comparison of - DECL_ASSEMBLER_NAME. - (build_vtbl_or_vbase_field): Use SET_DECL_ASSEMBLER_NAME, - COPY_DECL_ASSEMBLER_NAME, etc. Don't set DECL_ASSEMBLER_NAME - where it's not necessary. - (check_methods): Likewise. - (build_clone): Likewise. - (built_vtt): Likewise. - * cp-tree.h (DECL_NEEDED_P): Likewise. - * decl.c (pushtag): Likewise. - (duplicate_decls): Likewise. - (pushdecl): Likewise. - (builtin_function): Likewise. - (build_library_fn_1): Set DECL_LANGUAGE for library functions. - (build_cp_library_fn): Likewise. - (maybe_commonize_var): Use SET_DECL_ASSEMBLER_NAME, - COPY_DECL_ASSEMBLER_NAME, etc. Don't set DECL_ASSEMBLER_NAME - where it's not necessary. - (make_rtl_for_nonlocal_decl): Likewise. - (cp_finish_decl): Likewise. - (grokfndecl): Likewise. - (grokvardecl): Likewise. - (grokdeclarator): Likewise. - (start_function): Likewise. - (cp_missing_return_ok_p): Likewise. - * decl2.c (grokclassfn): Likewise. - (check_classfn): Likewise. - (finish_static_data_member_decl): Likewise. - (grokfield): Likewise. - * error.c (GLOBAL_IORD_P): Remove. - (dump_global_iord): Improve output. - (dump_decl): Avoid using DECL_ASSEMBLER_NAME. - * except.c (nothrow_libfn_p): Summarily reject any function not in - namespace-scope. - * init.c (build_java_class_ref): Don't explicitly set - DECL_ASSEMBLER_NAME after calling mangle_decl. - * mangle.c (mangle_decl_string): Handle extern "C" functions. - (mangle_decl): Set the DECL_ASSEMBLER_NAME for the decl. - * method.c (set_mangled_name_for_decl): Don't explicitly set - DECL_ASSEMBLER_NAME after calling mangle_decl. - (make_thunk): Explicitly set the DECL_ASSEMBLER_NAME and - IDENTIFIER_GLOBAL_VALUE for the thunk. - * pt.c (set_mangled_name_for_template_decl): Remove. - (check_explicit_specialization): Don't use it. - (looup_template_class): Don't set DECL_ASSEMBLER_NAME. - (tsubst_friend_function): Likewise. - (tsubst_decl): Likewise. - (regenerate_decl_from_template): Use COPY_DECL_ASSEMBLER_NAME. - * rtti.c (get_tinfo_decl): Use SET_DECL_ASSEMBLER_NAME, - COPY_DECL_ASSEMBLER_NAME, etc. Don't set DECL_ASSEMBLER_NAME - where it's not necessary. - (tinfo_base_init): Likewise. - (create_real_tinfo_var): Likewise. - * search.c (looup_field_1): Likewise. - * semantics.c (finish_named_return_value): Likewise. - * tree.c (init_tree): Set lang_set_decl_assembler_name. - - 2001-03-15 Gabriel Dos Reis - - Correct semantics restrictions checking in throw-expression. - * except.c (is_admissible_throw_operand): New function. - (build_throw): Use it. - - 2001-03-14 Mark Mitchell - - * decl.c (cp_make_fnname_decl): Set DECL_IGNORED_P on __FUNCTION__ - and its ilk. - - 2001-03-14 Mark Mitchell - - * class.c (build_clone): Use COPY_DECL_RTL, DECL_RTL_SET_P, etc. - * cp-tree.h (DECL_IN_MEMORY_P): Likewise. - * decl.c (duplicate_decls): Likewise. - (builtin_function): Likewise. - (build_library_fn): Likewise. - (build_cp_library_fn): Likewise. - (check_initializer): Likewise. - (cp_finish_decl): Likewise. - * decl2.c (grokfield): Likewise. - (grok_function_init): Remove #if 0'd code. - (finish_anon_union): Use COPY_DECL_RTL, DECL_RTL_SET_P, etc. - * friend.c (do_friend): Likewise. - * init.c (get_temp_regvar): Likewise. - * method.c (make_thunk): Likewise. - * pt.c (tsubst_friend_function): Likewise. - (tsubst_decl): Likewise. - (regenerate_decl_from_template): Likewise. - * semantics.c (genrtl_named_return_value): Likewise. - (expand_body): Likewise. - (genrtl_finish_function): Likewise. - * tree.c (cp_tree_equal): Likewise. - - 2001-03-12 Nathan Sidwell - - * call.c (convert_like_real): Add extra semantics to INNER - parameter. Don't convert to temporary if a user conversion - gives us an lvalue that we're about to bind to a reference. - Set INNER to indicate pending reference binding on recursive - calls. - - 2001-03-10 Neil Booth - - * cp/lex.c: Delete duplicate pending_lang_change. - - 2001-03-10 Neil Booth - - * cp/lex.c (handle_pragma_interface, handle_pragma_implementation): - Similarly. - * cp/repo.c (get_base_filename, open_repo_file): Similarly. - * cp/cp-tree.h: Remove file_name_nondirectory prototype. - - 2001-03-09 Zack Weinberg - - * Make-lang.in: Add dependencies on $(TM_P_H) as appropriate. - - 2001-03-08 Stan Shebs - - * cp-tree.h (set_identifier_local_value): Remove unused decl. - - 2001-03-06 Zack Weinberg - - * spew.c: Remove references to CPP_OSTRING. - - 2001-03-06 Andrew Haley - - * typeck.c (convert_arguments): Check that we have an fndecl. - - 2001-03-05 Andrew Haley - - * typeck.c (convert_arguments): Don't do ellipsis conversion for - __built_in_constant_p. - - 2001-03-02 Nathan Sidwell - - * typeck.c (build_static_cast): Allow enum to enum conversions - as per DR 128. - - 2001-03-02 Nathan Sidwell - - * class.c (check_field_decls): Pointers to member do not a - non-pod struct make, as per DR 148. - - 2001-03-02 Nathan Sidwell - - * call.c (joust): cp_pedwarn when using gnu extension concerning - worst conversion sequences. - - 2001-03-01 Zack Weinberg - - * decl.c: Replace all uses of 'boolean' with 'bool'. - - 2001-03-01 Zack Weinberg - - * lang-specs.h: Add zero initializer for cpp_spec field to - all array elements that need one. Don't put an #ifdef inside - the initializer list; set a default for CPLUSPLUS_CPP_SPEC and - use it. - - 2001-03-01 Nathan Sidwell - - Implement using decls inside template functions. - * decl2.c (validate_nonmember_using_decl): Don't special case - fake_std_node in the global namespace. Don't reject early when - processing a template. - (do_local_using_decl): Add to statement tree. Don't do further - processing when building a template. - * pt.c (tsubst_expr, DECL_STMT case): Deal with USING_DECLs. - - 2001-03-01 Nathan Sidwell - - * decl2.c (do_nonmember_using_decl): Don't complain if we find - same function. Do complain about ambiguating extern "C" - declarations. - - 2001-02-28 Nathan Sidwell - - Remove floating point and complex type template constant parms. - * pt.c (convert_nontype_argument): Remove REAL_TYPE and - COMPLEX_TYPE extensions. - (invalid_nontype_parm_type_p): Likewise. - - 2001-02-27 Jeffrey Oldham - - * except.c (call_eh_info): Revert "match_function"'s type. - - 2001-02-27 Nathan Sidwell - - Fix ctor vtable vcall offsets. - * class.c (struct vtbl_init_data_s): Add rtti_binfo member. - (build_rtt_vtbl_entries): Lose RTTI_BINFO parameter. - (get_matching_base): Remove. - (get_original_base): New function. - (build_vtbl_initializer): Initialize vid.rtti_binfo. - Use a virtual thunk for a ctor vtable with an index - (add_vcall_offset_vtbl_entries_1): Check if binfo has lost a - primary base within a constructor vtable. Only set - BV_VCALL_INDEX when not a constructor vtable. Adjust vcall offset - when primary base has been lost. - * cp-tree.h (BINFO_VIRTUALS): Remove ambiguity from comment. - - 2001-02-26 Jeffrey Oldham - - * call.c (joust): Ensure more_specialized()'s argument length - parameter has correct value for constructors. - - 2001-02-26 Nathan Sidwell - - * except.c (call_eh_info): Cleanup generation of cp_eh_info struct. - - * decl.c (mark_inlined_fns): Prototype. - - 2001-02-22 Mark Mitchell - - * spew.c (yylex): Correct handling of friends. - - 2001-02-22 Mark Mitchell - - * mangle.c (write_encoding): Pass write_function_type the - FUNCTION_DECL for the function being encoded. - (write_function_type): Pass it along to write_bare_function_type. - (write_bare_function_type): Pass it along to write_method_parms. - (write_method_parms): Don't mangle the compiler-generated - parameters to a constructor or destructor. - - 2001-02-22 Andreas Jaeger - - * optimize.c: Include toplev.h for - note_deferral_of_defined_inline_function prototype. - - 2001-02-22 Jakub Jelinek - - * cp-tree.h (struct lang_decl_inlined_fns): New. - (struct lang_decls): Add inlined_fns. - (DECL_INLINED_FNS): New macro. - * optimize.c (struct inline_data): Add inlined_fns. - (declare_return_variable): Use VARRAY_ACTIVE_SIZE macro. - (inlinable_function_p): Likewise, fix typo in comment, - function is not inlinable if it already inlined function currently - being optimized. - (expand_call_inline): Add fn to inlined_fns if necessary. - (optimize_function): Initialize inlined_fns. - Save inlined_fns into DECL_INLINED_FNS after expanding inlines. - * decl.c (mark_inlined_fns): New function. - (lang_mark_tree): Call it. - - 2001-02-21 Jason Merrill - - * cp-tree.h (struct lang_decl_flags): Remove uninlinable flag. - (DECL_UNINLINABLE): Move to middle-end. - - * class.c (clone_function_decl): Set DECL_ABSTRACT on original fn. - * decl.c (duplicate_decls): Preserve DECL_ABSTRACT. - * class.c (build_clone): Set DECL_ABSTRACT_ORIGIN for the clone. - * optimize.c (maybe_clone_body): Set DECL_ABSTRACT_ORIGIN for the - parms and outer BLOCK. note_deferral_of_defined_inline_function. - - * method.c (implicitly_declare_fn): Don't set DECL_ARTIFICIAL on - second parm of op=. - - 2001-02-19 Mark Mitchell - - * decl2.c (set_decl_namespace): Allow explicit instantiations in - any namespace. - - 2001-02-18 Kriang Lerdsuwanakij - - * optimize.c (expand_call_inline): Don't walk subtrees of type - nodes. - - 2001-02-18 Mark Mitchell - - * class.c (add_vcall_offset_vtbl_entries_1): Only add one entry - for a destructor. - - 2001-02-18 Jason Merrill - - Do put the VTT parameter in DECL_ARGUMENTS. - * cp-tree.h (struct cp_language_function): Add x_vtt_parm. - (current_vtt_parm): New macro. - (struct lang_decl_flags): Add has_vtt_parm_p, remove vtt_parm. - (DECL_HAS_VTT_PARM_P): New macro. - (DECL_VTT_PARM): Remove. - (FUNCTION_FIRST_USER_PARMTYPE, FUNCTION_FIRST_USER_PARM): New macros. - * decl.c (duplicate_decls): Only copy the operator code if - appropriate. - (start_function): Set current_vtt_parm. - (lang_mark_tree): Don't mark vtt_parm. - * decl2.c (maybe_retrofit_in_chrg): Do add the VTT parm to - DECL_ARGUMENTS. Set DECL_HAS_VTT_PARM_P. - * class.c (build_clone): Maybe remove the VTT parm. - * optimize.c (maybe_clone_body): Set up the VTT parm. - * pt.c (copy_default_args_to_explicit_spec): Preserve the VTT parm. - * call.c (build_over_call): Just allow the VTT arg. - * method.c (make_thunk): Don't set DECL_VTT_PARM. - (do_build_copy_constructor): Use FUNCTION_FIRST_USER_PARM. - (synthesize_method): Use FUNCTION_FIRST_USER_PARMTYPE. - * decl.c (grokdeclarator, copy_args_p, grok_ctor_properties): Likewise. - * error.c (dump_function_decl): Likewise. - * call.c (build_user_type_conversion_1, convert_like_real): Abort - if we try to call a constructor with in-charge or VTT parms. - * method.c (skip_artificial_parms_for): New fn. - * call.c (add_function_candidate, build_over_call): Call it. - * call.c (build_new_method_call): Use current_vtt_parm. - * init.c (expand_virtual_init): Likewise. - * class.c (same_signature_p): No longer static. - * cp-tree.h: Declare it. - * search.c (look_for_overrides_r): Use it. - - 2001-02-17 Mark Mitchell - - * cp-tree.h (new_abi_rtti_p): Remove. - (name_mangling_version): Likewise. - (flag_do_squangling): Likewise. - * class.c (build_rtti_vtbl_entries): Remove old ABI support. - * decl.c (grokfndecl): Likewise. - * decl2.c (name_mangling_version): Remove. - (flag_do_squangling): Likewise. - (lang_f_options): Remove `squangle'. - (unsupported_options): Add `squangle'. - (cxx_decode_option): Issue a warning about uses of - -fname-mangling-version. - (finish_file): Remove old ABI support. - * pt.c (check_explicit_specialization): Likewise. - (tsubst_decl): Likewise. - * rtti.c (init_rtti_processing): Likewise. - (build_headof): Likewise. - (get_tinfo_decl_dynamic): Likewise. - (tinfo_from_decl): Likewise. - (build_dynamic_cast_1): Likewise. - (synthesize_tinfo_var): Likewise. - * init.c (build_new): Allow enumeration types for the array-bounds - in a direct-new-declarator. - - * semantics.c (finish_typeof): Resolve OFFSET_REFs. - - * pt.c (check_explicit_specialization): Copy TREE_PRIVATE and - TREE_PROTECTED from the template being specialized. - - 2001-02-17 Jason Merrill - - * decl2.c (build_artificial_parm): Set TREE_READONLY. - - * decl.c (bad_specifiers): Allow throw specs on things with - pointer-to-function or -member-function type. - * init.c (build_default_init): Don't use a CONSTRUCTOR to initialize - a pmf. - - 2001-02-17 Mark Mitchell - - * call.c (check_dtor_name): Handle template names correctly. - - 2001-02-16 Jason Merrill - - * cp-tree.h (DECL_USE_VTT_PARM): Remove. - * decl2.c (maybe_retrofit_in_chrg): Don't create it. - * optimize.c (maybe_clone_body): Don't substitute it. - * call.c (build_new_method_call): Check in_chrg instead. - * init.c (expand_virtual_init): Likewise. - - 2001-02-16 Gabriel Dos Reis - - * decl.c (check_tag_decl): Make sure a typedef for an anonymous - class-type introduces at least a type-name. - - 2001-02-16 Jakub Jelinek - - * call.c (convert_like_real): Create a temporary for non-lvalue. - - 2001-02-16 Jeffrey Oldham - - * cp-tree.h: Fix typos in comments. - - 2001-02-16 Jason Merrill - - * optimize.c (remap_block): If we're compiling a clone, pass the - new block to insert_block. - - 2001-02-16 Mark Mitchell - - * semantics.c (finish_asm_stmt): Robustify. - - 2001-02-15 Mark Mitchell - - * pt.c (push_template_decl_real): Don't remangle the name of a - class template. - - 2001-02-15 Jim Meyering - - * Make-lang.in (c++.install-common): Depend on installdirs. - (c++.install-info): Likewise. - (c++.install-man): Likewise. - - 2001-02-15 Mark Mitchell - - * typeck2.c (build_m_component_ref): Robustify. - - 2001-02-15 Alexandre Oliva - - * friend.c (do_friend): Don't take the nested [template] class - into account when deciding whether to warn about the friend - function not referring to a template function. - - 2001-02-14 Jakub Jelinek - - * typeck.c (build_unary_op): Clarify error message. - - 2001-02-08 Aldy Hernandez - - * parse.y (component_constructor_declarator): allow optional - parentheses around constructor class name. - - 2001-02-14 Nathan Sidwell - - * cp-tree.h (setup_vtbl_ptr): Move prototype to semantics.c - section. - * init.c (emit_base_init): Remove incorrect comment about - virtual bases. - * method.c (make_thunk): Fix comment alignment. - - 2001-02-14 Nathan Sidwell - - Kill remnants of this is variable. - * cp-tree.h (flag_this_is_variable): Remove. - * decl2.c (flag_this_is_variable): Remove. - * class.c (fixed_type_or_null): Add cdtor parm. Adjust. - (build_vbase_path): The path is non-static, even in a cdtor. - (resolves_to_fixed_type_p): Add additional return value. - * search.c (init_vbase_pointers): Adjust. - * tree.c (lvalue_p_1): Adjust. - * typeck.c (mark_addressable): Adjust. - - 2001-02-14 Nathan Sidwell - - * pt.c (unify): Don't check cv quals of array types. - - 2001-02-14 Nathan Sidwell - - * tree.c (cp_build_qualified_type_real): Use CP_TYPE_QUALS to - check whether we already have the type. - - 2001-02-13 Mark Mitchell - - * cp-tree.h (CLASSTYPE_DESTRUCTORS): Fix typo in comment. - * call.c (build_op_delete_call): Simplify to remove duplicate - code. - * class.c (clone_function_decl): Don't build the deleting variant - of a non-virtual destructor. - * decl.c (finish_destructor_body): Don't call delete if this is a - non-virtual destructor. - * init.c (build_delete): Explicitly call `operator delete' when - deleting an object with a non-virtual destructor. - - 2001-02-13 Jason Merrill - - * lang-specs.h: Add more __EXCEPTIONS. - - 2001-02-12 Nathan Sidwell - - * typeck2.c (process_init_constructor): Check - TREE_HAS_CONSTRUCTOR before issuing missing init warning. - - 2001-02-12 Nathan Sidwell - - * pt.c (maybe_adjust_types_for_deduction, DEDUCE_ORDER case): - Remove spurious information in comment. Allow further - adjustments of REFERENCE_TYPE args. - - 2001-02-12 Nathan Sidwell - - * errfn.c (cp_deprecated): Tweak diagnostic text. - * parse.y (new_initializer): Deprecate initializer lists - extension. - - 2001-02-12 Mark Mitchell - - Remove old ABI support. - - 2001-02-11 Mark Mitchell - - * decl2.c (flag_vtable_thunks): Always set it to 1. - (flag_new_abi): Likewise. - * lang-specs.h: Remove conditional on ENABLE_NEW_GXX_ABI. - - * Makefile.in (g++spec.o): Fix typo. - - 2001-02-09 Jason Merrill - - * lang-specs.h: Restore definition of __EXCEPTIONS. - - 2001-02-08 Jason Merrill - - * search.c (shared_member_p): New function. - (lookup_field_r): Use it. - * cp-tree.h (SHARED_MEMBER_P): Remove. - - * method.c (process_overload_item): Handle template-dependent array - bounds. - * pt.c (type_unification_real): If we end up with undeduced nontype - parms, try again. - - * decl.c (lookup_name_real): Tweak warning to refer to decls, not - types. - - * typeck2.c (friendly_abort): Don't say anything if we have - earlier errors or sorries. - - * decl.c (check_tag_decl): Notice attempts to redefine bool and - wchar_t. Ignore if in_system_header. - - * decl.c (maybe_push_cleanup_level): New fn... - (start_decl_1): ...split out from here. - * cvt.c (build_up_reference): Use it. - * cp-tree.h: Declare it. - - 2001-02-07 Mark Mitchell - - * lang-specs.h: Use CPLUSPLUS_CPP_SPEC for the preprocessor - spec. - - 2001-02-06 Nathan Sidwell - - * pt.c (lookup_template_class): Make sure it's a primary - template or template_template_parm when called from the parser. - (instantiate_template_class): Add assertion. - - 2001-02-05 Alexandre Oliva - - * method.c (build_mangled_name) [old abi]: Protect flush_repeats() - from error_mark_node. - - 2001-02-05 Nathan Sidwell - - Fix specification and implementation bugs in V3 ABI - construction vtables. - * cp-tree.h (flag_dump_class_layout): New flag. - (BINFO_OVERRIDE_ALONG_VIRTUAL_PATH_P): Remove. - (BINFO_LOST_PRIMARY_P): New flag. - (SET_BINFO_NEW_VTABLE_MARKED): Adjust asserts. - (BINFO_PRIMARY_MARKED_P): Rename to ... - (BINFO_PRIMARY_P): ... here. - (binfo_via_virtual): New prototype. - * decl2.c (flag_dump_class_layout): New flag. - (cxx_decode_option): Set it. Adjust -fdump-translation-unit to - use `=' as a file name separator. - * init.c (dfs_initialize_vtbl_ptrs): Walk into virtual primary - bases. - (build_vtbl_address): If this is a virtual primary base, then - get the vtbl of what it is ultimately primary for. - * search.c (dfs_skip_nonprimary_vbases_unmarkedp): Adjust - for BINFO_PRIMARY_P. - (dfs_skip_nonprimary_vbases_markedp): Likewise. - (get_shared_vbase_if_not_primary): Likewise. - (dfs_get_pure_virtuals): Likewise. - (expand_upcast_fixups): Likewise. - (fixup_virtual_upcast_offsets): Likewise. - (dfs_find_vbase_instance): Likewise. - (find_vbase_instance): Likewise. - (binfo_from_vbase): Adjust comment to reflect reality. - (binfo_via_virtual): New function. - * class.c (VTT_TOP_LEVEL_P, VTT_MARKED_BINFO_P): New macros - for binfo walking during VTT construction. - (dfs_mark_primary_bases): Remove. - (force_canonical_binfo_r): New function. - (force_canonical_binfo): New function. - (mark_primary_virtual_base): New function. - (mark_primary_bases): Walk in inheritance graph order, use - mark_primary_virtual_base. - (determine_primary_base): Use some more intermediate variables. - (dfs_find_final_overrider): Don't check for overriding along a - virtual path. - (dfs_modify_vtables): Walk into primary virtual bases too. - (walk_subobject_offsets): Adjust for BINFO_PRIMARY_P. - (build_base_fields): Likewise. - (dfs_set_offset_for_unshared_vbases): Likewise. - (layout_virtual_bases): Likewise. - (end_of_class): Likewise. - (finish_struct_1): Call dump_class_hierarchy, if requested. - (dfs_get_primary_binfo): Use BINFO_TYPE for binfos. - (dump_class_hierarchy_r): Add stream parameter. Emit more information. - (dump_class_hierarchy): Add file parameter. Append to file, if - required. - (finish_vtbls): Adjust accumulate_vtbl_inits call. - Use canonical base for virtual bases. - (build_vtt): Add more comments. Adjust build_vtt_inits call. - (build_vtt_inits): Remove VIRTUAL_VTTS_P parm. - Only set BINFO_VPTR_INDEX on top level. Use VTT_TOP_LEVEL_P, - VTT_MARKED_BINFO_P for binfo walking. Use canonical vbase for - virtual VTTs. - (dfs_build_secondary_vptr_vtt_inits): Extract VTT_TOP_LEVEL_P - from DATA. We want virtual primary bases and all bases via virtual. - Only set BINFO_VPTR_INDEX for top level. Look up from a primary - virtual base when not a construction vtable. - (dfs_ctor_vtable_bases_queue_p): New DFS predicate. - (build_ctor_vtbl_group): Adjust accumulate_vtbl_inits call. - Use canonical bases when processing virtual bases. - (accumulate_vtbl_inits): We're interested in any base via a - virtual path. - (dfs_accumulate_vtbl_inits): If this is a primary virtual base - within a construction vtable, determine what is being overridden. - (build_vtbl_initializer): Add more comments - (add_vcall_offset_vtbl_entries_1): Adjust comment. - (build_rtti_vtbl_entries): Check if the base has lost its - primary. - - 2001-02-05 Mark Mitchell - - * Makefile.in (g++spec.o): Adjust use of DRIVER_DEFINES. - - Sun Feb 4 15:52:44 2001 Richard Kenner - - * decl.c (pushdecl): Call abort instead of fatal. - * except.c (decl_is_java_type): Call fatal_error instead of fatal. - * init.c (build_new_1): Likewise. - (build_java_class_ref): Call internal_error and fatal_error, not fatal. - * decl.c (build_typename_type): hash_table_init now returns void. - decl.c (init_decl_processing): Make an error non-fatal. - - 2001-02-04 Mark Mitchell - - * cp-tree.h (CLASSTYPE_INTERFACE_UNKNOWN): Fix formatting. - Document. - (CLASSTYPE_INTERFACE_KNOWN): Likewise. - (SET_CLASSTYPE_INTERFACE_UNKNOWN_X): Likewise. - (SET_CLASSTYPE_INTERFACE_UNKNOWN): Likewise. - (SET_CLASSTYPE_INTERFACE_KNOWN): Likewise. - * decl.c (maybe_commonize_var): Use the new name-mangling where - appropriate. - * decl2.c (comdat_linkage): Enhance comments. Make all - compiler-generated things static, if COMDAT is not available. - (get_tinfo_decl): Do not make typeinfo objects that belong in the - library COMDAT. - (tinfo_base_init): Use the correct mangled name for typeinfo - strings, and push them into the global scope. - (typeinfo_in_lib_p): New function. - (synthesize_tinfo_var): Use it. - (create_real_tinfo_var): Likewise. - - 2001-02-03 Jakub Jelinek - - * decl.c (push_class_binding): Use context_for_name_lookup instead - of CP_DECL_CONTEXT. - * search.c (context_for_name_lookup): Remove static. Check for NULL - context in the loop. - * cp-tree.h (context_for_name_lookup): Add prototype. - - 2001-02-02 Jakub Jelinek - - * cp-tree.h (build_expr_ptr_wrapper, can_free): Remove. - * tree.c (build_expr_ptr_wrapper, can_free, permanent_obstack): - Remove. - * call.c (convert_class_to_reference, build_user_type_conversion_1, - add_warning): Change build_expr_ptr_wrapper to build_ptr_wrapper. - - 2001-02-02 Mark Mitchell - - * Make-lang.in (g++spec.o): Add DRIVER_DEFINES to the list - of macros used when compiling g++spec.c. - * g++spec.c (lang_specific_driver): Link with the shared - libgcc by default. - - 2001-01-29 Joseph S. Myers - - * decl2.c (build_expr_from_tree), lex.c (make_pointer_declarator, - make_reference_declarator, make_call_declarator), method.c - (implicitly_declare_fn), parse.y (namespace_using_decl, - notype_unqualified_id, expr_or_declarator, new_type_id, - after_type_declarator, direct_after_type_declarator, - notype_declarator, complex_notype_declarator, - complex_direct_notype_declarator, qualified_id, - notype_qualified_id, overqualified_id, direct_new_declarator, - absdcl, direct_abstract_declarator, conversion_declarator), pt.c - (tsubst), semantics.c (begin_constructor_declarator): Use build_nt - instead of build_parse_node. - - 2001-01-28 Kaveh R. Ghazi - - * cp-tree.h (cp_tree_index): Delete CPTI_MINUS_ONE. - (minus_one_node): Moved to top level gcc directory. Renamed - to integer_minus_one_node. - - * init.c (init_init_processing): Don't set minus_one_node. - (build_vec_init): Use integer_minus_one_node. - - * rtti.c (get_tinfo_decl_dynamic): Likewise. - - 2001-01-28 Jakub Jelinek - - * optimize.c (copy_body_r): If MODIFY_EXPR has both arguments - identical and they would be replaced with constant, remove - MODIFY_EXPR from the tree. - - 2001-01-27 Kaveh R. Ghazi - - * Make-lang.in: Remove all dependencies on defaults.h. - * call.c: Don't include defaults.h. - * decl.c: Likewise. - * decl2.c: Likewise. - * except.c: Likewise. - * pt.c: Likewise. - * rtti.c: Likewise. - * tree.c: Likewise. - * typeck.c: Likewise. - - 2001-01-25 Jakub Jelinek - - * mangle.c (write_mangled_name, write_encoding): Mangle overloaded - operators even in "C" linkage. - * method.c (set_mangled_name_for_decl): Likewise. - * decl.c (grokfndecl): Call set_mangled_name_for_decl even for - overloaded operators in "C" linkage. - - 2001-01-24 Nathan Sidwell - - * pt.c (tsubst_decl): Remove IN_DECL parameter. - (tsubst_arg_types): Check parameter is not void. - (tsubst): Adjust tsubst_decl call. - - 2001-01-24 Nathan Sidwell - - * call.c (add_builtin_candidate): Quote std properly, from - previous change. - - 2001-01-23 Kriang Lerdsuwanakij - - * pt.c (check_explicit_specialization): Clone constructors and - destructors. - - 2001-01-23 Nathan Sidwell - - * decl.c (grokdeclarator): Don't presume DECL_LANG_SPECIFIC - indicates anything special about template depth. Make sure we - only count the user visible template classes. - - 2001-01-23 Nathan Sidwell - - * call.c (build_conv): Typo in comment. - (add_builtin_candidate): Add more explanation. - Remove extra test for ENUMERAL_TYPE in {PRE,POST}INCREMENT_EXPR. - Allow ENUMERAL_TYPEs for relops and eqops. Add both candidates - when we have enumeral types. - (add_builtin_candidates): Add more explanation. Add ENUMERAL_TYPE - candidates for relops and eqops. - (joust): Simplify control flow. Allow a non-template user - function to hide a builtin. - - 2001-01-22 Nathan Sidwell - - * cp-tree.h (unification_kind_t): Add DEDUCE_ORDER. - (more_specialized): Add deduction parameter. - * call.c (joust): Adjust more_specialized call. - * pt.c (UNIFY_ALLOW_OUTER_MORE_CV_QUAL, - UNIFY_ALLOW_OUTER_LESS_CV_QUAL): New unify flags. - (get_bindings_order): Remove. - (get_bindings_real): Add DEDUCE parameter. - (maybe_adjust_types_for_deduction): Return extra unify flags. Do - REFERENCE_TYPE jig for DEDUCE_ORDER. - (type_unification_real): Deal with DEDUCE_ORDER. Use result of - maybe_adjust_types_for_deduction. - (more_specialized): Add DEDUCE parameter. Call get_bindings_real - directly. - (try_one_overload): Use result of maybe_adjust_types_for_deduction. - (check_cv_quals_for_unify): Use new unify qualifier flags. - (unify): Clear new unify qualifier flags. - (get_bindings_real): Add DEDUCE parameter. - (get_bindings): Adjust call to get_bindings_real. - (get_bindings_overload): Likewise. - (most_specialized_instantiation): Adjust call to - more_specialized. - - 2001-01-19 Jason Merrill - - * decl2.c (flag_vtable_thunks): Also depend on ENABLE_NEW_GXX_ABI. - - * decl.c (init_decl_processing): Just force -fvtable-thunks on if - -fnew-abi. - - 2001-01-19 Ute Pelkmann - - * decl2.c (arg_assoc_class): Fix double iteration logic. - - 2001-01-19 Jason Merrill - - * init.c (build_delete): Always call convert_force to strip cv-quals. - - * decl2.c (flag_new_abi): Depend on ENABLE_NEW_GXX_ABI. - * lang-specs.h: Default ABI depends on ENABLE_NEW_GXX_ABI. - * g++spec.c: Don't look at ENABLE_NEW_GXX_ABI. - - 2001-01-19 Nathan Sidwell - - * search.c (get_vbase_1): Count only virtual bases. - - 2001-01-19 Nathan Sidwell - - * class.c (duplicate_tag_error): Robustify flag clearing. - - 2001-01-19 Nathan Sidwell - - * cp-tree.h (lookup_template_class): Add complain parm. - * decl.c (lookup_namespace_name): Adjust call to - lookup_template_class. - (make_typename_type): Likewise. - * semantics.c (finish_template_type): Likewise. - * pt.c (lookup_template_class): Add complain parm. Adjust. - (tsubst_aggr_type): Pass COMPLAIN down to lookup_template_class. - (tsubst): Likewise. - - 2001-01-19 Nathan Sidwell - - * pt.c (copy_default_args_to_explicit_spec): Preserve - object's CV quals. Reorganize. - - 2001-01-18 Nathan Sidwell - - * typeck.c (build_modify_expr): Say `initialization' for - INIT_EXPRs. - * init.c (build_default_init): Convert to enumeral type, if - needed. - - 2001-01-18 Jakub Jelinek - - * parse.y (nomods_initdcl0): Properly set things up for - initdcl0_innards. - - 2001-01-18 Nathan Sidwell - - * pt.c (UNIFY_ALLOW_OUTER_LEVEL): New unify flag. - (type_unification_real): Set it. - (unify): Use it. - - 2001-01-18 Nathan Sidwell - - * decl.c (finish_destructor_body): Convert to vbase pointer here. - - 2001-01-18 Nathan Sidwell - - * semantics.c (begin_class_definition): Check we're not inside a - template parm list. - - 2001-01-18 Nathan Sidwell - - * tree.c (walk_tree, TREE_LIST): Don't walk the TREE_PURPOSE of - BASELINK_P. - - 2001-01-16 Kriang Lerdsuwanakij - - * typeck.c (build_function_call_real): Call fold on the CALL_EXPR. - * call.c (build_over_call): Add comment. - - 2001-01-16 Daniel Berlin - - * cvt.c (ocp_convert): Handle vector type conversion - * typeck2.c (digest_init): Handle vector type initializations - - 2001-01-16 Phil Edwards - - * g++spec.c: Don't add libraries needlessly if -fsyntax-only - was given. - - 2001-01-15 Nathan Sidwell - - * pt.c (check_nontype_parm): Rename to ... - (invalid_nontype_parm_type_p): ... here. - (process_template_parm): Adjust. - (convert_template_argument): Adjust. - - 2001-01-15 Nathan Sidwell - - * pt.c (check_nontype_parm): New function. - (process_template_parm): Use it. - (convert_template_argument): Use it. - (convert_nontype_argument, RECORD_TYPE): Assert it's a ptr to - member. - - 2001-01-14 Jeffrey Oldham - - * tree.c: Add defaults.h - (cp_valid_lang_attribute): Incorporate SUPPORTS_INIT_PRIORITY. - * Make-lang.in (cp/tree.o): Add defaults.h. - - 2001-01-13 Joseph S. Myers - - * Make-lang.in (CXX_C_OBJS): Add c-format.o. - - 2001-01-13 Joseph S. Myers - - * g++.1: Change to be ".so man1/gcc.1". - - 2001-01-13 Joseph S. Myers - - * Make-lang.in (c++.info, c++.install-info): Build and install g++ - internals info. - (c++.uninstall, c++.maintainer-clean): Remove g++ internals info. - ($(srcdir)/cp/g++int.info): New target. - * gxxint.texi: Add info directory entry. Use @@ in email address. - * .cvsignore: Update. - - 2001-01-12 Nathan Sidwell - - * typeck.c (build_c_cast): Do template processing earlier. - Always pedwarn on array casts. - - 2001-01-12 Nathan Sidwell - - * friend.c (make_friend_class): Make sure a templated class is - actually a template. - - 2001-01-11 Nathan Sidwell - - * decl2.c (get_guard): Set linkage from guarded decl. - - 2001-01-11 Nathan Sidwell - - * call.c (convert_default_arg): Check for unprocessed - DEFAULT_ARG. - * cp-tree.h (replace_defarg): Move to spew.c. - (maybe_snarf_defarg, add_defarg_fn, do_pending_defargs): Move to - spew.c, which is where they really are. - (done_pending_defargs): Declare. - (unprocessed_defarg_fn): Declare. - * decl.c (replace_defarg): Move to spew.c - * parse.y (structsp): Call done_pending_defargs. - * spew.c (defarg_fns): Rearrange list structure. - (defarg_fnsdone): New static variable. - (defarg_depfns): New static variable. - (init_spew): Adjust. - (add_defarg_fn): Store the type in TREE_TYPE. - (do_pending_defargs): Detect and deal with ordering constraints - and circularity. - (done_pending_defargs): New function. - (unprocessed_defarg_fn): New function. - (replace_defarg): Moved from decl.c. Robustify. Don't save - if circularity detected. - - 2001-01-11 Nathan Sidwell - - * pt.c (unify): Check array has a domain, before checking - whether it is variable sized. - - 2001-01-11 Nathan Sidwell - - * decl.c (grokparms): Unobfuscate and get correct diagnostic for - parameters with pointers to arrays of unknown bound. - - 2001-01-11 Nathan Sidwell - - * parse.y (template_parm_header, template_spec_header): New - reductions. Split out from ... - (template_header): ... here. Use them. - (template_template_parm): Use template_parm_header. - * semantics.c (finish_template_template_parm): Add assert. - - 2001-01-10 Mark Mitchell - - * mangle.c (write_builtin_type): Fix thinko. - - * pt.c (copy_default_args_to_explicit_spec_1): New function. - (copy_default_args_to_explicit_spec): Likewise. - (check_explicit_specialization): Use it. - - * class.c (finish_struct_1): Remove last argument in call to - make_decl_rtl; use make_function_rtl instead of make_decl_rtl. - * decl.c (builtin_function): Likewise. - (build_cp_library_fn): Likewise. - (check_initializer): Likewise. - (make_rtl_for_nonlocal_decl): Likewise. - (cp_finish_decl): Likewise. - (start_function): Likewise. - * decl2.c (finish_anon_union): Likewise. - * friend.c (do_friend): Likewise. - * init.c (build_java_class_ref): Likewise. - * method.c (make_thunk): Likewise. - * pt.c (tsubst_friend_function): Likewise. - * semantics.c (expand_body): Likewise. - - 2001-01-10 Mark Mitchell - - * cp-tree.h (DECL_CLONED_FUNCTION_P): Avoid wild reads by not - looking at DECL_CLONED_FUNCTION for non-functions. - - 2001-01-10 Nathan Sidwell - - * error.c (dump_template_parameter): Use parm to determine how - to print default value. - - 2001-01-10 Nathan Sidwell - - * class.c (duplicate_tag_error): Clear more flags. - - 2001-01-10 Nathan Sidwell - - * call.c (build_new_method_call): Use binfo_for_vbase. - - 2001-01-10 Joseph S. Myers - - * cp-tree.h (flag_cond_mismatch): Don't declare. - * decl2.c (flag_cond_mismatch): Don't define. - (lang_f_options): Remove cond-mismatch. - (unsupported_options): Add cond-mismatch. - - 2001-01-09 Nathan Sidwell - - * class.c (handle_using_decl): Reject using of constructor name - of sourcing class. Allow injecting of a method with same name as - nested class. Fixup error messages. - - 2001-01-09 Joseph S. Myers - - * decl2.c (lang_decode_option): Handle -Wformat=2. - - 2001-01-08 Nathan Sidwell - - * cp-tree.h (lang_decl_flags): Rename defined_in_class to - initialized_in_class. - (DECL_DEFINED_IN_CLASS_P): Rename to ... - (DECL_INITIALIZED_IN_CLASS_P): ... here, to reflect true meaning. - * decl.c (duplicate_decls): Preseve DECL_INITIALIZED_IN_CLASS_P. - (cp_finish_decl): Adjust for DECL_INITIALIZED_IN_CLASS_P. - * pt.c (check_default_tmpl_args): Adjust for - DECL_INITIALIZED_IN_CLASS_P. - (instantiate_class_template): Likewise. - (instantiate_decl): Check DECL_INITIALIZED_IN_CLASS_P. - - * class.c (finish_struct): Constify saved_filename. - - 2001-01-08 Nathan Sidwell - - * class.c (duplicate_tag_error): Adjust diagnostic. - (finish_struct): Locally set location to start of struct. - * decl.c (fixup_anonymous_aggr): Use cp_error_at. - - 2001-01-08 Nathan Sidwell - - * decl.c (struct binding_level): Adjust class_shadowed comments - to reflect reality. - (push_class_level_binding): Adjust comments to reflect reality. - Set IDENTIFIER_CLASS_VALUE when replacing an existing binding. - Don't set TREE_VALUE on the class_shadowed list. - - 2001-01-07 Alexandre Petit-Bianco - - * decl2.c (acceptable_java_type): Allow references too. - * init.c (build_java_class_ref): When using the new ABI, search - `class$' and have it mangled with `mangle_decl.' - * mangle.c (write_java_integer_type_codes): New function. - (write_builtin_type): Detect and mangle Java integer and real - types. - - 2001-01-07 Mark Mitchell - - * decl2.c (grokfield): Don't accept `asm' specifiers for - non-static data members. - - 2001-01-07 Kaveh R. Ghazi - - * expr.c (cplus_expand_expr): Don't reset `target'. - - 2001-01-07 Neil Booth - - * cp/decl2.c (cxx_post_options): Call cpp_post_options. - - 2001-01-05 Nathan Sidwell - - * parse.y (template_datadef): Check for error_mark_node. - - 2001-01-05 Nathan Sidwell - - * cp-tree.def (DEFAULT_ARG): Make `x' class. - - 2001-01-04 Joseph S. Myers - - * decl.c (SIZE_TYPE, PTRDIFF_TYPE, WCHAR_TYPE): Don't define. - (record_builtin_type): Make non-static. - (flag_short_double): Don't declare. - (init_decl_processing): Remove the creation of many tree nodes now - in c_common_nodes_and_builtins. - (build_void_list_node): New function. - * decl2.c (flag_short_double, flag_short_wchar): Don't define. - * cp-tree.h (flag_short_wchar): Don't declare. - - 2001-01-04 Mark Mitchell - - * call.c (build_conv): Don't use build1 for USER_CONV. - * pt.c (tsubst_copy): Or for PREINCREMENT_EXPR and similar nodes. - - 2001-01-03 Joseph S. Myers - - * lex.c (lang_init): Call c_common_lang_init. - - 2001-01-03 Nathan Sidwell - - * search.c (lookup_fnfields_here): Remove. - (look_for_overrides_r): Use lookup_fnfields_1. - Ignore functions from using declarations. - - 2001-01-03 Nathan Sidwell - - Implement exceptions specifiers for implicit member functions. - * cp-tree.h (merge_exceptions_specifiers): Declare new function. - * method.c (synthesize_exception_spec): New function. - (locate_dtor, locate_ctor, locate_copy): New functions. - (implicitly_declare_fn): Generate the exception spec too. - * search.c (check_final_overrider): Check artificial functions - too. - * typeck2.c (merge_exception_specifiers): New function. - - 2001-01-03 Jason Merrill - - * init.c (build_default_init): New fn. - (perform_member_init): Split out from here. - (build_new_1): Use it. Simplify initialization logic. - (build_vec_init): Take an array, rather than a pointer and maxindex. - Speed up simple initializations. Don't clean up if we're assigning. - * cp-tree.h: Adjust. - * decl2.c (do_static_initialization): Remove TREE_VEC case. - * parse.y (new_initializer): Return void_zero_node for (). - * typeck.c (build_modify_expr): Handle getting a CONSTRUCTOR. - * typeck2.c (digest_init): Only complain about user-written - CONSTRUCTORs. - - 2000-12-22 Mike Stump - - * decl2.c: (max_tinst_depth): Increase to 50. - - 2001-01-02 Mark Mitchell - - * class.c (invalidate_class_lookup_cache): Zero the - previous_class_values. - * cp-tree.h (TMPL_PARMS_DEPTH): Use TREE_INT_CST_LOW, not - TREE_INT_CST_HIGH. - (CLASSTYPE_TEMPLATE_LEVEL): Likewise. - * decl.c (free_bindings): New variable. - (push_binding): Don't create a new binding if we have one on the - free list. - (pop_binding): Put old bindings on the free list. - (init_decl_processing): Use size_int, not build_int_2. - Register free_bindings as a GC root. - (cp_make_fname_decl): Use size_int, not build_int_2. - (push_inline_template_parms_recursive): Likewise. - (end_template_parm_list): Likewise. - (for_each_template_parm): Do not use walk_tree_without_duplicates. - (tsubst_template_parms): Use size_int, not build_int_2. - (tsubst): Likewise. - * rtti.c (get_vmi_pseudo_type_info): Likewise. - - 2001-01-02 Richard Henderson - - * parse.y (asm): Set ASM_INPUT_P. - - 2001-01-02 Jason Merrill - - * tree.c (cp_valid_lang_attribute): Don't set CLASSTYPE_COM_INTERFACE - for v3 ABI. - - * typeck.c (cp_truthvalue_conversion): New fn. - * cvt.c (ocp_convert): Use it. - - * cp-tree.h: Lose c-common.c decls. - - * typeck.c (build_unary_op): Restore old &a.f diagnostic code. - * cvt.c (convert_to_void): Use type_unknown_p. - - * typeck.c (strip_all_pointer_quals): Also strip quals from - pointer-to-member types. - - * Make-lang.in (cp/TAGS): Use --no-globals. Ignore parse.c, and treat - parse.y as C. - - * call.c (build_new_method_call): Do evaluate the object parameter - when accessing a static member. - * typeck.c (build_component_ref): Likewise. - - 2001-01-02 Andreas Jaeger - - * decl.c (cp_missing_noreturn_ok_p): New. - (init_decl_processing): Set lang_missing_noreturn_ok_p. - - 2000-12-29 Jakub Jelinek - - * decl.c (init_decl_processing): Fix sign of wchar_type_node. - - 2000-12-29 Mark Mitchell - - * class.c (pushclass): Remove #if 0'd code. - * cp-tree.h (overload_template_name): Remove. - * decl.c (store_bindings): Simplify. - (pop_from_top_level): Likewise. - * pt.c (overload_template_name): Remove. - (instantiate_decl): Don't call push_to_top_level if it's not - needed. - - 2000-12-28 Mark Mitchell - - * pt.c (register_local_specialization): Don't return a value. - (lookup_template_class): Use move-to-front heuristic when looking - up template instantiations. - (instantiate_decl): Only push_to_top_level when we're actually - going to instantiate the template. - - 2000-12-29 Hans-Peter Nilsson - - * search.c (binfo_for_vtable): Return least derived class, not - most. Handle secondary vtables. - - 2000-12-22 Jason Merrill - - * pt.c (more_specialized): Don't optimize len==0. - (fn_type_unification): If we're adding the return type, increase len. - - * typeck.c (build_binary_op): Fix pmf comparison logic. - - * call.c (joust): Use DECL_NONSTATIC_MEMBER_FUNCTION_P, not - DECL_STATIC_FUNCTION_P. - - * semantics.c (genrtl_finish_function): Don't try to jump to - return_label unless it exists. - - In partial ordering for a call, ignore parms for which we don't have - a real argument. - * call.c (joust): Pass len to more_specialized. - (add_template_candidate_real): Strip 'this', pass len. - * pt.c (more_specialized): Pass len down. Lose explicit_args parm. - (get_bindings_order): New fn. Pass len down. - (get_bindings_real): Strip 'this', pass len. - (fn_type_unification): Likewise. - (type_unification_real): Succeed after checking 'len' args. - (most_specialized_instantiation): Lose explicit_args parm. - * class.c (resolve_address_of_overloaded_function): Strip 'this', - pass len. - - 2000-12-21 Jason Merrill - - * pt.c (tsubst_decl): A FUNCTION_DECL has DECL_RESULT, not - DECL_TEMPLATE_RESULT. - - * search.c (lookup_field_r): Call lookup_fnfields_1, not - lookup_fnfields_here. - - * parse.y (typename_sub2): Return the TYPE_DECL, not the type. - - * call.c (build_object_call): Also allow conversions that return - reference to pointer to function. - (add_conv_candidate): Handle totype being ref to ptr to fn. - (build_field_call): Also allow members of type reference to function. - Lose support for calling pointer to METHOD_TYPE fields. - - * error.c (dump_expr): Handle *_CAST_EXPR. - - * typeck2.c (build_scoped_ref): Always convert to the naming class. - - * tree.c (break_out_cleanups): Lose. - * cp-tree.h: Remove prototype. - * typeck.c (build_component_ref): Don't break_out_cleanups. - (build_compound_expr): Likewise. - * semantics.c (finish_expr_stmt): Likewise. - - 2000-12-20 Richard Henderson - - * cp-tree.h: Update declarations. - * decl.c (finish_case_label): Return the new stmt node. - * semantics.c (finish_goto_stmt): Likewise. - (finish_expr_stmt, finish_return_stmt): Likewise. - (finish_break_stmt, finish_continue_stmt): Likewise. - (finish_asm_stmt): Likewise. - * parse.y (already_scoped_stmt): Set STMT_LINENO. - (compstmt, implicitly_scoped_stmt, stmt): Likewise. - (simple_if, simple_stmt): Return the new stmt node. - (save_lineno): New. - - 2000-12-18 Joseph S. Myers - - * cp-tree.h: Don't declare warn_long_long. - - 2000-12-15 Kriang Lerdsuwanakij - - * tree.c (no_linkage_helper): Use CLASS_TYPE_P instead of - IS_AGGR_TYPE. - - 2000-12-15 Kriang Lerdsuwanakij - - * pt.c (unify): Handle when both ARG and PARM are - BOUND_TEMPLATE_TEMPLATE_PARM. - - 2000-12-15 Kriang Lerdsuwanakij - - * pt.c (reduce_template_parm_level): Set DECL_ARTIFICIAL and - DECL_TEMPLATE_PARM_P. - - 2000-12-15 Jason Merrill - - * init.c (build_new_1): Reorganize. Now with 100% fewer SAVE_EXPRs! - - * init.c (build_new_1): Don't strip quals from type. - - * decl.c (pushdecl): Don't check for linkage on a non-decl. - - * call.c (build_op_delete_call): See through ARRAY_TYPEs. - - * call.c (build_new_function_call): Lose space before paren in - error message. - (build_new_method_call): Likewise. - - * typeck2.c (build_m_component_ref): Propagate quals from datum. - - 2000-12-14 Kriang Lerdsuwanakij - - * pt.c (check_explicit_specialization): Propagate default - function arguments to explicit specializations. - - 2000-12-13 DJ Delorie - - * typeck.c (build_binary_op): Do signed/unsigned warnings for >? - and - - * error.c (dump_function_name): Don't let the user see __comp_ctor. - - Clean up copy-initialization in overloading code. - * call.c (build_user_type_conversion_1): Die if we are asked to - convert to the same or a base type. - (implicit_conversion): Avoid doing so. Lose reference binding code. - (convert_like_real): Treat BASE_CONV and RVALUE_CONV as implicit - direct-initialization. Also do direct-init part of copy-init. - (build_user_type_conversion): Don't provide context to convert_like. - * cvt.c (ocp_convert): build_user_type_conversion will now provide - the constructor call for copy-init. - - * pt.c (tsubst_decl): Call clone_function_decl here if this is an - instantiation of a member template. - (do_decl_instantiation): Not here. - - 2000-12-07 Nathan Sidwell - - * class.c (check_field_decls): Don't special case anonymous - fields in error messages. - (note_name_declared_in_class): Use %D on diagnostic. - - * tree.c (pod_type_p): Use strip_array_types. - (cp_valid_lang_attribute): Likewise. - * typeck.c (cp_type_quals): Strip arrays separately, to avoid - multiple evaluations. - (cp_has_mutable_p): Use strip_array_types. - - 2000-12-07 Nathan Sidwell - - * cp-tree.h (sufficient_parms_p): Declare new function. - * call.c (sufficient_parms_p): New function, broken out of ... - (add_function_candidate): ... here. Use it. - (add_conv_candidate): Use it. - * decl.c (grok_ctor_properties): Use it. - - 2000-12-07 Jakub Jelinek - - * optimize.c (copy_body_r): Set STMT_IS_FULL_EXPR_P on EXPR_STMT. - - 2000-12-07 Joseph S. Myers - - * decl2.c (lang_decode_option): Handle -Wformat-security. - - 2000-12-06 Kriang Lerdsuwanakij - - * pt.c (verify_class_unification): New function. - (get_class_bindings): Use it. - (try_class_unification): Tidy. - (unify): Handle when argument of a template-id is not - template parameter dependent. - (template_args_equal): Handle when TREE_CODE's do not match. - - 2000-12-06 Alexandre Oliva - - * lang-specs.h (c++): When invoking the stand-alone preprocessor - for -save-temps, pass all relevant -Defines to it, and then don't - pass them to cc1plus. - - 2000-12-05 Will Cohen - - * decl.c (finish_case_label): Cleared - more_cleanups_ok in surrounding function scopes. - (define_label): Likewise. - - 2000-12-05 Nathan Sidwell - - * cp-tree.h (IDENTIFIER_VIRTUAL_P): Document. - (get_matching_virtual): Remove. - (look_for_overrides): Declare new function. - * decl.c (grokfndecl): Don't set IDENTIFIER_VIRTUAL_P or - DECL_VINDEX here. - * class.c (check_for_override): Move base class iteration code - to look_for_overrides. - * search.c (next_baselink): Remove. - (get_virtuals_named_this): Remove. - (get_virtual_destructor): Remove. - (tree_has_any_destructors_p): Remove. - (struct gvnt_info): Remove. - (check_final_overrider): Remove `virtual' from error messages. - (get_matching_virtuals): Remove. Move functionality to ... - (look_for_overrides): ... here, and ... - (look_for_overrides_r): ... here. Set DECL_VIRTUAL_P, if found - to be overriding. - - 2000-12-05 Nathan Sidwell - - * typeck.c (get_delta_difference): If via a virtual base, - return zero. - * cvt.c (cp_convert_to_pointer): If via a virtual base, do no - adjustment. - - 2000-12-04 Richard Henderson - - * error.c (dump_tree): Use output_add_string not OB_PUTS. - - 2000-12-04 Jason Merrill - - * mangle.c (write_type): Mangle VECTOR_TYPE with "U8__vector". - (write_builtin_type): Pass intSI_type_node and the like through - type_for_mode. - * method.c (process_overload_item): Mangle VECTOR_TYPEs with 'o'. - Pass intSI_type_node and the like through type_for_mode. - * decl2.c (arg_assoc_type): Handle VECTOR_TYPE like COMPLEX_TYPE. - * pt.c (tsubst, unify): Likewise. - * tree.c (walk_tree): Likewise. - * error.c (dump_type): Likewise. - (dump_type_prefix, dump_type_suffix): Don't bother with VECTOR_TYPE. - - * Make-lang.in: Tweak top comment for emacs. - (cp/TAGS): Restore. - - * except.c (expand_throw): Use push_throw_library_fn for _Jv_Throw. - - * class.c (clone_function_decl): Robustify. - - 2000-12-04 Michael Matz - - * decl.c (store_bindings): Only search in the non modified - old_bindings for duplicates. - - 2000-12-04 Nathan Sidwell - - * error.c (dump_function_decl): Use DECL_VIRTUAL_P, not - TYPE_POLYMORPHIC_P. - - * typeck.c (build_static_cast): Remove unused variable. - - 2000-12-01 Kriang Lerdsuwanakij - - * pt.c: Fix typo in comment. - - 2000-12-01 Joseph S. Myers - - * decl2.c (warn_format): Remove definition. - (lang_decode_option): Handle -Wformat-nonliteral, - -Wno-format-extra-args and -Wno-format-y2k. Use set_Wformat. - - 2000-12-01 Joseph S. Myers - - * decl.c (WINT_TYPE, INTMAX_TYPE, UINTMAX_TYPE): Don't define. - (init_decl_processing): Don't create string_type_node, - const_string_type_node, wint_type_node, intmax_type_node, - uintmax_type_node, default_function_type, ptrdiff_type_node and - unsigned_ptrdiff_type_node. Adjust position of call to - c_common_nodes_and_builtins. - (identifier_global_value): New function. - - 2000-12-01 Nathan Sidwell - - * call.c (standard_conversion): Reject pointer to member - conversions from ambiguous, inaccessible or virtual bases. - * typeck.c (build_static_cast): Don't check pointers to members - specially. - - 2000-11-30 Nathan Sidwell - - * method.c (do_build_copy_constructor): Preserve cv - qualifications when accessing source object members. - (do_build_assign_ref): Likewise. Remove separate diagnostics for - unnamed fields. - - 2000-11-30 Nathan Sidwell - - * method.c (do_build_assign_ref): Construct appropriately - CV-qualified base reference. Don't allow const casts in base - conversion. - - 2000-11-30 Nathan Sidwell - - * call.c (build_over_call): Use VOID_TYPE_P. Don't die on - incomplete return type. - - 2000-11-28 Nathan Sidwell - - * parse.y (base_class.1): Produce a _TYPE not a _DECL. - * semantics.c (finish_base_specifier): Accept a _TYPE not a - _DECL. - - 2000-11-28 Nathan Sidwell - - * spew.c (yyerror): Cope if yylval.ttype is NULL. - - 2000-11-28 Nathan Sidwell - - * decl.c (grokdeclarator): Diagnose undefined template contexts. - - 2000-11-28 Nathan Sidwell - - * decl.c (grokdeclarator): Do type access control on friend - class. - - 2000-11-27 Nathan Sidwell - - * decl.c (grokfndecl): Undo COMPONENT_REF damage caused by - bison parser ickiness. - * pt.c (tsubst_friend_function): Enter namespace scope when - tsubsting the function name. - * cp-tree.h (DECL_TI_TEMPLATE): Update comment to reflect reality. - - 2000-11-27 Nathan Sidwell - - * cp-tree.h (binfo_from_vbase): Return the virtual base's binfo. - * cvt.c (cp_convert_to_pointer): Add force parameter. - Allow conversions via virtual base if forced. - (convert_to_pointer_force): Adjust call to cp_convert_to_pointer. - (ocp_convert): Likewise. - * search.c (binfo_from_vbase): Return the virtual base's binfo. - * typeck.c (get_delta_difference): Adjust handling of virtual - bases. - - 2000-11-26 Mark Mitchell - - * tree.c (struct list_hash): Remove. - (list_hash_table): Make it be an htab. - (struct list_proxy): New type. - (list_hash_eq): New function. - (list_hash_pieces): Renamed from ... - (list_hash): ... this. - (list_hash_lookup): Remove. - (list_hash_add): Remove. - (hash_tree_cons): Use the generic hashtable. - (mark_list_hash): Remove. - (init_tree): Create the hashtable. - - 2000-11-25 Joseph S. Myers - - * method.c (build_mangled_C9x_name): Rename to - build_mangled_C99_name. Change C9X references in comments to - refer to C99. - - 2000-11-24 Nathan Sidwell - - * parse.y (unary_expr): Move VA_ARG from here ... - (primary): ... to here. - - 2000-11-24 Nathan Sidwell - - * semantics.c (finish_id_expr): If type is error_mark, return - error_mark. - - 2000-11-23 Nathan Sidwell - - * pt.c (lookup_template_class): Simplify loop exit constructs. - Cope when there is no partial instantiation of a template - template member. - - Thu Nov 23 02:16:47 2000 J"orn Rennecke - - * Make-lang.in (g++spec.o, cxxmain.o): Depend on $(CONFIG_H). - - 2000-11-22 Mark Mitchell - - * mangle.c (mangle_conv_op_name_for_type): Don't use `__op' - prefix. - - * pt.c (do_decl_instantiate): Explicitly clone constructors and - destructors that haven't already been cloned. - - 2000-11-20 Richard Henderson - - * parse.y (yyparse_1): Rename the parser entry point. - - 2000-11-20 Alex Samuel - - * mangle.c (write_name): Use for names directly in - function scope. - (write_unscoped_name): Accept names directly in function scope. - - 2000-11-20 Nathan Sidwell - - * lex.c (rid_to_yy, RID_EXPORT): Make unique keyword. - * parse.y (extdef): Add EXPORT reduction. - * spew.c (yylex): Don't skip export here. - - 2000-11-19 Mark Mitchell - - * decl.c (init_decl_processing): Correct name of pure virtual - function under the new ABI. - * rtti.c (throw_bad_cast): Likewise, for bad cast function. - (throw_bad_typeid): Likewise for bad typeid function. - - 2000-11-18 Mark Mitchell - - * decl.c (grokparms): Don't even function types of `void' type, - either. - * mangle.c (write_type): Don't crash when confronted with the - error_mark_node. - - * decl.c (grokparms): Don't create parameters of `void' type. - - 2000-11-17 Zack Weinberg - - * lex.c (mark_impl_file_chain): Delete. - (init_parse): Remove call to ggc_add_string_root. No need to - ggc_strdup a string constant. Do not add impl_file_chain to GC - roots. - (handle_pragma_implementation): No need to ggc_strdup main_filename. - - 2000-11-17 Nathan Sidwell - - * pt.c (tsubst_expr, DECL_STMT): Instantiate decl's type. - - 2000-11-17 Nathan Sidwell - - * cp-tree.h (PARMLIST_ELLIPSIS_P): New macro. - * decl.c (grokdeclarator): Don't reject void parms here. - (require_complete_types_for_parms): Simplify, use - complete_type_or_else. - (grokparms): Remove bitrot. Remove funcdef parm. - Deal with ellipsis parm lists here. - * semantics.c (finish_parmlist): Don't append void_list_node - here. Set PARMLIST_ELLIPSIS_P. - - 2000-11-17 Nathan Sidwell - - * typeck2.c (incomplete_type_error): Reorganize to avoid - excessive diagnostics. - - 2000-11-16 Zack Weinberg - - * lex.c (struct impl_files, internal_filename): Constify a char *. - - 2000-11-16 Mark Mitchell - - * mangle.c (write_special_name_constructor): Don't generate - assembler junk when confronted with an old-style constructor. - (write_special_name_destructor): Likewise. - (mangle_decl_string): Do it here instead. - - 2000-11-16 Nathan Sidwell - - * call.c (op_error): Make error messages clearer. - - 2000-11-15 Mark Mitchell - - * decl.c (wrapup_globals_for_namespace): Don't mark things - TREE_ASM_WRITTEN when they're not. - - 2000-11-15 Jason Merrill - - * typeck2.c (friendly_abort): Uncount the error before handing - off to fancy_abort. - - 2000-11-15 Nathan Sidwell - - * typeck.c (lookup_anon_field): Cope with qv qualifiers. - - 2000-11-14 Mark Mitchell - - * class.c (build_vtbl_initializer): Fix typo in comment. - * typeck.c (expr_sizeof): Don't crash on errors. - - 2000-11-14 Jim Wilson - - * lang-specs.h: Add %2 after %(cc1_options). - - 2000-11-14 Richard Henderson - - * typeck.c (c_sizeof): Be strict about casting result value - back to c_size_type_node. - (expr_sizeof, c_sizeof_nowarn, c_alignof): Likewise. - - 2000-11-13 Joseph S. Myers - - * typeck.c (build_unary_op): Use boolean_increment from - c-common.c, moving the relevant code there. - - 2000-11-11 Jason Merrill - - * typeck.c (mark_addressable): Don't call put_var_into_stack. - - * decl.c (maybe_commonize_var): Set DECL_UNINLINABLE for statics - in inlines. - - 2000-11-10 Kaveh R. Ghazi - - * decl.c (grokdeclarator, save_function_data): Use memcpy, not bcopy. - * lex.c (copy_lang_decl): Likewise. - - 2000-11-09 Mark Mitchell - - * dump.c (cp_dump_tree): Don't dump function bodies here. - - * Make-lang.in (CXX_C_OBJS): Add c-dump.o. - (dump.o): Update dependency list. - * cp-tree.h (DECL_MAYBE_TEMPLATE): Remove. - (flag_dump_translation_unit): Likewise. - (CP_TYPE_QUALS): Adjust definition. - (DECL_C_BIT_FIELD): Remove. - (SET_DECL_C_BIT_FIELD): Likewise. - (CLEAR_DECL_C_BIT_FIELD): Likewise. - (add_maybe_template): Likewise. - (strip_array_types): Likewise. - (dump_node_to_file): Likewise. - (cp_dump_tree): New function. - * decl.c (init_decl_processing): Set lang_dump_tree. - * decl2.c (flag_dump_translation_unit): Remove. - * dump.c: Move most of it to ../c-dump.c. - (cp_dump_tree): New function. - * pt.c (add_maybe_template): Remove. - * typeck.c (strip_array_types): Likewise. - - 2000-11-07 Eric Christopher - - * decl.c (init_decl_processing): Change definition of - __wchar_t to wchar_t. Remove artificial declaration of - wchar_t. - * lex.c: Change instances of __wchar_t to wchar_t. - - 2000-11-09 Nathan Sidwell - - * lex.c (do_identifier): Don't lookup_name for operators. - * parse.y (operator): Save looking_for_typename. - (unoperator): Restore it. - * spew.c (frob_opname): Use nth_token for lookahead. - - 2000-11-08 Nathan Sidwell - - * decl.c (grok_op_properties): Always use coerce_new_type and - coerce_delete_type. - * decl2.c (coerce_new_type): Use c_size_type_node. Preserve - exception specification. Tidy up. - (coerce_delete_type): Preserve exception specification. Tidy up. - - 2000-11-07 Joseph S. Myers - - * class.c (duplicate_tag_error, build_vtbl_initializer), decl.c - (push_binding_level), error.c (cp_tree_printer), pt.c - (process_partial_specialization, tsubst_template_arg_vector), - search.c (lookup_member): Use memset () instead of bzero (). - - 2000-11-07 Nathan Sidwell - - * decl.c (build_ptrmemfunc_type): Allow error_mark_node. - - 2000-11-05 Joseph S. Myers - - * Make-lang.in (c++.distdir): Remove. - - 2000-11-04 Mark Mitchell - - * decl2.c (do_nonmember_using_decl): Allow `extern "C"' - declarations from different namespaces to be combined. - - 2000-11-03 Zack Weinberg - - * decl.c: Include tm_p.h. - - 2000-11-03 Joseph S. Myers - - * tree.c (cp_tree_equal): Use memcmp () instead of bcmp (). - - 2000-11-02 Joseph S. Myers - - * dump.c (dequeue_and_dump), lex.c (interface_strcmp), method.c - (build_overload_value), repo.c (open_repo_file), xref.c - (open_xref_file): Use strchr () and strrchr () instead of index () - and rindex (). - - 2000-11-01 Bernd Schmidt - - * call.c (build_over_call): Call fold on the CALL_EXPR. - - 2000-11-01 Gabriel Dos Reis - - * error.c (dump_template_decl): Separate template hearders with - space not comma. - - 2000-10-31 Gabriel Dos Reis - - * error.c: Move TFF_ macros into cp-tree.h. Throughout, replace - TS_* flags with corresponding TFF_*. Adjust prototypes of - functions (which used to take a tree_string_flags) to take an int. - - * cp-tree.h (enum tree_string_flags): Remove - (TFF_PLAIN_IDENTIFIER, TFF_NAMESPACE_SCOPE, TFF_CLASS_SCOPE, - TFF_CHASE_NAMESPACE_ALIAS, TFF_CHASE_TYPEDEF, TFF_DECL_SPECIFIERS, - TFF_CLASS_KEY_OR_ENUM, TFF_RETURN_TYPE, - TFF_FUNCTION_DEFAULT_ARGUMENTS, TFF_EXCEPTION_SPECIFICATION, - TFF_TEMPLATE_HEADER, TFF_TEMPLATE_DEFAULT_ARGUMENTS, - TFF_TEMPLATE_NAME, TFF_EXPR_IN_PARENS, TFF_SCOPE): New macros. - (type_as_string, decl_as_string, expr_as_string, - context_as_string): Adjust prototype. - - * class.c (dump_class_hierarchy_r): Use TFF_PLAIN_IDENTIFIER - instead of TS_PLAIN. - - * pt.c (mangle_class_name_for_template): Use TFF_CHASE_TYPEDEF - instead of TF_CHASE_TYPEDEFS. Use TFF_PLAIN_IDENTIFIER instead of - plain `0'. - - 2000-10-30 Mark Mitchell - - * cp-tree.h (DECL_EXTERNAL_LINKAGE_P): New macro. - (linkage_kind): New enumeration. - (decl_linkage): New function. - * decl2.c (comdat_linkage): Extend comment. - * error.c (dump_function_decl): Print the arguments used to - instantiate a template, even when not printing the type of the - function. - * pt.c (convert_nontype_argument): Use DECL_EXTERNAL_LINKAGE_P, - not TREE_PUBLIC, to test for external linkage. - * tree.c (decl_linkage): New function. - - 2000-10-28 Mark Mitchell - - * pt.c (instantiate_decl): Always instantiate static data members - initialized in-class. - - 2000-10-27 Zack Weinberg - - * Make-lang.in: Move all build rules here from Makefile.in, - adapt to new context. Wrap all rules that change the current - directory in parentheses. Expunge all references to $(P). - When one command depends on another and they're run all at - once, use && to separate them, not ;. Add OUTPUT_OPTION to - all object-file generation rules. Delete obsolete variables. - - * Makefile.in: Delete. - * config-lang.in: Delete outputs= line. - - 2000-10-26 Gabriel Dos Reis - - * error.c (dump_function_decl): Print no space between - `ptr-operator' the `type-specifier' of the return type. - (dump_type_prefix): Make sure we put space at the appropriate - place. - - 2000-10-23 Jason Merrill - - * call.c (equal_functions): Also call decls_match for extern "C" fns. - - 2000-10-22 Jason Merrill - - * call.c (build_conditional_expr): Use ocp_convert to force - rvalue conversion. - - 2000-10-22 Mark Mitchell - - * call.c (standard_conversion): Use RVALUE_CONVs for all - expressions that satisfy lvalue_p, not just those that satisfy - real_lvalue_p. - - * optimize.c (copy_body_r): Don't treat CALL_EXPRs specially. - - * typeck.c (c_sizeof): Return an expression of `size_t' type, - not one with TYPE_IS_SIZETYPE set. - (dubious_conversion_warnings): Remove special-case code. - - 2000-10-21 Geoffrey Keating - - * decl2.c (arg_assoc_type): Handle VECTOR_TYPE. - * error.c (dump_type): Handle VECTOR_TYPE like POINTER_TYPE. - (dump_type_prefix): Print vector-of-int as 'int vector'. - (dump_type_suffix): Handle VECTOR_TYPE like POINTER_TYPE. - * tree.c (walk_tree): Handle VECTOR_TYPE. - - * decl.c (init_decl_processing): Call MD_INIT_BUILTINS. - - 2000-10-21 Jason Merrill - - * parse.y (operator): Set got_object from got_scope. - Set looking_for_typename. - * decl.c (lookup_name_real): Clear val after setting from_obj. - Reorganize diagnostic. - - 2000-10-20 Jason Merrill - - * tree.c (walk_tree): Don't walk into default args. - - * error.c (dump_expr): Use host_integerp. - - 2000-10-20 David Edelsohn - - * typeck2.c (abstract_virtuals_error): Use "because" instead of - "since" in error message. - - Fri Oct 20 13:54:59 2000 Richard Kenner - - * typeck.c (dubious_conversion_warning): Suppress if TYPE_IS_SIZETYPE. - - 2000-10-20 Jeffrey Oldham - - * decl.c (revert_static_member_fn): Fixed typo. - - 2000-10-19 Mark Mitchell - - * class.c (subobject_offset_fn): New type. - (dfs_record_base_offsets): Remove. - (record_base_offsets): Likewise. - (dfs_search_base_offsets): Likewise. - (record_subobject_offset): New function. - (check_subobject_offset): Likewise. - (walk_subobject_offsets): Likewise. - (record_subobject_offsets): Likewise. - (layout_conflict_p): Reimplement. - (layout_nonempty_base_or_field): Correct handling of type - conflicts during layout. - (layout_empty_base): Likewise. - (build_base_field): Adjust to handle new representation of empty - base offset table. - (build_base_fields): Likewise. - (layout_virtual_bases): Likewise. - (splay_tree_compare_integer_csts): New function. - (layout_class_type): Use a splay_tree, rather than a varray, to - represent the offsets of empty bases. - - * cp-tree.h (DECL_ANTICIPATED): Don't require a FUNCTION_DECL. - * decl.c (select_decl): Don't return declarations that are - DECL_ANTICIPATED. - - 2000-10-18 Mark Mitchell - - * cp-tree.h (cp_tree_index): Add CPTI_FAKE_STD. - (fake_std_node): New macro. - * decl.c (in_std): Rename to ... - (in_fake_std): ... this. - (flag_no_builtin): Remove. - (flag_no_nonansi_builtin): Likewise. - (walk_namespaces_r): Use fake_std_node. - (push_namespace): Use std_identifier. - (pop_namespace): Use in_fake_std. - (lookup_name_real): Use fake_std_node. - (init_decl_processing): When -fhonor-std, create the `std' - namespace. Don't create a dummy fake_std_node in that case. - Adjust call to c_common_nodes_and_builtins. Use std_identifier. - (builtin_function): Put builtins whose names don't begin - with `_' in the std namespace. - * decl2.c (flag_no_builtin): Remove. - (flag_no_nonansi_builtin): Likewise. - (set_decl_namespace): Use fake_std_node. - (validate_nonmember_using_decl): Likewise. - (do_using_directive): Likewise. - (handle_class_head): Likewise. - * dump.c (dequeue_and_dump): Likewise. - * except.c (init_exception_processing): Use std_identifier. - * init.c (build_member_call): Use fake_std_node. - * rtti.c (init_rtti_processing): Use std_identifier. - - 2000-10-17 Mark Mitchell - - * cp-tree.h (back_end_hook): Remove declaration. - * decl2.c (back_end_hook): Remove definition. - - * dump.c (dequeue_and_dump): Dump TREE_USED. - - Tue Oct 17 20:19:06 2000 Brad Lucier - - * spew.c (snarf_defarg): Cast 2nd arg to obstack_blank to (int). - - 2000-10-17 Joseph S. Myers - - * decl.c (WINT_TYPE): Define. - (init_decl_processing): Create types unsigned_ptrdiff_type_node, - c_size_type_node, signed_size_type_node and wint_type_node. - - 2000-10-17 Joseph S. Myers - - * decl2.c (warn_missing_format_attribute): New variable. - (lang_decode_option): Decode -Wmissing-format-attribute. - - 2000-10-16 Mark Mitchell - - * typeck.c (qualify_type): Remove. - (composite_pointer_type): Fix handling of conversions to `cv void*'. - - 2000-10-14 Kaveh R. Ghazi - - * Makefile.in (parse.c, parse.h): Fix think-o in last patch. - - 2000-10-13 Kaveh R. Ghazi - - * Makefile.in (parse.c, parse.h): Create atomically. - - 2000-10-12 Mark Mitchell - - * class.c (current_obstack): Remove. - * decl.c (ggc_p): Remove. - (start_decl): Don't use decl_tree_cons. - (grokdeclarator): Don't use build_decl_list. - (start_function): Don't use decl_tree_cons. - (finish_function): Don't mess with obstacks. - * decl2.c (grok_x_components): Don't use build_decl_list. - * lex.c (make_call_declarator): Don't call decl_tree_cons. - (implicitly_declare_fn): Don't call build_decl_list. - * parse.y (frob_specs): Don't call build_decl_list or - decl_tree_cons. - (expr_or_declarator_intern): Don't call decl_tree_cons. - (primary): Don't call build_decl_list. - (fcast_or_absdcl): Likewise. - (typed_declspecs): Don't call decl_tree_cons. - (reserved_declspecs): Don't call build_decl_list. - (declmods): Likewise. - (reserved_typespecquals): Likewise. - (aggr): Likewise. - (new_type_id): Likewise. - (cv_qualifiers): Likewise. - (after_type_declarator_intern): Likewise. - (notype_declarator_intern): Likewise. - (absdcl_intern): Likewise. - (named_parm): Likewise. - * pt.c (most_specialized_class): Likewise. - * repo.c (temporary_obstack): Make it a structure, not a pointer. - (init_repo): Initialize it. - * search.c (current_obstack): Remove. - * typeck2.c (add_exception_specifier): Don't call build_decl_list. - - 2000-10-09 Richard Henderson - - * Make-lang.in (CXX_EXTRA_HEADERS): Remove. - (c++ language support bits for libgcc): Remove. - (c++.clean): Remove cplib2.txt cleanup. - * config-lang.in (headers, lib2funcs): Remove. - - * exception.cc, new.cc, new1.cc, new2.cc: Remove files. - * tinfo.cc, tinfo.h, tinfo2.cc, vec.cc: Remove files. - * inc/cxxabi.h, inc/exception, inc/new: Remove files. - * inc/new.h, inc/typeinfo: Remove files. - - 2000-10-08 Joseph S. Myers - - * decl.c (INTMAX_TYPE, UINTMAX_TYPE): Define if not already - defined. - (init_decl_processing): Initialize intmax_type_node and - uintmax_type_node. - - 2000-10-06 Richard Henderson - - * cp-tree.h (struct cp_language_function): Remove x_result_rtx. - (original_result_rtx): Remove. - * decl.c (save_function_data): Don't clear x_result_rtx. - (mark_lang_function): Don't mark it either. - * expr.c (fixup_result_decl): Remove. - * semantics.c (genrtl_named_return_value): Frob the return decl - before calling emit_local_var. - (genrtl_finish_function): Don't call fixup_result_decl. - Always emit the jump to return_label. - - 2000-10-06 Nathan Sidwell - - * pt.c (lookup_template_class): Set current access for enum. - (tsubst_enum): Set file & line for enum decl. - - * spew.c (yylex): Remove unused variable. - - 2000-10-05 Richard Henderson - - * semantics.c (genrtl_finish_function): Don't init or check - can_reach_end; remove noreturn and return value checks. - - 2000-10-05 Tom Tromey - - * init.c (build_java_class_ref): Use `build_static_name' with a - suffix, not a prefix, to build the class object's name. - - 2000-10-05 Nathan Sidwell - - * cp-tree.h (access_kind): Fix comment typo. - * decl2.c (grokfield): Fix diagnostic typo. - * semantics.c (finish_template_type): Fix comment typo. - (finish_qualified_object_call_expr): Likewise. - - 2000-10-05 Nathan Sidwell - - * pt.c (tsubst_expr, DECL_STMT case): Don't process if - tsubsting fails. - - 2000-10-05 Nathan Sidwell - - * spew.c (frob_id): New static function. - (frob_opname): Use it. - (yylex): Use it. - - 2000-10-01 Mark Mitchell - - * decl.c (lang_mark_false_label_stack): Remove. - * lex.c (cp_mang_lang_type): Use ggc_alloc_cleared. - - 2000-09-30 Joseph S. Myers - - * gxxint.texi: Use @email for formatting email addresses. - - 2000-09-29 Gabriel Dos Reis - - * error.c: Remove direct obstack manipulation. Replace with - output_buffer-based formatting. Adjust calls to removed macros. - (obstack_chunk_alloc, obstack_chunk_free): Remove. - (OB_INIT, OB_PUTC, OB_PUTC2, OB_PUTS, OB_PUTID, OB_PUTCP, - OB_FINISH, OB_PUTI, OB_END_TEMPLATE): Likewise. - - 2000-09-24 Mark Mitchell - - * ir.texi: Move to ../c-tree.texi. - - 2000-09-20 Jason Merrill - - * decl2.c (get_guard): Check DECL_FUNCTION_SCOPE_P. - - 2000-09-21 Andreas Jaeger - - * errfn.c: Move declaration of cp_printer and cp_printers to ... - * cp-tree.h: ... here. - - * error.c: Remove declaration of cp_printer. - - 2000-09-20 Mark Mitchell - - * tree.c (mark_local_for_remap_r): Handle CASE_LABELs. - - 2000-09-20 Hans-Peter Nilsson - - * except.c: Delete #if 0:d EXCEPTION_SECTION_ASM_OP-default and - users. - - 2000-09-18 Mark Mitchell - - * decl.c (start_function): Robustify. - - 2000-09-18 Kaveh R. Ghazi - - * cp-tree.h (check_function_format): Accept a `status' parameter. - - * call.c, typeck.c: Updates calls to `check_function_format'. - - 2000-09-17 Geoffrey Keating - - * decl2.c (handle_class_head): Always push some scope even - in the error case. - - 2000-09-16 Mark Mitchell - - * cp-tree.h (struct cp_language_function): Remove - x_scope_stmt_stack and name_declared. - (current_scope_stmt_stack): Remove. - (function_name_declared_p): New macro. - (struct lang_decl_flags): Use c_lang_decl as a base class. - (context): Remove. - (struct lang_decl): Replace saved_tree with context. - (DECL_FRIEND_CONTEXT): Adjust accordingly. - (SET_DECL_FRIEND_CONTEXT): Likewise. - (DECL_VIRTUAL_CONTEXT): Likewise. - (DECL_SAVED_TREE): Remove. - (C_DECLARED_LABEL_FLAG): Likewise. - (cplus_expand_expr_stmt): Don't declare. - (add_decl_stmt): Likewise. - (add_scope_stmt): Likewise. - * decl.c (mark_stmt_tree): Remove. - (case_compare): Likewise. - (finish_case_label): Use c_add_case_label. - (init_decl_processing): Set more language-specific hooks. - (build_enumerator): Fix typo in comment. - (cplus_expand_expr_stmt): Remove. - (mark_lang_function): Use mark_c_language_function. - (lang_mark_tree): Use c_mark_lang_decl. - * decl2.c: Change order of inclusion. - * except.c: Likewise. - * expr.c (cplus_expand_expr): Remove handling of STMT_EXPR. Fall - back on c_expand_expr. - * friend.c: Include expr.h. - * init.c: Change order of inclusion. - * Makefile.in: Update dependencies. - * lex.h (free_lang_decl_chain): Remove. - * optimize.c (maybe_clone_body): Use function_name_declared_p. - * pt.c (build_template_decl): Don't copy DECL_VIRTUAL_CONTEXT if - it doesn't exist. - (instantiate_decl): Use function_name_declared_p. - * semantics.c (lang_expand_expr_stmt): Remove. - (set_current_function_name_declared): Likewise. - (current_function_name_declared): Likewise. - (begin_compound_stmt): Use function_name_declared_p. - (add_decl_stmt): Remove. - (setup_vtbl_ptr): Use function_name_declared_p. - (add_scope_stmt): Remove. - (current_scope_stmt_stack): New function. - (cp_expand_stmt): Don't handle SCOPE_STMTs. - (expand_body): Use function_name_declared_p. - * tree.c (cp_statement_code_p): Don't include SCOPE_STMT. - * typeck.c: Change order of includes. - (convert_sequence): Remove. - - 2000-09-14 Joseph S. Myers - - * lex.c (reswords): Add _Complex. - - Thu Sep 14 12:10:45 2000 Richard Kenner - - * Make-lang.in (cplib2.txt): Depend on cp/Makefile. - - 2000-09-13 J. David Anglin - - * init.c (begin_init_stmts): Don't use // comments. - - 2000-09-12 Jason Merrill - - * decl.c (maybe_deduce_size_from_array_init): Set do_default for - all non-extern arrays. - - * decl.c (grokdeclarator): Complain about 'friend T' for implicit - typenames, too. Downgrade complaint to pedwarn. - (xref_tag): Warn about surprising behavior of 'friend struct T'. - * decl2.c (handle_class_head): Generate a TYPENAME_TYPE for - 'class This::Inherited'. - - 2000-09-12 Mark Mitchell - - * decl.c (finish_case_label): Given the LABEL_DECL a - DECL_CONTEXT. - - 2000-09-12 Gabriel Dos Reis - - * error.c (TFF_PLAIN_IDENTIFIER, TFF_NAMESPACE_SCOPE, - TFF_CLASS_SCOPE, TFF_CHASE_NAMESPACE_ALIAS, TFF_CHASE_TYPDEF, - TFF_DECL_SPECIFIERS, TFF_CLASS_KEY_OR_ENUM, TFF_RETURN_TYPE, - TFF_FUNCTION_DEFAULT_ARGUMENTS, TFF_EXCEPTION_SPECIFICATION, - TFF_TEMPLATE_HEADER, TFF_TEMPLATE_DEFAULT_ARGUMENTS, TFF_SCOPE): - New macros. - (sorry_for_unsupported_tree, print_scope_operator, - print_left_paren, print_right_paren, print_left_bracket, - print_right_bracket, print_whitespace): Likewise. - (aggr_variety): Rename to class_key_or_enum. - (print_type): Rename to print_type_id. - (print_type_specifier_seq, print_simple_type_specifier, - print_elaborated_type_specifier, - print_rest_of_abstract_declarator, - print_parameter_declaration_clause, print_exception_specification, - print_nested_name_specifier, print_template_id, - typedef_original_name, print_template_argument_list_start, - print_template_argument_list_end): New functions. - - 2000-09-11 Gabriel Dos Reis - - * ir.texi: Add more documentation. - - 2000-09-11 Mark Mitchell - - * cp-tree.h (struct saved_scope): Remove x_function_parms. - (current_function_parms): Don't define. - (struct cp_language_function): Remove parms_stored. - (current_function_just_assigned_this): Don't define. - (current_function_parms_stored): Likewise. - (static_ctors): Declare. - (static_dtors): Likewise. - (SF_EXPAND): Don't define. - (expand_start_early_try_stmts): Remove declaration. - (store_parm_decls): Likewise. - * decl.c (static_ctors): Don't declare. - (static_dtors): Likewise. - (struct binding_level): Remove this_block. - (poplevel): Remove dead code. - (set_block): Likewise. - (mark_binding_level): Don't mark this_block. - (mark_saved_scope): Don't mark x_function_parms. - (init_decl_processing): Don't add current_function_parms as a GC - root. - (check_function_type): Change prototype. - (start_function): Remove RTL-generation code. - (expand_start_early_try_stmts): Remove. - (store_parm_decls): Give it internal linkage. Remove - RTL-generation code. - (finish_function): Remove RTL-generation code. - * decl2.c (static_ctors): Fix formatting. - (static_dtors): Likewise. - * method.c (use_thunk): Don't call store_parm_decls. - (synthesize_method): Likewise. - * optimize.c (maybe_clone_body): Likewise. - * parse.y (fn.def2): Likewise. - (.set_base_init): Likewise. - (nodecls): Likewise. - * pt.c (instantiate_decl): Likewise. - * rtti.c (synthesize_tinfo_fn): Likewise. - * semantics.c (genrtl_try_block): Simplify. - (expand_body): Use genrtl_start_function and - genrtl_finish_function. - (genrtl_start_function): New function. - (genrtl_finish_function): Likewise. - - 2000-09-11 Nathan Sidwell - - * error.c (cp_tree_printer, case 'P'): Append break. - - 2000-09-11 Nathan Sidwell - - * cp-tree.h (frob_opname): Declare. - * parse.y (saved_scopes): New static variable. - (cp_parse_init): Adjust. - (do_id): If lastiddecl is NULL, do do_identifier. - (operator): Save scope information. - (unoperator): New reduction. Restore scope information. - (operator_name): Append unoperator. Call frob_opname. - * spew.c (frob_opname): Define. - - 2000-09-10 Zack Weinberg - - * decl.c, rtti.c: Include defaults.h if not already included. - Don't define the *_TYPE_SIZE macros. - - 2000-09-09 Mark Mitchell - - * cp-tree.h (push_switch): Change prototype. - (check_cp_case_value): Remove declaration. - (decl_constant_value): Likewise. - * decl.c (struct cp_switch): Add switch_stmt and cases. - (case_compare): New function. - (push_switch): Set switch_stmt. Initialize cases. - (pop_switch): Clean up cases. - (define_case_label): Rename to ... - (finish_case_label): ... this. Do semantic analysis for case - labels here. - (start_function): Correct comment. - * decl2.c (check_cp_case_value): Remove. - * expr.c (do_case): Remove. - * pt.c (tsubst_expr): Adjust call to finish_case_label. - * semantics.c (genrtl_do_poplevel): Remove declaration. - (RECHAIN_STMTS): Remove. - (finish_break_stmt): Use build_break_stmt. - (finish_continue_stmt): Use build_continue_stmt. - (finish_switch_cond): Adjust condition here, rater than in - c_expand_start_case. - (finish_case_label): Remove. - * typeck.c (c_expand_return): Remove. - (c_expand_start_case): Likewise. - - 2000-09-07 Gabriel Dos Reis - - * ir.texi: Document type nodes. - - 2000-09-06 Mark Mitchell - - * cp-tree.h (init_cp_semantics): Declare. - (genrtl_try_block): Don't declare. - (genrtl_handler): Likewise. - (genrtl_catch_block): Likewise. - (genrtl_ctor_stmt): Likewise. - (genrtl_subobject): Likewise. - (genrtl_do_poplevel): Likewise. - (genrtl_named_return_value): Likewise. - * lex.c (init_parse): Call init_cp_semantics. - * semantics.c (genrtl_try_block): Give it internal linkage. - (genrtl_handler): Likewise. - (genrtl_catch_block): Likewise. - (genrtl_ctor_stmt): Likewise. - (genrtl_subobject): Likewise. - (genrtl_do_poplevel): Likewise. - (genrtl_named_return_value): Likewise. - (lang_expand_stmt): Rename to ... - (cp_expand_stmt): ... this. Only handle C++-specific nodes. - (init_cp_semantics): Define. - - * decl.c (initialize_local_var): Remove RTL-generating code. - * semantics.c (genrtl_try_block): Fix formatting. - - Move statement-tree facilities from C++ to C front-end. - * cp-tree.h (cp_tree_index): Remove CPTI_VOID_ZERO. - (void_zero_node): Remove. - (stmt_tree): Likewise. - (scope_chain): Adjust. - (language_function): Rename to cp_language_function. - (cp_function_chain): Adjust. - (current_stmt_tree): Remove. - (last_tree): Likewise. - (last_expr_type): Likewise. - (struct lang_decl): Adjust. - (STMT_IS_FULL_EXPR_P): Remove. - (add_tree): Remove. - (begin_stmt_tree): Likewise. - (finish_stmt_tree): Likewise. - (walk_tree_fn): Likewise. - (walk_stmt_tree): Likewise. - * class.c (finish_struct): Replace use of add_tree with add_stmt. - * decl.c (mark_stmt_tree): Adjust type. - (init_decl_processing): Don't build void_zero_node. - (initialize_local_var): Adjust usage of current_stmt_tree. - (finish_enum): Use add_stmt, not add_tree. - (save_function_data): Adjust use of language_function. - (finish_constructor_body): Use add_stmt, not add_tree. - (finish_destructor_body): Likewise. - (push_cp_function_context): Adjust use of language_function. - (pop_cp_function_context): Likewise. - (mark_lang_function): Likewise. - (mark_cp_function_context): Likewise. - * init.c (build_aggr_init): Adjust use of current_stmt_tree. - (build_vec_init): Likewise. - * semantics.c (SET_LAST_STMT): Remove. - (RECHAIN_STMTS): Don't use it. - (stmts_are_full_exprs_p): Adjust use of current_stmt_tree. - (current_stmt_tree): Define. - (add_tree): Remove. - (finish_goto_stmt): Use add_stmt, not add_tree. - (finish_expr_stmt): Likewise. - (begin_if_stmt): Likewise. - (finish_then_clause): Likewise. - (begin_while_stmt): Likewise. - (begin_do_stmt): Likewise. - (finish_return_stmt): Likewise. - (begin_for_stmt): Likewise. - (finish_break_stmt): Likewise. - (finish_continue_stmt): Likewise. - (begin_switch_stmt): Likewise. - (finish_case_label): Likewise. - (begin_try_block): Likewise. - (begin_function_try_block): Likewise. - (begin_handler): Likewise. - (begin_catch_block): Likewise. - (begin_compound_stmt): Likewise. - (begin_asm_stmt): Likewise. - (finish_asm_stmt): Likewise. - (finish_label_stmt): Likewise. - (add_decl_stmt): Likewise. - (finish_subobject): Likewise. - (finish_decl_cleanup): Likewise. - (finish_named_return_value): Likewise. - (setup_vtbl_ptr): Likewise. - (add_scope_stmt): Likewise. - (finish_stmt_expr): Likewise. - (prune_unused_decls): Remove. - (begin_stmt_tree): Likewise. - (finish_stmt_tree): Likewise. - (prep_stmt): Adjust use of current_stmt_tree. - (lang_expand_stmt): Likewise. - * tree.c (statement_code_p): Remove. - (cp_statement_code_p): New function. - (walk_stmt_tree): Remove. - (init_tree): Set lang_statement_code_p. - - 2000-09-06 Zack Weinberg - - Integrated preprocessor. - - * Make-lang.in, Makefile.in: Remove all references to input.c, - gxx.gperf, and hash.h. Add ../c-lex.o to C_OBJS. - * gxx.gperf, hash.h, input.c: Delete. - * lang-specs.h: Pass -lang-c++ to cc1plus so cpplib is - initialized properly. - - * class.c (fixup_pending_inline): Take a tree, not a - struct pending_inline *. All callers changed. - (init_class_processing): Set RID_PUBLIC, RID_PRIVATE, - RID_PROTECTED entries in ridpointers[] array here. - * decl.c (duplicate_decls): Do not refer to struct - pending_inline. - (record_builtin_type, init_decl_processing): Use RID_MAX not - CP_RID_MAX. - (grokdeclarator): Use C_IS_RESERVED_WORD. - * decl2.c (lang_decode_option): Ignore -lang-c++ for sake of - cpplib. - (grok_x_components): Do not inspect pending_inlines chain. - - * cp-tree.h (struct lang_identifier): Add rid_code entry. - (C_IS_RESERVED_WORD, C_RID_CODE, C_RID_YYCODE): New. - (flag_no_gnu_keywords, flag_operator_names, rid_to_yy): Declare. - (DEFARG_LENGTH, struct pending_inline, TIME_IDENTIFIER_TIME, - TIME_IDENTIFIER_FILEINFO): Kill. - Update prototypes. - * lex.h: Expunge cp_rid. Rewrite RIDBIT macros to use just a - single 32-bit word. - * parse.y: Call do_pending_inlines unconditionally. - reinit_parse_for_method is now snarf_method. fn.defpen is no - longer necessary. Remove unnecessary annotation on - SCOPE. Do not refer to end_of_file or struct pending_inline. - * semantics.c (begin_inline_definitions): Call - do_pending_inlines unconditionally. - - * lex.c: Remove all code now shared with C front end. - Initialize cpplib properly if USE_CPPLIB. Put reserved words - into the get_identifier table. Rewrite pragma handling to - work with the registry. Move code to save tokens for later - processing to spew.c. - - * spew.c: Rewrite everything in terms of token streams instead - of text. Move routines here from lex.c / input.c as - appropriate. GC-mark trees hanging off the pending inlines - chain. - - 2000-09-06 Mark Mitchell - - * NEWS: Mention that the named return value extension has been - deprecated. - * cp-tree.h (original_result_rtx): Define. - (TREE_REFERENCE_EXPR): Remove. - (DECL_VPARENT): Likewise. - (pushdecl_nonclass_level): Likewise. - (store_return_init): Likewise. - (reinit_lang_specific): Likewise. - (genrtl_named_return_value): Change prototype. - * decl.c (original_result_rtx): Remove. - (cp_finish_decl): Don't build DECL_STMTs for RESULT_DECLs. - Do not generate RTL for local variables here. - (store_return_init): Remove. - * semantics.c (genrtl_named_return_value): Simplify. Fold in - store_return_init. - (finish_named_return_value): Adjust accordingly. Warn that this - extension is deprecated. - (lang_expand_stmt): Adjust call to genrtl_named_return_value. - - 2000-09-06 Nathan Sidwell - - * pt.c (type_unification_real): Replace switch with if. - (unify): Tsubst non-type parms before comparing. - - 2000-09-06 Nathan Sidwell - - * error.c (dump_typename): New function, broken out of ... - (dump_type): ... here. Use it. - * typeck.c (same_type_p): Use cp_tree_equal for TYPENAME_TYPE. - - 2000-09-06 Nathan Sidwell - - * init.c (build_offset_ref): Deal with namespace scoped - TEMPLATE_ID_EXPRs. - - 2000-09-06 Nathan Sidwell - - * class.c (resolve_address_of_overloaded_function): Add - explanation message. - * decl.c (define_case_label): Reformat explanation. - * decl2.c (finish_static_data_member_decl): Likewise. - (grokfield): Likewise. - * friend.c (do_friend): Likewise. - - 2000-09-05 Zack Weinberg - - * tree.c (walk_tree): Expose tail recursion. - (walk_stmt_tree): New function. - * cp-tree.h: Prototype walk_stmt_tree. - * semantics.c (prune_unused_decls): Operate on SCOPE_STMTs not - the BLOCKs directly. If a BLOCK has no variables after - pruning, discard it. - (finish_stmt_tree): Use walk_stmt_tree. No need to save and - restore the line number. - - 2000-09-05 Mark Mitchell - - * Makefile.in (CXX_TREE_H): Add dependency on HTAB_H. - (pt.o): Remove dependency on HTAB_H. - * cp-tree.h: Include hashtab.h. - (walk_tree): Change prototype. - (walk_tree_without_duplicates): New function. - * decl.c (check_default_argument): Use it. - * optimize.c (remap_decl): Adjust calls to walk_tree. - (copy_body): Likewise. - (expand_calls_inline): Likewise. - (calls_setjmp_p): Use walk_tree_without_duplicates. - * pt.c: Don't include hashtab.h. - (for_each_template_parm): Use walk_tree_without_duplicates. - * semantics.c (finish-stmt_tree): Likewise. - (expand_body): Likewise. - * tree.c (walk_tree): Add additional parameter. - (walk_tree_without_duplicates): New function. - (count_trees): Use it. - (verify_stmt_tree): Adjust call to walk_tree. - (find_tree): Use walk_tree_without_duplicates. - (no_linkage_check): Likewise. - (break_out_target_exprs): Adjust call to walk_tree. - (cp_unsave): Likewise. - - 2000-09-04 Kriang Lerdsuwanakij - - * cp-tree.def (BOUND_TEMPLATE_TEMPLATE_PARM): New tree code. - (TEMPLATE_TEMPLATE_PARM): Adjust comment. - * cp-tree.h (TYPE_BINFO): Adjust comment. - (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO): Likewise. - (TEMPLATE_TYPE_PARM_INDEX): Likewise. - (IS_AGGR_TYPE): Use BOUND_TEMPLATE_TEMPLATE_PARM instead. - (TYPE_TEMPLATE_INFO): Likewise. - (TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL): Likewise. - * class.c (push_nested_class): Likewise. - * decl.c (lookup_name_real): Likewise. - (grokdeclarator): Likewise. - (grok_op_properties): Likewise. - (xref_tag): Likewise. - (xref_basetypes): Likewise. - * decl2.c (constructor_name_full): Likewise. - (arg_assoc_template_arg): Add TEMPLATE_TEMPLATE_PARM case. - (arg_assoc_type): Use BOUND_TEMPLATE_TEMPLATE_PARM instead. - * error.c (dump_type): Split TEMPLATE_TEMPLATE_PARM case. - (dump_type_prefix): Add BOUND_TEMPLATE_TEMPLATE_PARM. - (dump_type_suffix): Likewise. - * init.c (is_aggr_type): Use BOUND_TEMPLATE_TEMPLATE_PARM - instead. - (get_aggr_from_typedef): Likewise. - * mangle.c (write_type): Split TEMPLATE_TEMPLATE_PARM case. - (write_expression): Add BOUND_TEMPLATE_TEMPLATE_PARM. - (write_template_parm): Likewise. - (write_template_template_parm): Check tree code instead of - using TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO. - * method.c (build_overload_nested_name): Add - BOUND_TEMPLATE_TEMPLATE_PARM. - (process_overload_item): Split TEMPLATE_TEMPLATE_PARM case. - * parse.y (bad_parm): Add BOUND_TEMPLATE_TEMPLATE_PARM. - * pt.c (convert_template_argument): Check tree code instead of - using TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO. - (for_each_template_parm_r): Split TEMPLATE_TEMPLATE_PARM case. - (for_each_template_parm): Adjust comment. - (tsubst): Add BOUND_TEMPLATE_TEMPLATE_PARM. Reorganize. - (tsubst_copy): Add BOUND_TEMPLATE_TEMPLATE_PARM. - (unify): Add BOUND_TEMPLATE_TEMPLATE_PARM. Reorganize. Use - template_args_equal to compare template template parameter cases. - * ptree.c (print_lang_type): Add BOUND_TEMPLATE_TEMPLATE_PARM. - * search.c (lookup_field_1): Use BOUND_TEMPLATE_TEMPLATE_PARM - instead. - * tree.c (copy_template_template_parm): Decide whether to create - a TEMPLATE_TEMPLATE_PARM or BOUND_TEMPLATE_TEMPLATE_PARM node. - (walk_tree): Add BOUND_TEMPLATE_TEMPLATE_PARM. - (copy_tree_r): Likewise. - * typeck.c (comptypes): Likewise. Check tree code instead of - using TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO. - - 2000-09-04 Mark Elbrecht - - * decl.c (finish_function): Move the code for handling functions - marked with the constructor and destructor attributes inside the - expand_p block. - - 2000-09-04 Nathan Sidwell - - * init.c (resolve_offset_ref): Deal with TEMPLATE_ID_EXPR. - - 2000-09-04 Nathan Sidwell - - * pt.c (lookup_template_class): Remove abort. - * tree.c (get_type_decl): Allow error_mark_node. - - 2000-09-04 Nathan Sidwell - - * decl2.c (arg_assoc): Deal with COMPONENT_REFs inside - TEMPLATE_ID_EXPRs. - - 2000-09-03 Mark Mitchell - - * operators.def (ALIGNOF_EXPR, MAX_EXPR, MIN_EXPR): Change - new ABI mangling. - - 2000-09-01 Nathan Sidwell - - * parse.y (named_class_head): Check for TYPENAME_TYPE. Simplify - union tag mismatch error reporting. - - 2000-09-01 Nathan Sidwell - - * call.c (build_scoped_method_call): Check it is not a namespace. - - 2000-08-30 Jason Merrill - - * cp-tree.h (LOCAL_CLASS_P): Use decl_function_context. - - * tree.c (bot_manip): Check TREE_CONSTANT rather than - !TREE_SIDE_EFFECTS. Call break_out_target_exprs and - build_target_expr_with_type for the non-AGGR_INIT_EXPR case. - - * decl.c (start_function): Always call make_function_rtl. - - 2000-08-29 Zack Weinberg - - * semantics.c (prune_unused_decls): New function. - (finish_stmt_tree): Call it via walk_tree. - - 2000-08-29 Zack Weinberg - - * class.c (build_secondary_vtable): Constify a char *. - * decl.c (init_decl_processing): Initialize function_id_node, - pretty_function_id_node, and func_id_node. - * input.c (struct input_source): Constify 'str'. - (feed_input): Constify first argument. - * mangle.c (write_identifier): Constify argument. - * pt.c (mangle_class_name_for_template): Constify argument. - - 2000-08-29 Mark Mitchell - - * typeck.c (mark_addressable): Remove code that pokes around in - RTL. - - 2000-08-28 Jason Merrill - - * lex.c (file_name_nondirectory): Move to toplev.c. - - * cp-tree.h (LOCAL_CLASS_P): New macro. - * class.c (finish_struct_1): Use it. - - 2000-08-27 Alex Samuel - - * mangle.c (CLASSTYPE_TEMPLATE_ID_P): Remove unexplained voodoo. - (write_encoding): Pass another argument to write_name. - (write_name): Add ignore_local_scope parameter. Fix handling of - local names. - (write_nested_name): Use write_unqualified_name. - (write_prefix): Likewise. Skip out on FUNCTION_DECLs. - (write_template_prefix): Use write_unqualified_name. - (write_component): Remove. - (write_local_name): Add parameter. Use direct local entity to - discriminator calculation. - (write_class_enum_type): Pass another argument to write_name. - (write_template_template_arg): Likewise. - (make_guard_variable): Likewise. - - 2000-08-27 Jason Merrill - - * decl.c (pushdecl): Matching decls for local externs are found in - the current level. Propagate linkage information from previous - declarations. - - 2000-08-26 Gabriel Dos Reis - - * ir.texi (Expressions): Fix typo. - - 2000-08-25 Greg McGary - - * tree.c (init_tree): Use ARRAY_SIZE. - - 2000-08-25 Gabriel Dos Reis - - * error.c (cp_tree_printer): Rework. - - 2000-08-25 Mark Mitchell - - * Make-lang.in (CXX_LIB2FUNCS): Remove cp-demangle.o and - dyn-string.o. - (CXX_LIB2SRCS): Remove cp-demangle.c and dyn-string.c. - (cp-demangle.o): Remove target. - (dyn-string.o): Likewise. - - * decl.c (grokfndecl): Require that `main' return an `int'. - * mangle.c (write_encoding): Don't mangle return types for - conversion functions. - - 2000-08-25 Gabriel Dos Reis - - * error.c (tree_formatting_info): New data type. - (tree_being_formatted): New macro. - (tree_formatting_flags): Likewise. - (put_whitespace): Likewise. - (print_tree_identifier): Likewise. - (print_identifier): Likewise. - (cp_tree_printer, print_function_argument_list, print_declaration, - print_expression, print_function_declaration, - print_function_parameter, print_type, print_cv_qualifier): New - functions. - (init_error): Initialize lang_printer. - - 2000-08-24 Jason Merrill - - * typeck.c (build_ptrmemfunc): Just reinterpret if there's no - adjustment necessary. - - 2000-08-24 Greg McGary - - * cp-tree.h (MAIN_NAME_P): Remove macro. - - 2000-08-24 Gabriel Dos Reis - - * error.c (print_instantiation_context): Don't forget to flush the - buffer. - - 2000-08-23 Jason Merrill - - * typeck.c (build_ptrmemfunc): Save the input pmf. - - * method.c (process_modifiers): Use same_type_p. - - 2000-08-23 Mark Mitchell - - * cp-tree.h (DECL_CLONED_FUNCTION_P): Check DECL_LANG_SPECIFIC. - * mangle.c (write_function_type): Change prototype. - (write_encoding): Don't mangle return types for - constructors or destructors. - (write_type): Adjust call to write_function_type. - * pt.c (instantiate_template): Instantiate alternate entry points - when instantiating the main function. - - 2000-08-23 Gabriel Dos Reis - - * error.c (cp_print_error_function): Don't use embedded '\n' in - output_printf. - - 2000-08-23 Gabriel Dos Reis - - * decl.c (init_decl_processing): Remove bogus initialization. - * error.c (lang_print_error_function): Restore here. - (init_error): Initialize print_error_function. - - 2000-08-22 Theodore Papadopoulo - - * decl2.c (arg_assoc): Revert my 2000-08-11 change. - - 2000-08-22 Gabriel Dos Reis - - * Makefile.in (error.o): Depends on diagnostic.h - - * cp-tree.h (problematic_instantiation_changed, - record_last_problematic_instantiation, current_instantiation, - print_instantiation_context): Declare. - (maybe_print_template_context): Remove. - - * decl.c (init_decl_processing): Set print_error_function to NULL. - (lang_print_error_function): Remove, since we're using a new - machinery. - - * error.c: #include diagnostic.h - (function_category): New function. - (cp_diagnostic_starter): Likewise. - (cp_diagnostic_finalizer): Likewise. - (cp_print_error_function): Likewise. - (maybe_print_instantiation_context): Likewise. - (print_instantiation_full_context): Likewise. - (print_instantiation_partial_context): Likewise. - (print_instantiation_context): Define. - (init_error): Initialize diagnostic pager and finalizer. - - * pt.c (problematic_instantiation_changed): Define. - (record_last_problematic_instantiation): Likewise. - (current_instantiation): Likewise. - (maybe_print_template_context): Remove. - (print_template_context): Likewise. - (current_tinst_level): Make static to reflect Brendan Kehoe's - change of 1995-04-13. - (push_tinst_level): Call print_instantiation_context. - - 2000-08-21 Nix - - * lang-specs.h: Do not process -o or run the assembler if - -fsyntax-only. - - 2000-08-21 Joseph S. Myers - - * decl.c (flag_hosted, flag_noniso_default_format_attributes): New - variables. - * decl2.c (lang_decode_option): Disable gettext attributes for - -ansi. - - 2000-08-21 Gabriel Dos Reis - - * lex.c (lang_init_options): Default diagnostic message maximum - length to 80, when line-wrapping. - - 2000-08-20 Mark Mitchell - - * class.c (build_vtbl_initializer): Clear the entire - vtbl_init_data. Start keeping track of the functions for which we - have created vcall offsets here. - (dfs_build_vcall_offset_vtbl_entries): Remove. - (build_vcall_offset_vtbl_entries): Reimplement. - (add_vcall_offset_vtbl_entries_r): New function. - (add_vcall_offset_vtbl_entries_1): Likewise. Tweak logic for - computing when vcall offsets are necessary. - - 2000-08-18 Nathan Sidwell - - * decl.c (member_function_or_else): Use cp_error ... %T. - (grokdeclarator): Likewise. - (start_method): Likewise. - * friend.c (make_friend_class): Use cp_pedwarn ... %T. - - 2000-08-18 Nathan Sidwell - - * decl2.c (grokfield): Set CLASSTYPE_GOT_SEMICOLON on class - TYPE_DECLs. - - 2000-08-18 Nathan Sidwell - - * cp-tree.h (PTRMEM_OK_P): New macro. - (itf_ptrmem_ok): New enumeration value. - * class.c (resolve_address_of_overloaded_function): Add PTRMEM - argument. Diagnose implicit pointer to member. - (instantiate_type): Don't diagnose implicit pointer to member - here. Pass itf_ptrmem_ok if ok. Adjust calls to - resolve_address_of_overloaded_function. - * init.c (build_offset_ref): Set PTRMEM_OK_P. - (resolve_offset_ref): Don't diagnose implicit pointer to member here. - * semantics.c (finish_parenthesized_expr): Clear OFFSET_REFs here. - * typeck.c (build_x_unary_op): Calculate PTRMEM_OK_P. - (build_unary_op): Deal with single non-static member in - microsoft-land. - - 2000-08-18 Nathan Sidwell - - * decl2.c (arg_assoc_type): Cope with TYPENAME_TYPE. - - 2000-08-18 Nathan Sidwell - - * cp-tree.h (enum_name_string): Remove prototype. - (report_case_error): Remove prototype. - * cp/typeck2.c (enum_name_string): Remove. - (report_case_error): Remove. - * error.c (dump_expr): Deal with enum values directly. - Correctly negate integer constant. - - 2000-08-17 Nathan Sidwell - - * inc/cxxabi.h (__cxa_vec_new2, __cxa_vec_new3): Declare. - (__cxa_vec_delete2, __cxa_vec_delete3): Declare. - * vec.cc (__cxa_vec_new2, __cxa_vec_new3): Implement. - (__cxa_vec_delete2, __cxa_vec_delete3): Implement. - (__cxa_vec_new): Use __cxa_vec_new2. - (__cxa_vec_delete): Use __cxa_vec_delete2. - - 2000-08-17 Nathan Sidwell - - * vec.cc (__cxa_vec_new): Set "C" linkage. - (__cxa_vec_ctor): Likewise. - (__cxa_vec_cctor): Likewise. - (__cxa_vec_dtor): Likewise. - (__cxa_vec_delete): Likewise. - * inc/cxxabi.h (__cxa_vec_new): Set "C" linkage. - (__cxa_vec_ctor): Likewise. - (__cxa_vec_cctor): Likewise. - (__cxa_vec_dtor): Likewise. - (__cxa_vec_delete): Likewise. - - 2000-08-17 Nathan Sidwell - - * class.c (instantiate_type): Reinstate local variable - deleted in previous change. - - * cvt.c (cp_convert_to_pointer): Pass itf_complain, not - itf_no_attributes. - - 2000-08-17 Nathan Sidwell - - * cp-tree.h (instantiate_type_flags): New enumeration. - (instantiate_type): Change parameter. - * class.c (instantiate_type): Adjust prototype. Adjust. - * call.c (standard_conversion): Adjust instantiate_type call. - (reference_binding): Likewise. - (build_op_delete_call): Likewise. - (convert_like_real): Likewise. - * cvt.c (cp_convert_to_pointer): Likewise. - (convert_to_reference): Likewise. - * pt.c (convert_nontype_argument): Likewise. - * typeck.c (build_binary_op): Likewise. - (build_ptrmemfunc): Likewise. - (convert_for_assignment): Likewise. - - 2000-08-17 Nathan Sidwell - - * cp-tree.h (CPTR_AGGR_TAG): New global tree node. - (current_aggr): Define. - * decl.c (grokdeclarator): Make sure a friend class is an - elaborated type specifier. - * parse.y (current_aggr): Remove static definition. - (cp_parse_init): Adjust. - (structsp): Clear and restore current_aggr. - (component_decl_list): Clear current_aggr. - - * error.c (dump_type, case TYPENAME_TYPE): Don't emit the - aggregate tag on the typename's context. - - * pt.c (tsubst_friend_class): Return error_mark_node, if - parms becomes NULL. - (instantiate_class_template): Ignore error_mark_node friend types. - - 2000-08-14 Nathan Sidwell - - * cvt.c (warn_ref_binding): New static function, broken out of ... - (convert_to_reference): ... here. Use it. - - 2000-08-11 Kriang Lerdsuwanakij - - * parse.y (template_arg): Add rule for template qualified with - global scope. - - 2000-08-11 Theodore Papadopoulo - - * decl2.c (add_function): Reorganize. - (arg_assoc): Do not consider function template decls. - - 2000-08-11 Jason Merrill - - * decl.c (lookup_name_real): Don't forget the TYPENAME_TYPE we're - looking inside. - - 2000-08-11 Nathan Sidwell - - * cp-tree.h (resolve_scope_to_name): Remove unused prototype. - (lookup_nested_tag): Likewise. - - * decl2.c (grokfield): Fix comment to reflect many types of _DECLs - can be produced. - - 2000-08-11 Nathan Sidwell - - * parse.y (named_complex_class_head_sans_basetype): Remove - always true if. - - 2000-08-11 Nathan Sidwell - - * decl2.c (build_expr_from_tree, case METHOD_CALL_EXPR): Build - explicit TEMPLATE_ID_EXPR args. - (build_expr_from_tree, case CALL_EXPR): Likewise. - - 2000-08-11 Nathan Sidwell - - * decl.c (check_tag_decl): Diagnose typename's which don't - declare anything. - - 2000-08-10 Nathan Sidwell - - * init.c (build_aggr_init): Reject bogus array initializers - early. - - 2000-08-09 Nathan Sidwell - - * rtti.c (build_dynamic_cast_1): Set "C" linkage for new abi - runtime. - * cp/tinfo.cc (__dynamic_cast): Likewise. - * cp/inc/cxxabi.h (__dynamic_cast): Likewise. - - 2000-08-09 Nathan Sidwell - - * cvt.c (convert_to_pointer_force): Fix error message when - attempting to cast from ambiguous base. - - 2000-08-08 Jason Merrill - - * pt.c (tsubst_aggr_type): Bail if creating the argvec fails. - (tsubst_template_arg_vector): Likewise. - - * decl2.c (build_anon_union_vars): Choose the largest field; don't - assume that one will be as large as the union. - - 2000-08-07 Kazu Hirata - - * cp-tree.h (CLASSTYPE_HAS_PRIMARY_BASE_P): Fix a comment typo. - * decl.c (pop_labels): Likewise. - - 2000-08-04 Jeffrey Oldham - - * inc/cxxabi.h (__pbase_type_info): Changed member names to match - specifications. - (__pointer_to_member_type_info): Likewise. - (__base_class_info): Likewise. - (__class_type_info): Likewise. - (__si_class_type_info): Likewise. - (__vmi_class_type_info): Likewise. - * tinfo.cc (__si_class_type_info::__do_find_public_src): - Changed member names to match specifications. - (__vmi_class_type_info::__do_find_public_src): Likewise. - (__si_class_type_info::__do_dyncast): Likewise. - (__vmi_class_type_info::__do_dyncast): Likewise. - (__si_class_type_info::__do_upcast): Likewise. - (__vmi_class_type_info::__do_upcast): Likewise. - * tinfo2.cc (__pbase_type_info::__do_catch): Likewise. - (__pbase_type_info::__pointer_catch): Likewise. - (__pointer_type_info::__pointer_catch): Likewise. - (__pointer_to_member_type_info::__pointer_catch): Likewise. - - 2000-08-04 Zack Weinberg - - * Make-lang.in (cc1plus): Depend on $(BACKEND), not stamp-objlist. - * Makefile.in: Add C_OBJS, BACKEND; delete OBJS, OBJDEPS. - (cc1plus): Link with $(BACKEND) and $(C_OBJS). - - 2000-08-04 Mark Mitchell - - * cp-tree.h (add_method): Change prototype. - * class.c (add_method): Remove FIELDS parameter. Add ERROR_P. - Don't double the size of the method vector in the error case. - (handle_using_decl): Adjust call to add_method. - (add_implicitly_declared_members): Likewise. - (clone_function_decl): Likewise. - * decl2.c (check_classfn): Likewise. - * semantics.c (finish_member_declaration): Likewise. - - 2000-08-04 Joseph S. Myers - - * decl.c (flag_isoc94): New variable. - - 2000-08-02 Jason Merrill - - * pt.c (do_type_instantiation): Add complain parm; don't complain - if called recursively. - * cp-tree.h, parse.y: Adjust. - - 2000-08-02 Zack Weinberg - - * decl2.c: Silently ignore -Wstrict-prototypes; warn about - -Wno-strict-prototypes. - - * g++spec.c: Adjust type of second argument to - lang_specific_driver, and update code as necessary. - - * cp-tree.h: Don't prototype min_precision here. - (my_friendly_assert): Cast expression to void. - * semantics.c (do_poplevel): Initialize scope_stmts. - - 2000-08-02 Mark Mitchell - - * cp-tree.h (DECL_NEEDED_P): Tweak. - - 2000-07-28 Jason Merrill ! * lang-specs.h: Use %i in rule for .ii files. ! ! 2000-07-31 Zack Weinberg ! ! * lang-specs.h: Rename cpp to cpp0 and/or tradcpp to tradcpp0. ! ! 2000-07-30 Mark Mitchell ! ! Allow indirect primary bases. ! * cp-tree.h (struct lang_type): Remove vfield_parent. Add ! primary_base. ! (CLASSTYPE_VFIELD_PARENT): Remove. ! (CLASSTYPE_PRIMARY_BINFO): Reimplement. ! (BINFO_PRIMARY_BINFO): Remove. ! (CLASSTYPE_HAS_PRIMARY_BASE_P): Reimplement. ! (BINFO_VBASE_PRIMARY_P): Likewise. ! (BINFO_PRIMARY_BASE_OF): New macro. ! (BINFO_INDIRECT_PRIMARY_P): Likewise. ! (get_primary_binfo): New function. ! * decl.c (lang_mark_tree): Make lang_type::primary_base. ! * class.c (vcall_offset_data_s): Rename to ... ! (vtbl_init_data_s): ... this. Rename primary_p to primary_vtbl_p, ! and add ctor_vtbl_p. ! (get_derived_offset): Use get_primary_binfo. ! (dfs_mark_primary_bases): Adjust handling of virtual primary ! bases. ! (mark_primary_bases): Likewise. ! (set_primary_base): Take a binfo, not an integer, as a ! representation of the primary base. ! (indirect_primary_base_p): Remove. ! (determine_primary_base): Adjust for indirect primary bases. ! (dfs_find_final_overrider): Fix typo in coment. ! (update_vtable_entry_for_fn): Use get_primary_binfo. ! (layout_nonempty_base_or_field): Tweak. ! (build_base_fields): Adjust for new primary base semantics. ! (dfs_propagate_binfo_offsets): Remove. ! (propagate_binfo_offsets): Rewrite. ! (dfs_set_offset_for_shared_vbases): Remove. ! (layout_virtual_bases): Don't use it. ! (layout_class_type): Set CLASSTYPE_SIZE correctly under the new ! ABI. ! (finish_struct_1): Set CLASSTYPE_PRIMARY_BINFO, not ! CLASSTYPE_VFIELD_PARENT. ! (dfs_get_primary_binfo): New function. ! (get_primary_binfo): Likewise. ! (dump_class_hierarchy_r): Tweak printing of primary bases. ! (build_vtbl_initializer): Fix typo in comments. Use ! vtbl_init_data. ! (build_vcall_and_vbase_vtbl_entries): Likewise. ! (build_vbaes_offset_vtbl_entries): Likewise. ! (dfs_build_vcall_offset_vtbl_entries): Adjust setting of ! BV_VCALL_INDEX to handle indirect primary bases. ! (build_vcall_offset_vtbl_entries): Use vtbl_init_data. ! (build_rtti_vtbl_entries): Likewise. ! * search.c (get_shared_vbase_if_not_primary): Tweak. ! (find_vbase_instance): Likewise. ! (binfo_for_vtable): Simplify. ! * tree.c (unshare_base_binfos): Clear BINFO_PRIMARY_BASE_OF. ! (make_binfo): Make it have 11 entries. ! ! 2000-07-30 Alex Samuel ! ! * mangle.c (DECL_TEMPLATE_ID_P): Remove. ! (CLASSTYEP_TEMPLATE_ID_P): Check template info, and context when ! ascertaining primaryness. ! (G): Remove template_args. ! (decl_is_template_id): New function. ! (write_encoding): Use decl_is_template_id. ! (write_name): Likewise. Handle type_decls. Get main variant of ! type decls. ! (write_nested_name): Likewise. ! (write_prefix): Likewise. ! (write_template_prefix): Likewise. ! (write_special_name_constructor): Remove defunct production from ! comment. ! (write_bare_function_type): Remove comment about absent parameter. ! (write_template_template_arg): Add missing grammar production to ! comment. ! ! 2000-07-27 Jason Merrill ! ! * decl.c (duplicate_decls): If common_type produces a non-typedef ! type for a typedef, just use the old type. ! ! 2000-07-27 Mark Mitchell ! ! * cp-tree.h (function_depth): Declare. ! (verify_stmt_tree): Likewise. ! (find_tree): Likewise. ! * decl.c (function_depth): Give it external linkage. ! * optimize.c (optimize_function): Increment and decrement it. ! * tree.c (verify_stmt_tree_r): New function. ! (verify_stmt_tree): Likewise. ! (find_tree_r): Likewise. ! (find_tree): Likewise. ! ! 2000-07-27 Jason Merrill ! ! * pt.c (for_each_template_parm_r, case RECORD_TYPE): Use ! TYPE_PTRMEMFUNC_P. ! * cp-tree.h (TYPE_TEMPLATE_INFO): Check for TYPE_LANG_SPECIFIC. ! ! 2000-07-26 Mark Mitchell ! ! * decl.c (start_cleanup_fn): Mark the function as `inline'. ! * decl2.c (get_guard): Call cp_finish_decl, not ! rest_of_decl_compilation, for local guards. ! * lex.c (do_identifier): Remove unused variable. ! ! Wed Jul 26 15:05:51 CEST 2000 Marc Espie ! ! * parse.y: Add missing ';'. ! ! 2000-07-26 Mark Mitchell ! ! * parse.y (empty_parms): Use `()', not `(...)', when in the scope ! of `extern "C++"'. ! ! 2000-07-25 Nathan Sidwell ! ! Kill strict_prototype. Backwards compatibility only for ! non NO_IMPLICIT_EXTERN_C systems. ! * cp-tree.h (flag_strict_prototype): Remove. ! (strict_prototype): Remove. ! (strict_prototypes_lang_c, strict_prototypes_lang_cplusplus): Remove. ! * decl.c (maybe_push_to_top_level): Adjust. ! (pop_from_top_level): Adjust. ! (decls_match): Only allow sloppy parm matching for ancient ! system headers. ! (init_decl_processing): Adjust. ! (grokdeclarator): Adjust. ! * decl2.c (flag_strict_prototype): Remove. ! (strict_prototype): Remove. ! (strict_prototypes_lang_c, strict_prototypes_lang_cplusplus): Remove. ! (lang_f_options): Remove "strict-prototype". ! (unsupported-options): Add "strict-prototype". ! * lex.c (do_identifier): Adjust. ! (do_scoped_id): Adjust. ! * parse.y (empty_parms): Adjust. ! * class.c (push_lang_context): Adjust. ! (pop_lang_context): Adjust. ! * typeck.c (comp_target_parms): Adjust. ! ! 2000-07-25 Nathan Sidwell ! ! * decl.c (poplevel): Deal with anonymous variables at for scope. ! (maybe_inject_for_scope_var): Likewise. ! ! 2000-07-25 Zack Weinberg ! ! * decl.c: Remove all signal handling code, now done in toplev.c. ! ! 2000-07-23 Mark Mitchell ! ! * decl.c (make_rtl_for_nonlocal_decl): Rework. ! ! * pt.c (lookup_template_class): Ensure that TYPE_CONTEXT is set ! correctly. ! ! 2000-07-20 Zack Weinberg ! ! * cp-tree.h: Use __FUNCTION__ not __PRETTY_FUNCTION__. ! Define my_friendly_assert and my_friendly_abort as macros ! which may call friendly_abort. Prototype friendly abort, not ! my_friendly_abort or my_friendly_assert. ! * decl.c (signal_catch): Report the signal caught in the error ! message. Call fatal directly. ! * typeck2.c (ack, my_friendly_assert): Delete. ! (my_friendly_abort): Rename to friendly_abort. Expect file, ! line, and function parameters. Report the abort code, then ! call fancy_abort. Do not mask an abort if errors have ! already occurred. ! ! 2000-07-18 Nathan Sidwell ! ! * typeck.c (comp_target_parms): Remove obsolete parameter. ! (comp_target_types): Adjust. ! ! 2000-07-17 Jason Merrill ! ! * typeck.c (mark_addressable): Never set TREE_USED. ! * call.c (build_call): Don't abort on calls to library functions ! that have been declared normally. ! ! * typeck.c (build_binary_op): Fix grammar in warning. ! ! * exception.cc (__eh_free): Fix prototype. ! ! * decl2.c (finish_decl_parsing): Handle TEMPLATE_ID_EXPR. ! ! * decl.c (pushdecl): Handle seeing an OVERLOAD in ! IDENTIFIER_NAMESPACE_VALUE. ! ! 2000-07-16 Mark Mitchell ! ! * cp-tree.h (THUNK_VCALL_OFFSET): Update documentation. ! * method.c (use_thunk): Correct handling of vcall offsets. ! ! 2000-07-14 Zack Weinberg ! ! * .cvsignore: parse.h and parse.c have no cp- prefix. ! ! 2000-07-13 Mark Mitchell ! ! * .cvsignore: New file. ! ! 2000-07-13 Zack Weinberg ! ! * lang-specs.h: Use the new named specs. Remove unnecessary braces. ! ! 2000-07-12 Mark Mitchell ! ! * Makefile.in ($(PARSE_H)): Depend directly on parse.y. ! * parse.c: Remove. ! * parse.h: Likewise. ! ! 2000-07-11 Mark Mitchell ! ! * class.c (layout_class_type): Add pointers to virtual bases after ! base classes under the old ABI. ! ! 2000-07-10 Benjamin Chelf ! ! * semantics.c (finish_for_stmt): Remove call to emit_line_note. ! (finish_continue_stmt): Likewise. ! (begin_for_stmt): Remove call to note_level_for_for. ! (finish_goto_stmt): Change call from build_min_nt ! to build_stmt. ! (finish_expr_stmt): Likewise. ! (begin_if_stmt): Likewise. ! (begin_while_stmt): Likewise. ! (finish_while_stmt): Likewise. ! (finish_return_stmt): Likewise. ! (begin_for_stmt): Likewise. ! (finish_for_stmt): Likewise. ! (finish_break_stmt): Likewise. ! (begin_switch_stmt): Likewise. ! (finish_case_label): Likewise. ! (genrtl_try_block): Likewise. ! (begin_try_block): Likewise. ! (begin_handler): Likewise. ! (begin_compound_stmt): Likewise. ! (finish_asm_stmt): Likewise. ! (finish_label_stmt): Likewise. ! (add_decl_stmt): Likewise. ! (finish_subobject): Likewise. ! (finish_decl_cleanup): Likewise. ! (finish_named_return_value): Likewise. ! (setup_vtbl_ptr): Likewise. ! (add_scope_stmt): Likewise. ! * decl.c (finish_constructor_body): Likewise. ! (finish_destructor_body): Likewise. ! * optimize.c (copy_body_r): Likewise. ! (initialize_inlined_parameters): Likewise. ! (declare_return_variable): Likewise. ! (expand_call_inline): Likewise. ! ! 2000-07-10 Jakub Jelinek ! ! * semantics.c (expand_body): Sync interface information ! at the end of function body expansion. ! ! 2000-07-09 Jason Merrill ! ! * init.c (build_new_1): Bail early if the call to new fails. ! ! * decl.c (compute_array_index_type): Check specifically for ! an INTEGER_CST, not just TREE_CONSTANT. ! ! * decl.c (duplicate_decls): Don't call duplicate_decls on ! the DECL_TEMPLATE_RESULT. ! (decls_match): Return 0 if the DECL_TEMPLATE_RESULTs have different ! codes. ! ! * error.c (dump_template_bindings): Don't crash if we had an ! invalid argument list. ! ! * typeck.c (c_expand_start_case): Do narrowing here. ! * semantics.c (finish_switch_cond): Not here. ! ! 2000-07-09 Hidvegi Zoli ! ! * parse.y (asm_clobbers): Do string concatenation. ! ! 2000-07-09 Mark Mitchell ! ! * decl.c (pushtag): Don't put local classes in template functions ! on the local_classes list. ! ! 2000-07-04 Scott Snyder ! ! * decl2.c (get_guard): Add missing return for old ABI local ! variable case. ! ! 2000-07-09 Mark Mitchell ! ! * cp-tree.h (char_type_p): New function. ! * decl.c (init_decl_processing): Don't initialize ! signed_wchar_type_node or unsigned_wchar_type_node. ! (complete_array_type): Handle brace-enclosed string-constants. ! * rtti.c (emit_support_tinfos): Remove #if 0'd code. ! * tree.c (char_type_p): New function. ! * typeck2.c (digest_init): Use char_type_p. ! ! 2000-07-06 Nathan Sidwell ! ! * pt.c (tsubst): Don't layout type, if it's error_mark. ! ! 2000-07-06 Nathan Sidwell ! ! * pt.c (instantiate_pending_templates): Reset template level. ! ! 2000-07-05 Jason Merrill ! ! * call.c (joust): Don't complain about `operator char *()' beating ! `operator const char *() const'. ! ! 2000-07-04 scott snyder ! Jason Merrill ! ! * repo.c (repo_get_id): Handle the case where a class with virtual ! bases has a null TYPE_BINFO_VTABLE. ! ! 2000-07-04 Kevin Buhr ! Jason Merrill ! ! * parse.y (member_init): Just pass in the type. ! * init.c (expand_member_init): Handle getting a type. ! ! 2000-07-04 Martin v. Löwis ! Jason Merrill ! ! * decl.c (finish_function): Warn if a function has no return ! statement. ! Suggested by Andrew Koenig. ! * typeck.c (check_return_expr): Do set current_function_returns_value ! if we got an error_mark_node. ! ! 2000-07-03 Nathan Sidwell ! ! * decl2.c (push_decl_namespace): Push the original namespace. ! ! 2000-07-03 Nathan Sidwell ! ! * pt.c (instantiate_class_template): Set CLASSTYPE_VBASECLASSES. ! * semantics.c (begin_class_definition): Clear it. ! ! 2000-07-02 Benjamin Chelf ! ! * cp-tree.h (genrtl_goto_stmt): Remove declaration. ! (genrtl_expr_stmt): Likewise. ! (genrtl_decl_stmt): Likewise. ! (genrtl_if_stmt): Likewise. ! (genrtl_while_stmt): Likewise. ! (genrtl_do_stmt): Likewise. ! (genrtl_return_stmt): Likewise. ! (genrtl_for_stmt): Likewise. ! (genrtl_break_stmt): Likewise. ! (genrtl_continue_stmt): Likewise. ! (genrtl_scope_stmt): Likewise. ! (genrtl_switch_stmt): Likewise. ! (genrtl_case_label): Likewise. ! (genrtl_begin_compound_stmt): Likewise. ! (genrtl_finish_compound_stmt): Likewise. ! (genrtl_compound_stmt): Likewise. ! (genrtl_asm_stmt): Likewise. ! ! * init.c (begin_init_stmts): Remove call to ! genrtl_begin_compound_stmt. ! (finish_init_stmts): Remove call to genrtl_finish_compound_stmt. ! ! * semantics.c (lang_expand_stmt): Changed call to ! genrtl_compound_stmt to ignore return value. ! ! 2000-07-02 Mark Mitchell ! ! * mangle.c (canonicalize_for_substitution): Return the canonical ! variant of a type. ! ! * decl.c (duplicate_decls): Preserve DECL_ORIGINAL_TYPE for a ! TYPE_DECL. ! * typeck.c (commonparms): Remove obstack manipulations. ! ! 2000-07-01 Benjamin Chelf ! ! * Make-lang.in (cc1plus$(exeext)): Added c-semantics.o. ! ! * Makefile.in (OBJS): Added ../c-semantics.o. ! (OBJDEPS): Likewise. ! ! * cp-tree.h (TREE_LANG_FLAG_?): Moved common documentation to ! ../c-common.h. ! (struct stmt_tree): Added comment. ! (current_function_name_declared): Removed. ! (stmts_are_full_exprs_p): Likewise. ! (genrtl_do_pushlevel): Likewise. ! (genrtl_clear_out_block): Likewise. ! (COMPOUND_STMT_NO_SCOPE): Moved to ../c-common.h. ! (DECL_ANON_UNION_ELEMS): Likewise. ! (emit_local_var): Likewise. ! (make_rtl_for_local_static): Likewise. ! (do_case): Likewise. ! (expand_stmt): Likewise. ! (genrtl_decl_cleanup): Likewise. ! (c_expand_asm_operands): Likewise. ! (c_expand_return): Likewise. ! (c_expand_start_case): Likewise. ! ! * decl.c (make_rtl_for_local_static): Moved to c-semantics.c. ! (emit_local_var): Likewise. ! (initialize_local_var): Change reference to ! stmts_are_full_exprs_p to call to stmts_are_full_exprs_p(). ! Change reference to stmts_are_full_exprs_p to ! current_stmt_tree->stmts_are_full_exprs_p. ! (push_cp_function_context): Likewise. ! ! * expect.c (expand_throw): Change reference to ! stmts_are_full_exprs_p. ! ! * init.c (build_aggr_init): Change reference to ! stmts_are_full_exprs_p. ! (build_vec_init): Likewise. ! ! * optimize.c (maybe_clone_body): Change reference to ! current_function_name_declared to ! cp_function_chain->name_declared. ! ! * pt.c (instantiate_decl): Change reference to ! current_function_name_declared to ! cp_function_chain->name_declared. ! ! * semantics.c (expand_cond): Moved declaration to c-common.h. ! (genrtl_do_pushlevel): Moved to c-semantics.c. ! (genrtl_clear_out_block): Likewise. ! (genrtl_goto_stmt): Likewise. ! (genrtl_expr_stmt): Likewise. ! (genrtl_decl_stmt): Likewise. ! (gerntl_if_stmt): Likewise. ! (genrtl_while_stmt): Likewise. ! (genrtl_do_stmt): Likewise. ! (genrtl_return_stmt): Likewise. ! (genrtl_for_stmt): Likewise. ! (genrtl_break_stmt): Likewise. ! (genrtl_continue_stmt): Likewise. ! (genrtl_scope_stmt): Likewise. ! (genrtl_switch_stmt): Likewise. ! (genrtl_case_label): Likewise. ! (genrtl_begin_compound_stmt): Likewise. ! (genrtl_finish_compound_stmt): Likewise. ! (genrtl_compound_stmt): Likewise. ! (genrtl_asm_stmt): Likewise. ! (genrtl_decl_cleanup): Likewise. ! (expand_cond): Likewise. ! (expand_stmt): Renamed to ... ! (lang_expand_stmt): ... this. ! (lang_expand_expr_stmt): Initialize. ! (set_current_function_name_declared): Likewise. ! (stmts_are_full_exprs_p): Likewise. ! (current_function_name_declared): Likewise. ! (anon_aggr_type_p): Likewise. ! (do_poplevel): Change reference to ! stmts_are_full_exprs_p to call to stmts_are_full_exprs_p(). ! Change reference to stmts_are_full_exprs_p to ! current_stmt_tree->stmts_are_full_exprs_p. ! (add_tree): Likewise. ! (finish_expr_stmt): Likewise. ! (prep_stmt): Likewise. ! (lang_expand_stmt): Likewise. ! (begin_compound_stmt): Change reference to ! current_function_name_declared to ! cp_function_chain->name_declared and call to ! current_function_name_declared(). ! (setup_vtbl_ptr): Likewise. ! (genrtl_do_poplevel): Removed. ! ! 2000-06-30 Jason Merrill ! ! * init.c (init_init_processing): Go back to aligning like ! double_type_node for old ABI. ! (get_cookie_size): Make cookie larger if we get a type that needs ! more alignment. ! (build_vec_delete): Call it. ! ! * typeck.c (qualify_type_recursive): New fn. ! (composite_pointer_type): Use it. ! (build_binary_op): Use composite_pointer_type. ! ! 2000-06-24 Carlos O'Ryan ! Jason Merrill ! ! * typeck.c (check_return_expr): Don't complain about returning ! NULL from operator new if -fcheck-new. ! * cp-tree.h: Declare flag_check_new here. ! * init.c: Not here. ! ! 2000-06-28 Alex Samuel ! ! * mangle.c (find_substitution): Use same_type_p. ! (write_encoding): Don't check for substitutions. ! ! 2000-06-30 Nathan Sidwell ! ! * parse.y (expr_no_comma_rangle): New non-terminal. ! (template_parm): Use it for default parameter case. ! (template_arg): Use it. ! (expr_no_commas): Remove commented out undefined extensions. ! * Makefile.in (CONFLICTS): Adjust to 33 s/r & 48 r/r. ! * parse.h, parse.c: Rebuilt. ! ! 2000-06-30 Mark Mitchell ! ! * semantics.c (genrtl_asm_stmt): Don't decay input operands here. ! (finish_asm_stmt): Do it here, instead. ! ! * cp-tree.h (ridpointers): Don't declare. ! * decl.c (record_builtin_type): Use CP_RID_MAX instead of RID_MAX. ! (record_builtin_java_type): Likewise. ! (init_decl_processing): Likewise. ! * lex.c: Move inclusion of lex.h. ! (ridpointers): Don't define. ! (init_parse): Initialize ripdointers. Use CP_RID_MAX instead of ! RID_MAX. ! * lex.h (enum rid): Rename to ... ! (enum cp_rid): ... this. ! (ridpointers): Don't declare. ! * parse.y: Move inclusion of lex.h. ! * parse.c: Regenerated. ! * spew.c: Move inclusion of lex.h. ! ! * cp-tree.h (struct language_function): Remove temp_name_counter. ! (temp_name_counter): Remove. ! (get_temp_name): Change prototype. ! (get_guard): New function. ! (get_guard_cond): Likewise. ! (set_guard): Likewise. ! * cvt.c (build_up_reference): Adjust call to get_temp_name. ! * decl.c (expand_static_init): Use get_guard and friends to ! implement guard variables. ! * decl2.c (get_temp_name): Assume that the variables created are ! always static. ! (get_sentry): Rename to ... ! (get_guard): ... this. Implement new ABI guard variables. ! (get_guard_bits): New function. ! (get_guard_cond): Likewise. ! (set_guard): Likewise. ! (start_static_initialization_or_destruction): Use them. ! (do_static_initialization): Replace sentry with guard throughout. ! (do_static_destruction): Likewise. ! * init.c (create_temporary_var): Add comment. ! ! 2000-06-28 Alex Samuel ! ! * mangle.c (find_substitution): Use same_type_p. ! (write_encoding): Don't check for substitutions. ! ! 2000-06-30 Nathan Sidwell ! ! * parse.y (expr_no_comma_rangle): New non-terminal. ! (template_parm): Use it for default parameter case. ! (template_arg): Use it. ! (expr_no_commas): Remove commented out undefined extensions. ! * Makefile.in (CONFLICTS): Adjust to 33 s/r & 48 r/r. ! * parse.h, parse.c: Rebuilt. ! ! 2000-06-29 Mark Mitchell ! ! * cp-tree.h (flag_const_strings): Remove. ! (warn_parentheses): Likewise. ! (warn_format): Likewise. ! (common_type): Likewise. ! (default_conversion): Likewise. ! (build_binary_op): Likewise. ! (cp_build_binary_op): New macro. ! * call.c (build_new_op): Use cp_build_binary_op instead of ! build_binary_op. ! * class.c (build_vtable_entry_ref): Likewise. ! * decl.c (expand_static_init): Likewise. ! (compute_array_index_type): Likewise. ! (build_enumerator): Likewise. ! * decl2.c (delete_sanity): Likewise. ! (start_static_initialization_or_destruction): Likewise. ! * error.c (dump_type_suffix): Likewise. ! * init.c (resolve_offset_ref): Likewise. ! (build_new): Likewise. ! (build_new_1): Likewise. ! (build_vec_delete_1): Likewise. ! (build_vec_init): Likewise. ! (build_delete): Likewise. ! * rtti.c (synthesize_tinfo_fn): Likewise. ! (synthesize_tinfo_var): Likewise. ! * search.c (expand_upcast_fixups): Likewise. ! (fixup_all_virtual_upcast_offsets): Likewise. ! * typeck.c (build_array_ref): Likewise. ! (get_member_function_from_ptrfunc): Likewise. ! (build_binary_op): Add parameter. ! (pointer_int_sum): Use cp_build_binary_op. ! (pointer_diff): Likewise. ! (build_modify_expr): Likewise. ! (get_delta_difference): Likewise. ! (build_ptrmemfunc): Likewise. ! ! 2000-06-29 Nathan Sidwell ! ! * cp-tree.h (SET_DECL_ARTIFICIAL): Remove. ! * decl.c (create_implicit_typedef): Adjust. ! * decl2.c (build_artificial_parm): Adjust. ! * method.c (implicitly_declare_fn): Adjust. ! * pt.c (push_inline_template_parms_recursive): Adjust. ! (process_template_parm): Adjust. ! (overloaded_template_name): Adjust. ! * semantics.c (finish_template_template_parm): Adjust. ! ! 2000-06-28 Mark Mitchell ! ! * cp-tree.h (CLEAR_BINFO_NEW_VTABLE_MARKED): Remove. ! * class.c (update_vtable_entry_for_fn): Correct logic for deciding ! where to emit thunks. ! (build_vtt): Adjust call to build_vtt_inits. ! (build_vtt_inits): Add parameter to indicate whether or not ! sub-VTTs for virtual bases should be included. Adjust handling of ! construction vtables. ! (get_matching_base): New function. ! (dfs_build_vtt_inits): Rename to ... ! (dfs_build_secondary_vptr_vtt_inits): Adjust handling of ! construction vtables. ! (dfs_fixup_binfo_vtbls): Likewise. ! (build_ctor_vtbl_groups): Build construction vtables for virtual ! bases, too. ! (accumulate_vtbl_inits): Tweak logic for deciding whether or not ! to build construction vtbls. ! (dfs_accumulate_vtbl_inits): Adjust handling of ! construction vtables. ! ! * pt.c (tsubst, case TEMPLATE_TEMPLATE_PARM): Handle cv-qualified ! types correctly. ! ! 2000-06-27 Mark Mitchell ! ! * decl.c (grokfndecl): Set DECL_CONTEXT for static functions too. ! ! 2000-06-26 Nathan Sidwell ! ! * search.c (hides): Remove. ! (is_subobject_of_p): Add most_derived parameter. Use ! CANONICAL_BINFO. ! (lookup_field_queue_p): Adjust. ! (lookup_field_r): Adjust. ! ! 2000-06-26 Nathan Sidwell ! ! * decl2.c (handle_class_head): Bash typedefs to the type's main ! decl. ! ! 2000-06-25 Mark Mitchell ! ! * cp-tree.h (genrtl_begin_stmt_expr): Rename to ... ! (begin_global_stmt_expr): ... this. ! (genrtl_finish_stmt_expr): Rename to ... ! (finish_global_stmt_expr): ... this. ! * init.c (begin_init_stmts): Adjust calls. ! (finish_init_stmts): Likewise. ! * semantics.c (genrtl_begin_stmt_expr): Rename to ... ! (begin_global_stmt_expr): ... this. ! (genrtl_finish_stmt_expr): Rename to ... ! (finish_global_stmt_expr): ... this. ! ! 2000-06-25 Theodore Papadopoulo ! ! * search.c (lookup_member): Fix typo in comment. ! ! 2000-06-24 Jason Merrill ! ! * decl.c (pushdecl): Don't set DECL_CONTEXT from current_namespace. ! (push_namespace): Set DECL_CONTEXT for a new NAMESPACE_DECL. ! ! 2000-06-24 Martin v. Löwis ! ! * parse.y (complex_direct_notype_declarator): Support global_scope. ! * Makefile.in: Adjust conflict count. ! ! 2000-06-23 Kriang Lerdsuwanakij ! ! * parse.y (template_arg): Convert TEMPLATE_DECL ! that is a template template parameter to ! TEMPLATE_TEMPLATE_PARM here. ! ! * cp-tree.def (TEMPLATE_TEMPLATE_PARM): Adjust comment. ! * cp-tree.h (TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL): New macro. ! (copy_template_template_parm): Adjust prototype. ! * decl.c (grokdeclarator): Remove dead code. ! * pt.c (process_template_parm): Tidy. ! (lookup_template_class): Construct nodes in ! copy_template_template_parm. ! (tsubst): Pass TEMPLATE_DECL rather than IDENTIFIER_NODE to ! lookup_template_class. Use TYPE_TI_TEMPLATE. ! * tree.c (copy_template_template_parm): Add NEWARGS ! parameter. ! (mapcar): Adjust call to copy_template_template_parm. ! * typeck.c (comptypes): Use TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL. ! * method.c (build_template_template_parm_names): Change error ! code to avoid compilation warning. ! ! * gxxint.texi: Document template template parameter ! name mangling. ! ! 2000-06-21 Alex Samuel ! ! * Make-lang.in (CXX_LIB2FUNCS): Add cp-demangle.o and dyn-string.o. ! (CXX_LIB2SRCS): Add cp-demangle.c and dyn-string.c. ! (cp-demangle.o): New rule. ! (dyn-string.o): Likewise. ! * inc/cxxabi.h (__cxa_demangle): New declaration. ! ! 2000-06-22 Mark Mitchell ! ! * cp-tree.h (BV_USE_VCALL_INDEX_P): New macro. ! (BV_GENERATE_THUNK_WITH_VTABLE_P): Likewise. ! (lang_decl_flags): Add generate_with_vtable_p. Make vcall_offset ! a tree, not an int. ! (THUNK_GENERATE_WITH_VTABLE_P): New macro. ! (make_thunk): Change prototype. ! (emit_thunk): Rename to use_thunk. ! (mangle_thunk): Change prototype. ! * class.c (get_derived_offset): Simplify. ! (copy_virtuals): Clear BV_USE_VCALL_INDEX_P and ! BV_GENERATE_THUNK_WITH_VTABLE_P. ! (build_primary_vtable): Simplify. ! (add_virtual_function): Use BV_FN, rather than TREE_VALUE. ! (dfs_find_base): Remove. ! (update_vtable_entry_for_fn): Correct bug in finding the base ! where a virtual function was first declared. Figure out whether ! or not to emit a vcall-thunk with the vtables in which it appears. ! Correct logic for deciding whether to use an ordinary thunk, or a ! vcall thunk. ! (finish_struct_1): Remove unnecssary code. ! (build_vtbl_initializer): Use ssize_int for the running counter of ! negative indices. ! (build_vtbl_initializer): Only use vcall thunks where necessary. ! Mark thunks as needing to be emitted with their vtables, or not. ! (build_vbase_offset_vtbl_entries): Adjust for use of ssize_int in ! indices. Use size_binop. ! (dfs_build_vcall_offset_vtbl_entries): Don't rely on ! BINFO_PRIMARY_MARKED_P here. Use BV_FN consistently. Use ! size_binop. ! (build_rtti_vtbl_entries): Adjust call to build_vtable_entry. ! (build_vtable_entry): Mark thunks as needing to be emitted with ! their vtables, or not. ! * decl.c (lang_mark_tree): Mark the vcall_offset in a thunk. ! * decl2.c (mark_vtable_entries): Use use_thunk instead of ! emit_thunk. ! * dump.c (dequeue_and_dump): Remove dead code. Dump new thunk ! information. ! * error.c (dump_expr): Use BV_FN. ! * mangle.c (mangle_thunk): Adjust now that vcall_offset is a tree, ! not an int. ! * method.c (make_thunk): Likewise. ! (emit_thunk): Rename to use_thunk. Allow callers to decide ! whether or not to actually emit the thunk. Adjust for changes in ! representation of vcall offsets. ! * search.c (dfs_get_pure_virtuals): Use BV_FN. ! * semantics.c (emit_associated_thunks): New function. ! (expand_body): Use it. ! * ir.texi: Adjust decriptions of thunks. ! ! 2000-06-22 Jason Merrill ! ! * pt.c (tsubst_decl, case FUNCTION_DECL): Clear DECL_SAVED_TREE. ! (tsubst_friend_function): Copy it here. ! ! * decl.c (grok_op_properties): Fix typo. ! ! * decl2.c (delete_sanity): Clarify warning, avoid failure on ! deleting void*. ! ! * pt.c (check_explicit_specialization): Clarify error. ! ! * decl.c (pushdecl): Also pull out one of the FUNCTION_DECLs from ! an old OVERLOAD when we're declaring a non-function. ! (pushdecl, destroy_local_var): Check for error_mark_node. ! (warn_extern_redeclared_static): Also bail early if ! we're a CONST_DECL. ! (push_overloaded_decl): Ignore an old error_mark_node. ! ! 2000-06-22 Nathan Sidwell ! ! * call.c (build_x_va_arg): Check if in a template decl. ! * pt.c (tsubst_copy, case VA_ARG_EXPR): Use build_x_va_arg. ! ! 2000-06-20 Alexandre Petit-Bianco ! ! * class.c (push_lang_context): TYPE_NAME gets you to the Java ! types DECLs. ! * decl.c (check_goto): Computed gotos assumed OK. ! ! 2000-06-20 Jason Merrill ! ! * pt.c (tsubst_decl, case TYPE_DECL): Fix test for TYPE_DECLs ! for which we don't need to look for instantiations. ! ! 2000-06-21 Nathan Sidwell ! ! * parse.y (program): Always call finish_translation_unit. ! * parse.c, parse.h: Rebuilt. ! ! 2000-06-20 Zack Weinberg ! ! * method.c: Don't include hard-reg-set.h. ! ! 2000-06-20 Nathan Sidwell ! ! * rtti.c (get_base_offset): Cope when vbase field is in a base. ! ! 2000-06-20 Nathan Sidwell ! ! * call.c (build_conditional_expr): Use VOID_TYPE_P. ! * cvt.c (cp_convert_to_pointer): Likewise. ! (convert_to_void): Likewise. ! * error.c (dump_expr): Likewise. ! * except.c (complete_ptr_ref_or_void_ptr_p): Likewise. ! * init.c (build_delete): Likewise. ! * method.c (emit_thunk): Likewise. ! * optmize.c (declare_return_variable): Likewise. ! * rtti.c (get_tinfo_decl_dynamic): Likewise. ! (get_typeid): Likewise. ! (build_dynamic_cast_1): Likewise. ! * typeck.c (composite_pointer_type): Likewise. ! (common_type): Likewise. ! (build_indirect_ref): Likewise. ! (build_binary_op): Likewise. ! (build_x_compound_expr): Likewise. ! (check_return_expr): Likewise. ! * typeck2.c (add_exception_specifier): Likewise. ! ! * mangle.c (write_method_parms): Use direct comparison for end ! of parmlist. ! ! 2000-06-19 Benjamin Chelf ! ! * cp-tree.h (genrtl_try_block): Declare function. ! (genrtl_handler): Likewise. ! (genrtl_catch_block): Likewise. ! (genrtl_ctor_stmt): Likewise. ! (genrtl_subobject): Likewise. ! (genrtl_decl_cleanup): Likewise. ! (genrtl_do_poplevel): Likewise. ! (genrtl_do_pushlevel): Likewise. ! (genrtl_clear_out_block): Likewise. ! (genrtl_goto_stmt): Likewise. ! (genrtl_expr_stmt): Likewise. ! (genrtl_decl_stmt): Likewise. ! (genrtl_if_stmt): Likewise. ! (genrtl_while_stmt): Likewise. ! (genrtl_do_stmt): Likewise. ! (genrtl_return_stmt): Likewise. ! (genrtl_for_stmt): Likewise. ! (genrtl_break_stmt): Likewise. ! (genrtl_continue_stmt): Likewise. ! (genrtl_scope_stmt): Likewise. ! (genrtl_switch_stmt): Likewise. ! (genrtl_case_label): Likewise. ! (genrtl_begin_compound_stmt): Likewise. ! (genrtl_finish_compound_stmt): Likewise. ! (genrtl_compound_stmt): Likewise. ! (genrtl_asm_stmt): Likewise. ! (genrtl_named_return_value): Likewise. ! (genrtl_begin_stmt_expr): Likewise. ! (genrtl_finish_stmt_expr): Likewise. ! (finish_for_stmt): Removed first argument. ! (finish_switch_stmt): Likewise. ! ! * semantics.c (genrtl_try_block): Define function. ! (genrtl_handler): Likewise. ! (genrtl_catch_block): Likewise. ! (genrtl_ctor_stmt): Likewise. ! (genrtl_subobject): Likewise. ! (genrtl_decl_cleanup): Likewise. ! (genrtl_do_poplevel): Likewise. ! (genrtl_do_pushlevel): Likewise. ! (genrtl_clear_out_block): Likewise. ! (genrtl_goto_stmt): Likewise. ! (genrtl_expr_stmt): Likewise. ! (genrtl_decl_stmt): Likewise. ! (genrtl_if_stmt): Likewise. ! (genrtl_while_stmt): Likewise. ! (genrtl_do_stmt): Likewise. ! (genrtl_return_stmt): Likewise. ! (genrtl_for_stmt): Likewise. ! (genrtl_break_stmt): Likewise. ! (genrtl_continue_stmt): Likewise. ! (genrtl_scope_stmt): Likewise. ! (genrtl_switch_stmt): Likewise. ! (genrtl_case_label): Likewise. ! (genrtl_begin_compound_stmt): Likewise. ! (genrtl_finish_compound_stmt): Likewise. ! (genrtl_compound_stmt): Likewise. ! (genrtl_asm_stmt): Likewise. ! (genrtl_named_return_value): Likewise. ! (genrtl_begin_stmt_expr): Likewise. ! (genrtl_finish_stmt_expr): Likewise. ! (finish_for_stmt): Removed first argument and generate rtl ! specific code. ! (finish_switch_stmt): Likewise. ! (do_poplevel): Removed generate rtl specific code. ! (do_pushlevel): Likewise. ! (add_tree): Likewise. ! (finish_goto_stmt): Likewise. ! (finish_expr_stmt): Likewise. ! (begin_if_stmt): Likewise. ! (finish_if_stmt_cond): Likewise. ! (finish_then_clause): Likewise. ! (begin_else_clause): Likewise. ! (finish_else_clause): Likewise. ! (finish_if_stmt): Likewise. ! (clear_out_block): Likewise. ! (begin_while_stmt): Likewise. ! (finish_while_stmt_cond): Likewise. ! (finish_while_stmt): Likewise. ! (begin_do_stmt): Likewise. ! (finish_do_body): Likewise. ! (finish_do_stmt): Likewise. ! (finish_return_stmt): Likewise. ! (begin_for_stmt): Likewise. ! (finish_for_init_stmt): Likewise. ! (finish_for_cond): Likewise. ! (finish_for_expr): Likewise. ! (finish_break_stmt): Likewise. ! (finish_continue_stmt): Likewise. ! (begin_switch_stmt): Likewise. ! (finish_switch_cond): Likewise. ! (finish_case_label): Likewise. ! (begin_try_block): Likewise. ! (begin_function_try_block): Likewise. ! (finish_try_block): Likewise. ! (finish_cleanup_try_block): Likewise. ! (finish_cleanup): Likewise. ! (finish_function_try_block): Likewise. ! (finish_handler_sequence): Likewise. ! (finish_function_handler_sequence): Likewise. ! (begin_handler): Likewise. ! (finish_handler_parms): Likewise. ! (begin_catch_block): Likewise. ! (finish_handler): Likewise. ! (begin_compound_stmt): Likewise. ! (finish_compound_stmt): Likewise. ! (finish_asm_stmt): Likewise. ! (finish_label_stmt): Likewise. ! (finish_label_decl): Likewise. ! (finish_subobject): Likewise. ! (finish_decl_cleanup): Likewise. ! (finish_named_return_value): Likewise. ! (begin_stmt_expr): Likewise. ! (finish_stmt_expr): Likewise. ! ! * decl.c (initialize_local_var): Changed call to finish_expr_stmt ! to call genrtl_expr_stmt when appropriate. ! ! * init.c (begin_init_stmts): Changed calls to begin_stmt_expr and ! begin_compound_expr to call genrtl_begin_stmt_expr and ! genrtl_begin_compound_expr when appropriate. ! (finish_init_stmts): Changed calls to finish_compound_expr and ! finish_stmt_expr to call genrtl_finish_compound_expr and ! genrtl_finish_stmt_expr when appropriate. ! (expand_default_init): Changed call to finish_expr_stmt to call ! genrtl_expr_stmt when appropriate. ! (build_vec_init): Likewise. ! ! * parse.y (simple_stmt): Removed first argument from call to ! finish_for_stmt. Removed first argument from call to ! finish_switch_stmt. ! ! * parse.c: Regenerated. ! ! * pt.c (tsubst_expr): Removed first argument from call to ! finish_for_stmt. Removed first argument from call to ! finish_switch_stmt. ! ! 2000-06-16 Benjamin Chelf ! ! * cp-tree.h (enum cplus_tree_code): Changed __DUMMY to ! CP_DUMMY_TREE_CODE. Remove #include "c-common.def". ! ! * lex.c (cplus_tree_code_type[]): Removed #include "c-common.def". ! (cplus_tree_code_length[]): Likewise. ! (cplus_tree_code_name[]): Likewise. ! (init_parse): Added call to add_c_tree_codes. Changed ! LAST_AND_UNUSED_TREE_CODE to LAST_C_TREE_CODE. ! ! 2000-06-16 Mark Mitchell ! ! * cp-tree.h (finish_mem_initializers): Declare. ! (count_trees): Likewise. ! * parse.y (base_init): Use finish_mem_initializers. ! * semantics.c (finish_mem_initializers): New function. ! ! * tree.c (count_trees_r): Prototype. Use DATA parameter to store ! the number of trees. ! (n_trees): Remove. ! (count_trees): Don't use it. ! ! 2000-06-15 Jason Merrill ! ! * tree.c (count_trees): New debugging function. ! ! * typeck.c (build_x_function_call): Use DECL_FUNCTION_TEMPLATE_P. ! * init.c (build_member_call): Pull out the name of a DECL. ! ! * Makefile.in (semantics.o, pt.o): Depend on TIMEVAR_H. ! * semantics.c (expand_body): Push to TV_INTEGRATION here. ! * optimize.c (optimize_function): Not here. ! * pt.c (instantiate_decl): Push to TV_PARSE. ! ! 2000-06-15 Mark Mitchell ! ! * cp-tree.h (struct language_function): Remove x_base_init_list ! and x_member_init_list. ! (current_base_init_list): Remove. ! (current_member_init_list): Likewise. ! (setup_vtbl_ptr): Change prototype. ! (emit_base_init): Likewise. ! (expand_member_init): Likewise. ! (reinit_parse_for_function): Remove. ! * decl.c (save_function_data): Don't clear x_base_init_list and ! x_member_init_list. ! (mark_language_function): Don't mark them. ! * init.c (perform_member_init): Tweak comment. ! (sort_member_init): Take the list of initializers as an argument. ! (sort_base_init): Likewise. ! (emit_base_init): Likewise. ! (expand_member_init): Return the initializer. Don't use global ! variables. ! * lex.c (reinit_parse_for_function): Remove. ! * method.c (build_template_parm_names): Correct substitution. ! (do_build_copy_constructor): Don't use current_member_init_list ! and current_base_init_list. ! (synthesize_method): Likewise. ! * parse.y (base_init): Split mem-initializers into ! base-initializers and field-initializers. ! (member_init_list): Build up the list here. ! (member_init): Return the initializer. ! (fn.depfn): Don't use reinit_parse_for_function. ! * parse.c: Regenerated. ! * pt.c (convert_nontype_argument): Don't make an ADDR_EXPR of the ! ERROR_MARK. ! (tsubst_expr): Don't use current_member_init_list ! and current_base_init_list. ! (tsubst_expr_values): Rename to ... ! (tsubst_initializer_list): ... this. Use convert_from_reference. ! * semantics.c (setup_vtbl_ptr): Don't use current_member_init_list ! and current_base_init_list. ! (begin_function_definition): Don't call reinit_parse_for_function. ! ! * dump.c (dequeue_and_dump): Use TREE_VEC_LENGTH with vectors. ! ! * error.c (dump_expr): Handle ADDR_EXPRs with REFERENCE_TYPE ! correctly. ! ! * cp-tree.h (DECL_PENDING_INLINE_P): Relax checking. ! ! 2000-06-14 Benjamin Chelf ! ! * cp-tree.h (IF_COND): Move to c-common.h. ! (THEN_CLAUSE): Likewise. ! (ELSE_CLAUSE): Likewise. ! (WHILE_COND): Likewise. ! (WHILE_BODY): Likewise. ! (DO_COND): Likewise. ! (DO_BODY): Likewise. ! (RETURN_EXPR): Likewise. ! (EXPR_STMT_EXPR): Likewise. ! (FOR_INIT_STMT): Likewise. ! (FOR_COND): Likewise. ! (FOR_EXPR): Likewise. ! (FOR_BODY): Likewise. ! (SWITCH_COND): Likewise. ! (SWITCH_BODY): Likewise. ! (CASE_LOW): Likewise. ! (CASE_HIGH): Likewise. ! (GOTO_DESTINATION): Likewise. ! (COMPOUND_BODY): Likewise. ! (ASM_CV_QUAL): Likewise. ! (ASM_STRING): Likewise. ! (ASM_OUTPUTS): Likewise. ! (ASM_INPUTS): Likewise. ! (ASM_CLOBBERS): Likewise. ! (DECL_STMT_DECL): Likewise. ! (STMT_EXPR_STMT): Likewise. ! (LABEL_STMT_LABEL): Likewise. ! (SCOPE_BEGIN_P): Likewise. ! (SCOPE_END_P): Likewise. ! (SCOPE_STMT_BLOCK): Likewise. ! (SCOPE_NULLIFIED_P): Likewise. ! (SCOPE_NO_CLEANUPS_P): Likewise. ! (SCOPE_PARTIAL_P): Likewise. ! (ASM_VOLATILE_P): Likewise. ! (STMT_LINENO): Likewise. ! (STMT_LINENO_FOR_FN_P): Likewise. ! ! * cp-tree.def: Removed SRCLOC, SIZEOF_EXPR, ARROW_EXPR, ! ALIGNOF_EXPR, EXPR_STMT, COMPOUND_STMT, DECL_STMT, IF_STMT, ! FOR_STMT, WHILE_STMT, DO_STMT, RETURN_STMT, BREAK_STMT, ! CONTINUE_STMT, SWITCH_STMT, GOTO_STMT, LABEL_STMT, ASM_STMT, ! SCOPE_STMT, CASE_LABEL, STMT_EXPR. ! ! * Makefile.in (CXX_TREE_H): Added $(srcdir)/../c-common.def. ! ! * Make-lang.in (CXX_SRCS): Added $(srcdir)/c-common.def. ! (cc1plus$(exeext)): Added $(srcdir)/c-common.def. ! ! * lex.c (cplus_tree_code_type[]): Added '#include "c-common.def"'. ! (cplus_tree_code_length[]): Added '#include "c-common.def"'. ! (cplus_tree_code_name[]): Added '#include "c-common.def"'. ! ! 2000-06-14 Mark Mitchell ! ! * cp-tree.h (BINFO_OVERRIDE_ALONG_VIRTUAL_PATH): New macro. ! * class.c (dfs_find_final_overrider): Set it appropriately. ! (dfs_built_vtt_inits): Check BINFO_OVERRIDE_ALONG_VIRTUAL_PATH to ! avoid unneeded secondary vptrs. ! ! 2000-06-13 Jakub Jelinek ! ! * class.c (build_secondary_vtable): Set DECL_USER_ALIGN. ! (check_bitfield_decl, check_field_decl): Likewise. ! (build_vtbl_or_vbase_field, build_base_field): Likewise. ! (layout_class_type): Set DECL_USER_ALIGN resp. CLASSTYPE_USER_ALIGN. ! * decl.c (record_unknown_type): Set TYPE_USER_ALIGN. ! (xfer_tag, finish_enum): Likewise. ! * decl2.c (finish_builtin_type): Likewise. ! * init.c (init_init_processing): Likewise. ! * pt.c (instantiate_class_template): Likewise. ! * rtti.c (get_tinfo_decl, synthesize_tinfo_fn): Set DECL_USER_ALIGN. ! * cp-tree.h (struct lang_type): Add user_align member. ! (CLASSTYPE_USER_ALIGN): Define. ! ! Tue Jun 13 15:48:03 2000 Maciej W. Rozycki ! ! * Make-lang.in (c++.install-common): Install g++-cross in ! $(gcc_tooldir)/bin as g++ and c++; g++ in $(bindir) as ! $(target_alias)-g++ and $(target_alias)-c++. ! ! 2000-06-12 Mark Mitchell ! ! * class.c (vcall_offset_data_s): Add last_init and fns. ! (overrides): Rename to same_signature_p. ! (dfs_find_final_overrider): Adjust accordingly. ! (mark_overriders): Likewise. ! (warn_hidden): Likewise. ! (build_vtbl_initializer): Reorganize machinery for building things ! at negative offsets. ! (build_vcall_and_vbase_vtbl_entries): Likewise. ! (build_vbase_offset_vtbl_entries): Likewise. ! (dfs_build_vcall_offset_vtbl_entries): Correct order of vcall ! offset entries. Do not create two entries for functions with the ! same signature. ! (build_vcall_offset_vtbl_entries): Initialize vod->fns. ! (build_rtti_vtbl_entries): Reorganize machinery for building things ! at negative offsets. ! ! * optimize.c (expand_call_inline): Don't recurse into the code ! used to initialize the parameters more than once. ! ! 2000-06-11 Mark Mitchell ! ! * mangle.c (NESTED_TEMPLATE_MATCH): Fix typo in comment. ! (is_std_substitution): Don't check CLASSTYPE_USE_TEMPLATE here. ! (find_substitution): Only use the `Sa' substitution for ! std::allocator, not instantiations of it. ! (write_template_prefix): Move comment. Only use a TREE_LIST to ! represent substitutions for a member template. ! (write_array_type): Mangle array dimensions correctly. ! * optimize.c (maybe_clone_body): Copy more information from the ! cloned function. ! * pt.c (regenerate_decl_from_template): Preserve DECL_USE_TEMPLATE ! on the regenerated declaration. ! ! 2000-06-11 Chip Salzenberg ! Mark Mitchell ! ! * class.c (build_vtable): Clarify comment. ! (build_ctor_vtbl_group): Pass the most derived type to ! build_vtable. ! ! 2000-06-11 Kaveh R. Ghazi ! ! * decl2.c (compare_options): Don't needlessly cast away const-ness. ! ! 2000-06-10 Mark Mitchell ! ! * decl.c (add_binding): Handle duplicate declarations of external ! variables. ! ! 2000-06-09 Chip Salzenberg ! Mark Mitchell ! ! * mangle.c (write_number): Take an unsigned HOST_WIDE_INT as an ! argument. ! (write_signed_number): New macro. ! (write_unsigned_number): Likewise. ! (write_source_name): Use them. ! (write_number): Handle signed and unsigned values. ! (write_integer_cst): Use tree_int_cst_sgn, and use ! write_unsigned_number or write_signed_number as appropriate. ! (write_discriminator): Use write_unsigned_number or ! write_signed_number as appropriate. ! (write_template_arg_literal): Likewise. ! (write_array_type): Use tree_low_cst. ! (write_template_parm): Use write_unsigned_number or ! write_signed_number as appropriate. ! (write_substitution): Adjust call to write_number. ! (write_type): Get the TYPE_MAIN_VARIANT before mangling it. ! (write_expression): Handle non-type template arguments of ! reference type correctly. ! (mangle_thunk): Use write_signed_number. ! ! 2000-06-09 Chip Salzenberg ! ! * mangle.c (find_substition): Don't mangle objects with typename ! substitutions (e.g. "cin" as "Si"). ! ! 2000-06-09 Zack Weinberg ! ! * call.c (add_candidate): Use ggc_alloc_cleared. ! * decl.c (lookup_label): Likewise. ! * lex.c (retrofit_lang_decl): Likewise. ! ! 2000-06-09 Jason Merrill ! ! * semantics.c (expand_body): Push to TV_EXPAND. ! * optimize.c (optimize_function): Push to TV_INTEGRATION. ! * decl.c (start_function): Always call announce_function. ! ! * tinfo2.cc: Just declare abort. ! ! 2000-06-09 Gabriel Dos Reis ! ! * lex.c (DEF_OPERATOR): Say `operator@' -not- `operator @' ! whenever @ is a symbolic name. ! ! 2000-06-08 Jakub Jelinek ! ! * method.c (make_thunk): Clear DECL_VTT_PARM in thunk. ! ! 2000-06-07 Mark Mitchell ! ! * decl.c (pushdecl): Look up functions by DECL_NAME, not ! DECL_ASSEMBLER_NAME. ! ! 2000-06-06 Mark Mitchell ! ! * decl2.c (c_language): Define. ! ! 2000-06-06 Gabriel Dos Reis ! ! * lex.c (lang_init_options): Tweak. ! ! * decl2.c: Remove #inclusion of diagnostic.h ! (lang_decode_option): Move diagnostic formatting options to ! toplevel. ! ! * lang-options.h: Remove documentation for diagnostic options. ! ! * Makefile.in (lex.o): Depends upon diagnostic.h ! ! 2000-06-06 Mark Mitchell ! ! * decl.c (redeclaration_error_message): If two TEMPLATE_DECLs have ! the same DECL_RESULT, it's not a redefinition. ! * pt.c (tsubst_decl): Remove code to handle illegal ! specializations. ! ! 2000-06-06 Nathan Sidwell ! ! * exception.cc: (__eh_alloc, __eh_free): Moved to libgcc2.c ! ! 2000-06-05 Jason Merrill ! ! * search.c (maybe_suppress_debug_info): Don't check ! CLASSTYPE_INTERFACE_ONLY if CLASSTYPE_INTERFACE_KNOWN isn't set. ! ! * pt.c (mark_decl_instantiated): Do SET_DECL_EXPLICIT_INSTANTIATION ! here if extern_p. ! ! Remember instantiation context in deferred instantiations. ! * cp-tree.h (struct tinst_level): Remove. ! (TINST_DECL, TINST_LINE, TINST_FILE): New macros. ! * pt.c (current_tinst_level): Now a tree. ! (print_template_context, push_tinst_level, pop_tinst_level, ! tinst_for_decl): Adjust. ! (reopen_tinst_level): New fn. ! (init_pt): Register current_tinst_level as a root. ! (add_pending_template): Put current_tinst_level in TREE_PURPOSE ! of the pending templates list. ! (instantiate_pending_templates): Adjust. Call reopen_tinst_level. ! * lex.c (extract_interface_info): Adjust. ! * decl2.c (warn_if_unknown_interface): Adjust. ! ! 2000-06-05 Mark Mitchell ! ! * class.c (indirect_primary_base_p): New function. ! (determine_primary_base): Use it. ! ! 2000-06-05 Nathan Sidwell ! ! Update new-abi dynamic cast algorithm. ! * tinfo.cc (__class_type_info::__dyncast_result): Add ! whole_details. Adjust constructor. ! (__vmi_class_type_info::__do_dyncast): Adjust for vmi_flags. ! Avoid unnecessary searching. ! (__dynamic_cast): Adjust for __dyncast_result::whole_details. ! ! Mon Jun 5 06:48:55 2000 Richard Kenner ! ! * decl.c (init_decl_processing): Don't call record_component_aliases. ! * tree.c (build_cplus_array_type_1): Likewise. ! ! 2000-06-04 Mark Mitchell ! ! * ir.texi: Correct typo. ! * mangle.c (write_expression): Handle non-type template arguments ! with reference type. ! * method.c (build_overload_value): Likewise. ! * pt.c (convert_nontype_argument): Explicitly represent conversion ! to a reference with an ADDR_EXPR. ! (unify): Always unify arguments in left-to-right order. ! ! 2000-06-03 Alex Samuel ! Mark Mitchell ! ! * Make-lang.in (CXX_SRCS): Add mangle.c. ! * Makefile.in (CXX_OBJS): Add mangle.o. ! (mangle.o): New rule. ! ! * class.c (local_classes): New variable. ! * class.c (get_vtable_name): Use mangle_vtable_for_type for new ABI. ! (get_vtt_name): Use mangle_vtt_name for new ABI. ! (init_class_processing): Initialize local_classes. ! (build_ctor_vtbl_group): Use mangle_ctor_vtbl_for_type for new ABI. ! * cp-tree.h (cp_tree_index): Add CPTI_STD_IDENTIFIER. ! (std_identifier): New macro. ! (DECL_VOLATILE_MEMFUNC_P): New macro. ! (DECL_NAMESPACE_STD_P): Likewise. ! (local_classes): Declare. ! (get_mostly_instantiated_function_type): Declare. ! (init_mangle): Declare. ! (mangle_decl): Likewise. ! (mangle_type_string): Likewise. ! (mangle_type): Likewise. ! (mangle_typeinfo_for_type): Likewise. ! (mangle_typeinfo_string_for_type): Likewise. ! (mangle_vtbl_for_type): Likewise. ! (mangle_vtt_for_type): Likewise. ! (mangle_ctor_vtbl_for_type): Likewise. ! (mangle_thunk): Likewise. ! (mangle_conv_op_name_for_type): Likewise. ! (mangle_guard_variable): Likewise. ! * decl.c (pushtag): Keep track of local classes. ! (initialize_predefined_identifiers): Initialize std_identifier. ! (init_decl_processing): Use std_identifier. ! (start_decl): Don't treat instantiations as specializations. ! (grokdeclarator): Likewise. ! (grokvardecl): Call mangle_decl for new ABI. Only set mangled ! name for fully-instantiated templates. ! * decl2.c (grokclassfn): Use set_mangled_name_for_decl for ! destructors with the new ABI. ! (finish_static_data_member_decl): Use mangle_decl under the new ABI. ! (grokfield): Use mangle_type for new ABI. ! (grokoptypename): Use mangle_conv_op_for_type for new ABI. ! (get_sentry): Use mangle_guard_variable for new ABI. ! (start_static_initialization_or_destruction): Likewise. ! * expr.c (extract_aggr_init): Remove. ! (extract_scalar_init): Likewise. ! (extract_init): Remove #if 0'd code. ! * mangle.c: New function. ! * method.c (build_mangled_name): Assert not flag_new_abi. ! (build_static_name): Likewise. ! (build_decl_overload_real): Likewise. ! (build_typename_overload): Likewise. ! (build_overload_with_type): Likewise. ! (build_overload_name): Likewise. ! (get_ctor_vtbl_name): Likewise. ! (start_squangling): Likewise. ! (get_id_2): Likewise. ! (set_mangled_name_for_decl): Call mangle_decl for new ABI. ! (init_method): Call init_mangle for new ABI. ! (make_thunk): Call mangle_thunk for new ABI. ! * operators.def: Correct new ABI manglings for the `%' operator. ! Add `::' operator. ! * pt.c (build_template_decl): Copy DECL_OVERLOADED_OPERATOR_P and ! DECL_ASSIGNMENT_OPERATOR_P to the TEMPLATE_DECL. ! (lookup_template_class): Call mangle_decl for new ABI. ! (get_mostly_instantiated_function_type): New function. ! (set_mangled_name_for_template_decl): Use it. ! (tsubst_decl): Use set_mangled_name_for_decl for destructors with ! the new ABI. Use mangle_conv_op_name_for_type for instantiated ! conversion op names. ! * rtti.c (tinfo_name): Call mangle_type_string for new ABI. ! (get_tinfo_decl): Call mangle_typeinfo_for_type for new ABI. ! (tinfo_base_init): Likewise. Mangle typeinfo string name with ! mangle_typeinfo_string_for_type. ! ! 2000-06-03 Mark Mitchell ! ! * cp-tree.h (TMPL_ARGS_LEVEL): Clarify comment. ! (INNERMOST_TEMPLATE_ARGS): New macro. ! (innermost_args): Remove. ! (get_innermost_template_args): New function. ! * decl2.c (arg_assoc_class): Use INNERMOST_TEMPLATE_ARGS. ! * error.c (dump_function_decl): Be caution when using ! most_general_template. ! * method.c (build_template_parm_names): Use ! INNERMOST_TEMPLATE_ARGS. ! * pt.c (add_to_template_args): Tidy comment ! (get_innermost_template_args): New function. ! (check_explicit_specialization): Clear DECL_INITIAL for a new ! specialization. ! (process_partial_specialization): Use INNERMOST_TEMPLATE_ARGS. ! Tidy. ! (push_template_decl): Always register specializations of the most ! general template. ! (convert_template_argument): Use INNERMOST_TEMPLATE_ARGS. ! (coerce_template_parms): Likewise. ! (lookup_template_class): Likewise. ! (innermost_args): Remove. ! (tsubst_decl): Use INNERMOST_TEMPLATE_ARGS. ! (tsubst_decl): Handle tricky specializations. Use ! get_innermost_template_args. ! (instantiate_template): Simplify handling of partial ! instantiations. ! (get_class_bindings): Use INNERMOST_TEMPLATE_ARGS. ! (most_general_template): Reimplement, in a more straightforward ! manner. ! (regenerate_decl_from_template): Tweak formatting. Use ! TMPL_ARGS_DEPTH for clarity. ! (set_mangled_name_for_template_decl): Use INNERMOST_ARGS. ! ! * dump.c (dequeue_and_dump): Dump information about thunks. ! ! 2000-06-01 Richard Henderson ! ! * decl.c (init_decl_processing): Set lang_get_alias_set first thing. ! ! 2000-06-01 Richard Henderson ! ! * decl2.c (unsupported_options): Fix typo, make const. ! (lang_decode_option): Fix bsearch argument order. ! ! 2000-06-01 Mark Mitchell ! ! * init.c (resolve_offset_ref): Remove check for TREE_ADDRESSABLE ! on FIELD_DECLs. ! ! Wed May 31 14:09:00 2000 Richard Kenner ! ! * cp-tree.h (c_get_alias_set): Deleted. ! * Makefile.in (decl.o): Include ../expr.h. ! * decl.c (expr.h): Include. ! (init_decl_processing): Call record_component_aliases for arrays. ! (grokdeclarator): Likewise. ! Set TREE_ADDRESSABLE for fields that aren't bitfields. ! * tree.c (build_cplus_array_type_1): Call record_component_aliases. ! ! 2000-05-31 Mark Mitchell ! ! Remove guiding declaration support. ! * cp/cp-tree.h (flag_dump_translation_unit): Make it const. ! (flag_guiding_decls): Remove. ! * call.c (build_user_type_conversion_1): Remove support for ! guiding decls. ! (build_new_function_call): Likewise. ! (build_new_op): Likewise. ! (build_new_method_call): Likewise. ! * decl.c (start_function): Likewise. ! * friend.c (is_friend): Likewise. ! (do_friend): Likewise. ! * decl2.c ((flag_dump_translation_unit): Make it const. ! (flag_guiding_decls): Remove. ! (unsupported_options): New variable ! (compare_options): New function. ! (lang_decode_option): Use them. ! ! * decl.c (build_cp_library_fn): Set DECL_CONTEXT. ! ! * method.c (mangle_expression): Adjust test for legal expression ! operators. ! ! * pt.c (instantiate_decl): Save and restore the local ! specializations list. ! ! 2000-05-30 Jason Merrill ! ! * decl.c (grok_reference_init): Pass LOOKUP_ONLYCONVERTING. ! ! 2000-05-30 Mark Mitchell ! ! * call.c (add_template_candidate_real): Handle member template ! constructors for classes with virtual bases. ! (build_user_type_conversion_1): Use in_charge_arg_for_name. ! (build_new_method_call): Use DECL_NONSTATIC_MEMBER_FUNCTION_P. ! ! * ir.texi: Update thunk documentation. ! ! * call.c (joust): Fix handling of overloaded builtin operators. ! ! 2000-05-30 Zack Weinberg ! ! * cp-tree.h (DECL_ANTICIPATED): New macro. ! Document new use of DECL_LANG_FLAG_7. ! * decl.c (builtin_function): Set DECL_ANTICIPATED on builtins ! in the user namespace. ! * lex.c (do_identifier): If the identifier's declaration has ! DECL_ANTICIPATED on, it has not yet been declared. But do not ! replace it with an ordinary implicit declaration. ! ! * tinfo2.cc: Include stdlib.h. ! ! 2000-05-29 Mark Mitchell ! ! * cp-tree.h (CLASSTYPE_ALIGN_UNIT): New macro. ! * class.c (layout_empty_base): Use CLASSTYPE_ALIGN_UNIT, not ! CLASSTYPE_ALIGN. ! ! 2000-05-28 Gabriel Dos Reis ! ! * decl2.c (lang_decode_option): Use skip_leading_substring instead ! of plain strncmp. ! ! 2000-05-28 Alexandre Oliva ! ! * operators.def (?): this. Fixed. ! ! 2000-05-27 Alex Samuel ! Mark Mitchell ! ! * cp-tree.h (ansi_opname): Make it a macro. ! (ansi_assopname): Likewise. ! (struct lang_decl_flags): Add assignment_operator_p. ! (struct lang_decl): Add operator_code. ! (DECL_VTT_PARM): Adjust. ! (DECL_OVERLOADED_OPERATOR_P): Return the operator_code for an ! overloaded operator. ! (SET_OVERLOADED_OPERATOR_CODE): New macro. ! (DECL_ASSIGNMENT_OPERATOR_P): New macro. ! (DECL_ARRAY_DELETE_OPERATOR_P): Adjust. ! (opname_tab): Remove. ! (assignop_tab): Likewise. ! (operator_name_info_t): New type. ! (operator_name_info): New variable. ! (assignment_operator_name_info): Likewise. ! (build_cp_library_fn): Remove declaration. ! (push_cp_library_fn): Likewise. ! (operator_name_string): Likewise. ! (build_decl_overload): Likewise. ! * call.c (print_z_candidates): Simplify. ! (build_object_call): Adjust usage of ansi_opname. Use ! DECL_OVERLOADED_OPERATOR_P. ! (op_error): Adjust operator name lookup. ! (build_conditional_expr): Adjust usage of ansi_opname. ! (build_new_op): Likewise. ! (build_op_delete_call): Likewise. ! (build_over_call): Likewise. ! (joust): Use DECL_OVERLOADED_OPERATOR_P. ! * decl.c (duplicate_decls): Copy operator_code. ! (init_decl_processing): Adjust parameters to push_cp_library_fn. ! (builtin_function): Adjust parameters to build_library_fn_1. ! (build_library_fn_1): Accept an overloaded operator code. ! (build_library_fn): Pass ERROR_MARK. ! (build_cp_library_fn): Accept an overloaded operator code. ! (push_cp_library_fn): Likewise. ! (grokfndecl): Tweak. ! (grokdeclarator): Simplify code to compute names of overloaded ! operators. Adjust use of ansi_opname. ! (ambi_op_p): Work on tree_codes, not identifiers. ! (unary_op_p): Likewise. ! (grok_op_properties): Likewise. ! (start_function): Use DECL_OVERLOADED_OPERATOR_P. ! (lang_mark_tree): Don't try to mark the operator_code. ! * decl2.c (grok_function_init): Use DECL_OVERLOADED_OPERATOR_P. ! * error.c (dump_decl): Remove special handling for operator ! names. ! (dump_function_name): Likewise. ! (dump_expr): Adjust name lookup of operators. ! (op_to_string): Simplify. ! (assop_to_string): Likewise. ! * init.c (build_new_1): Adjust use of ansi_opname. ! * lex.c (opname_tab): Remove. ! (assignop_tab): Likewise. ! (ansi_opname): Likewise. ! (ansi_assopname): Likewise. ! (operator_name_string): Likewise. ! (reinit_lang_specific): Likewise. ! (operator_name_info): New variable. ! (assignment_operator_name_info): Likewise. ! (init_operators): New function. ! (init_parse): Use it. ! (do_identifier): Adjust use of ansi_opname. ! * method.c (mangle_expression): Don't use ansi_opname for ! mangling. ! (build_decl_overload_real): Use DECL_OVERLOADED_OPERATOR_P. ! (build_decl_overload): Remove. ! (build_typename_overload): Use OPERATOR_TYPENAME_FORMAT directly. ! (do_build_assign_ref): Adjust use of ansi_opname. ! (synthesize_method): Likewise. ! (implicitly_declare_fn): Likewise. ! * operators.def: New file. ! * parse.y (operator): Adjust use of ansi_opname. ! * pt.c (tsubst_decl): Use IDENTIFIER_OPNAME_P. ! (set_mangled_name_for_template_decl): Don't play games with ! current_namespace. ! (special_function_p): Adjust use of ansi_opname. ! * typeck.c (check_return_expr): Likewise. ! * Make-lang.in (cc1plus): Depend on operators.def. ! * Makefile.in (lex.o): Likewise. ! (decl.o): Likewise. ! ! 2000-05-27 Zack Weinberg ! ! * Make-lang.in (cplib2.ready): Eradicate. ! ! Sat May 27 11:25:46 2000 Richard Kenner ! ! * method.c (mangle_expression): Use TREE_CODE_LENGTH. ! * tree.c (break_out_calls, build_min_nt): Use TREE_CODE_LENGTH. ! (built_min, cp_tree_equal): Likewise. ! ! 2000-05-26 Mark Mitchell ! ! * class.c (layout_nonempty_base_or_field): Replace ! `record_layout_info' with `record_layout_info_s'. ! ! 2000-05-26 Jason Merrill ! ! Fix goto checking. ! * cp-tree.h (struct language_function): x_named_labels is now ! a struct named_label_list*. ! * decl.c (struct named_label_use_list): Renamed from... ! (struct named_label_list): ...this. New struct. ! (push_binding_level): Don't set eh_region. ! (note_level_for_eh): New fn. ! (pop_label): Take label and old value directly. ! (pop_labels): Adjust for new named_labels format. ! (lookup_label): Likewise. ! (poplevel): Note characteristics of a binding level containing a ! named label. Mess with named label lists earlier. ! (mark_named_label_lists): New fn. ! (mark_lang_function): Call it. ! (use_label): New fn, split out from... ! (make_label_decl): ...here. Don't call it. ! (decl_jump_unsafe, check_previous_goto, check_previous_goto_1, ! check_previous_gotos): New fns, split out from... ! (define_label): ...here. ! (check_switch_goto): New fn. ! (define_case_label): Call it. ! (check_goto): New fn. ! * semantics.c (finish_goto_stmt): Call it and use_label. ! (begin_compound_stmt): If we're a try block, call note_level_for_eh. ! (expand_stmt): Never pass 1 as DONT_JUMP_IN to expand_end_bindings. ! ! 2000-05-26 Mark Mitchell ! ! * class.c (build_vtable_entry_ref): Correct usage of ! get_vtbl_decl_for_binfo. ! ! * decl2.c (grokclassfn): Set DECL_LANGUAGE here. ! * method.c (implicitly_declare_fn): Not here. ! ! 2000-05-26 Nathan Sidwell ! ! * cp-tree.h (CPTI_PTMD_DESC_TYPE): Rename to ... ! (CPTI_PTMD_DESC_TYPE): ... here. ! (ptmd_desc_type_node): Rename to ... ! (ptm_desc_type_node): ... here. ! * decl.c: Likewise. ! * rtti.c (ptmd_initializer): Rename to ... ! (ptm_initializer): ... here. ! (sythesize_tinfo_var): Adjust. Deal with pointer to member ! function. ! (create_tinfo_types): Adjust. ! ! 2000-05-25 Mark Mitchell ! Finish implementation of VTTs. ! * cp-tree.h (cp_tree_index): Add CPTI_VTT_PARM_TYPE and ! CPTI_VTT_PARM_IDENTIFIER. ! (vtt_parm_identifier): New macro. ! (vtt_parm_type): Likewise. ! (BINFO_SUBVTT_INDEX): Likewise. ! (BINFO_VPTR_INDEX): Likewise. ! (struct lang_decl): Add vtt_parm. ! (DECL_VTT_PARM): New macro. ! (DECL_USE_VTT_PARM): Likewise. ! (DECL_NEEDS_VTT_PARM_P): Likewise. ! (get_vtt_name): Declare. ! (build_artificial_parm): Likewise. ! (fixup_all_virtual_upcast_offsets): Likewise. ! (expand_indirect_vtbls_init): Remove. ! * call.c (build_new_method_call): Pass the vtt to subobject ! constructors and destructors. ! * class.c (get_vtt_name): Give it external linkage. ! (build_clone): Handle the magic VTT parameters for clones. ! (clone_function_decl): Fix typo in comment. ! (build_vtt): Keep track of the indices in the VTTs where various ! entities are stored. ! (build_vtt_inits): Likewise. ! (dfs_build_vtt_inits): Likewise. ! (build_ctor_vtbl_group): Tweak type of construction vtables. ! (dfs_accumulate_vtbl_inits): Build vtables for all bases, even ! primary bases, when building construction vtables. ! * decl.c (duplicate_decls): Handle DECL_VTT_PARM. ! (initialize_predefined_identifiers): Add vtt_parm_identifier. ! (init_decl_processing): Initialize vtt_parm_type. ! (grokfndecl): Use DECL_OVERLOADED_OPERATOR_P. ! (lang_mark_tree): Make vtt_parm. ! * decl2.c (build_artificial_parm): New function. ! (maybe_retrofit_in_chrg): Use it. Add VTT parameters. ! (grokclassfn): Use build_artificial_parm. ! * init.c (initialize_vtbl_ptrs): Call ! fixup_all_virtual_upcast_offsets directly. ! (perform_member_init): Use the complete subobject destructor for ! member cleanups. ! (build_vtbl_address): New function. ! (expand_virtual_init): Handle VTTs. ! * optimize (maybe_clone_body): Likewise. ! * search.c (fixup_all_virtual_upcast_offsets): Give it external ! linkage. ! (expand_indirect_vtbls_init): Remove. ! * semantics.c (setup_vtbl_ptr): Fix typos in comment. ! * tree.c (make_binfo): Make them bigger. ! 2000-05-25 Nathan Sidwell ! * inc/cxxabi.h (__pbase_type_info): Define, based on ! __pointer_type_info. ! (__pointer_type_info): Derive from __pbase_type_info. Adjust. ! (__pointer_to_member_type_info): Likewise. ! * tinfo2.cc (__pbase_type_info::~__pbase_type_info): Implement. ! (__pointer_to_member_type_info::__is_pointer_p): Remove. ! (__pointer_type_info::__do_catch): Rename to ... ! (__pbase_type_info::__do_catch): ... here. Adjust. ! (__pbase_type_info::__pointer_catch): Implement. ! (__pointer_type_info::__pointer_catch): Adjust. ! (__pointer_to_member_type_info::__pointer_catch): Adjust. ! 2000-05-25 Nathan Sidwell ! * tinfo.h (__user_type_info::contained_virtual_p): New ! predicate. ! * tinfo.cc (__user_type_info::do_upcast): Fix bug with diamond ! shaped hierarchy. ! (__vmi_class_type_info::__do_upcast): Fix bug with NULL pointer to ! diamond shaped hierarchy. Add early out for mixed diamond and ! duplicate shaped hierarchy. ! 2000-05-24 Mark Mitchell ! * cp-tree.h (build_delete): Change prototype. ! (build_vec_delete): Likewise. ! * call.c (build_scoped_method_call): Use special_function_kind ! values to indicate the kind of destruction to be done. ! (build_method_call): Likewise. ! * decl.c (finish_destructor_body): Likewise. ! (maybe_build_cleanup_1): Likewise. Rename to ... ! (maybe_build_cleanup): ... this. ! * decl2.c (delete_sanity): Use special_function_kind ! values to indicate the kind of destruction to be done. ! (build_cleanup): Likewise. ! * init.c (perform_member_init): Likewise. ! (build_vec_delete_1): Likewise. ! (build_dtor_call): Simplify. ! (build_delete): Use special_function_kind ! values to indicate the kind of destruction to be done. ! (build_vbase_delete): Likewise. ! (build_vec_delete): Likewise. ! * init.c (sort_member_init): Fix typo in error message generation ! code. ! Mon May 15 11:46:29 2000 Donald Lindsay ! * semantics.c (begin_class_definition): make the packed ! attribute be sensitive to the "-fpack-struct" command line flag ! 2000-05-24 Nathan Sidwell ! Update new-abi upcast algorithm. ! * inc/cxxabi.h (__class_type_info::__do_upcast): Change ! prototype and meaning of return value. ! (__si_class_type_info::__do_upcast): Likewise. ! (__vmi_class_type_info::__do_upcast): Likewise. ! * tinfo.cc (__class_type_info::__upcast_result): Replace ! whole2dst with part2dst. Adjust ctor. ! (__class_type_info::__do_upcast): Adjust call of worker function. ! (__class_type_info::__do_upcast): Adjust. ! (__si_class_type_info::__do_upcast): Adjust. Use parent's ! __do_upcast. ! (__vmi_class_type_info::__do_upcast): Likewise. Fix private ! virtual base in diamond hierarchy bug. ! 2000-05-23 Mark Mitchell ! * cp-tree.h (lang_decl_flags): Rename mutable_flag to uninlinable ! and bitfield to tinfo_fn_p. ! (DECL_TINFO_FN_P): Adjust. ! (SET_DECL_TINFO_FN_P): Likewise. ! (DECL_MUTABLE_P): Likewise. ! (DECL_C_BIT_FIELD): Likewise. ! (SET_DECL_C_BIT_FIELD): Likewise. ! (CLEAR_DECL_C_BIT_FIELD): Likewise. ! (DECL_UNINLINABLE): Likewise. ! * class.c (alter_access): Call retrofit_lang_decl if ncessary. ! (handle_using_decl): Remove assertion. ! (build_vtbl_or_vbase_field): Use build_decl, not build_lang_decl, ! to build FIELD_DECLs. ! (build_base_field): Likewise. ! (layout_class_type): Likewise. ! * decl.c (init_decl_processing): Likewise. ! (build_ptrmemfunc_type): Likewise. ! (grokdeclarator): Likewise. ! * decl2.c (grok_x_components): Likewise. ! * except.c (call_eh_info): Likewise. ! * init.c (init_init_processing): Likewise. ! * rtti.c (expand_class_desc): Likewise. ! (create_pseudo_type_info): Likewise. ! (get_vmi_pseudo_type_info): Likewise. ! (create_tinfo_types): Likewise. ! * ptree.c (print_lang_decl): Adjust. ! * typeck.c (build_component_ref): Don't check DECL_LANG_SPECIFIC ! before checking DECL_MUTABLE_P. ! * decl2.c (maybe_retrofit_in_chrg): Don't create in-charge ! parameters for template functions. ! * pt.c (tsubst_decl): Make sure we call maybe_retrofit_in_chrg for ! destructors as well as constructors. ! 2000-05-22 Mark Mitchell ! * class.c (build_ctor_vtbl_group): Set inits. ! * optimize.c (maybe_clone_body): Set DECL_INLINE and ! DECL_THIS_INLINE appropriately for clones. ! * cp-tree.h (IDENTIFIER_TYPENAME_P): Use a flag, not strncmp. ! (DECL_CONV_FN_P): Simplify. ! (DECL_OPERATOR): Remove. ! (language_to_string): Declare. ! * decl.c (duplicate_decls): Fix typo in comment. ! (grokdeclarator): Adjust use of IDENTIFIER_TYPENAME_P. ! (grok_op_properties): Use DECL_CONV_FN_P instead of ! IDENTIFIER_TYPENAME_P. ! * dump.c (dequeue_and_dump): Dump the language linkage of ! declarations. ! * error.c (language_to_string): Give it external linkage. ! * method.c (build_typename_overload): Set IDENTIFIER_TYPENAME_P. ! (implicitly_declare_fn): Set DECL_LANGUAGE. ! * pt.c (check_explicit_specialization): Use DECL_CONV_FN_P, not ! IDENTIFIER_TYPENAME_P. ! (tsubst_decl): Likewise. ! (tsubst_copy): Adjust use of IDENTIFIER_TYPENAME_P. ! * semantics.c (finish_member_declaration): Don't mark members of ! classes declared in an extern "C" region as extern "C". ! 2000-05-22 Martin v. Löwis ! * decl2.c (qualified_lookup_using_namespace): Look through ! namespace aliases. ! * decl.c (push_using_decl): Return the old decl on namespace level. ! 2000-05-21 Mark Mitchell ! * cp-tree.h (SET_BINFO_NEW_VTABLE_MARKED): Add sanity checks. ! (VTT_NAME_PREFIX): New macro. ! (CTOR_VTBL_NAME_PREFIX): Likewise. ! (get_ctor_vtbl_name): New function. ! * class.c (get_vtable_name): Simplify. ! (get_vtt_name): New function. ! (get_vtable_decl): Don't set IDENTIFIER_GLOBAL_VALUE. ! (dfs_mark_primary_bases): Update the CLASSTYPE_VBASECLASSES list ! when a virtual base becomes primary. ! (finish_struct_1): Set CLASSTYPE_VFIELDS a little earlier. Build ! VTTs. ! (finish_vtbls): Adjust calls to accumulate_vtbl_inits to pass in ! additional parameters. ! (dfs_finish_vtbls): Don't clear BINFO_NEW_VTABLE_MARKED. ! (initialize_array): New function. ! (build_vtt): Likewise. ! (build_vtt_inits): Likewise. ! (dfs_build_vtt_inits): Likewise. ! (dfs_fixup_binfo_vtbls): Likewise. ! (build_ctor_vtbl_group): Likewise. ! (initialize_vtable): Use initialize_array. ! (accumulate_vtbl_inits): Reimplement to handle construction ! vtables. ! (dfs_accumulate_vtbl_inits): Likewise. ! (bulid_vtbl_initializer): Adjust parameter name. ! * method.c (build_typename_overload): Remove #if 0'd code. ! (get_ctor_vtbl_name): New function. ! * search.c (dfs_walk_real): Use BINFO_N_BASETYPES. ! (init_vbase_pointers): Don't mess with the TREE_CHAIN of a binfo. ! * cp-tree.h (struct lang_type): Remove search_slot. ! (CLASSTYPE_SEARCH_SLOT): Remove. ! (emit_base_init): Change prototype. ! (initialize_vtbl_ptrs): Likewise. ! (expand_indirect_vtbls_init): Likewise. ! (clear_search_slots): Remove. ! * decl.c (lang_mark_tree): Don't mark search_slot. ! * init.c (initialize_vtbl_ptrs): Simplify. ! (emit_base_init): Likewise. ! * search.c (struct vbase_info): Document decl_ptr. ! (convert_pointer_to_single_level): Remove. ! (dfs_find_vbases): Remove. ! (dfs_init_base_pointers): Simplify. ! (dfs_clear_vbase_slots): Remove. ! (dfs_vtable_path_unmark): New function. ! (init_vbase_pointers): Simplify. ! (expand_upcast_fixups): Don't rely on CLASSTYPE_SEARCH_SLOT. ! (expand_indirect_vtbls_init): Simplify. Don't call ! mark_all_temps_used. ! * semantics.c (setup_vtbl_ptr): Adjust calls to emit_base_init and ! initialize_vtbl_ptrs. ! 2000-05-20 Zack Weinberg ! * except.c: Add static prototypes. ! 2000-05-20 H.J. Lu ! * Make-lang.in (cplib2.ready): Also depend on cc1plus$(exeext). ! 2000-05-19 Mark Mitchell ! Don't create a separate copy of virtual bases for the ! CLASSTYPE_VBASECLASSES list. ! * cp-tree.h (CLASSTYPE_VBASECLASSES): Change documentation. ! (BINFO_FOR_VBASE): Remove. ! (CANONICAL_BINFO): Adjust. ! (binfo_for_vbase): New function. ! * class.c (build_vbase_pointer_fields): Use binfo_for_vbase ! instead of BINFO_FOR_VBASE. ! (build_vbase_pointer): Likewise. ! (build_secondary_vtable): Likewise. ! (dfs_mark_primary_bases): Likewise. ! (mark_primary_bases): Likewise. ! (layout_nonempty_base_or_field): Likewise. ! (dfs_set_offset_for_shared_vbases): Likewise. ! (dfs_set_offset_for_unshared_vbases): Likewise. ! (layout_virtual_bases): Likewise. Adjust for changes to the ! CLASSTYPE_VBASECLASSES list. ! (dump_class_hierarchy_r): Use binfo_for_vbase ! instead of BINFO_FOR_VBASE. ! (dump_class_hierarchy): Likewise. ! (finish_vtbls): Likewise. ! (build_vtbl_initializer): Adjust for changes to the ! CLASSTYPE_VBASECLASSES list. ! (build_vbase_offset_vtbl_entries): Use binfo_for_vbase. ! * decl.c (finish_destructor_body): Adjust for changes to the ! CLASSTYPE_VBASECLASSES list. ! * init.c (sort_base_init): Use binfo_for_vbase. ! (construct_virtual_bases): Adjust for changes to the ! CLASSTYPE_VBASECLASSES list. ! (expand_member_init): Use binfo_for_vbase. ! (build_vbase_delete): Adjust for changes to the ! CLASSTYPE_VBASECLASSES list. ! * method.c (do_build_copy_constructor): Likewise. ! * rtti.c (get_base_offset): Use binfo_for_vbase. ! (expand_class_desc): Remove #if 0'd code. ! * search.c (struct vbase_info): Remove vbase_types. ! (get_base_distance): Use binfo_for_vbase. ! (lookup_field_queue_p): Use CANONICAL_BINFO. ! (get_shared_vbase_if_not_primary): Use binfo_for_vbase. ! (get_pure_virtuals): Adjust for changes to the ! CLASSTYPE_VBASECLASSES list. ! (dfs_find_vbases): Use binfo_for_vbase. ! (dfs_init_vbase_pointers): Likewise. ! (init_vbase_pointers): Don't initialize vi.vbase_types. ! (virtual_context): Use binfo_for_vbase. ! (fixup_all_virtual_upcast_offsets): Adjust for changes to the ! CLASSTYPE_VBASECLASSES list. ! (expand_indirect_vtbls_init): Simplify. ! (dfs_get_vbase_types): Don't replicate virtual bases. ! (find_vbase_instance): Use binfo_for_vbase. ! (binfo_for_vbase): New function. ! * typeck.c (get_delta_difference): Use binfo_for_vbase. ! 2000-05-17 Mark Mitchell ! * decl2.c (finish_anon_union): Generalize error messages to handle ! anonymous structures. ! * init.c (perform_member_init): Remove `name' parameter. ! (build_field_list): New function. ! (sort_member_init): Handle anonymous union initialization order ! correctly. Check for multiple initializations of the same union. ! (emit_base_init): Don't look up fields by name here. ! (expand_member_init): Record the result of name lookup for future ! reference. ! * typeck.c (build_component_ref): Fix formatting. ! Wed May 17 17:27:44 2000 Andrew Cagney ! * decl.c (pop_label): Replace warn_unused with warn_unused_label. ! * typeck.c (build_x_compound_expr): Replace warn_unused with ! warn_unused_value. ! * decl2.c (lang_decode_option): Update -Wall unused flags by ! calling set_Wunused. ! 2000-05-16 Mark Mitchell ! * cp-treeh (BINFO_NEW_VTABLE_MARKED): Update documentation. ! * init.c (dfs_vtable_path_unmark): Remove. ! * search.c (marked_new_vtable_p): Likewise. ! (unmarked_new_vtable_p): Likewise. ! (dfs_search_slot_nonempty_p): Likewise. ! (dfs_mark): Likewise. ! (dfs_vtable_path_unmark): Likewise. ! (dfs_find_vbases): Don't set BINFO_NEW_VTABLE_MARKED. ! (dfs_int_vbase_pointers): Don't clear BINFO_VTABLE_PATH_MARKED. ! (dfs_init_vbase_pointers): Remove special-case new ABI code. ! (dfs_clear_vbase_slots): Don't clear BINFO_NEW_VTABLE_MARKED. ! (init_vbase_pointers): Simplify. ! (expand_indirect_vtbls_init): Likewise. ! * class.c (copy_virtuals): New function. ! (build_primary_table): Use it. ! (build_secondary_vtable): Likewise. ! (modify_vtable_entry): Use NULL_TREE, not integer_zero_node, to ! indicate that no vcall offset is required. ! (add_virtual_function): Likewise. ! (modify_all_vtables): Likewise. ! (dfs_finish_vtbls): Adjust call to build_vtbl_initializer. ! (dfs_accumulate_vtbl_inits): Likewise. ! (build_vtbl_initializer): Make changes to handle construction ! vtables. ! (dfs_build_vcall_offset_vtbl_entries): Likewise. ! (build_rtti_vtbl_entries): Likewise. ! (build_vtable_entries): Handle a NULL vcall_index. ! 2000-05-15 Gabriel Dos Reis ! * decl2.c (lang_decode_option): Fix thinko. ! 2000-05-14 Jason Merrill ! * except.c (check_handlers): New fn. ! * cp-tree.h: Declare it. ! * semantics.c (finish_handler_sequence): Call it. ! (finish_function_handler_sequence): Likewise. ! (finish_handler_parms): Set TREE_TYPE on the handler. ! * cp-tree.h (PUBLICLY_UNIQUELY_DERIVED_P): New macro. ! * search.c (get_base_distance_recursive): If protect>1, ignore ! special access. ! (get_base_distance): Don't reduce watch_access. ! 2000-05-13 Gabriel Dos Reis ! * lex.c: #include diagnostic.h. ! (lang_init_options): Set default prefixing rules. ! * lang-options.h: Add -fdiagnostics-show-location=. ! * decl2.c: #include diagnostic.h. ! (lang_decode_option): Handle -fdiagnostics-show-location=. ! 2000-05-12 Nathan Sidwell ! * tinfo.cc: Revert my 2000-05-08 and 2000-05-07 changes. ! * vec.cc: Revert my 2000-05-07 change. ! 2000-05-11 Jason Merrill ! * class.c (check_field_decls): Complain about non-static data ! members with same name as class in class with constructor. ! 2000-05-10 Jason Merrill ! * decl.c (grokdeclarator): Allow non-static data members with ! same name as class. ! 2000-05-09 Zack Weinberg ! * cp-tree.h: Constify tree_srcloc.filename, tinst_level.file, ! and pending_inline.filename. Update prototypes. ! * decl.c (define_label): Constify filename parameter. ! * decl2.c (warn_if_unknown_interface): Constify local char *. ! * input.c Constify input_source.filename. Don't declare ! input_filename or lineno. Constify filename parameter to feed_input. ! * lex.c (init_parse): Constify parameter and return value. ! (cp_pragma_interface, cp_pragma_implementation): Constify ! filename argument. ! (reinit_parse_for_method, reinit_parse_for_block, ! reinit_parse_for_expr, feed_defarg, handle_cp_pragma): ! Constify local char *. ! * pt.c: Don't declare lineno or input_filename. ! (print_template_context, tsubst_friend_function, tsubst_decl, ! tsubst, instantiate_decl): Constify local char *. ! * semantics.c (expand_body): Constify local char *. ! * tree.c (build_srcloc): Constify filename parameter. ! * typeck.c (c_expand_asm_operands): Constify filename parameter. ! 2000-05-08 Nathan Sidwell ! ! * tinfo.cc (__dynamic_cast): Use a reinterpret_cast. Fix ! offsetof expansion. ! ! 2000-05-08 Branko Cibej ! ! * inc/cxxabi.h: Fix typos in comment. ! (__base_class_info::__offset): Use a static_cast. ! ! 2000-05-07 Nathan Sidwell ! ! * inc/cxxabi.h: Use __SIZE_TYPE_ and __PTRDIFF_TYPE__ in place ! of std::size_t and std::ptrdiff_t respectively. ! * tinfo.cc: Likewise. ! * vec.cc: Likewise. ! ! 2000-05-06 Richard Henderson ! ! * typeck.c (build_c_cast): Don't warn integer->pointer size ! mismatch for constants. ! ! 2000-05-06 Nathan Sidwell ! ! * rtti.c (ptmd_initializer): Set non-public, if class is ! incomplete. ! ! * inc/cxxabi.h (__dynamic_cast): Explicitly say extern "C++". ! (__cxa_vec_new, __cxa_vec_ctor, __cxa_vec_dtor, ! __cxa_vec_delete): Likewise. ! * tinfo.cc (__dynamic_cast): Likewise. ! * vec.cc (__cxa_vec_new, __cxa_vec_ctor, __cxa_vec_dtor, ! __cxa_vec_delete): Likewise. ! ! 2000-05-04 Mark Mitchell ! ! * cp-tree.h (DELTA_FROM_VTABLE_ENTRY): Remove. ! (SET_FNADDR_FROM_VTABLE_ENTRY): Likewise. ! (lang_decl_flags): Add vcall_offset. ! (THUNK_VCALL_OFFSET): Use it. ! * decl.c (lang_mark_tree): Don't mark DECL_ACCESS for a thunk. ! * method.c (make_thunk): Create the lang_decl here, not in ! emit_thunk. ! (emit_thunk): Make generic thunks into ordinary functions once ! they have been fed to expand_body. ! * semantics.c (expand_body): Set current_function_is_thunk here. ! ! 2000-05-04 Kaveh R. Ghazi ! ! * class.c (update_vtable_entry_for_fn): Prototype. ! ! * pt.c (tsubst_decl): Initialize variables `argvec', `gen_tmpl' ! and `tmpl'. ! ! * search.c (dfs_build_inheritance_graph_order): Prototype. ! ! 2000-05-04 Mark Mitchell ! ! * cp-tree.h (special_function_kind): Add various kinds of ! destructors. ! (special_function_p): New function. ! * class.c (overrides): Don't let one kind of destructor override ! another. ! * decl2.c (mark_used): Use DECL_NON_THUNK_FUNCTION_P when deciding ! whether or not to instantiate a template. ! * tree.c (special_function_p): Define. ! ! 2000-05-03 Mark Mitchell ! ! * cp-tree.def (THUNK_DECL): Remove. ! * cp-tree.h (DECL_THUNK_P): New macro. ! (DECL_NON_THUNK_FUNCTION_P): Likewise. ! (DECL_EXTERN_C_FUNCTION_P): Likewise. ! (SET_DECL_THUNK_P): Likewise. ! (DELTA_FROM_VTABLE_ENTRY): Use DECL_THUNK_P. ! (FNADDR_FROM_VTABLE_ENTRY): Likewise. ! (DECL_MAIN_P): Use DECL_EXTERN_C_FUNCTION_P. ! * decl.c (decls_match): Use DECL_EXTERN_C_P. ! (duplicate_decls): Likewise. ! (pushdecl): Likewise. Adjust thunk handling. ! (grokfndecl): Use DECL_EXTERN_C_P. ! * decl2.c (mark_vtable_entries): Use DECL_THUNK_P. ! * dump.c (dequeue_and_dump): Remove THUNK_DECL handling. ! * except.c (nothrow_libfn_p): Use DECL_EXTERN_C_P. ! * expr.c (cplus_expand_expr): Remove THUNK_DECL handling. ! * method.c (make_thunk): Use SET_DECL_THUNK_P. Set ! DECL_NO_STATIC_CHAIN. ! (emit_thunk): Don't play games with TREE_CODE on thunks. Don't ! set DECL_DESTRUCTOR_P or DECL_CONSTRUCTOR_P on a thunk. ! * search.c (covariant_return_p): Remove THUNK_DECL handling. ! * ir.texi: Update. ! ! 2000-05-01 Jason Merrill ! ! * tree.c (walk_tree): Set lineno. ! ! 2000-05-01 Mark Mitchell ! ! * exception.cc: Update license notice. ! * new.cc: Likewise. ! * new1.cc: Likewise. ! * new2.cc: Likewise. ! * tinfo.cc: Likewise. ! * tinfo2.cc: Likewise. ! * vec.cc: Likewise. ! * inc/cxxabi.h: Likewise. ! * inc/exception: Likewise. ! * inc/new: Likewise. ! * inc/new.h: Likewise. ! * inc/typeinfo: Likewise. ! ! 2000-05-01 Jason Merrill ! ! * tree.c (build_target_expr_with_type): If we already have a ! TARGET_EXPR, just return it. ! ! * optimize.c (initialize_inlined_parameters): Don't generate an ! EXPR_STMT if we can just use DECL_INITIAL. ! * decl.c (emit_local_var): Only make the initialization a ! full-expression if stmts_are_full_exprs_p. ! ! 2000-05-01 Mark Mitchell ! ! * cp-tree.h (same_type_ignoring_top_level_qualifiers_p): New ! macro. ! * call.c (standard_conversion): Use it. ! (direct_reference_binding): Likewise. ! (build_over_call): Likewise. ! (is_properly_derived_from): Likewise. ! (compare_ics): Likewise. ! * class.c (resolves_to_fixed_type_p): Likewise. ! * optimize.c (declare_return_variable): Likewise. ! * pt.c (is_specialization_of): Likewise. ! (unify): Likewise. ! * typeck.c (comp_target_parms): Likeiwse. ! (build_static_cast): Likewise. ! (build_reinterpret_cast): Likewise. ! (build_const_cast): Likewise. ! (comp_ptr_ttypes_real): Likewise. ! (comp_ptr_ttypes_const): Likewise. ! * typeck2.c (process_init_constructor): Likewise. ! ! 2000-04-30 Scott Snyder ! ! * decl.c (finish_destructor_body): Use the base destructor when ! destroying virtual bases. ! ! 2000-04-30 Mark Mitchell ! ! * expr.c (cplus_expand_expr): Preserve temporaries when expanding ! STMT_EXPRs. ! * optimize.c (struct inline_data): Add target_exprs field. ! (declare_return_variable): When a function returns an aggregate, ! use the variable declared in the TARGET_EXPR as the remapped ! DECL_RESULT. ! (expand_call_inline): Update the pending target_exprs stack. ! (optimize_function): Initialize the stack. ! ! * decl2.c (finish_file): Fix typo in comment. ! ! * method.c (emit_thunk): Don't try to return a `void' value. ! ! * optimize.c (initialize_inlined_parameters): If the parameter is ! addressable, we need to make a new VAR_DECL, even if the ! initializer is constant. ! ! 2000-04-28 Cosmin Truta ! ! * decl.c (grok_op_properties): Add an extra check of argtypes. ! ! 2000-04-27 Mark Mitchell ! ! * optimize.c (copy_body_r): Use STRIP_TYPE_NOPS when copying ! variables. ! (initialize_inlined_parameters): Try to avoid creating new ! VAR_DECLs. ! ! 2000-04-27 Alex Samuel ! ! * lex.c (my_get_run_time): Remove. ! (init_filename_times): Use get_run_time instead of my_get_run_time. ! (check_newline): Likewise. ! (dump_time_statistics): Likewise. ! * decl2.c (finish_file): Push and pop timevar TV_VARCONST instead ! of computing elapsed time explicitly. ! ! 2000-04-26 Mark Mitchell ! ! * cp-tree.h (TREE_READONLY_DECL_P): Use DECL_P. ! * init.c (decl_constant_value): Check TREE_READONLY_DECL_P. ! * call.c (convert_like_real): Don't test TREE_READONLY_DECL_P ! before calling decl_constant_value. ! * class.c (check_bitfield_decl): Likewise. ! * cvt.c (ocp_convert): Likewise. ! (convert): Likewise. ! * decl.c (compute_array_index_type): Likewise. ! (build_enumerator): Likewise. ! * decl2.c (check_cp_case_value): Likewise. ! * pt.c (convert_nontype_argument): Likewise. ! (tsubst): Likewise. ! * typeck.c (decay_conversion): Likewise. ! (build_compound_expr): Likewise. ! (build_reinterpret_cast): Likewise. ! (build_c_cast): Likewise. ! (convert_for_assignment): Likewise. ! ! 2000-04-26 Jason Merrill ! ! * decl.c (finish_function): Don't play games with DECL_INLINE. ! ! 2000-04-25 Gabriel Dos Reis ! ! * ir.texi: Correct typo. ! ! 2000-04-25 Martin v. Löwis ! ! * decl.c (grokdeclarator): Reject VLAs as members. ! ! 2000-04-24 Gabriel Dos Reis ! ! * call.c (standard_conversion): Accept conversion between ! COMPLEX_TYPEs. ! ! * cvt.c (ocp_convert): Handle conversion to COMPLEX_TYPE. ! ! 2000-04-24 Zack Weinberg ! ! * decl2.c (finish_file): Remove double setup for accounting ! compile time. ! ! 2000-04-24 Robert Lipe ! ! * cp-tree.h (lang_type): Member `language' now ENUM_BITFIELD. ! ! 2000-04-23 Benjamin Kosnik ! ! * new.cc (set_new_handler): Needs to be in std::. ! ! 2000-04-23 Mark Mitchell ! ! * cp-tree.h (lang_decl): Remove pretty_function_p. ! (DECL_PRETTY_FUNCTION_P): Use TREE_LANG_FLAG_0, not a bit in the ! language-specific node. ! * decl.c (cp_make_fname_decl): Use build_decl, not ! build_lang_decl, to build the variables. ! (grokvardecl): Don't call build_lang_decl for local variables in ! templates. ! (grokdeclarator): Don't call build_lang_decl for local type ! declarations in templates. ! * lex.c (retrofit_lang_decl): Use ggc_alloc_obj to allocated ! zero'd memory, rather than calling memset. ! * pt.c: Include hashtab.h. ! (local_specializations): New variable. ! (retrieve_local_specialization): Use it. ! (register_local_specialization): Likewise. ! (tsubst_decl): Don't assume local variables have ! DECL_LANG_SPECIFIC. ! (instantiate_decl): Set up local_specializations. ! * Makefile.in (HTAB_H): New variable. ! ! 2000-04-23 Richard Henderson ! ! * typeck.c (c_expand_asm_operands): Restore the original ! contents of the output list. ! ! 2000-04-22 Gabriel Dos Reis ! ! * ir.texi: Document complex number representation. ! ! 2000-04-20 Nathan Sidwell ! ! * rtti.c (init_rtti_processing): Set tinfo_var_id in new-abi. ! (target_incomplete_p): New function. ! (tinfo_base_init): Create comdat NTBS name variable. ! (ptr_initializer): Add non_public parameter. Calculate it. ! (ptmd_initializer): Likewise. ! (synthesize_tinfo_var): Adjust. Emit incomplete class tinfo. ! (create_real_tinfo_var): Add non_public parameter. Use it. ! Push proxy into global namespace. ! * inc/cxxabi.h (__pointer_type_info::incomplete_class_mask): ! New enumeration. ! * inc/typeinfo (type_info::before, type_info::operator==): ! Compare __name addresses. ! ! * tinfo2.cc: Remove new-abi builtins comment. ! ! 2000-04-20 Jason Merrill ! ! * typeck.c (build_x_function_call): Resolve an OFFSET_REF. ! ! * call.c (joust): Exit early if we get the same function, too. ! ! * decl2.c (key_method): Return NULL_TREE for template classes. ! (import_export_class): Don't need to check for template classes. ! ! 2000-04-18 Zack Weinberg ! ! * lex.c: Remove references to cccp.c. ! ! 2000-04-18 Mark Mitchell ! ! * cp-tree.h (lang_decl_flags): Remove const_memfunc and ! volatile_memfunc. Add destructor_attr. Adjust dummy. ! (DECL_DESTRUCTOR_P): Use destructor_attr. ! (DECL_CONST_MEMFUNC_P): Reimplement. ! (DECL_VOLATILE_MEMFUNC_P): Remove. ! * class.c (finish_struct_methods): Use CLASSTYPE_DESTRUCTORS. ! (overrides): Use DECL_DESTRUCTOR_P. ! (check_for_override): Likewise. ! * decl.c (start_function): Likewise. ! * decl2.c (grokfclassfn): Likewise. ! (check_classfn): Likewise. ! (grok_function_init): Likewise. ! ! 2000-04-17 Mark Mitchell ! ! * decl2.c (grokfield): Issue error on illegal data member ! declaration. ! ! Mon Apr 17 17:11:16 2000 Mark P Mitchell ! ! * method.c (make_thunk): Set DECL_CONTEXT for a THUNK_DECL. ! ! 2000-04-16 Mark Mitchell ! ! * class.c (build_vtable_entry): Don't build thunks for type-info ! functions. ! ! 2000-04-16 Jason Merrill ! ! * decl.c (decls_match): Allow a redeclaration of a builtin to ! specify args while the builtin did not. ! ! 2000-04-15 Mark Mitchell ! ! * cp-tree.def (THUNK_DECL): Add to documentation. ! * cp-tree.h (flag_huge_objects): Declare. ! * class.c (modify_vtable_entry): Tidy. ! (update_vtable_entry_for_fn): Split out from dfs_modify_vtables. ! Calculate delta appropriately for the new ABI. ! (dfs_modify_vtables): Use it. ! (modify_all_vtables): Fix thinko in code to add overriding copies ! of functions to primary vtables. ! (build_clone): Fix typo in comment. ! (clone_function_decl): Correct order of destructors in vtable. ! (build_vbase_offset_vtbl_entries): Adjust comment. ! (dfs_vcall_offset_queue_p): Remove. ! (dfs_build_vcall_offset_vtbl_entries): Update BV_VCALL_INDEX. ! (build_vcall_offset_vtbl_entries): Juse use dfs_skip_vbases. ! (build_vtable_entry): Correct check for pure virtual functions. ! Don't declare flag_huge_objects. ! * decl.c (flag_huge_objects): Remove declaration. ! * method.c (make_thunk): Tweak mangling for vcall offset thunks. ! Use int_size_in_bytes. ! (emit_thunk): Handle vcall offset thunks. ! ! Sat Apr 15 16:00:01 2000 Richard Kenner ! ! * decl2.c (parse_time, varconst_time): Delete declarations. ! (finish_file): Delete LINENO declaration. ! START_TIME and THIS_TIME now long. ! ! 2000-04-13 Nathan Sidwell ! ! * class.c (build_base_field): Reformat comment. ! ! * inc/cxxabi.h (stddef.h): Comment inclusion. ! (__base_class_info::__offset): Comment shift. ! ! 2000-04-12 Mark Mitchell ! ! * cp-tree.h (IDENTIFIER_CTOR_OR_DTOR_P): New macro. ! (cp_tree_index): Add CPTI_PUSH_EXCEPTION_IDENTIFIER. ! (cp_push_exception_identifier): New macro. ! (DECL_COMPLETE_DESTRUCTOR_P): New macro. ! (DECL_BASE_DESTRUCTOR_P): Likewise. ! (DECL_DELETING_DESTRUCTOR_P): Likewise. ! (get_vtbl_decl_for_binfo): Fix formatting. ! (in_charge_arg_for_name): New macro. ! (maybe_build_cleanup_and_delete): Remove declaration. ! * call.c (build_field_call): Use IDENTIFIER_CTOR_OR_DTOR_P. ! (in_charge_arg_for_name): New function. ! (build_new_method_call): Use it. Handle cloned destructors. ! (build_clone): Don't make the base constructor virtual. ! Automatically defer generated functions. ! (clone_function_decl): Handle destructors, too. ! (clone_constructors_and_destructors): Likewise. ! (create_vtable_ptr): Don't create a vtable entry for a cloned ! function. ! * decl.c (predefined_identifier): Add ctor_or_dtor_p. ! (initialize_predefined_identifiers): Update appropriately. ! (finish_destructor_body): Simplify. ! (maybe_build_cleanup_and_delete): Remove. ! * except.c (expand_throw): Handle new-ABI destructors. ! * init.c (expand_cleanup_for_base): Use base_dtor_identifier. ! (build_dtor_call): New function. ! (build_delete): Use it. Simplify. ! * optimize.c (maybe_clone_body): Handle destructors. ! * search.c (lookup_field_queue_p): Use IDENTIFIER_CTOR_OR_DTOR_P. ! ! * exception.cc (cleanup_fn): New typedef. ! (CALL_CLEANUP): New macro. ! (cp_eh_info): Use them. ! (__cp_push_exception): Likewise. ! (__cp_pop_exception): Likewise. ! ! 2000-04-11 Mark Mitchell ! ! * cp-tree.h (cp_tree_index): Add CPTI_DTOR_IDENTIFIER. ! (complete_dtor_identifier): New macro. ! (CLASSTYPE_FIRST_CONVERSION): Remove. ! (CLASSTYPE_CONSTRUCTOR_SLOT): New macro. ! (CLASSTYPE_DESTRUCTOR_SLOT): Likewise. ! (CLASSTYPE_FIRST_CONVERSION_SLOT): Likewise. ! (CLASSTYPE_CONSTRUCTORS): Likewise. ! (CLASSTYPE_DESTRUCTORS): Likewise. ! (lang_decl): Add cloned_function. ! (DECL_COMPLETE_CONSTRUCTOR_P): New macro. ! (DECL_BASE_CONSTRUCTOR_P): Likewise. ! (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P): Likewise. ! (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P): Likewise. ! (DECL_CLONED_FUNCTION_P): Likewise. ! (DECL_CLONED_FUNCTION): Likewise. ! (clone_function_decl): Declare. ! (maybe_clone_body): Likewise. ! * call.c (build_user_type_conversion_1): Call complete object ! constructors in the new ABI. ! (build_new_method_call): Don't add in-charge parameters under the ! new ABI. ! * class.c (add_method): Use DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P, ! DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P, CLASSTYPE_CONSTRUCTOR_SLOT, and ! CLASSTYPE_DESTRUCTOR_SLOT. ! (build_clone): New function. ! (clone_function_decl): Likewise. ! (clone_constructors_and_destructors): Likewise. ! (check_bases_and_members): Use it. ! * decl.c (iniitialize_predefined_identifiers): Initialize ! complete_dtor_identifier. ! (finish_function): Don't add extra code to a clone. ! (lang_mark_tree): Mark cloned_function. ! * decl2.c (mark_used): Don't bother trying to instantiate things ! we synthesized. ! * dump.c (dequeue_and_dump): Don't dump CP_DECL_CONTEXT twice. ! * method.c (set_mangled_name_for_decl): Don't treat clones as ! constructors. ! (synthesize_method): Sythesize cloned functions, not the clones. ! * optimize.c (inline_data): Update comment on ret_label. ! (remap_block): Don't assume DECL_INITIAL exists. ! (copy_body_r): Allow ret_label to be NULL. ! (maybe_clone_body): Define. ! * pt.c (tsubst_decl): Handle clones. ! (instantiate_clone): New function. ! (instantiate_template): Use it. ! (set_mangled_name_for_template_decl): Don't treat clones as ! constructors. ! * search.c (lookup_fnfields_1): Use CLASSTYPE_CONSTRUCTOR_SLOT, ! CLASSTYPE_DESTRUCTOR_SLOT, and CLASSTYPE_FIRST_CONVERSION_SLOT. ! * semantics.c (expand_body): Clone function bodies as necessary. ! ! * optimize.c (remap_decl): Avoid sharing structure for arrays ! whose size is only known at run-time. ! * tree.c (copy_tree_r): Don't copy PARM_DECLs. ! ! * cp-tree.h (lang_decl_flags): Rename constructor_for_vbase_attr ! to has_in_charge_parm_p. ! (DECL_CONSTRUCTOR_FOR_VBASE_P): Rename to ... ! (DECL_HAS_IN_CHARGE_PARM_P): ... this. ! (DECL_COPY_CONSTRUCTOR_P): New macro. ! * call.c (add_function_candidate): Use DECL_HAS_IN_CHARGE_PARM_P. ! (build_user_type_conversion_1): Likewise. ! (convert_like_real): Likewise. ! (build_over_call): Likeiwse. Use DECL_COPY_CONSTRUCTOR_P. ! * decl.c (grokdeclarator): Use DECL_HAS_IN_CHARGE_PARM_P. ! (copy_args_p): Likewise. ! (grok_ctor_properties): Likewise. ! (start_function): Likewise. ! * decl2.c (maybe_retrofit_in_charge): Likewise. Set it. ! * error.c (dump_function_decl): Use DECL_HAS_IN_CHARGE_PARM_P. ! * init.c (emit_base_init): Use DECL_COPY_CONSTRUCTOR_P. ! * method.c (do_build_copy_constructor): Use ! DECL_HAS_IN_CHARGE_PARM_P. ! (synthesize_method): Likewise. ! * pt.c (instantiate_template): Remove goto. ! * tree.c (build_cplus_method_type): Remove mention of obstacks in ! comment. ! ! * cp-tre.h (finish_function): Change prototype. ! * decl.c (end_cleanup_fn): Adjust caller. ! (finish_function): Take only one parameter. ! * decl2.c (finish_objects): Adjust caller. ! (finish_static_storage_duration_function): Likewise. ! * method.c (emit_thunk): Likewise. ! * parse.y: Likewise. ! * parse.c: Regenerated. ! * pt.c (instantiate_decl): Likewise. ! * rtti.c (synthesize_tinfo_fn): Likewise. ! * semantics.c (expand_body): Likewise. ! ! * cp-tree.h (copy_decl): New function. ! * class.c (finish_struct_1): Use it. ! * lex.c (copy_decl): Define it. ! * pt.c (tsubst_decl): Likewise. ! * tree.c (copy_template_template_parm): Likewise. ! ! * cp-tree.h (lang_type): Remove has_nonpublic_ctor and ! has_nonpublic_assign_ref. ! (TYPE_HAS_NONPUBLIC_CTOR): Don't declare. ! (TYPE_HAS_NONPUBLIC_ASSIGN_REF): Likewise. ! * class.c (finish_struct_methods): Don't set ! TYPE_HAS_NONPUBLIC_CTOR or TYPE_HAS_NONPUBLIC_ASSIGN_REF. ! (interface_only): Don't declare. ! (interface_unknown): Likewise. ! ! 2000-04-11 Martin v. Löwis ! ! * tree.h (HAVE_TEMPLATES): Remove definition. ! * lang-options.h (-fthis-is-variable): Remove documentation. ! ! 2000-04-10 Jason Merrill ! ! * class.c (instantiate_type): Handle object-relative template-id. ! ! * semantics.c (finish_expr_stmt): Call convert_to_void here. ! * decl.c (cplus_expand_expr_stmt): Not here. ! ! * rtti.c (build_dynamic_cast_1): Call non_lvalue. ! Initialize exprtype earlier. ! ! * parse.y (fn.def1): Check for defining types in return types. ! ! * decl.c (check_tag_decl): Notice extra fundamental types. ! Diagnose empty decls in classes, too. ! ! * decl.c (grokdeclarator): Don't override an anonymous name if no ! declarator was given. ! ! * cvt.c (convert_to_void): Call resolve_offset_ref. ! ! * typeck.c (build_x_function_call): Abort if we get an OFFSET_REF. ! ! * decl2.c (decl_namespace): Handle getting a type. ! ! * typeck.c (build_c_cast): Re-enable warning for cast between ! pointer and integer of different size. ! ! 2000-04-10 Nathan Sidwell ! ! * inc/cxxabi.h (__pointer_type_info): Add restrict and ! incomplete flags. ! (__pointer_type_info::__pointer_catch): New virtual function. ! (__pointer_to_member_type_info): Derive from ! __pointer_type_info. Adjust. ! (__pointer_to_member_type_info::__do_catch): Remove. ! (__pointer_to_member_type_info::__is_pointer_p): Declare. ! (__pointer_to_member_type_info::__pointer_catch): Declare. ! * rtti.c (qualifier_flags): Add restrict flag. ! (ptmd_initializer): Reorder members. ! (create_tinfo_types): Expand comments. Reorder ! ptmd_desc_type_node members. ! * tinfo2.cc (__pointer_to_member_type_info::__is_pointer_p): ! Implement. ! (__pointer_type_info::__do_catch): Move specific code into ! __pointer_catch. Call it. ! (__pointer_type_info::__pointer_catch): Non-pointer-to-member ! specific catch checking. Fix void conversion check. ! (__pointer_to_member_type_info::__do_catch): Remove. ! (__pointer_to_member_type_info::__pointer_catch): Implement. ! ! 2000-04-10 Martin v. Löwis ! ! * lex.c (init_parse): Remove traces of classof and headof. ! * decl2.c (flag_operator_names): Default to 1. ! (lang_decode_option): Do not set it for -ansi. ! ! 2000-04-09 Mark Mitchell ! ! * cp-tree.h (struct lang_decl): Remove main_decl_variant. ! (DECL_MAIN_VARIANT): Remove. ! * decl.c (duplicate_decls): Don't set it. ! (start_function): Likewise. ! (lang_mark_tree): Don't mark it. ! * decl2.c (defer_fn): Don't use it. ! * lex.c (retrofit_lang_decl): Don't set it. ! * pt.c (tsubst_decl): Likewise. ! * ptree.c (print_lang_decl): Don't print it. ! * typeck.c (mark_addressable): Don't use it. ! ! 2000-04-09 Nathan Sidwell ! ! * vec.cc: Include and . ! (__cxa_vec_ctor): Use __cxa_vec_dtor for cleanup. ! (__cxa_vec_dtor): Catch dtor exceptions, and rethrow or ! terminate. ! (__cxa_vec_delete): Catch dtor exceptions. ! ! 2000-04-09 Nathan Sidwell ! ! Prepend __ to implementation defined names. ! * inc/typeinfo (type_info): Rename _name to __name. ! (type_info::type_info): Rename parameter. ! (type_info::operator==, type_info::operator!=, ! type_info::before): Likewise. ! (type_info::is_pointer_p, type_info::is_function_p, ! type_info::do_catch, type_info::do_upcast): Prepend __. Rename ! parameters. ! * inc/cxxabi.h ! (__fundamental_type_info::__fundamental_type_info) Rename parameters. ! (__pointer_type_info::__pointer_type_info): Likewise. ! (__pointer_type_info::is_pointer_p, ! __pointer_type_info::do_catch): Prepend __. Rename parameters. ! (__array_type_info::__array_type_info): Rename parameters. ! (__function_type_info::__function_type_info): Likewise. ! (__function_type_info::is_function_p): Prepend __. ! (__enum_type_info::__enum_type_info): Rename parameters. ! (__pointer_to_member_type_info::__pointer_to_member_type_info): ! Likewise. ! (__pointer_to_member_type_info::do_catch): Prepend __. Rename ! parameters. ! (__base_class_info::is_virtual_p, is_public_p, offset): Prepend __. ! (__class_type_info::__class_type_info): Rename parameters. ! (__class_type_info::sub_kind): Prepend __. Adjust member names. ! (__class_type_info::upcast_result, ! __class_type_info::dyncast_result): Prepend __. Move definition ! into tinfo.cc. ! (__class_type_info::do_upcast, __class_type_info::do_catch, ! __class_type_info::find_public_src, ! __class_type_info::do_dyncast, ! __class_type_info::do_find_public_src): Prepend __. Rename ! parameters. ! (__si_class_type_info::__si_class_type_info): Rename parameters. ! (__si_class_type_info::do_upcast, __si_class_type_info::do_dyncast, ! __si_class_type_info::do_find_public_src): Prepent __. Rename ! parameters. ! (__vmi_class_type_info::__vmi_class_type_info): Rename parameters. ! (__vmi_class_type_info::do_upcast, __vmi_class_type_info::do_dyncast, ! __vmi_class_type_info::do_find_public_src): Prepent __. Rename ! parameters. ! (__dynamic_cast): Rename parameters. ! * tinfo.cc (type_info::is_pointer_p, type_info::is_function_p, ! type_info::do_catch, type_info::do_upcast): Prepend __. ! (contained_p, public_p, virtual_p, contained_public_p, ! contained_nonpublic_p, contained_nonvirtual_p): Adjust. ! (__class_type_info::do_catch, ! __class_type_info::do_upcast): Prepend __. Adjust. ! (__class_type_info::__upcast_result, ! __class_type_info::__dyncast_result): Move from inc/cxxabi.h. ! Adjust. ! (__class_type_info::find_public_src): Prepend __. Adjust. ! (__class_type_info::do_find_public_src, ! __si_class_type_info::do_find_public_src, ! __vmi_class_type_info::do_find_public_src): Likewise. ! (__class_type_info::do_dyncast, ! __si_class_type_info::do_dyncast, ! __vmi_class_type_info::do_dyncast): Likewise. ! (__class_type_info::do_upcast, ! __si_class_type_info::do_upcast, ! __vmi_class_type_info::do_upcast): Likewise. ! (__dynamic_cast): Adjust. ! * tinfo2.cc (__pointer_type_info::is_pointer_p): Prepend __. ! (__function_type_info::is_function_p): Likewise. ! (__pointer_type_info::do_catch): Likewise. Adjust. ! (__pointer_to_member_type_info::do_catch): Likewise. Adjust. ! (__throw_type_match_rtti_2): Adjust. ! (__is_pointer): Adjust. ! ! 2000-04-08 Mark Mitchell ! ! * cp-tree.h (cp_tree_index): Add CPTI_COMPLETE_CTOR_IDENTIFIER. ! (complete_ctor_identifier): New macro. ! (special_function_kind): Add sfk_copy_constructor and ! sfk_assignment_operator. ! (LOOKUP_HAS_IN_CHARGE): Remove. ! (cons_up_default_function): Rename to ... ! (implicitly_declare_fn): ... this. ! * call.c (build_new_method_call): Add in-charge parameters for ! constructors here. ! * class.c (add_implicitly_declared_members): Change parameter name ! from cant_have_assignment to cant_have_const_assignment. ! Replace calls to cons_up_default_function to implicitly_declare_fn. ! * cvt.c (ocp_convert): Use complete_ctor_identifier. ! * decl.c (initialize_predefined_identifiers): Initialize it. ! (start_function): Use DECL_CONSTRUCTOR_FOR_VBASE_P instead of ! complex expression. ! * init.c (expand_default_init): Don't calculate the in-charge ! parameter here. ! (build_new_1): Likewise. ! * lex.c (cons_up_default_function): Move to method.c. ! * method.c (synthesize_method): Use DECL_DESTRUCTOR_P. ! (implicitly_declare_fn): New function. ! * typeck.c (build_static_cast): Use complete_ctor_identifier. ! (build_modify_expr): Likewise. ! * typeck2.c (build_functional_cast): Likewise. ! ! Under the new ABI, constructors don't return `this'. ! * cp-tree.h (warn_reorder): Declare. ! (special_function_kind): New enum. ! (global_base_init_list): Remove declaration. ! (emit_base_init): Don't return a value. ! (check_base_init): Don't declare. ! (is_aggr_typedef): Likewise. ! * decl.c (check_special_function_return_type): New function. ! (return_types): Remove. ! (grokdeclarator): Use check_special_function_return_type. ! (start_function): Don't initialize ctor_label under the new ABI. ! (finish_construtor_body): Don't create a corresponding LABEL_STMT. ! * init.c (begin_init_stmts): Move to top of file. ! (finish_init_stmts): Likewise. ! (warn_reorder): Don't declare. ! (emit_base_init): Don't create a STMT_EXPR here. Don't return a ! value. ! (check_base_init): Remove. ! (is_aggr_typedef): Likewise. ! (build_new_1): Don't use the return value of a constructor. ! * semantics.c (setup_vtbl_ptr): Don't use the return value ! of emit_base_init. ! * typeck.c (check_return_expr): Don't magically convert return ! statements into `return this' in constructors under the new ABI. ! ! * cp-tree.h (cp_tree_index): Add CPTI_BASE_CTOR_IDENTIFIER, ! CPTI_BASE_DTOR_IDENTIFIER, and CPTI_DELETING_DTOR_IDENTIFIER. ! (base_ctor_identifier): New macro. ! (base_dtor_identifier): Likewise. ! (deleting_dtor_identifier): Likewise. ! * decl.c: Don't include obstack.h. ! (obstack_chunk_alloc): Don't define. ! (obstack_chunk_free): Likewise. ! (struct predefined_identifier): New type. ! (initialize_predefined_identifiers): New function. ! (init_decl_processing): Use it. ! (debug_temp_inits): Remove. ! (start_method): Don't call preserve_data. ! (hack_incomplete_structures): Update comment. ! * init.c (init_init_processing): Don't initialize ! nelts_identifier. ! (build_offset_rf): Remove dead code. ! (build_delete): Use CLASSTYPE_N_BASECLASSES. ! * search.c (init_search_processing): Don't initialize ! vptr_identifier. ! ! 2000-04-08 Kaveh R. Ghazi ! ! * typeck.c (build_binary_op): Call `tree_expr_nonnegative_p' to elide ! some sign_compare warnings. ! ! 2000-04-07 Nathan Sidwell ! ! Rename abi::__vmi_class_type_info members. ! * inc/cxxabi.h (__vmi_class_type_info): Rename details, n_bases, ! base_list, detail_masks members to vmi_flags, vmi_base_count, ! vmi_bases and vmi_flags_masks respectively. ! (__vmi_class_type_info::vmi_flags_masks): Rename ! details_unknown_mask to flags_unknown_mask. ! * tinfo.cc (__class_type_info::do_upcast): Adjust. ! (__vmi_class_type_info::do_find_public_src): Adjust. ! (__vmi_class_type_info::do_dyncast): Adjust. ! (__vmi_class_type_info::do_upcast): Adjust. ! ! 2000-04-07 Nathan Sidwell ! ! * tinfo.cc (convert_to_base): New function. ! (get_vbase_offset): Remove. Move into convert_to_base. ! (__vmi_class_type_info::do_find_public_src): Adjust. ! (__vmi_class_type_info::do_dyncast): Adjust. ! (__vmi_class_type_info::do_upcast): Adjust. ! ! 2000-04-06 Jason Merrill ! ! * tinfo.cc (operator=): Use __builtin_strcmp. ! * tinfo2.cc (before): Likewise. ! ! 2000-04-06 Mark Mitchell ! ! * cp-tree.h (lang_decl_flags): Rename saved_inline to deferred. ! (DECL_SAVED_INLINE): Rename to ... ! (DECL_DEFERRED_FN): ... this. ! (in_function_p): Remove declaration. ! (mark_inline_for_output): Rename to ... ! (defer_fn): ... this. ! * decl.c (finish_function): Adjust call to mark_inline_for_output. ! (in_function_p): Remove definition. ! * decl2.c (saved_inlines): Rename to ... ! (deferred_fns): ... this. ! (saved_inlines_used): Rename to ... ! (deferred_fns_used): ... this. ! (mark_inline_for_output): Rename to ... ! (defer_fn): ... this. ! (finish_file): Adjust accordingly. ! (init_decl2): Likewise. ! * lex.c (cons_up_default_function): Likewise. ! * pt.c (mark_decl_instantiated): Likewise. ! (instantiate_decl): Don't set DECL_DEFER_OUTPUT under any ! circumstances. ! * rtti.c (get_tinfo_decl): Adjust call to mark_inline_for_output. ! * semantics.c (expand_body): Defer more functions. ! ! 2000-04-06 Nathan Sidwell ! ! * vec.cc: New file. ! * Make-lang.in (CXX_LIB2FUNCS): Add it. ! (vec.o): Build it. ! * inc/cxxabi.h (__cxa_vec_new, __cxa_vec_ctor, __cxa_vec_dtor, ! __cxa_vec_delete): Declare. ! ! 2000-04-06 Nathan Sidwell ! ! * rtti.c (dfs_class_hint_mark): New static function. ! (dfs_class_hint_unmark): New static function. ! (class_hint_flags): Use them. ! ! 2000-04-05 Benjamin Kosnik ! ! * decl2.c: Make flag_honor_std dependent on ENABLE_STD_NAMESPACE. ! ! 2000-04-05 Mark Mitchell ! ! * cp-tree.h (instantiate_decl): Change prototype. ! * decl2.c (mark_used): Adjust call. ! * optimize.c (inlinable_function_p): Adjust handling of templates. ! * pt.c (do_decl_instantiation): Adjust call to instantiate_decl. ! (do_type_instantiation): Likewise. ! (instantiate_decl): Defer more templates. ! (instantiate_pending_templates): Adjust logic to handle inline ! friend functions. ! ! * Makefile.in (GGC_H): New variable. Use it throughout in place ! of ggc.h. ! ! * call.c: Don't include obstack.h. Include ggc.h. ! (obstack_chunk_alloc): Don't define. ! (obstack_chunk_free): Likewise. ! (add_candidate): Allocate the z_candidate with ggc_alloc_obj. ! * decl.c (push_switch): Use xmalloc to allocate the cp_switch. ! (pop_switch): Free it. ! ! * decl2.c (grokclassfn): Set TREE_READONLY for PARM_DECLs. ! ! * dump.c (dequeue_and_dump): Don't try to print the bit_position ! if we don't have a DECL_FIELD_OFFSET. ! ! Wed Apr 5 15:12:18 MET DST 2000 Jan Hubicka ! ! * optimize.c (calls_setjmp_r): Use setjmp_call_p instead of ! special_function_p. ! ! 2000-04-04 Kaveh R. Ghazi ! ! * cfns.gperf (hash, libc_name_p): Prototype. ! ! * rtti.c (build_dynamic_cast_1): Constification. ! ! * search.c (dfs_debug_unmarkedp, dfs_debug_mark): Unhide prototypes. ! ! * semantics.c (deferred_type_access_control): Prototype. ! ! 2000-04-04 Mark Mitchell ! ! Correct many new ABI issues regarding vbase and vcall offset ! layout. ! * cp-tree.h (BINFO_VTABLE): Document. ! (struct lang_type): Tweak formatting. ! (BINFO_PRIMARY_BINFO): Add to documentation. ! (CLASSTYPE_VSIZE): Fix typo in comment. ! (CLASSTYPE_VBASECLASSES): Update documentation. ! (BINFO_VBASE_MARKED): Remove. ! (SET_BINFO_VBASE_MARKED): Likewise. ! (CLEAR_BINFO_VBASE_MARKED): Likewise. ! (BINFO_FIELDS_MARKED): Remove. ! (SET_BINFO_FIELDS_MARKED): Likewise. ! (CLEAR_BINFO_FIELDS_MARKED): Likewise. ! (enum access_kind): New enumeration. ! (num_extra_vtbl_entries): Remove declaration. ! (size_extra_vtbl_entries): Likewise. ! (get_vtbl_decl_for_binfo): New function. ! (dfs_vbase_unmark): Remove declaration. ! (mark_primary_bases): Likewise. ! * class.c (SAME_FN): Remove. ! (struct vcall_offset_data_s): Move definition. ! (build_vbase_pointer): Use `build', not `build_binary_op', to ! access the vbase pointer under the new ABI. ! (build_vtable_entry_ref): Use get_vtbl_decl_for_binfo. ! (build_primary_vtable): Likewise. ! (dfs_mark_primary_bases): Move here from search.c. ! (mark_primary_bases): Likewise. ! (determine_primary_bases): Under the new ABI, don't make a base ! class a primary base just because we don't yet have any virtual ! functions. ! (layout_vtable_decl): Use get_vtbl_decl_for_binfo. ! (num_vfun_entries): Remove. ! (dfs_count_virtuals): Likewise. ! (num_extra_vtbl_entries): Likewise. ! (size_extra_vtbl_entries): Likewise. ! (layout_virtual_bases): Iterate in inheritance graph order under ! the new ABI. ! (finish_struct_1): Use TYPE_VFIELD, not CLASSTYPE_VSIZE, to ! indicate that a vfield is present. ! (init_class_processing): Initialize access_public_node, etc., from ! ak_public, etc. ! (get_vtbl_decl_for_binfo): New function. ! (dump_class_hierarchy_r): Likewise. ! (dump_class_hierarchy): Use it. ! (finish_vtbls): Build the vtbls in inheritance graph order. ! (dfs_finish_vtbls): Adjust call to build_vtbl_initializer. ! (initialize_vtable): Use get_vtbl_decl_for_binfo. ! (accumulate_vtbl_inits): Add comments explaining why a pre-order ! walk is required. ! (dfs_accumulate_vtbl_inits): Set BINFO_VTABLE to the location ! where the vptr points, even for primary vtables. ! (build_vtbl_initializer): Adjust handling of vbase and vcall ! offsets. ! (build_vcall_and_vbase_vtable_entries): New function. ! (dfs_build_vbase_offset_vtbl_entries): Remove. ! (build_vbase_offset_vtbl_entries): Reimplement. ! (dfs_build_vcall_offset_vtbl_entries): Don't include virtuals that ! were already handled in a primary base class vtable. ! (build_vcall_offset_vtbl_entries): Adjust. ! (build_rtti_vtbl_entries): Adjust. ! * decl2.c (output_vtable_inherit): Use get_vtbl_decl_for_binfo. ! * init.c (expand_virtual_init): Simplify. ! * repo.c (repo_get_id): Use get_vtbl_decl_for_binfo. ! * rtti.c (create_pseudo_type_info): Adjust calculation of vptr. ! * search.c (BINFO_ACCESS): New macro. ! (SET_BINFO_ACCESS): Likewise. ! (dfs_access_in_type): Manipulate access_kinds, not access nodes. ! (access_in_type): Likewise. ! (dfs_accessible_p): Likewise. ! (protected_accessible_p): Likewise. ! (lookup_fnfields_1): Adjust documentation. ! (dfs_mark_primary_bases): Move to class.c ! (mark_primary_bases): Likewise. ! (dfs_vbase_unmark): Remove. ! (virtual_context): Use BINFO_FOR_VBASE. ! (dfs_get_vbase_types): Simplify. ! (dfs_build_inheritance_graph_order): New function. ! (get_vbase_types): Use it. ! * tree.c (debug_binfo): Use get_vtbl_decl_for_binfo. ! ! * tinfo.cc (get_vbase_offset): New function. ! (__vmi_class_type_info::do_find_public_src): Use it. ! (__vmi_class_type_info::do_dyncast): Likewise. ! (__vmi_class_type_info::do_upcast): Likewise. ! ! 2000-04-03 Zack Weinberg ! ! * lang-specs.h: Pass -fno-show-column to the preprocessor. ! ! 2000-03-30 Nathan Sidwell ! ! * rtti.c (class_hint_flags): Rename flags. ! (class_initializer): Remove flags. ! (synthesize_tinfo_var): Combine offset and flags. Add flags ! for __vmi_class_type_info. ! (create_tinfo_types): Remove flags from __class_type_info and ! __si_class_type_info. Merge flags and offset from ! base_class_type_info. ! * inc/cxxabi.h (__base_class_info): Merge offset and vmi_flags. ! (__base_class_info::is_virtual_p): Adjust. ! (__base_class_info::is_public_p): Adjust. ! (__base_class_info::offset): New accessor. ! (__class_type_info::details): Remove member. ! (__class_type_info::__class_type_info): Lose details. ! (__class_type_info::detail_masks): Remove. ! (__si_class_type_info::__si_class_type_info): Lose details. ! (__vmi_class_type_info::details): New member. ! (__vmi_class_type_info::__vmi_class_type_info): Adjust. ! (__vmi_class_type_info::detail_masks): New member. ! * tinfo.cc (__class_type_info::do_upcast): Initialize result ! with unknown_details_mask. ! (__vmi_class_type_info::do_find_public_src): Adjust ! (__vmi_class_type_info::do_dyncast): Adjust. ! (__vmi_class_type_info::do_upcast): Set result details, if ! needed. Adjust. ! (__dynamic_cast): Temporarily #if out optimization. ! ! 2000-03-29 Nathan Sidwell ! ! * rtti.c (get_tinfo_decl): Mark used. ! (emit_tinfo_decl): Don't optimize polymorphic type_info. Only ! mark as dealt with, if we output it. ! ! 2000-03-28 Mark Mitchell ! ! * class.c: Reorganize to put virtual function table initialization ! machinery at the end of the file. ! ! 2000-03-28 Jason Merrill ! ! * class.c (finish_struct): Use bitsize_zero_node. ! * pt.c (instantiate_class_template): Likewise. ! ! 2000-03-28 Mark Mitchell ! ! Put RTTI entries at negative offsets in new ABI. ! * class.c (dfs_build_vbase_offset_vtbl_entries): Put the first ! vbase offset at index -3, not -1. ! (build_vtabe_offset_vtbl_entries): Use unmarked_vtable_pathp, not ! dfs_vtable_path_unmarked_real_bases_queue_p to walk bases. ! (dfs_build_vcall_offset_vtbl_entries): Don't use skip_rtti_stuff. ! (build_rtti_vtbl_entries): New function. ! (set_rtti_entry): Remove. ! (build_primary_vtable): Don't use it. ! (build_secondary_vtable): Likewise. ! (start_vtable): Remove. ! (first_vfun_index): New function. ! (set_vindex): Likewise. ! (add_virtual_function): Don't call start_vtable. Do call ! set_vindex. ! (set_primary_base): Rename parameter. ! (determine_primary_base): Likewise. ! (num_vfun_entries): Don't use skip_rtti_stuff. ! (num_extra_vtbl_entries): Include RTTI information. ! (build_vtbl_initializer): Use build_rtti_vtbl_entries. ! (skip_rtti_stuff): Remove. ! (dfs_modify_vtables): Don't use it. ! (modify_all_vtables): Don't use start_vtable. Do use set_vindex. ! (layout_nonempty_base_or_field): Update size handling. ! (create_vtable_ptr): Tweak. ! (layout_class_type): Adjust parameter names. ! (finish_struct_1): Simplify. ! * cp-tree.h (CLASSTYPE_VSIZE): Tweak documentation. ! (skip_rtti_stuff): Remove. ! (first_vfun_index): New function. ! (dfs_vtable_path_unmarked_real_bases_queue_p): Remove. ! (dfs_vtable_path_marked_real_bases_queue_p): Remove. ! (marked_vtable_pathp): Declare. ! (unmarked_vtable_pathp): Likewise. ! * error.c (dump_expr): Use first_vfun_index to calculate vtable ! offsets. ! * rtti.c (build_headof): Look for RTTI at negative offsets. ! (get_tinfo_decl_dynamic): Likewise. ! (tinfo_base_init): Don't take the address of the TINFO_VTABLE_DECL ! here. ! (create_pseudo_type_info): Do it here instead. Adjust so that ! vptr points at first virtual function. ! * search.c (marked_vtable_pathp): Make it global. ! (unmarked_vtable_pathp): Likewise. ! (dfs_vtable_path_unmarked_real_bases_queue_p): Remove. ! (dfs_vtable_path_marked_real_bases_queue_p): Likewise. ! (dfs_get_pure_virtuals): Don't use skip_rtti_stuff. ! (get_pure_virtuals): Likewise. ! (expand_upcast_fixups): Likewise. ! * tree.c (debug_binfo): Likewise. ! * tinfo.cc (__dynamic_cast): Look for vtable_prefix at appropriate ! negative offset. ! ! Sun Mar 26 20:15:26 2000 Richard Kenner ! ! * class.c (check_field_decl): Fix typo. ! (build_vtbl_or_vbase_field): Don't clear DECL_SAVED_INSNS. ! (check_methods): Likewise. ! (check_field_decls): Likewise. ! Use DECL_CONTEXT, not DECL_FIELD_CONTEXT. ! * cp-tree.h (DECL_SHADOWED_FOR_VAR, DECL_TEMPLATE_RESULT): ! Use DECL_RESULT_FLD, not DECL_RESULT. ! * decl.c (xref_tag): Use DECL_TEMPLATE_RESULT. ! * lex.c (identifier_type): Likewise. ! * pt.c (determine_specialization, lookup_template_class): Likewise. ! (tsubst_friend_function, tsubst_decl, instantiate_template): Likewise. ! (resolve_overloaded_unification, more_specialized): Likewise. ! * semantics.c (finish_member_declaration): Likewise. ! * typeck.c (build_x_function_call): Likewise. ! ! 2000-03-26 Mark Mitchell ! ! * class.c (layout_empty_base): Handle empty bases with non-byte ! alignment. ! (build_base_field): Likewise. ! (layout_virtual_bases): Likewise. ! ! * class.c (finish_struct_1): Fix typo in this change: ! ! Sat Mar 25 09:12:10 2000 Richard Kenner ! ! 2000-03-25 Mark Mitchell ! ! * decl.c (grokdeclarator): Count partial specializations when ! keeping track of how many template classes have been seen. ! ! * dump.c (dequeue_and_dump): Dump DECL_TEMPLATE_RESULT. ! ! Sat Mar 25 09:12:10 2000 Richard Kenner ! ! * class.c (build_vbase_pointer_fields): layout_field now place_field. ! (get_vfield_offset): Use byte_position. ! (set_rtti_entry): Set OFFSET to ssizetype zero. ! (get_binfo_offset_as_int): Deleted. ! (dfs_record_base_offsets): Use tree_low_cst. ! (dfs_search_base_offsets): Likewise. ! (layout_nonempty_base_or_field): Reflect changes in RLI format ! and call byte_position. ! (layout_empty_base): Convert offset to ssizetype. ! (build_base_field): use rli_size_unit_so_far. ! (dfs_propagate_binfo_offsets): Do computation in proper type. ! (layout_virtual_bases): Pass ssizetype to propagate_binfo_offsets. ! (layout_class_type): Reflect changes in RLI names and fields. ! (finish_struct_1): Set DECL_FIELD_OFFSET. ! * dump.c (dequeue_and_dump): Call bit_position. ! * expr.c (cplus_expand_constant): Use byte_position. ! * rtti.c (expand_class_desc): Use bitsize_one_node. ! * typeck.c (build_component_addr): Use byte_position and don't ! special case for zero offset. ! ! 2000-03-24 Nathan Sidwell ! ! * decl.c (vtype_decl_p): Use TYPE_POLYMORPHIC_P. ! ! * rtti.c (get_tinfo_decl): Set comdat linkage on new-abi ! tinfo object. ! (emit_tinfo_decl): Only emit polymorphic tinfo's when emitting ! vtable. ! ! 2000-03-20 Theodore Papadopoulo ! ! * call.c (check_dtor_name, build_new_method_call): Use TYPE_P and ! DECL_P macros. ! * decl.c (push_class_binding, poplevel, pushtag, lookup_namespace_name, ! make_typename_type, check_initializer, cp_finish_decl, ! xref_tag): Likewise. ! * decl2.c (grokfield, build_expr_from_tree, build_expr_from_tree, ! decl_namespace, arg_assoc_template_arg, arg_assoc, ! validate_nonmember_using_decl, do_class_using_decl): Likewise. ! * error.c (dump_template_argument, dump_expr, cp_file_of, cp_line_of, ! args_to_string): Likewise. ! * friend.c (is_friend): Likewise. ! * lex.c (note_got_semicolon, note_list_got_semicolon, ! is_global): Likewise. ! * method.c (build_overload_nested_name, build_overload_value, ! build_qualified_name, build_qualified_name, hack_identifier): Likewise. ! * parse.y (typename_sub, typename_sub1): Likewise. ! * pt.c (push_inline_template_parms_recursive, check_template_shadow, ! process_partial_specialization, convert_template_argument, ! template_args_equal, add_pending_template, lookup_template_class, ! for_each_template_parm_r, maybe_fold_nontype_arg, ! tsubst, instantiate_template, type_unification_real, unify, ! instantiate_pending_templates, set_mangled_name_for_template_decl): ! Likewise. ! * repo.c (repo_get_id, repo_template_used): Likewise. ! * search.c (lookup_field_1): Likewise. ! * tree.c (walk_tree, get_type_decl, cp_tree_equal, member_p): Likewise. ! * xref.c (classname): Likewise. ! ! 2000-03-22 Mark Mitchell ! ! * cp-tree.h (BINFO_FOR_VBASE): Adjust documentation. ! (CANONICAL_BINFO): New macro. ! (BINFO_NEW_VTABLE_MARKED): Use it. ! (SET_BINFO_NEW_VTABLE_MARKED): Likewise. ! (CLEAR_BINFO_NEW_VTABLE_MARKED): Likewise. ! * class.c (dfs_build_vbase_offset_vtbl_entries): Use BINFO_TYPE, ! not TREE_TYPE. ! (build_primary_vtable): Adjust usage of BINFO_NEW_VTABLE_MARKED. ! (build_secondary_vtable): Likewise. ! (dfs_finish_vtbls): Likewise. ! (dfs_accumulate_vtbl_inits): Likewise. ! (accumulate_vtbl_inits): New function. ! (finish_vtbls): Make sure that virtual bases come after ! non-virtual bases in the vtable group. ! (record_base_offsets): Don't save and restore TREE_VIA_VIRTUAL. ! (finish_struct_1): Adjust usage of BINFO_NEW_VTABLE_MARKED. ! * search.c (struct vbase_info): Move definition. ! (marked_new_vtable_p): Adjust usage of BINFO_NEW_VTABLE_MARKED. ! (unmarked_new_vtable_p): Likewise. ! (dfs_mark_vtable_path): Remove. ! (dfs_mark_new_vtable): Remove. ! (dfs_unmark_new_vtable): Likewise. ! (dfs_clear_search_slot): Likewise. ! (dfs_find_vbases): Adjust usage of BINFO_NEW_VTABLE_MARKED. ! (dfs_clear_vbase_slots): Likewise. ! (init_vbase_pointers): LIkewise. ! ! 2000-03-22 Jason Merrill ! ! * typeck.c (type_after_usual_arithmetic_conversions): Prefer a ! SIZETYPE to a non-SIZETYPE. ! ! 2000-03-21 Mark Mitchell ! ! * class.c (layout_virtual_bases): Adjust names in conditionally ! compiled code. ! ! * class.c (record_base_offsets): New function. ! (layout_conflict_p): Likewise. ! (layout_nonempty_base_or_field): Use it. ! (layout_empty_base): New function. ! (build_base_field): Use it. ! (build_base_fields): Update comment. ! (layout_virtual_bases): Fold in a little code form ! layout_basetypes. Use layout_empty_base. ! (layout_basetypes): Remove. ! (end_of_class): New function. ! (layout_class_type): Use it. Adjust. ! ! * cp-tree.h (CLASSTYPE_VBASECLASSES): Fix typo in comment. ! (fntype_p): Remove. ! * search.c (dfs_skip_nonprimary_vbases_unmarkedp): Fix typo in ! comment. ! (dfs_skip_nonprimary_vbases_markedp): Likewise. ! * typeck.c (fntype_p): Remove. ! ! * cp-tree.h (TI_SPEC_INFO): Remove. ! (CLASSTYPE_TI_SPEC_INFO): Likewise. ! * pt.c (process_partial_specialization): Likewise. ! ! * class.c (build_base_field): Fix thinko in computation of binfo ! offsets. ! ! * tree.c (mark_local_for_remap_p): Mark variables declared in ! TARGET_EXPRs as well. ! ! 2000-03-21 Nathan Sidwell ! ! * typeck.c (require_complete_type, complete_type, ! complete_type_or_else, c_sizeof, c_sizeof_nowarn, ! build_array_ref, convert_arguments, pointer_diff, ! build_x_unary_op, build_unary_op, build_c_cast, ! build_modify_expr): Use COMPLETE_TYPE_P etc. ! * call.c (is_complete, convert_like_real, ! build_new_method_call): Likewise. ! * class.c (build_vbase_pointer_fields, check_bases, ! build_base_field, finish_struct_1, pushclass): Likewise. ! * cvt.c (cp_convert_to_pointer, convert_to_void): Likewise. ! * decl.c (maybe_process_template_type_declaration, pushtag, ! pushdecl, redeclaration_error_message, start_decl, start_decl_1, ! layout_var_decl, check_initializer, cp_finish_decl, ! grokdeclarator, require_complete_types_for_parms, ! grok_op_properties, xref_tag, xref_basetypes, ! check_function_type): Likewise. ! * decl2.c (check_classfn, reparse_absdcl_as_casts): Likewise. ! * friend.c (do_friend): Likewise. ! * init.c (build_offset_ref): Likewise. ! * parse.y (structsp): Likewise. ! * pt.c (maybe_process_partial_specialization, ! tsubst_friend_function, instantiate_class_template, tsubst, ! do_type_instantiation, instantiate_pending_templates): Likewise. ! * repo.c (repo_get_id): Likewise. ! * rtti.c (build_typeid, get_typeid, build_dynamic_cast_1, ! synthesize_tinfo_var, emit_support_tinfos): Likewise. ! * search.c (lookup_fnfields_1, lookup_conversions): Likewise. ! * semantics.c (begin_class_definition): Likewise. ! * tree.c (build_cplus_method_type): Likewise. ! * typeck2.c (digest_init, build_functional_cast, ! add_exception_specifier): Likewise. ! * parse.h, parse.c: Regenerated. ! ! 2000-03-21 Nathan Sidwell ! ! * inc/cxxabi.h: New header file. Define new-abi entry points. ! (__pointer_type_info::target): Rename member to ... ! (__pointer_type_info::type): ... here. ! (__base_class_info::type): Rename member to ... ! (__base_class_info::base): ... here. ! * Make-lang.in (CXX_EXTRA_HEADERS): Add cxxabi.h ! * cp-tree.h (CPTI_ABI): New global tree enumeration. ! (abi_node): New global tree node. ! * decl.c (abi_node): Document. ! (init_decl_processing): Initialize abi_node. ! * rtti.c (build_dynamic_cast_1): Use abi_node for new-abi. ! (get_vmi_pseudo_type_info): Likewise. ! (create_tinfo_types): Likewise. ! (emit_support_tinfos): Likewise. ! * tinfo.h (cxxabi.h): Include for new-abi. ! Move rtti class definitions to new header file. ! * tinfo.cc (abi): Use the namespace. ! (std): Move new abi rtti classes from here ... ! (__cxxabiv1): ... to here. ! * tinfo2.cc (cxxabi.h): Include for new-abi. ! Move rtti class definitions to new header file. ! (std): Move new abi rtti classes from here ... ! (__cxxabiv1): ... to here. ! * inc/typeinfo (__class_type_info): Move into __cxxabiv1 ! namespace. ! ! 2000-03-20 Jed Wing ! Jason Merrill ! ! * method.c (build_overload_int): Use host_integerp. ! ! 2000-03-20 Theodore Papadopoulo ! ! * init.c (build_offset_ref): Handle the case of a templated member ! function. ! ! 2000-03-19 Martin v. Löwis ! ! * except.c (expand_exception_blocks): Clear catch_clauses_last. ! ! 2000-03-18 Mark Mitchell ! ! * cp-tree.h (CLEAR_DECL_C_BIT_FIELD): New macro. ! * class.c (check_bitfield_decl): Turn illegal bitfields into ! non-bitfields. ! (dfs_propagate_binfo_offsets): Adjust for new size_binop ! semantics. ! (dfs_offset_for_unshared_vbases): Likewise. ! * cvt.c (cp_convert_to_pointer): Convert NULL to a ! pointer-to-member correctly under the new ABI. ! * expr.c (cplus_expand_constant): Don't use cp_convert when ! turning an offset into a pointer-to-member. ! * init.c (resolve_offset_ref): Don't adjust pointers-to-members ! when dereferencing them under the new ABI. ! * typeck.c (get_member_function_from_ptrfunc): Tweak calculation ! of pointers-to-members under the new ABI. ! ! * class.c (check_bitfield_decl): Remove restriction on really long ! bitfields. ! (layout_class_type): Implement new ABI handling of bitfields ! longer than their types. ! ! 2000-03-18 Martin v. Löwis ! ! * parse.y (extdefs): Call ggc_collect. ! * parse.c: Regenerated. ! ! 2000-03-18 Nathan Sidwell ! ! * class.c (build_base_field): Use TYPE_ALIGN to examine a type. ! (note_name_declared_in_class): Use OVL_CURRENT to get at a ! potential overload. ! ! Fri Mar 17 08:09:14 2000 Richard Kenner ! ! * class.c (build_vbase_path): Use integer_zerop. ! (build_vtable_entry): Use tree_low_cst. ! (get_vfield_offset): Use bit_position. ! (dfs_modify_vtables): New variable vindex_val; `i' is HOST_WIDE_INT. ! Use tree_low_cst. ! (check_bitfield_decl): Set DECL_SIZE using convert. ! (build_base_field): Set DECL_SIZE and DECL_SIZE_UNIT using size_binop. ! (layout_virtual_bases): DSIZE is unsigned HOST_WIDE_INT. ! Use tree_low_cst. ! (finish_struct_1): Use bit_position. ! (dump_class_hierarchy): Use tree_low_cst. ! * cp-tree.h (min_precision): Add declaration. ! * decl.c (xref_tag, xref_basetypes): Use tree_low_cst. ! * error.c (dump_type_suffix): Use host_integerp and tree_low_cst. ! (dump_expr): Use integer_zerop, host_integerp, and tree_low_cst. ! * expr.c (cplus_expand_constant): Use bit_position. ! * init.c (build_vec_init): Use host_integerp and tree_low_cst. ! * rtti.c (get_base_offset): Use bit_position. ! * typeck.c (build_binary_op): Use integer_zerop, compare_tree_int, ! host_integerp, and tree_low_cst. ! (pointer_int_sum): Use integer_zerop. ! (build_component_addr): Use bit_position. ! ! 2000-03-17 Nathan Sidwell ! ! * typeck.c (require_complete_type): Don't assume size_zero_node. ! (complete_type_or_else): Likewise. ! ! 2000-03-16 Steven Grady ! Jason Merrill ! ! * rtti.c (build_dynamic_cast_1): Improve diagnostics. ! ! 2000-03-16 Nathan Sidwell ! ! * decl2.c (grokfield): Bail out if type is error_mark_node. ! ! 2000-03-15 Nathan Sidwell ! ! * tinfo2.cc (__ptr_to_member_data): Rename to ... ! (__pointer_to_member_data): ... here. Adjust. ! * rtti.c (create_tinfo_types): Adjust. ! ! 2000-03-15 Nathan Sidwell ! ! * cp-tree.h (CPTI_REF_DESC_TYPE, ref_desc_type_node): Remove. ! * decl.c (ref_desc_type_node): Undocument. ! * rtti.c (ptr_ref_initializer): Rename to ... ! (ptr_initializer): ... here. Adjust comments. ! (ptmd_initializer): Fix comment thinko. ! (synthesize_tinfo_var): Remove REFERENCE_TYPE case. ! (create_tinfo_types): Remove ref_desc_type_node init. ! * tinfo2.cc (__reference_type_info): Remove. ! ! 2000-03-15 Nathan Sidwell ! ! * decl.c (cp_finish_decl): Remove obsolete comment. ! ! * typeck.c (build_ptrmemfunc1): Kill uninitialized warning. ! ! 2000-03-14 Mark Mitchell ! ! * cp-tree.h: Tweak documentation. ! * class.c (build_vbase_pointer_fields): Layout the fields, too. ! (avoid_overlap): Remove. ! (get_binfo_offset_as_int): New function. ! (dfs_serach_base_offsets): Likewise. ! (layout_nonempty_base_or_field): Likewise. ! (build_base_field): Layout fields here. Avoid placing two objects ! of the same type at the same address, under the new ABI. ! (build_base_fields): Adjust accordingly. ! (create_vtable_ptr): Return the new field, but don't attach it to ! TYPE_FIELDS. ! (remove_base_field): Remove. ! (remove_base_fields): Remove. ! (layout_basetypes): Adjust accordingly. ! (layout_class_type): Call layout_field for each field, rather than ! just making a wholesale call to layout_type. ! ! 2000-03-14 Jeff Sturm ! ! * except.c (expand_throw): Fix typo in _Jv_Sjlj_Throw. ! ! 2000-03-13 Jason Merrill ! ! * decl.c (grokfndecl): Set TREE_NOTHROW if TYPE_NOTHROW_P. ! ! * except.c (dtor_nothrow): New fn. ! (do_pop_exception): Use it. Take type parm. ! (push_eh_cleanup): Take type parm. ! (expand_start_catch_block): Pass it. ! (build_eh_type_type_ref): Accept null type. ! ! 2000-03-12 Mark Mitchell ! ! * cp-tree.h (revert_static_member_fn): Change prototype. ! * decl.c (grokfndecl): Adjust call to revert_static_member_fn. ! (grok_op_properties): Likewise. ! (start_function): Likewise. ! (revert_static_member_fn): Simplify. ! * pt.c (check_explicit_specialization): Adjust call to ! revert_static_member_fn. ! ! 2000-03-11 Mark Mitchell ! ! * cp-tree.h (scope_kind): New type. ! (tmpl_spec_kind): Likewise. ! (declare_pseudo_global_level): Remove. ! (pseudo_global_level_p): Rename to template_parm_scope_p. ! (pushlevel): Remove declaration. ! (begin_scope): New function. ! (finish_scope): Likewise. ! (current_tmpl_spec_kind): Likewise. ! * decl.c (struct binding_level): Shorten parm_flag to 2 bits. ! Shorten keep to 2 bits. Rename pseudo_global to template_parms_p. ! Add template_spec_p. ! (toplevel_bindings_p): Adjust. ! (declare_pseudo_global_level): Remove. ! (pseudo_global_level_p): Rename to template_parm_scope_p. ! (current_tmpl_spec_kind): New function. ! (begin_scope): Likewise. ! (finish_scope): Likewise. ! (maybe_push_to_top_level): Adjust. ! (maybe_process_template_type_declaration): Likewise. ! (pushtag): Likewise. ! (pushdecl_nonclass_level): Likewise. ! (lookup_tag): Likewise. ! (grokfndecl): Handle member template specializations. Share ! constructor and non-constructor code. ! * decl2.c (check_classfn): Handle member template specializations. ! * pt.c (begin_template_parm_list): Use begin_scope. ! (begin_specialization): Likewise. ! (end_specialization): Likewise. ! (check_explicit_specialization): Use current_tmpl_spec_kind. ! Handle member template specializations. ! (end_template_decl): Use finish_scope. Remove call to ! get_pending_sizes. ! (push_template_decl_real): Remove bogus error message. ! (tsubst_decl): Fix typo in code contained in comment. ! (instantiate_template): Handle member template specializations. ! (most_general_template): Likewise. ! ! 2000-03-11 Gabriel Dos Reis ! ! * lex.c (whitespace_cr): Compress consecutive calls to warning(). ! (do_identifier): Ditto for error(). ! ! * pt.c (convert_nontype_argument): Ditto for cp_error(). ! (convert_template_argument): Ditto for cp_pedwarn(). ! ! 2000-03-11 Jason Merrill ! ! * exception.cc (__check_null_eh_spec): New fn. ! * except.c (expand_end_eh_spec): Call it if the spec is throw(). ! ! 2000-03-10 Jason Merrill ! ! * decl.c (push_throw_library_fn): Take the FUNCTION_TYPE. ! * except.c (expand_end_eh_spec): Add the return type. ! * rtti.c (throw_bad_cast): Add the parmtypes. ! (throw_bad_typeid): Likewise. ! ! * semantics.c (expand_stmt): Only leave out rtl for unused ! artificials, and set DECL_IGNORED_P on them as well. ! * decl.c (wrapup_globals_for_namespace): Likewise. ! ! 2000-03-09 Nathan Sidwell ! ! * decl.c (maybe_commonize_var): Skip all artificial decls. ! * pt.c (tsubst_decl): Don't copy TREE_ASM_WRITTEN. ! ! 2000-03-10 Jason Merrill ! ! * lang-options.h, decl2.c: Add -fno-enforce-eh-specs. ! * cp-tree.h: Declare flag_enforce_eh_specs. ! * decl.c (store_parm_decls, finish_function): Check it. ! ! C library functions don't throw. ! * Makefile.in (cfns.h): New target. ! (except.o): Depend on it. ! * Make-lang.in (cc1plus): Depend on cfns.gperf. ! * cfns.gperf: New file. ! * cfns.h: Generated. ! * except.c: Include it. ! (nothrow_libfn_p): New fn. ! * decl.c (grokfndecl): Use it. ! * cp-tree.h: Declare it. ! ! * decl.c (push_overloaded_decl_1, auto_function, ! define_function): Lose. ! (build_library_fn_1): New static fn. ! (builtin_function): Use it. ! (get_atexit_node): Use build_library_fn_ptr. ! (build_library_fn, build_cp_library_fn, build_library_fn_ptr, ! build_cp_library_fn_ptr, push_library_fn, push_cp_library_fn, ! push_void_library_fn, push_throw_library_fn): New fns. ! * cp-tree.h: Declare them. ! (cp_tree_index): Remove CPTI_BAD_CAST, CPTI_BAD_TYPEID. ! (throw_bad_cast_node, throw_bad_typeid_node): Lose. ! * except.c (init_exception_processing, call_eh_info, do_pop_exception, ! (expand_end_eh_spec, alloc_eh_object, expand_throw): Use above fns. ! * rtti.c (build_runtime_decl): Lose. ! (throw_bad_cast, throw_bad_typeid, get_tinfo_decl, ! build_dynamic_cast_1, expand_si_desc, expand_class_desc, ! expand_ptr_desc, expand_attr_desc, expand_generic_desc): Use above fns. ! ! * call.c (build_call): Remove result_type parm. ! Call mark_used on unused artificial fns. ! * init.c, method.c, typeck.c, except.c, rtti.c: Adjust. ! ! 2000-03-09 Jason Merrill ! ! * call.c (build_call): Set TREE_NOTHROW on the CALL_EXPR as ! appropriate. ! * decl.c (define_function): Set TREE_NOTHROW on the FUNCTION_DECL. ! * except.c (call_eh_info, alloc_eh_object, expand_throw): Set ! TREE_NOTHROW or TREE_THIS_VOLATILE on the function as appropriate. ! * rtti.c (build_runtime_decl, get_tinfo_decl, build_dynamic_cast_1, ! expand_si_desc, expand_class_desc, expand_ptr_desc, expand_attr_desc, ! expand_generic_desc): Likewise. ! ! 2000-03-08 Nathan Sidwell ! ! * exception.cc (__cp_pop_exception): Cleanup the original object. ! ! 2000-03-08 Nathan Sidwell ! ! * decl.c (grok_op_properties): Merge conversion to void warning ! with other silly op warnings. ! ! 2000-03-08 Jason Merrill ! ! * typeck2.c (process_init_constructor): Set TREE_PURPOSE of ! array CONSTRUCTOR elements. Don't use expr_tree_cons. ! ! 2000-03-08 Nathan Sidwell ! ! * decl.c (cp_make_fname_decl): New function. ! (wrapup_globals_for_namespace): Don't emit unused static vars. ! (init_decl_processing): Remove comment about use of ! array_domain_type. Set make_fname_decl. ! (cp_finish_decl): Remove __FUNCTION__ nadgering. ! * semantics.c (begin_compound_stmt): Remove ! current_function_name_declared flagging. ! (expand_stmt): Don't emit unused local statics. ! * typeck.c (decay_conversion): Don't treat __FUNCTION__ decls ! specially. ! ! 2000-03-08 Nathan Sidwell ! ! * typeck.c (convert_for_assignment): Don't look at array ! initializer. ! * call.c (convert_like_real): Likewise. ! ! 2000-03-07 Jason Merrill ! ! Add initial support for '\uNNNN' specifier. ! * lex.c (read_ucs): New fn. ! (readescape, skip_white_space): Call it. ! (is_extended_char, is_extended_char_1): New fns. ! (utf8_extend_token): New fn, #if 0'd out. ! (real_yylex): Treat extended chars like letters. ! ! * search.c (note_debug_info_needed): Walk the bases even if we ! weren't deferring the type itself. ! ! 2000-03-07 Kaveh R. Ghazi ! ! * decl2.c (finish_objects): Constify a char*. ! ! * method.c (emit_thunk): Likewise. ! ! 2000-03-06 Nathan Sidwell ! ! * typeck.c (dubious_conversion_warnings): Look through ! REFERENCE_TYPE. ! ! Mon Mar 6 08:46:47 2000 Richard Kenner ! ! * class.c (dfs_modify_vtables): I is now unsigned. ! (check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int. ! (build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT. ! * error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned. ! * init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT. ! * method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned. ! * typeck.c (build_binary_op, case TRUNC_DIV_EXPR): ! Call integer_all_onesp. ! * typeck2.c (process_init_constructor): Use compare_tree_int. ! ! * lang-specs.h (as): Don't call if -syntax-only. ! ! 2000-03-06 Mark Mitchell ! ! * expr.c (cplus_expand_expr, case STMT_EXPR): Don't set ! RTL_EXPR_HAS_NO_SCOPE after all. ! ! 2000-03-05 Mark Mitchell ! ! * expr.c (cplus_expand_expr, case STMT_EXPR): Use ! expand_start_stmt_expr and expand_end_stmt_expr directly. Set ! RTL_EXPR_HAS_NO_SCOPE. ! ! * pt.c (instantiate_decl): Clear TI_PENDING_TEMPLATE_FLAG a little ! later. ! ! * dump.c (dequeue_and_dump): Dump SCOPE_NO_CLEANUPS_P. ! ! 2000-03-05 Nathan Sidwell ! ! * call.c (convert_like): Macrofy. ! (convert_like_with_context): New macro. ! (convert_like_real): Renamed from convert_like. Add calling ! context parameters, for diagnostics. Add recursive flag. Call ! dubious_conversion_warnings for outer conversion. ! (build_user_type_conversion): Use convert_like_with_context. ! (build_over_call): Likewise. Don't warn about dubious ! conversions here. Adjust convert_default_arg calls. ! (convert_default_arg): Add context parameters for diagnostics. ! Pass through to convert_like_with_context. ! * cp-tree.h (convert_default_arg): Add context parameters. ! (dubious_conversion_warnings): Prototype new function. ! * typeck.c (convert_arguments): Adjust convert_default_arg call. ! (dubious_conversion_warnings): New function, broken ! out of convert_for_assignment. ! (convert_for_assignment): Adjust. ! ! 2000-03-03 Jason Merrill ! ! * decl2.c (key_method): Break out from... ! (import_export_vtable, import_export_class): ...here. ! ! * decl.c (finish_function): Don't mess with flag_keep_inline_functions. ! * decl2.c (finish_vtable_vardecl): Don't check decl_function_context. ! ! * search.c (note_debug_info_needed, dfs_debug_mark, ! dfs_debug_unmarkedp): Uncomment. Adjust for new scheme. ! * decl2.c (finish_vtable_vardecl): Call note_debug_info_needed. ! ! 2000-03-03 Nathan Sidwell ! ! * decl.c (cp_finish_decl): Remove obsolete obstack comments, fix ! typos. ! ! 2000-03-02 Mark Mitchell ! ! * cp-tree.h (TYPE_NEEDS_DESTRUCTOR): Rename to ... ! (TYPE_HAS_NONTRIVIAL_DESTRUCTOR): ... this. ! (TYPE_HAS_TRIVIAL_DESTRUCTOR): New macro. ! (lang_type): Split gets_new into has_new and has_array_new. ! (TYPE_VEC_NEW_USES_COOKIE): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR. ! (TYPE_GETS_NEW): Split into ... ! (TYPE_HAS_NEW_OPERATOR): ... this, and ... ! (TYPE_HAS_ARRAY_NEW_OPERATOR): ... this. ! (DECL_ARRAY_DELETE_OPERATOR_P): New macro ! (build_op_new_call): Don't declare. ! (build_new_1): Likewise. ! * call.c (build_op_new_call): Remove. ! * class.c (check_bases): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR ! instead of TYPE_NEEDS_DESTRUCTOR. ! (finish_struct_bits): Likewise. ! (add_implicitly_declared_members): Likewise. ! (check_field_decl): Likewise. ! (check_methods): Set TYPE_VEC_DELETE_TAKES_SIZE here, and set it ! correctly under the new ABI. ! * decl.c (start_decl_1): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR ! instead of TYPE_NEEDS_DESTRUCTOR. ! (initialize_local_var): Likewise. ! (destroy_local_var): Likewise. ! (cp_finish_decl): Likewise. ! (register_dtor_fn): Likewise. ! (grok_op_properties): Set TYPE_HAS_NEW_OPERATOR and ! TYPE_HAS_ARRAY_NEW_OPERATOR, not TYPE_HAS_NEW. Don't set ! TYPE_VEC_DELETE_TAKES_SIZE here. ! (xref_basetypes): Set TYPE_HAS_NEW_OPERATOR and ! TYPE_HAS_ARRAY_NEW_OPERATOR, not TYPE_HAS_NEW. ! (store_parm_decls): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR. ! (finish_destructor_body): Likewise. ! (maybe_build_cleanup_1): Likewise. ! * decl2.c (do_static_destruction): Likewise. ! * init.c (build_new_1): Make it static. ! (perform_member_init): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR. ! (expand_cleanup_for_base): Likewise. ! (get_cookie_size): New function. ! (build_new_1): Handle array-new cookies correctly under the new ! ABI. ! (build_vec_delete_1): Likewise. ! (build_vec_init): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR. ! (build_delete): Likewise. ! (build_vec_delete): Handle array-new cookies correctly under the new ! ABI. ! * lex.c (do_identifier): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR. ! * pt.c (instantiate_class_template): Set TYPE_HAS_NEW_OPERATOR and ! TYPE_HAS_ARRAY_NEW_OPERATOR. ! * ptree.c (print_lang_type): Check them. ! * search.c (context_for_name_lookup): Fix typo in comment. ! (tree_has_any_destructor_p): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR. ! * tree.c (break_out_cleanups): Likewise. ! (build_cplus_array_test_1): Likewise. ! (cp_build_qualified_type_real): Likewise. ! * typeck.c (complete_type): Likewise. ! ! * g++spec.c (lang_specific_driver): Add -fnew-abi at the start of ! the command-line, not the end. ! ! 2000-03-01 Jason Merrill ! ! * pt.c (instantiate_decl): Clear TI_PENDING_TEMPLATE_FLAG. ! ! 2000-03-02 Tom Tromey ! ! * cp-tree.h (build_java_class_ref): Declare. ! * init.c (build_java_class_ref): No longer static. ! * except.c (expand_throw): Generate a Java-style `throw' if the ! thrown object is a "Java" object. ! (initialize_handler_parm): Generate a Java-style lookup of ! exception info if the caught object is a "Java" object. ! (catch_language, catch_language_init): New globals. ! (decl_is_java_type): New function. ! (expand_start_catch_block): Don't call push_eh_info() or ! push_eh_cleanup() when handling a Java-style "catch". Pass Java ! class reference to build_catch_block. ! ! Thu Mar 2 13:32:01 2000 Richard Kenner ! ! * typeck.c (comptypes): Treat sizetype like its language equivalent. ! ! 2000-03-01 Bernd Schmidt ! ! * typeck.c (maybe_warn_about_returning_address_of_local): Reorganize ! to merge reference/pointer code and fix incorrect warnings. ! ! 2000-02-29 Jason Merrill ! ! * search.c (protected_accessible_p): Use context_for_name_lookup. ! ! * init.c (construct_virtual_bases): Fix thinko. ! * typeck.c (expand_ptrmemfunc_cst): Fix thinko. ! ! 2000-03-01 Martin von Loewis ! ! * decl.c (current_function_decl): Move to toplev.c. ! ! 2000-02-29 Nathan Sidwell ! ! * pt.c (fn_type_unification): Unify return type, whenever ! provided. ! (get_bindings_real): Only pass return type when necessary. ! Remove explicit return type check. ! * class.c (resolve_address_of_overloaded_function): Pass desired ! return type to fn_type_unification. ! ! Mon Feb 28 08:15:23 2000 Richard Kenner ! ! * class.c (build_vtbl_or_vbase_field, check_methods): Don't clear ! DECL_FIELD_SIZE. ! (check_bitfield_decl, check_field_decls): Set DECL_SIZE, not ! DECL_FIELD_SIZE. ! * rtti.c (expand_class_desc): Likewise. ! * cp-tree.h (DECL_INIT_PRIORITY): Use underlying union name. ! (THUNK_VCALL_OFFSET): Likewise. ! (THUNK_DELTA): Reflect changes in ../tree.h. ! ! 2000-02-28 Jason Merrill ! ! * search.c (protected_accessible_p): Also allow the access if ! the member is public in DERIVED. Lose TYPE parm. ! (friend_accessible_p): Lose TYPE parm. ! (accessible_p): Adjust. ! ! Sun Feb 27 16:40:33 2000 Richard Kenner ! ! * class.c (dfs_build_vtable_offset_vtbl_entries): Don't use size_binop ! on things that are not sizes; ssize_binop deleted. ! Call size_diffop when appropriate. ! (dfs_build_vcall_offset_vtbl_entries): Likewise. ! (build_primary_vtable, build_secondary_vtable): Likewise. ! (dfs_set_offset_for_unshared_vbases, dfs_modify_vtables): Likewise. ! Variable I is HOST_WIDE_INT. ! (get_vfield_offset): Pass proper types to size_binop. ! (size_extra_vtbl_entries, layout_virtual_bases): Likewise. ! (finish_struct_1): Likewise. ! (skip_rtti_stuff): Arg N is now pointer to signed. ! (layout_class_type): Use size_zero_node. ! * cp-tree.h (skip_rtti_stuff): Arg N is pointer to signed. ! * cvt.c (cp_convert_to_pointer): Pass proper types to size_binop. ! * decl.c (complete_arry_type): Pass proper types to size_binop. ! (xref_basetypes): BINFO_OFFSET is sizetype. ! * error.c (dump_expr): Don't use size_binop non-sizes. ! * expr.c (cplus_expand_constant): Pass proper types to size_binop. ! * init.c (construct_virtual_bases): Fix type error. ! (build_vec_delete_1): Pass proper type to size_binop and don't ! fold result. ! * lex.c (cp_make_lang_type): BINFO_OFFSET is sizetype. ! * rtti.c (get_base_offset): Pass proper type to size_binop. ! * search.c (dfs_find_vbases): Fix type error. ! (expand_upcast_fixups): Arg to skip_rtti_stuff is pointer to signed. ! (dfs_get_vbase_types): BINFO_OFFSET is sizetype. ! * tree.c (debug_binfo): Variable N is signed. ! Use HOST_WIDE_INT_PRINT_DEC. ! * typeck.c (comptypes): sizetype is same as equivalent integer type. ! (c_sizeof, c_sizeof_nowarn, expr_sizeof): Use TYPE_SIZE_UNIT, ! size_one_node and size_zero_node. ! (c_alignof): Use size_one_node. ! (build_component_addr): Pass proper types to size_binop. ! (expand_ptrmemfunc_cst): Don't use size_binop on non-sizes. ! ! 2000-02-26 Jason Merrill ! ! Implement class scope using-declarations for functions. ! * class.c (handle_using_decl): Call add_method for used functions. ! Use IDENTIFIER_CLASS_VALUE to check for conflicts. ! (add_method): Used functions are hidden by local functions. ! (check_bases_and_members): Handle using-decls before finalizing ! CLASSTYPE_METHOD_VEC. ! * call.c (add_function_candidate): Add ctype parm; if nonzero, ! override the type of 'this' accordingly. ! (add_template_candidate, add_template_candidate_real): Add ctype parm. ! (convert_class_to_reference, build_user_type_conversion_1, ! build_new_function_call, build_object_call, build_new_op, ! build_new_method_call): Pass ctype parm. ! ! * search.c (lookup_member): Put rval_binfo, not basetype_path, in ! the baselink. ! * call.c (convert_class_to_reference, build_user_type_conversion_1, ! build_new_function_call, build_object_call, build_new_op, ! build_new_method_call, build_op_delete_call): Don't get basetype_path ! from a baselink. ! * typeck.c (build_component_ref): Likewise. ! * init.c (build_offset_ref): Likewise. ! (resolve_offset_ref): Don't call enforce_access. ! Call build_scoped_ref. ! * typeck2.c (build_scoped_ref): Simplify. Do nothing if it ! would cause an error or if -pedantic. ! * class.c (alter_access): Lose binfo parm. ! ! 2000-02-26 Mark Mitchell ! ! * semantics.c (simplify_aggr_init_exprs_p): Don't walk into ! types. ! ! 2000-02-25 Alfred Minarik ! ! * rtti.c (get_vmi_pseudo_type_info): Move __vmi_class_type_info ! pseudo_type_info creation into the std namespace ! ! 2000-02-26 Mark Mitchell ! ! * cp-tree.h (DECL_NEEDED_P): Tweak to correct usage before EOF. ! (import_export_class): Remove declaration. ! * decl2.c (import_export_class): Make it static. ! * dump.c (dequeue_and_dump): Handle PREDECREMENT_EXPR, ! PREINCREMENT_EXPR, POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, ! EXPR_WITH_FILE_LOCATION. ! * lex.c (check_newline): Tweak filename/lineno setting. ! * semantics.c (begin_while_stmt): Fix typo in comment. ! ! Sat Feb 26 19:50:23 2000 Richard Kenner ! ! * lang-options.h (-fmessage-length=): Add missing option. ! ! * Make-lang.in (CXX_SRCS): Add .h files and sort list. ! ! 2000-02-26 Zack Weinberg ! ! * Make-lang.in: Delete refs to LIBGCC2_DEPS. ! ! Fri Feb 25 14:52:33 2000 Jim Wilson ! ! * optimize.c (expand_call_inline): Emit the return label before ! evaluating the return value. ! ! 2000-02-24 Mark Mitchell ! ! * lex.c (check_newline): Use push_srcloc and pop_srcloc, rather ! than duplicating functionality here. ! * optimize.c: Include input.h. ! (expand_call_inline): Use push_srcloc and pop_srcloc. ! * parse.y (maybe_cv_qualifier): Remove calls to emit_line_note. ! * parse.c: Regenerated. ! * Makefile.in (lex.o): Depend on input.h. ! (optimize.o): Likewise. ! ! 2000-02-24 Nathan Sidwell ! ! * decl.c (grokdeclarator): Diagnose qualifiers on non-member ! function type, rather than ICE. ! ! 2000-02-23 Jason Merrill ! ! * decl.c (grokdeclarator): Call decl_type_access_control. ! * parse.y (parse_end_decl): Don't call decl_type_access_control if ! decl is null. ! ! 2000-02-23 Nathan Sidwell ! ! * decl.c (decls_match): Remove obsolete static member nadgering. ! ! 2000-02-21 Martin v. Löwis ! ! * decl.c (grokdeclarator): Change ANSI to ISO. ! * lex.c (consume_string, readescape, do_identifier): Likewise. ! (parse_float, real_yylex): Likewise. ! * parse.y (paren_expr_or_null, paren_cond_or_null): Likewise. ! (unary_expr, new_initializer, cast_expr, primary, primary_no_id, ! new_type_id, maybe_label_decls, simple_stmt, ! for.init.statement): Likewise. ! * pt.c (do_decl_instantiation, do_type_instantiation): Likewise. ! * semantics.c (finish_named_return_value): Likewise. ! * parse.c: Regenerate. ! ! 2000-02-21 Mark Mitchell ! ! * cp-tree.h (CPTI_VTABLE_INDEX_TYPE): New macro. ! (CPTI_CLASS_STAR_TYPE): Remove. ! (vtable_index_type): Likewise. ! (class_star_type_node): Remove. ! (TYPE_PTRMEMFUNC_FN_TYPE): Adjust for the new ABI. ! (build_binary_op_nodefault): Remove. ! * call.c (build_new_op): Use build_binary_op instead of ! build_binary_op_nodefault. ! * decl.c (init_decl_processing): Remove class_star_type_node ! initialization. Make delta_type_node ptrdiff_type_node under the ! new ABI. Initialize vtable_index_type. ! (build_ptrmemfunc_type): Build different structures for the new ! ABI. ! (build_enumerator): Use build_binary_op instead of ! build_binary_op_nodefault. ! * method.c (build_overload_value): Mangle pointers-to-members ! appropriately under the new ABI. ! * typeck.c (build_array_ref): Use build_binary_op instead of ! build_binary_op_nodefault. ! (get_member_function_from_ptrfunc): Adjust for the new ABI. ! (build_binary_op_nodefault): Rename to ... ! (build_binary_op): ... this. Remove old version. Adjust for ! pointer-to-member comparisons under the new ABI. ! (build_ptrmemfunc1): Remove dead code. Adjust for the new ABI. ! (build_ptrmemfunc): Adjust for the new ABI. ! (expand_ptrmemfunc_cst): Likewise. ! (delta2_from_ptrmemfunc): Assert that we're not using the new ABI. ! (pfn_from_ptrmemfunc): Adjust for the new ABI. ! ! 2000-02-21 Gabriel Dos Reis ! ! * call.c (build_object_call): Compress consecutive calls to ! cp_error. ! (build_conditional_expr): Say 'ISO C++' not 'ANSI C++'. ! (build_op_delete_call): Adjust message formatting. ! ! * class.c (check_bases): Compress consecutive calls to ! cp_pedwarn. ! (finish_struct_anon): Say 'ISO C++'. ! ! * decl.c (start_decl): Same here. ! (grok_reference_init): Likewise. ! (grokfndecl): Correct message formatting. ! (grokfndecl): Improve diagnostic. ! (check_static_variable_definition): Likewise. Say 'ISO C++' ! (compute_array_index_type): Say 'ISO C++' ! (create_array_type_for_decl): Compress consecutive calls to ! cp_error. ! (grokdeclarator): Say 'ISO C++' ! (grok_op_properties): Likewise. ! ! * decl2.c (delete_sanity): Clairify diagnostic. ! (check_member_template): Same here. ! (grok_function_init): Use consistent terminology. ! ! * expr.c (do_case): Say 'ISO C++' ! ! * friend.c (do_friend): Compress consecutive calls to warning. ! ! 2000-02-20 Mark Mitchell ! ! * cp-tree.h (merge_primary_and_secondary_vtables_p): New macro. ! * class.c (build_secondary_vtable): Reorganize. Don't create a ! new vtable under the new ABI. ! (layout_vtable_decl): Don't add num_extra_vtbl_entries when ! computing the size. ! (build_vtbl_initializer): Don't return a CONSTRUCTOR; just return ! the initializing elements. ! (initialize_vtable): New function. ! (dfs_finish_vtbls): Use it. ! (dfs_accumulate_vtbl_inits): New function. ! (finish_vtbls): Merge primary and secondary vtables under the new ! ABI. ! (finish_struct_1): Remove redundant call to layout_vtable_decl. ! * init.c (expand_virtual_init): Deal with BINFO_VTABLEs that ! aren't VAR_DECLs. ! ! * class.c (build_vtable): New function, split out from ... ! (get_vtable_decl): ... here, and ... ! (build_secondary_vtable): ... here. ! ! * pt.c (tsubst_decl): Fix formatting. ! ! Sat Feb 19 18:43:13 2000 Richard Kenner ! ! * class.c (build_primary_vtable, layout_vtable_decl): Likewise. ! (avoid_overlap, build_base_field): Likewise. ! (build_base_field, build_base_fields, is_empty_class): ! Test DECL_SIZE with integer_zero. ! (layout_class_type): Set CLASSTYPE_SIZE_UNIT. ! * cp-tree.h (struct lang_type): New field size_unit. ! (CLASSTYPE_SIZE_UNIT): New macro. ! * decl.c (init_decl_processing): Set DECL_SIZE_UNIT. ! (cp_finish_decl): Delete -Wlarger-than processing. ! * optimize.c (remap_decl): Walk DECL_SIZE_UNIT. ! * pt.c (tsubst_decl): Set DECL_SIZE_UNIT. ! * tree.c (make_binfo): binfo vector is one entry longer. ! (walk_tree): Walk DECL_SIZE_UNIT. ! ! 2000-02-19 Mark Mitchell ! ! * class.c (dfs_build_vcall_offset_vtbl_entries): Fix typo in ! comment. ! (build_vtable_entry): Don't assume all vtable entries are ! functions. ! (build_vtbl_initializer): Adjust accordingly. ! (get_vtable_decl): Fix formatting. ! ! 2000-02-18 Jason Merrill ! ! * semantics.c (deferred_type_access_control): Walk the entire ! type_lookups list. ! (save_type_access_control): Rename from ! initial_deferred_type_access_control. Just remember the value. ! (decl_type_access_control): New fn. ! (begin_function_definition): Use deferred_type_access_control, after ! we've started the function. Set type_lookups to error_mark_node. ! * parse.y (frob_specs, fn.def1): Adjust. ! (parse_decl0, parse_field, parse_field0, parse_bitfield): New fns. ! (parse_end_decl, parse_bitfield0, parse_method): New fns. ! (fn.def2, initdcl, initdcl0_innards, nomods_initdcl0): Use them. ! (after_type_component_declarator0): Likewise. ! (after_type_component_declarator): Likewise. ! (notype_component_declarator): Likewise. ! * cp-tree.h: Adjust. ! ! * decl.c (redeclaration_error_message): Allow redeclaration of ! namespace-scope decls. ! ! 2000-02-18 Martin von Loewis ! ! * typeck2.c (my_friendly_abort): Use GCCBUGURL. ! ! 2000-02-17 Mark Mitchell ! ! * class.c (add_method): Don't set DECL_VIRTUAL_CONTEXT. ! * decl2.c (grokclassfn): Likewise. ! ! * ir.texi: Document DECL_TEMPLATE_INSTANTIATIONS. ! ! * decl2.c (lang_decode_option): Don't set default message length ! here. ! * lex.c (lang_init_options): Set it here. ! ! 2000-02-16 Mark Mitchell ! ! Make DECL_CONTEXT mean the class in which a member function was ! declared, even for a virtual function. ! * cp-tree.h (DECL_CLASS_CONTEXT): Adjust. ! (DECL_FRIEND_CONTEXT): New macro. ! (DECL_REAL_CONTEXT): Remove. ! (SET_DECL_FRIEND_CONTEXT): Likewise. ! (DECL_VIRTUAL_CONTEXT): Adjust. ! (DECL_CLASS_SCOPE_P): Use TYPE_P. ! (add_friends): Remove. ! (hack_decl_function_context): Likewise. ! * call.c (build_new_function_call): Replace DECL_REAL_CONTEXT with ! CP_DECL_CONTEXT. ! (build_over_call): Fix indentation. Use DECL_CONTEXT ! instead of DECL_CLASS_CONTEXT. ! * class.c (dfs_build_vcall_offset_vtbl_entries): Likewise. ! (add_method): Set DECL_VIRTUAL_CONTEXT, not DECL_CLASS_CONTEXT. ! (strictly_overrides): Use DECL_CONTEXT, not DECL_CLASS_CONTEXT. ! (build_vtbl_or_vbase_field): Don't set DECL_CLASS_CONTEXT. ! (build_base_field): Likewise. ! (finish_struct_1): Likewise. ! (build_self_reference): Likewise. ! * decl.c (push_class_binding): Use CP_DECL_CONTEXT, not ! DECL_REAL_CONTEXT. ! (pushtag): Use decl_function_context, not ! hack_decl_function_context. ! (decls_match): Use CP_DECL_CONTEXT, not DECL_REAL_CONTEXT. ! (duplicate_decls): Use DECL_VIRTUAL_CONTEXT. ! (pushdecl): Remove bogus code. ! (start_decl): Use DECL_CONTEXT rather than DECL_CLASS_CONTEXT. ! (cp_finish_decl): Use CP_DECL_CONTEXT, not DECL_REAL_CONTEXT. ! (grokfndecl): Use DECL_CONTEXT, not DECL_CLASS_CONTEXT. ! Use decl_function_context, nothack_decl_function_context. ! (grokvardecl): Don't set DECL_CLASS_CONTEXT. ! (grokdeclarator): Likewise. Use decl_function_context, not ! hack_decl_function_context. ! (copy_args_p): Document. Don't use DECL_CLASS_CONTEXT. ! (start_function): Use DECL_FRIEND_CONTEXT, not ! DECL_CLASS_CONTEXT. Use decl_function_context, not ! hack_decl_function_context. ! (finish_function): Use decl_function_context, not ! hack_decl_function_context. ! (maybe_retrofit_in_chrg): Use DECL_CONTEXT, not ! DECL_CLASS_CONTEXT. ! (grokclassfn): Set DECL_VIRTUAL_CONTEXT, not DECL_CONTEXT. ! (finish_static_data_member_decl): Don't set DECL_CLASS_CONTEXT. ! (grokfield): Likewise. ! (finish_builtin_type): Likewise. ! (finish_vtable_vardec): Use decl_function_context, not ! hack_decl_function_context. ! (import_export_decl): Use DECL_CONTEXT, not DECL_CLASS_CONTEXT. ! (start_static_initialization_or_destruction): Likewise. ! (finish_static_initialization_or_destruction): Likewise. ! (mark_used): Adjust logic for deciding when to synthesize methods. ! * dump.c (dequeue_and_dump): Use CP_DECL_CONTEXT, not ! DECL_REAL_CONTEXT. ! * error.c (dump_function_decl): Use DECL_CONTEXT, not ! DECL_CLASS_CONTEXT. ! * friend.c (is_friend): Likewise. ! (add_friends): Remove. ! (do_friend): Use SET_DECL_FRIEND_CONTEXT. ! * lex.c (begin_definition_of_inclass_inline): Use ! decl_function_context, not hack_decl_function_context. ! (process_next_inline): Likewise. ! (do_identifier): Use CP_DECL_CONTEXT, not DECL_REAL_CONTEXT. ! * method.c (set_mangled_name_for_decl): Use DECL_CONTEXT, not ! DECL_CLASSS_CONTEXT. ! (hack_identifier): Likewise. ! (synthesize_method): Use decl_function_context, not ! hack_decl_function_context. ! * pt.c (template_class_depth_real): Use CP_DECL_CONTEXT, not ! DECL_REAL_CONTEXT. ! (is_member_template): Use decl_function_context, not ! hack_decl_function_context. Use DECL_CONTEXT, not ! DECL_CLASS_CONTEXT. ! (build_template_decl): Set DECL_VIRTUAL_CONTEXT, not ! DECL_CLASS_CONTEXT. ! (check_default_tmpl_args): Use CP_DECL_CONTEXT, not ! DECL_REAL_CONTEXT. ! (push_template_decl_real): Likewise. ! (instantiate_class_template): Don't call add_friends. ! (tsubst_default_argument): Use DECL_CONTEXT, not ! DECL_REAL_CONTEXT. ! (tsubst_decl): Set DECL_VIRTUAL_CONTEXT, not DECL_CLASS_CONTEXT. ! Use DECL_CONTEXT, not DECL_CLASS_CONTEXT. ! (set_meangled_name_for_template_decl): Use DECL_CONTEXT, not ! DECL_CLASS_CONTEXT. ! * repo.c (repo_inline_used): Likewise. ! * search.c (current_scope): Adjust for new _CONTEXT macros. ! (context_for_name_lookup): Use CP_DECL_CONTEXT, not ! DECL_REAL_CONTEXT. ! (friend_accessible_p): Use DECL_CONTEXT, not DECL_CLASS_CONTEXT. ! (lookup_fnfields_here):Likewise. ! (check_final_overrider): Likewise. ! (init_vbase_pointers): Likewise. ! (virtual_context): Likewise. ! * semantics.c (finish_member_declaration): Just set DECL_CONTEXT. ! (expand_body): Use decl_function_context, not ! hack_decl_function_context. ! * tree.c (hack_decl_function_context): Remove. ! * typeck.c (build_x_function_call): Use DECL_CONTEXT, not ! DECL_CLASS_CONTEXT. ! * typeck2.c (error_not_base_type): Likewise. ! ! 2000-02-15 Jason Merrill ! ! * decl.c (xref_tag): Don't SET_IDENTIFIER_NAMESPACE_VALUE. ! ! 2000-02-16 Kaveh R. Ghazi ! ! * Make-lang.in (g++spec.o): Depend on $(GCC_H), not gcc.h. ! ! 2000-02-15 Jonathan Larmour ! ! * lang-specs.h: Add new __GNUC_PATCHLEVEL__ define to default spec. ! ! 2000-01-16 Gabriel Dos Reis ! ! * decl2.c (lang_decode_option): Enable automatic line wrapping. ! ! 2000-02-13 Jason Merrill ! ! * parse.y (frob_specs): Split out... ! (parse_decl): From here. ! (fn.def2): Call initial_deferred_type_access_control. ! (after_type_component_declarator0): Call frob_specs. ! (notype_component_declarator0): Likewise. ! * search.c (friend_accessible_p): Nested classes are friends of their ! enclosing classes. ! ! 2000-02-10 Mark Mitchell ! ! * ir.texi (ADDR_EXPR): Document the fact that an ADDR_EXPR can be ! used to create an implicit temporary. ! ! * class.c (dfs_modify_vtables): Tweak calculation of functions to ! override. ! ! 2000-02-08 Nathan Sidwell ! ! * typeck.c (strip_all_pointer_quals): Use TYPE_MAIN_VARIANT, to ! strip array element qualifiers too. ! ! 2000-02-07 Mark Mitchell ! ! * decl.c (store_parm_decls): Don't build cleanups for parameters ! while processing_template_decl. ! ! 2000-02-07 Jason Merrill ! ! * cp-tree.h (struct saved_scope): Add incomplete field. ! (namespace_scope_incomplete): New macro. ! * decl.c (pushdecl): Use it. ! (hack_incomplete_structures): Use it. See through artificial ! binding levels. ! (mark_saved_scope): Mark it. ! ! Implement access control for nested types. ! * search.c (type_access_control): New fn. ! (accessible_p): Now we do perform access control for types. ! * semantics.c (deferred_type_access_control): New fn. ! (initial_deferred_type_access_control): New fn. ! (begin_function_definition): Call it. Add lookups parm. ! * decl.c (struct binding_level): Add this_class field. ! (pushlevel_class): Set it. ! (mark_binding_level): Mark it. ! (lookup_name_real): Use it. Call type_access_control. ! (mark_saved_scope): Mark lookups field. ! * cp-tree.h (flagged_type_tree): Add lookups field. ! (struct saved_scope): Add lookups field. ! (type_lookups): New macro. ! * parse.y (declmods): Now . ! (parse_decl): Add lookups parm. Call ! initial_deferred_type_access_control. ! (lang_extdef): Clear type_lookups. ! (typed_declspecs, declmods, typespec): Set lookups field. ! (initdcl): Call deferred_type_access_control. ! (fn.def1, fn.def2, typed_declspecs1, initdcl0_innards, nomods_initdcl0, ! component_decl_1, named_parm): Adjust. ! * friend.c (is_friend): Nested classes are friends of their ! enclosing classes. ! ! * class.c (currently_open_derived_class): New fn. ! * method.c (hack_identifier): Use it. ! ! * lex.c (do_identifier): Remove obsolete code. ! ! * parse.y (typed_typespecs): Propagate new_type_flag properly. ! ! 2000-02-05 Zack Weinberg ! ! * tinfo.h: Remove apostrophes from C++ comment (xgettext ! thinks this file is plain C). ! ! 2000-02-05 Kaveh R. Ghazi ! ! * Makefile.in (call.o): Depend on $(EXPR_H). ! ! * call.c: Include "expr.h". ! ! * class.c (dump_class_hierarchy): Add prototype. ! ! * search.c (dfs_get_pure_virtuals): Likewise. ! ! 2000-02-1 Ulrich Drepper ! ! * parse.y (simple_stmt): Allow :: token in asm parameter list. ! * parse.c: Rebuilt. ! ! Mon Jan 31 15:35:29 2000 Jim Wilson ! ! * class.c (build_vtbl_or_vbase_field): New parameter fcontext. ! Store it in DECL_FCONTEXT. ! (build_vbase_pointer_fields, create_vtable_ptr): Fix callers. ! ! 2000-01-31 Jason Merrill ! ! * tinfo.h (old abi): #include "tconfig.h". ! * tinfo.cc (convert_to_base): Move into old abi section. ! ! 2000-01-31 Mark Mitchell ! ! * cp-tree.h (BINFO_VIRTUALS): Tweak documentation. ! (CLASSTYPE_PRIMARY_BINFO): Use BINFO_PRIMARY_BINFO. ! (BINFO_PRIMARY_BINFO): New macro. ! (BF_DELTA): Rename to ... ! (BV_DELTA): ... this. ! (BF_VCALL_INDEX): Rename to ... ! (BV_VCALL_INDEX): ... this. ! (BF_FN): Rename to ... ! (BV_FN): ... this. ! * class.c (build_vbase_path): Adjust for changes to reverse_path. ! (set_rtti_entry): Rename BF_ macros to BV_ variants. ! (modify_vtable_entry): Simplify. ! (add_virtual_function): Rename BF_ macros to BV_ variants. ! (build_vtable_initializer): Likewise. ! (get_class_offset_1): Remove. ! (dfs_get_class_offset): Likewise. ! (get_class_offset): Likewise. ! (dfs_find_final_overrider): New function. ! (find_final_overrider): Likewise. ! (modify_one_vtable): Remove. ! (dfs_find_base): New function. ! (dfs_modify_vtables): Fold modify_one_vtable in here. Use ! find_final_overrider. ! (modify_all_vtables): Adjust. Set BV_VCALL_INDEX on new ! virtuals. ! (dfs_fixup_vtable_deltas): Remove. ! (override_one_vtable): Remove. ! (merge_overrides): Likewise. ! (layout_virtual_bases): Make sure BINFO_OFFSET is set right for ! unreal chilren of virtual bases. ! (finish_struct_1): Don't use merge_overrides. Don't use ! dfs_fixup_vtable_deltas. ! * tree.c (reverse_path): Return a TREE_LIST, not a chain of ! BINFOs. ! ! 2000-01-31 Herman A.J. ten Brugge ! Jason Merrill ! ! * tinfo.h: Rename USItype to myint32, depend on BITS_PER_UNIT. ! ! 2000-01-31 Alfred Minarik ! ! * exception.cc (__throw_bad_typeid): Add missing std::. ! ! 2000-01-31 Kaveh R. Ghazi ! ! * cp-tree.h (make_thunk): PROTO -> PARAMS. ! ! 2000-01-31 Nathan Sidwell ! ! * cp-tree.h (new_abi_rtti_p): Use flag_new_abi. ! ! Runtime support for new-abi rtti. ! * inc/typeinfo (type_info::operator!=): Define in class. ! (type_info::before, type_info::name, type_info::operator==, ! type_info::operator!=): Define new ABI implementations. ! (type_info::is_pointer_p, type_info::is_function_p): Declare ! new virtual functions. ! (type_info::do_catch, type_info::do_upcast): Likewise. ! ! * tinfo.h (__base_class_info): Define new class. ! (__class_type_info): Likewise. ! (__si_class_type_info): Likewise. ! (__vmi_class_type_info): Likewise. ! (__dynamic_cast): Prototype. ! ! * tinfo.cc: Conditionalize old and new rtti mechanisms. ! (type_info::is_pointer_p): Define new function. ! (type_info::is_function_p): Likewise. ! (type_info::do_catch): Likewise. ! (type_info::do_upcast): Likewise. ! (vtable_prefix): New structure for vtable access. ! (adjust_pointer): Define new template function. ! (contained_p, public_p, virtual_p, contained_public_p, ! contained_nonpublic_p, contained_nonvirtual_p): Define new ! functions. ! (nonvirtual_base_type): New local variable. ! (__class_type_info::~__class_type_info): Define. ! (__si_class_type_info::~__si_class_type_info): Likewise. ! (__vmi_class_type_info::~__vmi_class_type_info): Likewise. ! (__class_type_info::do_catch): Define new function. ! (__class_type_info::do_upcast): Likewise. ! (__class_type_info::find_public_src): Likewise. ! (__class_type_info::do_find_public_src): Likewise. ! (__si_class_type_info::do_find_public_src): Likewise. ! (__vmi_class_type_info::do_find_public_src): Likewise. ! (__class_type_info::do_dyncast): Likewise. ! (__si_class_type_info::do_dyncast): Likewise. ! (__vmi_class_type_info::do_dyncast): Likewise. ! (__class_type_info::do_upcast): Likewise. ! (__si_class_type_info::do_upcast): Likewise. ! (__vmi_class_type_info::do_upcast): Likewise. ! (__dynamic_cast): Likewise. ! ! * tinfo2.cc (__fundamental_type_info): Define new class. ! (__pointer_type_info): Likewise. ! (__reference_type_info): Likewise. ! (__array_type_info): Likewise. ! (__function_type_info): Likewise. ! (__enum_type_info): Likewise. ! (__ptr_to_member_type_info): Likewise. ! (__fundamental_type_info::~__fundamental_type_info): Define. ! (__pointer_type_info::~__pointer_type_info): Likewise. ! (__reference_type_info::~__reference_type_info): Likewise. ! (__array_type_info::~__array_type_info): Likewise. ! (__function_type_info::~__function_type_info): Likewise. ! (__enum_type_info::~__enum_type_info): Likewise. ! (__ptr_to_member_type_info::~__ptr_to_member_type_info): Likewise. ! (__pointer_type_info::do_catch): Define new function. ! (__ptr_to_member_type_info::do_catch): Define new function. ! ! (__throw_type_match_rtti_2): Use new ABI interface, if enabled. ! (__is_pointer): Likewise. ! ! * exception.cc (__cplus_type_matcher): Deal with new-abi rtti. ! ! 2000-01-30 Mark Mitchell ! ! * cp/class.c (build_vtable): Rename to build_primary_vtable. ! (prepare_fresh_vtable): Rename to build_secondary_vtable. ! (make_new_vtable): New function. ! (modify_vtable_entry): Handle generation of new vtables correctly. ! (modify_one_vtable): Remove unused parameter. ! (dfs_fixup_vtable_deltas): Likewise. ! (override_one_vtable): Use build_secondary_vtable. ! (finish_struct_1): Use build_primary_vtable and ! build_secondary_vtable. ! ! 2000-01-28 Ulrich Drepper ! ! * cp/decl.c: Adjust variable names, comments, help strings. ! ! 2000-01-29 Nathan Sidwell ! ! * new2.cc (operator delete[]): Use operator delete, don't assume ! implementation. ! ! 2000-01-29 Nathan Sidwell ! ! * class.c (build_vtbl_initializer): Add argument to ! build_vtable_entry call. ! ! 2000-01-27 Mark Mitchell ! ! * cp-tree.def (THUNK_DECL): Discuss vcall indices. ! * cp-tree.h (BINFO_VIRTUALS): Update documentation. ! (BF_DELTA): New macro. ! (BF_VCALL_INDEX): Likewise. ! (BF_FN): Likewise. ! (THUNK_VCALL_OFFSET): Likewise. ! (make_thunk): Change prototype. ! * class.c (build_vtable_entry): Integrate ! build_vtable_entry_for_fn. Handle vcall indices. ! (build_vtable_entry_for_fn): Remove. ! (set_rtti_entry): Handle vcall indices. Use BF_DELTA, ! BF_VCALL_INDEX, BF_FN. ! (modify_vtable_entry): Integrate common code from ! modify_one_vtable and dfs_fixup_vtable_deltas. ! (add_virtual_function): Set BF_VCALL_INDEX. ! (build_vtbl_initializer): Simplify. Use BF_DELTA, BF_VCALL_INDEX, ! and BF_FN. ! (modify_one_vtable): Simplify. ! (dfs_fixup_vtable_deltas): Likewise. ! (override_one_vtable): Use BF_DELTA, BF_VCALL_INDEX, BF_FN. ! * method.c (make_thunk): Handle vcall indices. ! ! 2000-01-28 Nathan Sidwell ! ! Compiler side new abi rtti (not enabled). ! * cp-tree.h (new_abi_rtti_p): New macro. ! (emit_support_tinfos): Prototype new function. ! (tinfo_decl_p): Likewise. ! (emit_tinfo_decl): Likwise. ! * rtti.c (TINFO_PSEUDO_TYPE, TINFO_VTABLE_DECL): New accessor ! macros. ! (doing_runtime): New local static. ! (init_rtti_processing): Add new-abi initializer. ! (get_tinfo_decl): Add new-abi logic. ! (tinfo_from_decl): Likewise. ! (build_dynamic_cast_1): Likewise. ! (qualifier_flags): New static function. ! (tinfo_base_init): Likewise. ! (generic_initializer): Likewise. ! (ptr_ref_initializer): Likewise. ! (ptmd_initializer): Likewise. ! (class_hint_flags): Likewise. ! (class_initializer): Likewise. ! (synthesize_tinfo_var): Likewise. ! (create_real_tinfo_var): Likewise. ! (create_pseudo_type_info): Likewise. ! (get_vmi_pseudo_type_info): Likewise. ! (create_tinfo_types): Likewise. ! (emit_support_tinfos): New global function. ! (tinfo_decl_p): New global predicate. ! (emit_tinfo_decl): New global function. ! * class.c (set_rtti_entry): Generalize for old and new rtti. ! (build_vtbl_initializer): Likewise. ! * decl2.c (finish_file): Likewise. ! ! Thu Jan 27 20:53:36 2000 Jim Wilson ! ! * optimize.c (remap_decl): Add walk_tree calls for DECL_SIZE (t) ! and TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (t))). ! ! Thu Jan 27 13:54:12 2000 Mike Stump ! ! * decl.c (pushdecl): Fix up shadow warnings with respect to implicit ! for scopes. ! ! 2000-01-26 Jason Merrill ! ! * pt.c (unify): Use fold, not maybe_fold_nontype_arg. ! ! Wed Jan 26 22:19:14 2000 J"orn Rennecke ! ! * optimize.c (calls_setjmp_r): Supply new argument ! to special_function_p. ! ! 2000-01-26 Kaveh R. Ghazi ! ! * call.c: PROTO -> PARAMS. ! * class.c: Likewise. ! * cp-tree.h: Likewise. ! * cvt.c: Likewise. ! * decl.c: Likewise. ! * decl.h: Likewise. ! * decl2.c: Likewise. ! * dump.c: Likewise. ! * errfn.c: Likewise. ! * error.c: Likewise. ! * except.c: Likewise. ! * expr.c: Likewise. ! * init.c: Likewise. ! * input.c: Likewise. ! * lex.c: Likewise. ! * lex.h: Likewise. ! * method.c: Likewise. ! * optimize.c: Likewise. ! * parse.y: Likewise. ! * pt.c: Likewise. ! * repo.c: Likewise. ! * rtti.c: Likewise. ! * search.c: Likewise. ! * semantics.c: Likewise. ! * spew.c: Likewise. ! * tree.c: Likewise. ! * typeck.c: Likewise. ! * typeck2.c: Likewise. ! * xref.c: Likewise. ! ! 2000-01-25 Richard Henderson ! ! * typeck.c (build_binary_op_nodefault): Remove UNNE_EXPR. ! ! 2000-01-25 Mark Mitchell ! ! * cp-tree.h (vcall_offset_in_vtable_p): New macro. ! * class.c (build_vbase_offset_vtbl_entries): Fix typo in commment. ! (struct vcall_offset_data_s): New type. ! (dfs_vcall_offset_queue_p): New function. ! (dfs_build_vcall_offset_vtbl_entries): Likewise. ! (build_vcall_offset_vtbl_entries): Likewise. ! (layout_vtable_decl): Likewise. ! (num_vfun_entries): Likewise. ! (num_extra_vtbl_entries): Add the entries for vcall offsets. ! (build_vtbl_initializer): Likewise. ! (dfs_finish_vtabls): Use layout_vtable_decl. ! (modify_one_vtables): Always duplicate vtables under the new ABI. ! (finish_struct_1): Use layout_vtable_decl. ! ! 2000-01-25 Kaveh R. Ghazi ! ! * decl.c (member_function_or_else): Change third arg from a format ! specifier to an `enum overload_flags'. Callers changed. ! ! 2000-01-25 Gabriel Dos Reis ! ! * typeck.c (composite_pointer_type, c_sizeof, expr_sizeof, ! build_binary_op_nodefault, build_unary_op, build_reinterpret_cast, ! build_const_cast, get_delta_difference, check_return_expr): Avoid ! ANSI string concatenation usage. ! ! 2000-01-24 Mark Mitchell ! ! * class.c (layout_class_type): Put the fields required to make a ! class non-empty at the end, not the beginning, of the TYPE_FIELDs ! list. ! ! 2000-01-24 Jason Merrill ! ! * pt.c (maybe_fold_nontype_arg): Do nothing if we're not in a ! template. ! ! * decl2.c (mark_used): Do instantiate inlines that have been ! explicitly instantiated. ! ! 2000-01-24 Richard Henderson ! ! * call.c (build_over_call): Use expand_tree_builtin. ! * typeck.c (build_function_call_real): Likewise. ! (build_binary_op_nodefault): Handle unordered compares. ! ! 2000-01-24 Nathan Sidwell ! ! * cp-tree.h (CPTI_BAD_CAST, CPTI_BAD_TYPEID, CPTI_DCAST): New ! cp_tree_index values. ! (throw_bad_cast_node, throw_bad_typeid_node, dynamic_cast_node): ! New global node #defines for them. ! * rtti.c (call_void_fn): Replace with ... ! (build_runtime_decl): ... new static function. ! (throw_bad_cast): Use throw_bad_cast_node and build_runtime_decl. ! (throw_bad_typeid): Use throw_bad_typeid_node and build_runtime_decl. ! (build_dynamic_cast_1): Always produce correctly typed result. ! Explicitly produce type_info addresses. Use dynamic_cast_node. ! * exception.cc (__throw_bad_cast): Return `void *'. ! (__throw_bad_typeid): Return `const type_info &'. ! ! 2000-01-24 Nathan Sidwell ! ! * cp-tree.h (get_vtable_decl): Prototype new function. ! * class.c (get_vtable_decl): New function. Broken out from ... ! (build_vtable): ... here. Use it. ! * decl2.c (finish_vtable_vardecl): Ignore dummy vtables created ! by get_vtable_decl. ! ! 2000-01-24 Nathan Sidwell ! ! * cp-tree.h (CPTI_TP_DESC_TYPE, CPTI_ACCESS_MODE_TYPE, ! CPTI_USER_DESC_TYPE, CPTI_CLASS_DESC_TYPE, CPTI_ATTR_DESC_TYPE, ! CPTI_PTMF_DESC_TYPE): Remove cp_tree_index enumerations. ! (CPTI_TI_DESC_TYPE, CPTI_REF_DESC_TYPE, CPTI_ARY_DESC_TYPE, ! CPTI_ENUM_DESC_TYPE, CPTI_CLASS_DESC_TYPE, CPTI_SI_CLASS_DESC_TYPE, ! CPTI_VMI_CLASS_DESC_TYPE, CPTI_BASE_DESC_TYPE): New enumerations. ! (CPTI_TINFO_FN_ID, CPTI_TINFO_FN_TYPE): Rename to ... ! (CPTI_TINFO_DECL_ID, CPTI_TINFO_DECL_TYPE): ... here. ! (CPTI_TINFO_VAR_ID): New enumeration. ! (__tp_desc_type_node, __access_mode_type_node, ! __bltn_desc_type_node, __user_desc_type_node, ! __class_desc_type_node, __ptr_desc_type_node, ! __attr_desc_type_node, __func_desc_type_node, ! __ptmf_desc_type_node, __ptmd_desc_type_node): Remove #defines. ! (ti_desc_type_node, bltn_desc_type_node, ptr_desc_type_node, ! ref_desc_type_node, ary_desc_type_node, func_desc_type_node, ! enum_desc_type_node, class_desc_type_node, ! si_class_desc_type_node, vmi_class_desc_type_node, ! ptmd_desc_type_node, base_desc_type_node): New #defines. ! (tinfo_fn_id, tinfo_fn_type): Rename to ... ! (tinfo_decl_id, tinfo_decl_type): ... here. Adjust. ! (tinfo_var_id): New enumeration. ! (DECL_TINFO_FN_P): Augment comment. ! * decl.c (cp_global_trees): Adjust documentation. ! * rtti.c (init_rtti_processing): Adjust for tinfo_decl_id, ! tinfo_decl_type and tinfo_var_id. ! (get_tinfo_decl_dynamic): Adjust for tinfo_decl_type. ! (build_typeid): Remove unused variable. ! (get_tinfo_var): Use tinfo_var_id. ! (tinfo_name): New static function. ! (get_tinfo_decl): Adjust for tinfo_decl_id and tinfo_decl_type. ! (tinfo_from_decl): Likewise. ! (get_base_offset): New static function, broken out of ! expand_class_desc. ! (expand_si_desc): Use tinfo_name. ! (expand_class_desc): Likewise. Lose local static variable. ! Use base_desc_type_node. Use get_base_offset. ! (expand_ptr_desc): Use tinfo_name. ! (expand_attr_desc): Likewise. ! (expand_generic_desc): Likewise. ! ! * tinfo.cc (__GXX_ABI_VERSION): Test value and existence. ! * tinfo.h (__GXX_ABI_VERSION): Test value and existence. ! ! 2000-01-23 Mark Mitchell ! ! * cp-tree.h (__eprintf): Remove declaration. ! * tree.c (__eprintf): Remove definition. ! ! 2000-01-23 Zack Weinberg ! Mark Mitchell ! ! * cp-tree.h (CLASSTYPE_MARKED_N, SET_CLASSTYPE_MARKED_N, ! CLEAR_CLASSTYPE_MARKED_N): Avoid signed vs. unsigned warnings. ! ! 2000-01-23 Brad Lucier ! ! * class.c (dump_class_hierarchy): Print HOST_WIDE_INT properly. ! ! 2000-01-23 Mark Mitchell ! ! * cp-tree.h (register_dtor_fn): New function. ! * decl.c (destroy_local_static): Rename to ... ! (register_dtor_fn): ... this. Give it external linkage. ! (expand_static_init): Use it. ! * decl2.c (do_static_initialization): Likewise, if using ! __cxa_atexit. ! (do_static_destruction): Check that __cxa_atexit is not in use. ! (finish_file): Don't call do_static_destruction if using ! __cxa_atexit. ! ! * typeck.c (convert_arguments): Restore two-message error ! reporting. ! ! 2000-01-20 Nathan Sidwell ! ! Remap dynamic cast hint values to be consistent across ABIs. ! * search.c (dynamic_cast_base_recurse): Remap generated value. ! (get_dynamic_cast_base_type): Adjust documentation. ! * tinfo.h (__user_type_info::dyncast): Likewise. ! (__user_type_info::find_public_subobj): Remap BOFF meaning. ! * tinfo.cc (__si_type_info::do_dyncast): Remap BOFF meaning. ! (__class_type_info::do_dyncast): Likewise. ! (__class_type_info::do_find_public_subobj): Likewise. ! * tinfo2.cc (__dynamic_cast): Remap BOFF parameter. ! ! 2000-01-19 Gabriel Dos Reis ! ! * typeck.c (build_unary_op): Use cp_pedwarn, not pedwarn. ! ! * typeck2.c (incomplete_type_error): Restore previous ! cp_error and cp_error_at call sequence. ! ! 2000-01-20 Brad Lucier ! ! * class.c (dump_class_hierarchy): Make format agree with argument; ! cast pointer to unsigned long and print with %lx. ! ! 2000-01-19 Gabriel Dos Reis ! ! * decl2.c (lang_decode_option): Set default line-wrap length to 72. ! ! * typeck.c (composite_pointer_type, common_type, ! comp_target_parms, c_sizeof, expr_sizeof, build_array_ref, ! build_function_call_real, convert_arguments, ! build_binary_op_nodefault, pointer_int_sum, pointer_diff, ! build_unary_op, mark_addressable, build_compound_expr, ! build_static_cast, build_reinterpret_cast, build_const_cast, ! build_c_cast, build_modify_expr, get_delta_difference, ! build_ptrmemfunc, check_return_expr): Replace 'ANSI C++' with ! 'ISO C++'. Fusion consecutive calls to diagnostic message routines ! into a single one. ! * typeck2.c (readonly_error, abstract_virtuals_error, ! process_init_constructor, check_for_new_type): Likewise. ! ! 2000-01-19 Mark Mitchell ! ! * tree.c (bot_manip): Set DECL_CONTEXT for newly created ! VAR_DECLs. ! ! 2000-01-18 Nathan Sidwell ! ! * cp-tree.h (get_tinfo_fn_dynamic): Remove prototype. ! (build_x_typeid): Likewise. ! (get_tinfo_fn): Likewise. ! (get_tinfo_fn_unused): Rename to ... ! (get_tinfo_decl): ... here. ! * rtti.c (build_headof): Replace logic error with assertion. ! (get_tinfo_fn_dynamic): Rename to ... ! (get_tinfo_decl_dynamic): ... here. Make static. Use ! complete_type_or_else. ! (build_x_typeid): Move into ... ! (build_typeid): ... here. Adjust call to ! get_tinfo_decl_dynamic. Use tinfo_from_decl. Simplify ! throw_bad_typeid expression. ! (get_tinfo_fn_unused): Rename to ... ! (get_tinfo_decl): ... here. Adjust comment. ! (get_tinfo_fn): Delete. ! (tinfo_from_decl): New static function. ! (get_typeid_1): Call get_tinfo_decl and tinfo_from_decl. ! (get_typeid): Use complete_type_or_else. ! (build_dynamic_cast_1): Adjust calls to ! get_tinfo_decl_dynamic. Simplify throw_bad_cast expression. ! * parse.y (primary): Adjust call to build_typeid. ! * except.c (build_eh_type_type_ref): Adjust call to ! get_tinfo_decl. Mark as used. ! * class.c (set_rtti_entry): Adjust call to get_tinfo_decl. ! * decl2.c (build_expr_from_tree): Adjust call to build_typeid. ! * parse.c: Regenerated. ! ! 2000-01-17 Mark Mitchell ! ! * class.c (fixed_type_or_null): Don't clear NONNULL. Document ! calling convention. ! (resolves_to_fixed_type_p): Document calling convention. ! * rtti.c (build_x_typeid): Initialize NONNULL. ! ! * cp-tree.h (build_shared_int_cst): New function. ! * call.c (build_over_call): Use DECL_VIRTUAL_CONTEXT, for clarity. ! * class.c (modify_vtable_entry): Likewise. ! (add_virtual_function): Split out code to generated shared ! INTEGER_CSTs to build_share_int_cst. ! (modify_all_vtables): Handle all the overridden functions here. ! Add overridden functions from non-primary virtual bases to the ! primary vtable. ! (finish_struct_1): Adjust call to modify_all_vtables. Add ! overridden functions from non-primary bases to the vtable. ! * tree.c (build_shared_int_cst): New function. ! ! * cp-tree.h (scratchalloc): Remove. ! (build_scratch_list): Likewise. ! * call.c (convert_class_to_reference): Replace build_scratch_list ! and build_expr_list with build_tree_list. ! (add_candidate): Replace scratchalloc with expralloc. Note memory ! leak. ! (build_user_type_conversion_1): Replace build_scratch_list ! and build_expr_list with build_tree_list. ! (build_new_op): Likewise. ! (build_op_delete_call): Likewise. ! (convert_like): Likewise. ! * cvt.c (ocp_convert): Likewise. ! * decl.c (start_decl): Likewise. ! (start_function): Likewise. ! (finish_destructor_body): Likewise. ! (maybe_build_cleanup_1): Likewise. ! * decl2.c (reparse_decl_as_expr): Likewise. ! * init.c (perform_member_init): Likewise. ! (expand_cleanup_for_base): Likewise. ! (build_builtin_delete_call): Likewise. ! (build_new_1): Likewise. ! (build_delete): Likewise. ! * method.c (do_build_assign_ref): Likewise. ! * parse.y (already_scoped_stmt): Likewise. ! (nontrivial_exprlist): Likewise. ! (net_initializer): Likewise. ! (initlist): Likewise. ! * parse.c: Regenerated. ! * rtti.c (build_x_typeid): Likewise. ! (build_dynamic_cast_1): Likewise. ! * typeck.c (build_x_compound_expr): Likewise. ! (build_static_cast): Likewise. ! (build_modify_expr): Likewise. ! ! * cp-tree.h (DECL_VINDEX): Add documentation. ! * class.c (build_vtable_entry): Likewise. ! (start_vtable): Add comment. ! (add_virtual_function): Replace pending_hard_virtuals with ! overridden_virtuals and pending_virtuals with new_virtuals. ! Replace redundant assignments with assertions. ! (check_for_override): Add comment. ! (check_bases_and_members): Replace pending_hard_virtuals with ! overridden_virtuals and pending_virtuals with new_virtuals. ! (create_vtbl_ptr): Likewise. ! (layout_class_type): Likewise. ! (finish_struct_1): Likewise. Add comments. ! ! 2000-01-16 Mark Mitchell ! ! * class.c (finish_struct_1): Replace redundant code with ! assertions. ! ! * cp-tree.h (flag_new_abi): Move. ! (flag_use_cxa_atexit): Likewise. ! (flag_honor_std): Likewise. ! (flag_rtti): Likewise. ! (vbase_offsets_in_vtable_p): Define. ! (vptrs_present_everywhere_p): Likewise. ! (TYPE_CONTAINS_VPTR_P): Likewise. ! (dfs_walk_real): Declare. ! * class.c (build_vbase_pointer_fields): Check ! vbase_offsets_in_vtable_p. ! (dfs_build_vbase_offset_vtbl_entries): Record the vbase indices in ! BINFO_VPTR_FIELD. ! (build_vbase_offset_vtbl_entries): Simplify. ! (build_vbase_offset_vtbl_entries): Adjust. ! (build_vbase_pointer): Add ability to look up vbase offsets in ! vtable. ! (start_vtable): New function. ! (add_virtual_function): Use it. ! (determine_primary_base): Use TYPE_CONTAINS_VPTR_P. ! (num_extra_vtbl_entries): Use vbase_offsets_in_vtable_p. ! (build_vtbl_initializer): Take the type of the complete object as ! input. Use it to correctly calculate vbase offsets. ! (dfs_finish_vtbls): Pass the complete type to ! build_vtbl_initializer. ! (check_bases_and_members): Use TYPE_CONTAINS_VPTR_P. ! (create_vtable_ptr): Create a vtable even if there are no ! new virtual functions, under the new ABI. ! (finish_struct_1): Likewise. ! (get_vfield_name): Use TYPE_CONTAINS_VPTR_P. ! * decl.c (exapnd_static_init): Remove call to ! preserve_initializer. ! * decl2.c (mark_vtable_entries): Tweak to handle vbase offsets in ! vtables. ! * init.c (initialize_vtbl_ptrs): Initialize them in pre-order. ! (expand_virtual_init): Use vbase_offsets_in_vtable_p. ! (construct_virtual_bases): Don't initialize virtual base pointers ! under the new ABI. ! (build_aggr_init): Clean up comment. ! (expand_aggr_init_1): Likewise. ! * rtti.c (expand_class_desc): Store the virtual function table ! index where the vbase offset lives in the offset field. ! * search.c (dfs_walk_real): Make it global. ! (dfs_debug_mark): Use TYPE_CONTAINS_VPTR_P. ! * tree.c (make_binfo): Don't clear BINFO_VPTR_FIELD. ! ! * tinfo.h (USItype): Make it signed under the new ABI. ! * tinfo.cc (convert_to_base): New function. Encapsulate base ! conversion logic here. ! (__class_type_info::do_upcast): Use it. ! (__class_type_info::do_dyncast): Likewise. ! (__class_type_info::do_find_public_subobj): Likewise. ! ! * init.c (construct_virtual_bases): Don't look up the addresses of ! virtual bases at run-time. ! ! * class.c (build_vbase_pointer): Relocate. ! (build_vbase_pointer_fields): Likewise. ! (dfs_build_vbase_offset_vtbl_entries): Likewise. ! (build_vbase_offset_vtbl_entries): Likewise. ! ! * decl.c (init_decl_processing): Complain if -fnew-abi ! -fno-vtable-thunks is used. ! ! * decl2.c (lang_decode_option): Don't couple flag_honor_std to ! flag_new_abi. ! ! 2000-01-15 Mark Mitchell ! ! * cp-tree.h (num_extra_vtbl_entries): New function. ! (size_extra_vtbl_entries): Likewise. ! (dfs_vtable_path_unmark): Likewise. ! (dfs_vtable_path_unmarked_real_bases_queue_p): Likewise. ! (dfs_vtable_path_marked_real_bases_queue_p): Likewise. ! * class.c (num_extra_vtbl_entries): New function. ! (size_extra_vtbl_entries): Likewise. ! (dfs_build_vbase_offset_vtbl_entries): New function. ! (build_vbase_offset_vtbl_entries): Likewise. ! (build_vtbl_initializer): Use it. ! (finish_struct_1): Adjust vtable sizes (using ! num_extra_vtbl_entries). ! * expr.c (cplus_expand_expr): Assert that the DECL_RTL for a ! THUNK_DECL is non-NULL before expanding it. ! * init.c (expand_virtual_init): Adjust the vtable pointer by ! size_extra_vtbl_entries before storing it. ! * search.c (get_shared_vase_if_not_primary): Adjust prototype. ! Handle TREE_LIST parameters here, not in the dfs_* functions. ! (dfs_unmarked_real_bases_queue_p): Adjust. ! (dfs_marked_real_bases_queue_p): Likewise. ! (dfs_vtable_path_unmarked_real_bases_queue_p): New function. ! (dfs_vtable_path_marked_real_bases_queue_p): New function. ! (dfs_vtable_path_unmark): Likewise. ! ! 2000-01-14 Mark Mitchell ! ! * optimize.c (copy_body_r): Clear the operand three of a ! TARGET_EXPR when copying it. ! ! 2000-01-14 Martin v. Löwis ! ! * method.c (build_decl_overload_real): Check whether we are in :: ! before returning __builtin_new/delete. ! ! 2000-01-13 Mark Mitchell ! ! * pt.c (tsubst_friend_function): Improve comment. ! (instantiate_decl): Avoid crashing when a "nested" function is ! instantiated from the top level. ! ! * dump.c (dqeueue_and_dump): Dump ! DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION. ! ! 2000-01-13 Kaveh R. Ghazi ! ! * call.c: If GATHER_STATISTICS, declare `n_build_method_call'. ! ! 2000-01-13 Nathan Sidwell ! ! * g++spec.c (lang_specific_driver): Add -fnew-abi if ! ENABLE_NEW_GXX_ABI defined. ! * Make-lang.in (tinfo.o, tinfo2.o, exception.o, new.o, ! opnew.o, opnewnt.o, opvnew.o, opvnewnt.o, opdel.o, opdelnt.o, ! opvdel.o, opvdelnt.o): Use GXX_ABI_FLAG switch. ! ! 2000-01-12 Mark Mitchell ! ! * decl.c (start_cleanup_fn): Call pushdecl. ! ! * call.c (convert_class_to_reference): Fix typos. ! (build_conditional_expr): Handle errors gracefully. ! * class.c (push_nested_class): Likewise. ! * cp-tree.h (VAR_FUNCTION_OR_PARM_DECL_CHECK): New macro. ! (DECL_THIS_EXTERN): Use it. ! (DECL_THIS_STATIC): Likewise. ! * cvt.c (convert_to_void): Handle errors gracefully. ! (build_expr_type_conversion): Likewise. ! * decl.c (maybe_push_decl): Likewise. ! (start_decl_1): Likewise. ! (require_complete_types_for_parms): Likewise. ! * parse.y (structsp): Likewise. ! (base_class): Likewise. ! * parse.c: Regenerated. ! * pt.c (finish_member_template_decl): Likewise. ! * typeck.c (decay_conversion): Likewise. ! ! * cp-tree.h (dfs_skip_vbases): New function. ! (find_vbase_instance): Likewise. ! * class.c (determine_primary_base): Allow a nearly empty base to ! serve as a primary base class under the new ABI. ! (get_class_offset_1): Rename to ... ! (dfs_get_class_offset): ... this. Simplify. Don't issue error ! messages here. ! (get_class_offset): Use it. Issue error messages here. ! (dfs_modify_vtables): Rely on dfs_unmarked_real_bases_queue_p to ! find the right copies of virtual bases. ! (fixup_vtable_deltas1): Rename to ... ! (dfs_fixup_vtable_deltas): ... this. Adjust to handle virtual ! bases as primary bases. ! (fixup_vtable_deltas): Remove. ! (override_one_vtable): Handle virtual bases as primary bases. ! (merge_overrides): Likewise. ! (finish_struct_1): Likewise. ! (dump_class_hierarchy): Dump primary-ness of bases as well. ! * search.c (mark_primary_bases): Use a pre-order traversal to ! handle primary virtual bases. ! (dfs_skip_vbases): New fiunction. ! (expand_upcast_fixups): Adjust to handle primary virtual bases. ! (fixup_virtual_upcast_offsets): Likewise. ! (fixup_all_virtual_upcast_offsets): Likewise. ! (dfs_find_vbase_instances): New function. ! (find_vbase_instance): Likewise. ! ! 2000-01-11 Mumit Khan ! ! * lex.c (DIR_SEPARATOR): Delete macro. ! ! 2000-01-12 Gabriel Dos Reis ! ! * decl2.c (lang_decode_option): Handle automatic line wrapping ! option. ! ! 2000-01-11 Mark Mitchell ! ! * friend.c (do_friend): Don't resolve scopes when processing ! template declarations, even if the qualifying scope doesn't ! involve template parameters. ! ! 2000-01-10 Mark Mitchell ! ! * class.c (dfs_modify_vtables_queue_p): Remove. ! (modify_all_vtables): Use dfs_unmarked_real_bases_queue_p ! and dfs_marked_real_bases_queue_p instead of ! dfs_modify_vtables_queue_p. ! ! * class.c (build_vbase_path): Simplify. ! (dfs_propagate_binfo_offsets): New function. ! (propagate_binfo_offsets): Use it. ! (remove_base_field): Simplify. ! (dfs_set_offset_for_vbases): Remove. ! (dfs_set_offset_for_shared_vbases): New function. ! (dfs_set_offset_for_unshared_vbases): Likewise. ! (layout_virtual_bases): Use them. ! (layout_basetypes): Don't call propagate_binfo_offsets. ! * search.c (dfs_get_vbase_types): Clone completely fresh binfos ! for the vbases. ! ! * class.c (build_base_field): New function, split out from ... ! (build_base_fields): ... here. Use it. Allocate primary bases ! first, under the new ABI. ! (get_vtable_entry): Remove. ! (remove_base_field): New function, split out from ... ! (remove_base_fields): ... here. Adjust since primary bases come ! first under the new ABI. ! ! * cp-tree.h (expand_direct_vtbls_init): Remove declaration. ! (initialize_vtbl_ptrs): New function. ! (expand_indirect_vtbls_init): Change prototype. ! (convert_pointer_to_vbase): Declare. ! * init.c (expand_direct_vtbls_init): Remove. ! (dfs_initialize_vtbl_ptrs): New function. ! (initialize_vtbl_ptrs): Likewise. ! (emit_base_init): Use initialize_vtbl_ptrs. ! * search.c (convert_pointer_to_vbase): Make it global. ! (expand_indirect_vtbls_init): Remove vtable initialization code. ! * semantics.c (setup_vtbl_ptr): Use initialize_vtbl_ptrs. ! ! * class.c (dfs_finish_vtbls): New function. ! (finish_vtbls): Use it. ! (dump_class_hierarchy): New function. ! ! * cp-tree.h (BINFO_PRIMARY_MARKED_P): Change definition. ! (BINFO_VBASE_PRIMARY_P): New macro. ! (BINFO_VIRTUALS): Add to documentation. ! (SET_BINFO_PRIMARY_MARKED_P): Remove. ! (CLEAR_BINFO_PRIMARY_MARKED_P): Likewise. ! (dfs_mark_primary_bases_queue_p): Likewise. ! (dfs_unmarked_real_bases_queue_p): New function. ! (dfs_marked_real_bases_queue_p): Likewise. ! * search.c (dfs_mark_primary_bases): Adjust. ! (mark_primary_bases): Likewise. ! (get_shared_vbase_if_not_primary): New function. ! (dfs_unmarked_real_bases_queue_p): Likewise. ! (dfs_marked_real_bases_queue_p): Likewise. ! (dfs_get_pure_virtuals): Simplify. ! (get_pure_virtuals): Likewise. ! ! 2000-01-10 Kaveh R. Ghazi ! ! * lex.c: Include tm_p.h. ! ! 2000-01-07 Nathan Sidwell ! ! * lang-specs.h (__GXX_ABI_VERSION): New preprocessor macro. ! ! 2000-01-06 Jason Merrill ! ! * decl2.c (comdat_linkage): Don't set DECL_DEFER_OUTPUT. ! * pt.c (instantiate_decl): Defer comdat templates that might not be ! needed. ! ! * cp-tree.h (DECL_NEEDED_P): Also true if !DECL_COMDAT. ! * decl2.c (finish_vtable_vardecl): Don't check !DECL_COMDAT. ! (finish_file): Likewise. ! ! * decl2.c (import_export_class): Undo 12/14 change. ! ! * error.c (dump_decl): operator new, not operatornew. ! ! * class.c (field_decl_cmp): A nontype is "greater" than a type. ! * search.c (lookup_field_1): Look for the last field with the ! desired name. ! ! 2000-01-05 Nathan Sidwell ! ! * decl2.c (lookup_arg_dependent): Deal with FNS not being a ! FUNCTION_DECL. ! ! 2000-01-05 Nathan Sidwell ! ! * typeck.c (build_static_cast): Don't strip target qualifiers ! when casting from a class. ! ! 2000-01-04 Kaveh R. Ghazi ! ! * class.c (warn_hidden): Initialize variable `fndecl'. ! 2000-01-03 Ulrich Drepper ! * decl.c (flag_isoc9x): New variable to be able to use code in ! c-common.c. For now always zero. ! 2000-01-03 Mark Mitchell ! * cp-tree.h (CLASSTYPE_VBASECLASSES): Improve documentation. ! * class.c (layout_basetypes): Don't set BINFO_INHERITANCE_CHAIN ! or unshare_base_binfos for virtual bases here. ! * search.c (dfs_get_vbase_types): Do it here. ! (get_vbase_types): Adjust. ! 2000-01-02 Mark Mitchell ! * cp-tree.h (CLASSTYPE_VFIELDS): Move definition. ! (BINFO_PRIMARY_MARKED_P): Use flag 5. ! (SET_BINFO_PRIMARY_MARKED_P): Likewise. ! (CLEAR_BINFO_PRIMARY_MARKED_P): Likewise. ! (unmark_primary_bases): Remove declaration. ! (unmarkedp): Declare. ! (dfs_vbase_unmark): Likewise. ! * class.c (determine_primary_base): Return immediately if there ! are no base classes. Call mark_primary_bases here. ! (modify_all_direct_vtables): Remove. ! (modify_all_indirect_vtables): Remove. ! (dfs_modify_vtables_queue_p): New function. ! (dfs_modify_vtables): New function. ! (modify_all_vtables): Use them. ! (build_base_fields): Build FIELD_DECLs for primary virtual base ! classes. ! (create_vtable_ptr): Don't call determine_primary_base here. ! (dfs_mark_primary_bases_and_set_vbase_offsets): Rename to ... ! (dfs_set_offset_for_vbases): ... this. ! (layout_virtual_bases): Use it. ! (layout_class_type): Call determine_primary_base here. ! * search.c (unmarkedp): Make it global. ! (shared_marked_p): Simplify. ! (shared_unmarked_p): Likewise. ! (dfs_primary_bases_queue_p): Remove. ! (dfs_unmark_primary_bases): Likewise. ! (unmark_primary_bases): Likewise. ! (mark_primary_bases): Simplify. ! (get_pure_virtuals): Don't call mark_primary_bases here. ! (dfs_vbase_unmark): New function. ! (get_vbase_types): Simplify. ! * class.c (struct base_info): Remove. ! (determine_primary_base): Take has_virtual_p rather than a ! base_info as input. Don't calculate max_has_virtual. ! (finish_struct_bits): Remove max_has_virtual argument. ! (create_vtable_ptr): Remove max_has_virtual_p argument. ! (layout_virtual_bases): Remove max argument. ! (layout_basetypes): Likewise. ! (layout_class_type): Remove max_has_virtual_p argument. ! (finish_struct_1): Remove max_has_virtual. ! * cp-tree.h (dfs_mark_primary_bases_queue_p): New function. ! (layout_basetypes): Remove. ! * class.c (propagate_binfo_offsets): Moved here from tree.c. ! Update to handle primary virtual bases. ! (remove_base_fields): New function, split out from ! layout_basetypes. ! (dfs_mark_primary_bases_and_set_vbase_offsets): New function. ! (layout_virtual_bases): New function, split out from ! layout_basetypes. Update to handle primary virtual bases. ! (layout_basetypes): Moved here from tree.c. Use ! remove_base_fields and layout_virtual_bases. ! * search.c (dfs_mark_primary_bases_queue_p): New function. ! (mark_primary_bases): Use it. ! * tree.c (CEIL): Remove. ! (propagate_binfo_offsets): Remove. ! (layout_basetypes): Remove. ! 2000-01-01 Mark Mitchell ! * cp-tree.h (CLASSTYPE_N_BASECLASSES): Use BINFO_N_BASETYPES. ! (BINFO_PRIMARY_MARKED_P): New macro. ! (SET_BINFO_PRIMARY_MARKED_P): Likewise. ! (CLEAR_BINFO_PRIMARY_MARKED_P): Likewise. ! (mark_primary_bases): New function. ! (unmark_primary_bases): Likewise. ! * search.c (get_abstract_virtuals_1): Remove. ! (dfs_mark_primary_bases): New function. ! (mark_primary_bases): Likewise. ! (dfs_unmark_primary_bases): Likewise. ! (unmark_primary_bases): Likewise. ! (dfs_get_pure_virtuals): Likewise. ! 2000-01-01 Mark Mitchell ! * cp-tree.h (skip_rtti_stuff): Adjust prototype. ! * class.c (skip_rtti_stuff): Reorganize parameters and return value. ! (modify_one_vtable): Adjust. ! (fixup_vtable_deltas1): Likewise. ! (override_one_vtable): Likewise. ! * search.c (get_abstract_virtuals_1): Likewise. ! (get_pure_virtuals): Likewise. ! (expand_upcast_fixups): Likewise. ! * tree.c (debug_binfo): Likewise. ! * class.c (build_vtable): Don't return a value. Don't rebuild ! vtables for bases that have already been handled. ! (prepare_fresh_vtable): Don't rebuild vtables for bases that have ! already been handled. ! (modify_one_vtable): Adjust accordingly. ! (fixup_vtable_deltas1): Likewise. ! (finish_struct_1): Likewise. ! 2000-01-01 Martin v. Löwis ! * call.c (build_new_method_call): Also check destructors. --- 1,1103 ---- ! 2004-04-18 Release Manager ! * GCC 3.4.0 released. ! 2004-04-08 Danny Smith ! PR c++/14808 ! * method.c (make_alias_for_thunk): Just return function decl ! for one_only functions if __CYGWIN__ or __MINGW32__ ! (use_thunk): Don't put function and thunk in same one_only ! section if __CYGWIN__ or __MINGW32__. ! 2004-04-08 Jakub Jelinek ! * decl2.c (mark_used): Don't segfault if cfun != NULL but ! current_function_decl == NULL. ! 2004-04-01 Mark Mitchell ! PR c++/14803 ! * typeck.c (get_delta_difference): Call fold before returning the ! value. ! 2004-04-01 Richard Henderson ! PR c++/14804 ! * decl.c (cp_finish_decl): Preserve TREE_READONLY more often. ! * typeck2.c (split_nonconstant_init): Clear TREE_READONLY. ! 2004-04-01 Mark Mitchell ! PR c++/14810 ! * name-lookup.c (maybe_push_cleanup_level): Robustify. ! 2004-03-30 Mark Mitchell ! PR c++/14724 ! * decl.c (start_decl_1): Do not decide whether or not to create a ! new cleanup level until after the type has been completed. ! PR c++/14763 ! * pt.c (tsubst_default_argument): Clear current_function_decl. ! 2004-03-28 Jan Hubicka ! PR C++/14639 ! * method.c (use_think): Do not mark thunk as referenced. ! 2004-03-21 Mark Mitchell ! PR c++/14616 ! * decl.c (cp_finish_decl): Compute the size of arrays declared in ! templates, if their type is non-dependent. ! 2004-03-19 Mark Mitchell ! * call.c (build_op_delete_call): Do not forget the placement ! arguments when iterating through mutiple delete operators. ! * cp-tree.h (svaed_scope): Remove last_parms. ! (NEW_DELETE_OPNAME_P): New macro. ! (last_function_parms): Remove. ! (do_friend): Adjust prototype. ! * decl.c (grokparms): Return the PARM_DECLs directly, rather than ! using last_function_parms. ! (grokfndecl): Take the PARM_DECLs as an argument, rather than ! using last_function_parms. ! (grokdeclarator): Adjust accordingly. Do not form METHOD_TYPEs ! for class-specific operator new and operator delete. ! (grok_op_properties): Do not look for allocation functions with ! METHOD_TYPEs. ! (start_function): Use DECL_ARGUMENTS instead of ! last_function_parms. ! * decl.h (last_function_parms): Do not declare. ! * decl2.c (grokclassfn): Do not use last_function_parms. ! * friend.c (do_friend): Remove parmdecls parameter. ! * name-lookup.c (push_to_top_level): Do not save last_function_parms. ! (pop_from_top_level): Do not restore it. ! * pt.c (check_explicit_specialization): Do not adjust ! last_function_parms. ! * name-lookup.c (do_local_using_decl): Create a local binding for ! types brought in via using declarations. ! * name-lookup.c (lookup_arg_dependent): Handle block-scope ! function declarations correctly. ! * semantics.c (finish_id_expression): Correct handling of ! conversion operators to dependent types. ! * typeck.c (lookup_destructor): Allow the use of destructors from ! base classes. ! 2004-03-19 Giovanni Bajo ! PR c++/14545 ! * parser.c (cp_parser_functional_cast): A cast to anything ! but integral or enumaration type is not an integral constant ! expression. ! * pt.c (value_dependent_expression_p): Handle cast expressions ! without operands (such as "int()"). ! 2004-03-18 Mark Mitchell ! * semantics.c (finish_pseudo_destructor_expr): Allow differing ! cv-qualification between the type named by the ! pseudo-destructor-name and the object-type. ! * search.c (accessible_base_p): Handle non-proper bases. ! * name-lookup.c (do_nonmember_using_decl): If a using declaration ! refers to a single overloaded function, set the type of the ! function. ! * tree.c (lvalue_type): Simplify. ! * typeck.c (type_unknown_p): Do not assume all OVERLOADs have an ! unknown type. ! (build_unary_op): Handle OVERLOADs with known types. ! * decl.c (duplicate_decls): Do not destroy DECL_ARGUMENTS for ! function templates. ! * parser.c (cp_parser_postfix_expression): Handle the use of ! "typename" in non-dependent contexts. Convert appropriately when ! when using a qualified name after "->" or ".". ! * call.c (conditional_conversion): Honor the requirement that some ! conversions refer to the original object. ! * call.c (build_conditional_expr): Do not call force_rvalue for ! operands of void_type when the conditional expression itself has ! void type. ! * name-lookup.c (pushdecl): Don't consider a declaration of a ! function named "main" to be an overload of a type named "main". ! * parser.c (cp_parser_template_name): Perform name lookup when the ! template name is proceeded by "template" if the qualifying scope ! is non-dependent. ! * typeck.c (composite_pointer_type_r): Correctly handle ! pointer-to-member types. ! (build_const_cast): Likewise. ! 2004-03-16 Mark Mitchell ! PR c++/14586 ! * cp-tree.h (build_new_op): Change prototype. ! (build_x_binary_op): Likewise. ! * call.c (build_new_op): Add overloaded_p parameter. ! * decl2.c (grok_array_decl): Adjust call to build_new_op. ! * parser.c (cp_parser_binary_expression): Note that uses of ! overloaded operators prevents an expression from being considered ! an integral constant. ! * pt.c (tsubst_copy_and_build): Adjust calls to build_new_op and/or ! build_x_binary_op. ! * semantics.c (finish_call_expr): Likewise. ! * typeck.c (rationalize_conditional_expr): Likewise. ! (build_x_indirect_ref): Likewise. ! (build_x_binary_op): Likewise. ! (build_x_unary_op): Likewise. ! (build_x_compound_expr): Likewise. ! (build_modify_expr): Likewise. ! * typeck2.c (build_x_arrow): Likewise. ! 2004-03-13 Mark Mitchell ! PR c++/14550 ! * parser.c (cp_parser_non_integral_constant_expression): Encode ! more of the idiom that surrounded calls to this function within ! the function itself ! (cp_parser_primary_expression): Adjust accordingly. ! (cp_parser_postfix_expression): Likewise. ! (cp_parser_unary_expression): Likewise. ! (cp_parser_cast_expression): Likewise. ! (cp_parser_assignment_expression): Likewise. ! (cp_parser_expression): Likewise. ! (cp_parser_new_expression): Note that new-expressions are not ! allowed in integral constant expressions. ! (cp_parser_delete_expression): Likewise. ! 2004-03-11 Mark Mitchell ! PR c++/14476 ! * decl.c (xref_tag): Do not create dummy ENUMERAL_TYPEs. ! 2004-03-10 Mark Mitchell ! PR c++/14510 ! * decl.c (xref_tag): Disregard non-type declarations when ! looking up a tagged type. ! 2004-03-10 Jason Merrill ! PR c++/14452 ! * tree.c (stabilize_init): Return whether or not it worked. ! * init.c (build_new_1): If not, use a sentry. ! * cp-tree.h: Adjust prototype. ! 2004-03-09 Nathan Sidwell ! PR c++/14397 ! * call.c (convert_like_real): Build a const qualified temporary, ! when testing ctor access. ! 2004-03-09 Mark Mitchell ! * call.c (initialize_reference): Fix typo. ! 2004-03-09 Giovanni Bajo ! PR c++/14409 ! * pt.c (determine_specialization): For member templates, match also ! constness. ! PR c++/14448 ! * parser.c (cp_parser_initializer_clause): Fold initializer if it is ! non-dependent. ! * pt.c (tsubst_copy_and_build): Handle NOP_EXPRs. ! 2004-03-09 Mark Mitchell ! PR c++/14230 ! * call.c (initialize_reference): Handle initializers that are ! class-member access expressions applies to rvalues. ! PR c++/14432 ! * name-lookup.c (supplement_binding): Ignore functions that are ! marked DECL_ANTICIPATED. ! 2004-03-08 Mark Mitchell ! PR c++/14401 ! * class.c (check_field_decls): Complain about non-static data ! members of reference type in unions. Propagate ! CLASSTYPE_REF_FIELDS_NEED_INIT and ! CLASSTYPE_READONLY_FIELDS_NEED_INIT from the types of non-static ! data members. ! * init.c (perform_member_init): Complain about mbmers with const ! type that are not explicitly initialized. ! 2004-03-08 Jason Merrill ! PR c++/13170 ! * decl.c (xref_tag): Remove attribute handling. ! * cp-tree.h: Adjust prototype. ! * decl.c, parser.c, rtti.c: Adjust callers. ! * parser.c (cp_parser_class_head): Pass back attributes in the ! class head. ! (cp_parser_class_specifier): Adjust. ! 2004-03-08 Matt Austern ! PR debug/14079 ! * name-lookup.c (add_decl_to_level): Add extern variables, as well ! as static, to static_decls array. ! 2004-03-01 Jason Merrill ! PR c++/13944 ! * except.c (do_free_exception): Remove #if 0 wrapper. ! (build_throw): Use it if we elide a copy into the ! exception object. ! * tree.c (stabilize_call): Fix thinko. ! * init.c (build_new_1): Preevaluate initializer. Simplify EH code. ! (build_init): Call a constructor rather than call build_aggr_init ! for classes. ! * except.c (stabilize_throw_expr): Remove. ! (build_throw): Use stabilize_init instead of stabilize_throw_expr. ! * tree.c (stabilize_call, stabilize_init): New fns. ! * call.c (build_over_call): A constructor no longer returns the ! address of the object. ! 2004-03-01 Mark Mitchell ! PR c++/14324 ! * lex.c (retrofit_lang_decl): Treat entities with no linkage as ! having C++ linkage for name-mangling purposes. ! PR c++/14260 ! * parser.c (cp_parser_direct_declarator): Recognize constructor ! declarators that use a template-id to name the class being ! constructed. ! PR c++/14337 ! * pt.c (tsubst_qualified_id): Handle dependent qualifying scopes. ! (tsubst_expr): Do not call tsubst_copy, even when ! processing_template_decl. ! 2004-03-01 Mark Mitchell ! PR c++/14369 ! * pt.c (build_non_dependent_expr): Do not create a ! NON_DEPENDENT_EXPR for a THROW_EXPR. ! PR c++/14360 ! * parser.c (cp_parser_postfix_expression): Do not perform Koenig ! lookup if ordinary name-lookup finds a non-function. ! * pt.c (tsubst_copy_and_build): Likewise. ! PR c++/14361 ! * parser.c (cp_parser_late_parsing_default_args): Check that there ! are no extra tokens after the end of the default-argument ! expression. ! PR c++/14359 ! Backport 2004-02-12 Mark Mitchell ! * decl.c (redeclaration_error_message): Correct handling of templates. + * pt.c (tsubst_friend_declaration): Adjust code to determine + whether or not a friend template is a definition. + (tsubst_decl): Clear DECL_INITIAL for new FUNCTION_DECLs. ! 2004-03-01 Gabriel Dos Reis ! PR c++/14369 ! * error.c (dump_expr): Handle THROW_EXPR. ! 2004-02-29 Mark Mitchell ! PR c++/14138 ! * name-lookup.h (push_scope): Change prototype. ! * name-lookup.c (push_scope): Do not reenter the current class scope. ! * decl.c (grokfndecl): Check return code from push_scope before ! calling pop_scope. ! * decl2.c (check_classfn): Likewise. ! * parser.c (cp_parser_conversion_function_id): Likewise. ! (cp_parser_init_declarator): Likewise. ! (cp_parser_direct_declarator): Likewise. ! (cp_parser_class_specifier): Likewise. ! (cp_parser_class_head): Likewise. ! (cp_parser_lookup_name): Likewise. ! (cp_parser_constructor_declarator_p): Likewise. ! * pt.c (instantiate_class_template): Likewise. ! (resolve_typename_type): Likewise. ! 2004-02-27 Mark Mitchell ! PR debug/12103 ! * class.c (update_vtable_entry_for_fn): Do not go through ! covariance machinery if the type returned by an overrider is the ! same as the original. ! 2004-02-27 Giovanni Bajo ! PR c++/14284 ! * pt.c (dependent_type_p_r): A template template parameter is a ! dependent type. ! 2004-02-26 Mark Mitchell ! PR c++/14278 ! * parser.c (cp_parser_parameter_declaration_list): Commit ! to fewer tentative parses. ! 2004-02-26 Giovanni Bajo ! PR c++/14246 ! * mangle.c (write_template_arg_literal): Don't rely on identity for ! boolean constants. ! 2004-02-23 Giovanni Bajo ! PR c++/14250 ! * cvt.c (build_expr_type_conversion): Type must be complete before ! looking up for conversions. ! 2004-02-20 Mark Mitchell ! PR c++/14199 ! * pt.c (tsubst_copy): Call mark_used for a PARM_DECL. ! PR c++/14173 ! * semantics.c (begin_class_definition): Set TYPE_PACKED correctly ! for all type variants. ! 2004-02-19 Mark Mitchell ! PR c++/14186 ! * name-lookup.c (push_class_level_binding): Do not complain about ! adding a binding for a member whose name is the same as the ! enclosing class if the member is located in a base class of the ! current class. ! 2004-02-19 Giovanni Bajo ! PR c++/14181 ! * parser.c (cp_parser_new_expression): Parse an ill-formed ! direct-new-declarator after a parenthesized type-id to emit good ! diagnostic. ! 2004-02-17 Mark Mitchell ! PR c++/11326 ! * cp-tree.h (abi_version_at_least): Remove. ! * mangle.c: Include flags.h. ! 2004-02-15 Mark Mitchell ! PR c++/13971 ! * call.c (build_conditional_expr): Handle conversions between ! class types which result in differently cv-qualified type ! variants. ! PR c++/14086 ! * class.c (delete_duplicate_fields_1): Remove. ! (delete_duplicate_fields): Likewise. ! (finish_struct_anon): Remove check for members with the same name ! as their enclosing class. ! (check_field_decls): Do not call duplicate_fields. ! * decl.c (grokdeclarator): Remove check for static data members ! with the same name as their enclosing class. ! * name-lookup.c (push_class_level_binding): Check for members with ! the same name as their enclosing class. ! 2004-02-15 Gabriel Dos Reis ! PR c++/14085 ! * error.c (dump_decl): Handle TEMPLATE_TYPE_PARM. ! 2004-02-14 Kriang Lerdsuwanakij ! PR c++/13635 ! * pt.c (push_template_decl_real): Make sure DECL_TI_ARGS of DECL ! has full set of arguments. ! 2004-02-13 Mark Mitchell ! PR c++/14122 ! * cp-tree.h (delete_sanity): Change prototype. ! * decl2.c (delete_sanity): Make doing_vec a bool, not an int. ! Remove dead code. Adjust code to warn about deleting an array. ! * typekc.c (decay_conversion): Use build_address and build_nop. ! PR c++/14108 ! * search.c (accessible_p): Do not check access in thunks. ! 2004-02-13 Giovanni Bajo ! PR c++/13927 ! * error.c (dump_decl) : Dump as simple declarations. ! 2004-02-13 Mark Mitchell ! PR c++/14083 ! * call.c (build_conditional_expr): Call force_rvalue on the ! non-void operand in the case that one result is a throw-expression ! and the other is not. ! 2004-02-13 Ian Lance Taylor ! PR c++/9851 ! * parser.c (cp_parser_pseudo_destructor_name): Check for errors on ! the type name and look ahead for ::~, and bail out early with a ! better error message if the parse is going to fail. ! 2004-02-10 Mark Mitchell ! * typeck.c (lookup_destructor): Fix typo in error message. ! 2004-02-07 Zack Weinberg ! Bug 13856 ! * optimize.c (maybe_clone_body): Don't update DECL_ESTIMATED_INSNS. ! * decl.c (duplicate_decls, start_function): Likewise. ! 2004-02-07 Zack Weinberg ! * name-lookup.c (pushdecl): Issue shadow warnings directly. ! * parser.c (free_parser_stacks): Delete. ! 2004-02-07 Kazu Hirata ! * rtti.c, tree.c: Update copyright. ! 2003-02-06 Giovanni Bajo ! PR c++/14033 ! * decl.c (require_complete_types_for_parms): Do not insert ! error_mark_node in the parameter list. ! 2003-02-06 Giovanni Bajo ! PR c++/14028 ! * parser.c (cp_parser_enclosed_template_argument_list): Emit straight ! error when terminator can not be found. ! 2004-02-05 Kelley Cook ! Make-lang.in (po-generated): Delete. ! 2004-02-05 Rainer Orth ! PR middle-end/13750 ! Revert: ! 2004-01-15 Geoffrey Keating ! PR pch/13361 ! * cp/lex.c (handle_pragma_interface): Duplicate string from tree. ! (handle_pragma_implementation): Likewise. ! 2004-02-05 Mark Mitchell ! PR c++/13714 ! * typeck.c (lookup_destructor): Tweak error message. ! 2004-02-05 Paul Brook ! Backport from mainline. ! 2003-11-05 Mark Mitchell ! * decl.c (cxx_push_function_context): Do not set ! current_function_is_thunk. ! * method.c (use_thunk): Set CALL_FROM_THUNK on the call to the ! actual function. ! 2004-02-04 Mark Mitchell ! PR c++/13932 ! * call.c (convert_like_real): Use "converting" rather than ! "argument" as the descriptive keyword to ! dubious_conversion_warnings. ! * typeck.c (convert_for_assignment): Do not call ! dubious_conversion_warnings. ! 2004-02-04 Giovanni Bajo ! PR c++/13086 ! * init.c (build_delete): Emit a more informative error message in ! case of an incomplete type, and on the correct source line. ! 2004-02-04 Mark Mitchell ! PR c++/9941 ! * rtti.c (tinfo_base_init): Use import_export_tinfo to decide the ! linkage for the typeinfo name string. ! PR c++/13969 ! * cp-tree.h (fold_non_dependent_expr): New function. ! * parser.c (cp_parser_fold_non_dependent_expr): Remove. ! (cp_parser_template_argument): Use fold_non_dependent_expr. ! (cp_parser_direct_declarator): Likewise. ! * pt.c (fold_non_dependent_expr): New function. ! (convert_nontype_argument): Use it. ! (tsubst_qualified_id): Simplify. ! (tsubst_copy_and_build): Likewise. ! 2003-02-04 Giovanni Bajo ! PR c++/13997 ! * pt.c (more_specialized_class): Increase processing_template_decl ! while partial ordering. ! 2004-02-03 Mark Mitchell ! PR c++/13950 ! * parser.c (cp_parser_class_name): Robustify. ! PR c++/13970 ! * parser.c (cp_parser_cache_group): Do not consume the EOF token. ! 2004-02-03 Mark Mitchell ! PR c++/13925 ! * decl.c (start_function): Do not call pushdecl for any ! instantiation or specialization of a primary template. ! PR c++/14002 ! * semantics.c (finish_id_expression): Do not return an ! IDENTIFIER_NODE when lookup finds a PARM_DECL. ! PR c++/13978 ! * pt.c (build_non_dependent_expr): Do not build ! NON_DEPENDENT_EXPRs for FUNCTION_DECLs or TEMPLATE_DECLs. ! PR c++/13968 ! * semantics.c (finish_id_expression): Do not return an ! IDENTIFIER_NODE when lookup finds a VAR_DECL. ! PR c++/13975 ! * parser.c (cp_parser_simple_declaration): When skipping to the ! end of the statement swallow the terminating semicolon. ! 2004-02-02 Giovanni Bajo ! DR206 ! PR c++/13813 ! * decl.c (grokdeclarator): Check immediatly type completeness for ! non-dependent types. ! 2004-01-30 Mark Mitchell ! PR c++/13113 ! * init.c (build_offset_ref): Improve error recovery for invalid ! uses of non-static member functions. ! PR c++/13854 ! * cp-tree.h (cp_build_type_attribute_variant): New function. ! * class.c (build_clone): Use cp_build_type_attribute_variant. ! * decl.c (duplicate_decls): Likewise. ! * pt.c (copy_default_args_to_explicit_spec): Likewise. ! (tsubst_function_type): Likewise. ! * tree.c (build_exception_variant): Check attributes before ! concluding that two types are the same. ! (cp_build_type-attribute_variant): New method. ! * typeck.c (merge_types): Use cp_build_type_attribute_variant. ! PR c++/13907 ! * call.c (convert_class_to_reference): Keep better track of ! pedantically invalid user-defined conversions. ! 2004-02-02 Giovanni Bajo ! PR c++/13957 ! * pt.c (tsubst_qualified_id): Improved error message when a type ! is expected but not found. ! 2004-01-30 Michael Matz ! * parser.c (cp_parser_labeled_statement): Accept case ranges. ! 2004-01-28 Jan Hubicka ! PR c++/13683 ! * call.c (convert_arg_to_ellipsis): Don't emit a warning if within ! a sizeof expression.block ! 2004-01-29 Giovanni Bajo ! * parser.c (cp_parser_template_id): Parse tentatively `[:' after a ! template name as it was `<::' (digraph typo). ! (cp_parser_nth_token_starts_template_argument_list_p): New function. ! (cp_parser_id_expression): Use it. ! (cp_parser_nested_name_specifier_opt): Likewise. ! (cp_parser_template_name): Likewise. ! (cp_parser_class_name): Likewise. ! (cp_lexer_get_preprocessor_token): Use c_lex_with_flags. ! 2004-01-29 Mark Mitchell ! PR c++/13883 ! * mangle.c (write_encoding): Correct encoding of member template ! constructors. ! 2004-01-28 Mark Mitchell ! PR c++/13791 ! * typeck.c (merge_types): Do not merge attributes into ! TYPENAME_TYPEs. ! 2004-01-28 Mark Mitchell ! PR c++/13736 ! * parser.c (cp_parser_direct_declarator): Do not prevent ! backtracking inside a parenthesized declarator. ! (cp_parser_parameter_declaration): Fix typo in comment. ! 2004-01-26 Kaveh R. Ghazi ! * cp-tree.h (language_function, lang_type_header): Use ! BOOL_BITFIELD. ! * name-lookup.h (cp_binding_level): Likewise. ! 2004-01-26 Mark Mitchell ! PR c++/13663 ! * semantics.c (finish_for_expr): Check for unresolved overloaded functions. ! 2004-01-26 Mark Mitchell ! * class.c (add_method): Just check processing_template_decl to ! determine whether or not we are within a template. ! * decl2.c (maybe_retrofit_in_chrg): Likewise. ! * init.c (decl_constant_value): Check the type of the declaration, ! not TREE_READONLY. ! * name-lookup.c (maybe_push_to_top_level): Rename to ... ! (push_to_top_level): ... this. ! * name-lookup.h (maybe_push_to_top_level): Do not declare it. ! * pt.c (push_template_decl_real): Reorder condition for speed. ! (convert_template_argument): Use dependency-checking functions in ! place of uses_template_parms. ! (lookup_template_class): Avoid calling uses_template_parms more ! than once. ! (uses_template_parms): Reimplement, using dependency-checking functions. ! (instantiate_class_template): Use push_to_top_level, not ! maybe_push_to_top_level. ! (type_unification_real): Simplify. ! (type_dependent_expression_p): Handle OFFSET_REFs and ! TEMPLATE_DECLs. ! (any_dependent_template_arguments_p): Handle multiple levels of ! template argument. ! * semantics.c (expand_or_defer_fn): Do not check ! uses_template_parms for template instantiations. ! * typeck.c (comptypes): Avoid calling cp_type_quals. ! 2004-01-25 Mark Mitchell ! PR c++/13833 ! * call.c (build_over_call): Do not convert arguments when ! processing a template. ! * pt.c (build_non_dependent_expr): Do not build a ! NON_DEPENDENT_EXPR for arithmetic constants. ! 2004-01-25 Giovanni Bajo ! PR c++/13810 ! * parser.c (cp_parser_type_parameter): When cp_parser_id_expression ! returns a TYPE_DECL. no further lookup is required. ! * semantics.c (check_template_template_default_arg): A TYPE_DECL ! is invalid. Rework to give better diagnostics. ! 2004-01-25 Kriang Lerdsuwanakij ! PR c++/13797 ! * pt.c (instantiate_class_template): Add an error_mark_node ! check. ! (tsubst_decl) : Likewise. ! 2004-01-24 Kazu Hirata ! * call.c: Update copyright. * class.c: Likewise. * decl2.c: Likewise. * except.c: Likewise. * expr.c: Likewise. * init.c: Likewise. * mangle.c: Likewise. * optimize.c: Likewise. * typeck.c: Likewise. * typeck2.c: Likewise. ! 2004-01-23 Andrew Pinski ! PR c++/13701 ! * decl.c (finish_function): Move the call to ! finish_fname_decls below the call to ! finish_eh_spec_block. ! 2004-01-21 Zdenek Dvorak ! * parser.c (cp_parser_class_specifier): Prevent garbage collection. ! 2004-01-20 Kelley Cook ! * Make-lang.in: Replace $(docdir) with doc. ! (c++.info, c++.srcinfo): Dummy entry. ! (c++.man, c++.srcman): New rules. ! (c++.install-man): Revamp rule. ! 2004-01-19 Kelley Cook ! * Make-lang.in (CXX_INSTALL_NAME, GXX_INSTALL_NAME, ! CXX_TARGET_INSTALL_NAME, GXX_TARGET_INSTALL_NAME): Define via a ! immediate $(shell) instead of deferred backquote. ! 2004-01-19 Mark Mitchell ! PR c++/13651 ! * parser.c (cp_parser_postfix_expression): When encountering ! incomplete type on left-hand side of "->" or ".", treat the entire ! expression as erroneous. ! 2004-01-19 Mark Mitchell ! PR c++/13592 ! * call.c (build_field_call): Remove. ! (n_build_method_call): Likewise. ! (build_method_call): Likewise. ! (build_new_method_call): Do not call build_field_call. ! * class.c (n_build_method_call): Remove. ! (print_class_statistics): Do not print it. ! * cp-tree.h (build_method_call): Remove declaration. ! (finish_object_call_expr): Likewise. ! (build_new_1): Do not use build_method_call. ! * parser.c (cp_parser_postfix_expression): Use finish_call_expr ! when the function appearing on the right-hand-side of "." or "->" ! is not actually a function. ! * pt.c (tsubst_copy_and_build): Likewise. ! * semantics.c (finish_object_call_expr): Remove. ! 2004-01-18 Mark Mitchell ! PR c++/13710 ! * pt.c (tsubst): Use finish_typeof. ! 2004-01-18 Jason Merrill ! PR c++/11725 ! * except.c (build_throw): In a template, set ! current_function_returns_abnormally. ! 2004-01-17 Fred Fish ! PR c++/11895 ! * decl.c (reshape_init): Handle VECTOR_TYPE like ARRAY_TYPE, ! except don't call array_type_nelts() with a VECTOR_TYPE. ! 2004-01-16 Jan Hubicka ! * mangle.c (write_mangled_name): Remove inline modifier. ! 2004-01-16 Mark Mitchell ! PR c++/13574 ! * decl.c (compute_array_index_type): Fix grammar in comment. ! * init.c (build_zero_init): Handle zero-sized arrays correctly. ! PR c++/13178 ! * call.c (name_as_c_string): Print conversion operator names ! correctly. ! PR c++/13478 ! * call.c (initialize_reference): Pass -1 for inner parameter to ! convert_like_real. ! 2004-01-15 Giovanni Bajo ! PR c++/13407 ! * parser.c (cp_parser_base_specifier): Check for an invalid ! keyword `typename' and emit an user-friendly error message. ! 2004-01-15 Geoffrey Keating ! PR pch/13361 ! * cp/lex.c (handle_pragma_interface): Duplicate string from tree. ! (handle_pragma_implementation): Likewise. ! 2004-01-15 Giovanni Bajo ! PR c++/9259 ! * typeck.c (build_class_member_access_expr): Allow to access members ! of the currently open class. (finish_class_member_access_expr): Likewise. ! 2004-01-15 Alexandre Oliva ! PR c++/13659 ! * name-lookup.c (validate_nonmember_using_decl): Take scope and ! name by value, instead of computing them. ! (do_local_using_decl, do_toplevel_using_decl): Add scope and name ! arguments. Pass them to validate_nonmember_using_decl. ! * name-lookup.h (do_local_using_decl): Adjust. ! (do_toplevel_using_decl): Likewise. ! * parser.c (cp_parser_using_declaration): Likewise. * pt.c (tsubst_expr): Likewise. ! 2004-01-15 Alexandre Oliva ! PR c++/13594 ! PR c++/13658 ! * name-lookup.c (qualified_lookup_using_namespace): Search ! strongly-associated namespaces first, and only then try other ! namespaces. ! 2004-01-15 Kelley Cook ! * Make-lang.in (c++.srcextra): Dummy entry. ! 2004-01-15 Giovanni Bajo ! PR c++/8856 ! * parser.c (cp_parser_template_name): Don't try to parse a ! conversion-function-id, as it cannot be a template-name. ! (cp_parser_simple_type_specifier): Check for invalid template-ids ! even after a built-in type. ! 2004-01-14 Jan Hubicka ! PR c++/12850 ! * pt.c (instantiate_decl): Do not increase function_depth. ! 2004-01-14 Danny Smith ! PR c++/9021 ! PR c++/11005 ! * parser.c (cp_parser_elaborated_type_specifier): Warn about ! attributes and discard. ! * decl.c (xref_tag): Don't overwite existing attributes with ! NULL_TREE. ! 2004-01-14 Giovanni Bajo ! PR c++/12335 ! * parser.c (cp_parser_lookup_name): Return error_mark_node if there ! is no destructor while looking up a BIT_NOT_EXPR. ! 2004-01-13 Ian Lance Taylor ! * cxxfilt.c: Remove unused file. ! 2004-01-14 Jan Hubicka ! Partial fix to PR c++/12850 ! * decl2.c (mark_used): Do not proactively instantiate templates ! when compiling in unit-at-a-time or not optimizing. ! * optimize.c (maybe_clone_body): Do not increase function depth. ! 2004-01-13 Giovanni Bajo ! PR c++/13474 ! * pt.c (tsubst) : Remove obsolete array index tweaking. ! 2003-01-12 Steven Bosscher ! PR c++/13558 ! * parser.c (cp_parser_member_declaration): Any non-type is also ! not a class or a function. ! 2004-01-12 Jason Merrill ! PR c++/12815 ! * class.c (build_base_path): Do not mark vtable references as ! TREE_CONSTANT. ! (build_vtbl_ref_1): Likewise. ! 2004-01-12 Richard Henderson ! PR opt/10776 ! * typeck2.c (split_nonconstant_init_1, split_nonconstant_init): New. ! (store_init_value): Use it. ! * decl.c (check_initializer): Expect full initialization code ! from store_init_value. ! * init.c (expand_aggr_init_1): Likewise. ! * decl2.c (maybe_emit_vtables): Abort if runtime init needed. ! 2004-01-12 Mark Mitchell ! * class.c (layout_class_type): For non-POD class types, also copy ! the DECL_SIZE and DECL_MODE of fields to the base class type. ! 2004-01-12 Kriang Lerdsuwanakij ! PR c++/13289 ! * pt.c (instantiate_decl): Set DECL_TEMPLATE_INSTANTIATED before ! calling regenerate_decl_from_template. ! 2004-01-12 Scott Brumbaugh ! PR c++/4100 ! * parser.c (cp_parser_decl_specifier_seq): Add check for a friend ! decl-specifier occurring along with a class definition. ! 2004-01-12 Ian Lance Taylor ! * parser.c (cp_parser_decl_specifier_seq): Add parenthetical ! clauses to comments describing declares_class_or_enum. ! (cp_parser_type_specifier): Set *declares_class_or_enum to 0, not ! false. ! 2004-01-12 Jan Hubicka ! * pt.c (for_each_template_parm): Do not check for duplicates. ! (for_each_template_parm): Use walk_tree duplicate checking code. ! 2004-01-11 Ian Lance Taylor ! PR c++/3478 ! * parser.c (cp_parser_decl_specifier_seq): If the first decl_spec ! is error_mark_node, don't add any more decl_specs. ! (cp_parser_init_declarator): After committing to a declaration, if ! the decl_specifiers start with error_mark_node, issue an error and ! change the type to "int". ! 2004-01-09 Nathanael Nerode ! PR bootstrap/7817 ! * Make-lang.in: Copy gcc.1 to g++.1 rather than using .so. ! 2004-01-10 Giovanni Bajo ! DR 337 ! PR c++/9256 ! * pt.c (tsubst): Substitution must fail if we are attempting to ! create an array with element type that is an abstract class type. ! * decl.c (cp_finish_decl): Strip pointers and array types recursively ! before calling abstract_virtuals_error. ! 2004-01-09 Alexandre Oliva ! * name-lookup.c (qualified_lookup_using_namespace): Consider ! strong using directives even if we've already found a binding. ! 2004-01-09 Mark Mitchell ! * cp-tree.h (cxx_expand_expr): Change prototype. ! * expr.c (cxx_expand_expr): Add alt_rtl parameter. ! 2004-01-08 Giovanni Bajo ! PR c++/12573 ! * pt.c (value_dependent_expression_p): Handle COMPONENT_REFs by ! looking into them recursively. They can be there because of the ! new __offsetof__ extension. ! 2004-01-07 Zack Weinberg ! * parser.c (cp_parser_save_member_function_body): Mark the ! definition static. ! 2004-01-05 Mark Mitchell ! PR c++/13057 ! * class.c (build_clone): Copy type attributes from the original ! function to the clone. ! PR c++/12815 ! * class.c (build_vtbl_ref_1): Do not unconditionally mark vtable ! references as constant. ! PR c++/12132 ! * parser.c (cp_parser_explicit_instantiation): Improve error ! recovery. ! (cp_parser_require): Improve indication of the error location. ! PR c++/13451 ! * parser.c (cp_parser_class_head): Reorder logic to check for ! invalid qualification. ! 2004-01-04 Mark Mitchell ! PR c++/13157 ! * name-lookup.c (lookup_using_namespace): Remove spacesp parameter. + (unqualified_namespace_lookup): Likewise. + (lookup_qualified_name): Adjust accordingly. + (lookup_name_real): Likewise. + (lookup_arg_dependent): Do not eliminate the namespace of the + functions found by unqualified name lookup unless that is the + current namespace. ! 2004-01-04 Andrew Pinski ! * semantics.c (push_deferring_access_checks): Fix format. ! (resume_deferring_access_checks): Likewise. ! (stop_deferring_access_checks): Likewise. ! (pop_deferring_access_checks): Likewise. ! (get_deferred_access_checks): Likewise. ! (pop_to_parent_deferring_access_checks): Likewise. ! (perform_deferred_access_checks): Likewise. ! (perform_or_defer_access_check): Likewise. ! 2004-01-04 Richard Henderson ! * call.c (build_over_call): Don't create a save_expr of an ! aggregate, but rather its address. ! 2004-01-04 Mark Mitchell ! PR c++/13529 ! * parser.c (cp_parser_postfix_expression): Allow "." to appear in ! an offsetof expression. ! * parser.c (cp_parser_parameter_declaration): Fix comment. ! PR c++/12226 ! * call.c (CHECK_COPY_CONSTRUCTOR_P): New macro. ! (reference_binding): Set it when appropriate. ! (build_temp): New function, split out from ... ! (convert_like_real): ... here. Honor CHECK_COPY_CONSTRUCTOR_P. ! (initialize_reference): Likewise. ! PR c++/13536 ! * parser.c (cp_parser): Add in_type_id_in_expr_p. ! (cp_parser_new): Initialize it. ! (cp_parser_postfix_expression): Set it. ! (cp_parser_sizeof_operand): Likewise. ! (cp_parser_parameteR_declaration): Do not commit early to tenative ! parsers when in_type_id_in_expr_p is set. ! 2004-01-03 Kriang Lerdsuwanakij ! PR c++/13094 ! * parser.c (cp_parser_template_argument): Don't call ! make_unbound_class_template directly. ! (cp_parser_lookup_name): Don't extract TEMPLATE_DECL from ! UNBOUND_CLASS_TEMPLATE tree node. ! 2004-01-02 Richard Sandiford ! PR target/12729 ! * method.c (use_thunk): Pass the CALL_EXPR through force_target_expr. ! 2004-01-02 Kriang Lerdsuwanakij ! PR c++/13520 ! * cp-tree.h (DECL_UNBOUND_CLASS_TEMPLATE_P): New macro. ! (DECL_FUNCTION_TEMPLATE_P): Use it. ! (DECL_CLASS_TEMPLATE_P): Likewise. ! * parser.c (cp_parser_lookup_name): Add is_template parameter. ! (cp_parser_type_parameter): Adjust call to cp_parser_lookup_name. ! (cp_parser_template_name): Likewise. ! (cp_parser_elaborated_type_specifier): Likewise. ! (cp_parser_namespace_name): Likewise. ! (cp_parser_class_name): Likewise. ! (cp_parser_lookup_name_simple): Likewise. ! See ChangeLog.3 for earlier changes. diff -Nrc3pad gcc-3.3.3/gcc/cp/ChangeLog.1 gcc-3.4.0/gcc/cp/ChangeLog.1 *** gcc-3.3.3/gcc/cp/ChangeLog.1 2002-09-15 17:55:36.000000000 +0000 --- gcc-3.4.0/gcc/cp/ChangeLog.1 2003-12-13 04:28:49.000000000 +0000 *************** Wed May 10 00:55:59 1995 Jason Merrill *** 1386,1392 **** Tue May 9 19:10:33 1995 Mike Stump * decl2.c: Add flag_new_for_scope for new -ffor-scope flag. ! * parse.y (FOR): Conditionalize the pushing and poping of scope for the for-init-statement upon the new flag_new_for_scope. * parse.y (try_block): Simplify and use compstmt. --- 1386,1392 ---- Tue May 9 19:10:33 1995 Mike Stump * decl2.c: Add flag_new_for_scope for new -ffor-scope flag. ! * parse.y (FOR): Conditionalize the pushing and popping of scope for the for-init-statement upon the new flag_new_for_scope. * parse.y (try_block): Simplify and use compstmt. *************** Thu Mar 31 19:50:35 1994 Jason Merrill *** 7211,7217 **** Thu Mar 31 16:20:16 1994 Kung Hsu * decl2.c (grok_func_init): Do not abort as rtl for pur virtual ! fucntions. They can be defined somewhere else. Sat Jan 23 23:23:26 1994 Stephen R. van den Berg --- 7211,7217 ---- Thu Mar 31 16:20:16 1994 Kung Hsu * decl2.c (grok_func_init): Do not abort as rtl for pur virtual ! functions. They can be defined somewhere else. Sat Jan 23 23:23:26 1994 Stephen R. van den Berg diff -Nrc3pad gcc-3.3.3/gcc/cp/ChangeLog.2 gcc-3.4.0/gcc/cp/ChangeLog.2 *** gcc-3.3.3/gcc/cp/ChangeLog.2 2002-09-21 12:51:52.000000000 +0000 --- gcc-3.4.0/gcc/cp/ChangeLog.2 2004-01-01 00:42:21.000000000 +0000 *************** Tue Jan 27 16:42:21 1998 Mark Mitchell *** 13405,13411 **** (classtype_mangled_name): Likewise. (lookup_template_class): Likewise. (tsubst): Likewise. ! (more_specialized): Take explict template arguments as a parameter. (most_specialized): Likewise. (get_bindings): Likewise. Check that return types match before --- 13405,13411 ---- (classtype_mangled_name): Likewise. (lookup_template_class): Likewise. (tsubst): Likewise. ! (more_specialized): Take explicit template arguments as a parameter. (most_specialized): Likewise. (get_bindings): Likewise. Check that return types match before *************** Mon Jan 19 22:40:03 1998 Mark Mitchell *** 13627,13633 **** (instantiate_template): Use retrieve_specialization. (do_decl_instantiation): Likewise. (instantiate_decl): Likewise. ! (type_unification): Improve handling of explict template arguments. * tree.c (mapcar): Return error_mark_node, rather than aborting, on VAR_DECLS, FUNCTION_DECLS, and CONST_DECLS. --- 13627,13633 ---- (instantiate_template): Use retrieve_specialization. (do_decl_instantiation): Likewise. (instantiate_decl): Likewise. ! (type_unification): Improve handling of explicit template arguments. * tree.c (mapcar): Return error_mark_node, rather than aborting, on VAR_DECLS, FUNCTION_DECLS, and CONST_DECLS. *************** Tue Jan 16 11:39:40 1996 Jason Merrill *** 20213,20219 **** Tue Jan 16 11:09:42 1996 Mike Stump ! * decl.c (poplevel): When poping a level, don't give a warning for any subblocks that already exist. Tue Jan 16 00:25:33 1996 Jason Merrill --- 20213,20219 ---- Tue Jan 16 11:09:42 1996 Mike Stump ! * decl.c (poplevel): When popping a level, don't give a warning for any subblocks that already exist. Tue Jan 16 00:25:33 1996 Jason Merrill *************** Wed Oct 11 16:30:34 1995 Brendan Kehoe *** 20673,20675 **** --- 20673,20677 ---- * parse.y (fn.def1): Call split_specs_attrs in declmods notype_declarator case. + + See ChangeLog.1 for earlier changes. diff -Nrc3pad gcc-3.3.3/gcc/cp/ChangeLog.3 gcc-3.4.0/gcc/cp/ChangeLog.3 *** gcc-3.3.3/gcc/cp/ChangeLog.3 1970-01-01 00:00:00.000000000 +0000 --- gcc-3.4.0/gcc/cp/ChangeLog.3 2004-01-01 00:43:21.000000000 +0000 *************** *** 0 **** --- 1,22648 ---- + 2003-12-30 Nathan Sidwell + + PR c++/13507 + * decl.c (duplicate_decls): Use build_type_attribute_variant to + merge attributes. + + PR c++/13494 + * tree.c (build_cplus_array_type_1): Only build a minimal array + type for dependent types or domains. + + 2003-12-29 Nathan Sidwell + + PR c++/12774 + * typeck.c (comp_array_types): Fold non-dependent domains for + ABI-1. + + 2003-12-29 Kriang Lerdsuwanakij + + PR c++/13289 + * semantics.c (finish_id_expression): Only check if the type of + a template argument is integral or enumeration when it is not + dependent. + + 2003-12-29 Kriang Lerdsuwanakij + + PR c++/12403 + * parser.c (cp_parser_template_declaration_after_export): Set up + template specialization scope in case of explicit specialization. + + 2003-12-28 Mark Mitchell + + PR c++/13081 + * decl.c (duplicate_decls): Preserve inline-ness when redeclaring + a function template. + + PR c++/12613 + * decl.c (reshape_init): Reject GNU colon-style designated + initializers in arrays. + + PR c++/13009 + * call.c (build_special_member_call): Do not assume that we have a + pointer to the complete object in an assignment operator. + + 2003-12-28 Roger Sayle + + PR c++/13070 + * decl.c (duplicate_decls): When setting the type of an anticipated + declaration, merge the existing type attributes. + + 2003-12-25 Andrew Pinski + + PR c++/13268, c++/13339 + * class.c (add_method): Return early when method is error_mark_node. + * pt.c (tsubst_friend_function): Return early when new_friend is + error_mark_node. + + 2003-12-23 Mark Mitchell + + * cp-lang.c (cp_expr_size): Return zero for empty classes. + + * cp-tree.h (warn_if_uknown_interface): Remove unused function. + * decl2.c (warn_if_unknown_interface): Likewise. + + 2003-12-23 Nathan Sidwell + + PR c++/13387 + * cp-lang.c (cxx_get_alias_set): Correct logic for a base type. + + 2003-12-22 Mark Mitchell + + * decl.c (start_function): Do not check + flag_alt_external_templates or flag_external_templates. + * decl2.c (warn_if_unknown_interface): Likewise. + * lex.c (extract_interface_info): Likewise. + * pt.c (lookup_template_class): Likewise. + + PR c++/12862 + * name-lookup.c (pushdecl): Look up all namespace-scope entities + in their corresponding namespace. + + PR c++/12397 + * typeck.c (finish_class_member_access_expr): Don't tree + IDENTIFIER_NODEs as non-dependent expressions. + + 2003-12-22 Andrew Pinski + + PR c++/5050 + * tree.c (cp_start_inlining): Remove. + (cp_end_inlining): Remove. + * cp-lang.c (LANG_HOOKS_TREE_INLINING_START_INLINING): Do not define. + (LANG_HOOKS_TREE_INLINING_END_INLINING): Do not define. + * cp-tree.h (cp_start_inlining): Do not declare. + (cp_end_inlining): Do not declare. + + 2003-12-22 Mark Mitchell + + PR c++/12479 + * parser.c (cp_parser_declaration_seq_opt): Only issue "extra ;" + pedwarn when not in a system header. + + 2003-12-21 Mark Mitchell + + * cp-tree.h (cp_tree_index): Remove CPTI_RECORD_TYPE, + CPTI_UNION_TYPE, CPTI_ENUM_TYPE. + (record_type_node): Remove. + (union_type_node): Likewise. + (enum_type_node): Likewise. + * decl.c: Remove mention of above tree nodes in comment. + * lex.c (cxx_init): Do not assign to record_type_node, + union_type_node, or enum_type_node. Simplify handling of + class_type_node. + + PR c++/11554 + * init.c (sort_mem_initializers): Add warning. + + 2003-12-21 Kazu Hirata + + * call.c: Fix comment formatting. + * class.c: Likewise. + * cp-tree.h: Likewise. + * cvt.c: Likewise. + * cxx-pretty-print.c: Likewise. + * decl.c: Likewise. + * decl2.c: Likewise. + * error.c: Likewise. + * except.c: Likewise. + * init.c: Likewise. + * name-lookup.c: Likewise. + * parser.c: Likewise. + * pt.c: Likewise. + * rtti.c: Likewise. + * semantics.c: Likewise. + * typeck.c: Likewise. + * typeck2.c: Likewise. + + 2003-12-19 Kazu Hirata + + * cvt.c: Remove uses of "register" specifier in + declarations of arguments and local variables. + * decl.c: Likewise. + * decl2.c: Likewise. + * expr.c: Likewise. + * friend.c: Likewise. + * lex.c: Likewise. + * name-lookup.c: Likewise. + * repo.c: Likewise. + * search.c: Likewise. + * tree.c: Likewise. + * typeck.c: Likewise. + * typeck2.c: Likewise. + + 2003-12-19 Mark Mitchell + + PR c++/12795 + * name-lookup.c (pushdecl): Do not treated any functions as being + "nested" in C++. + + 2003-12-19 Jason Merrill + + PR c++/13371 + * typeck.c (build_modify_expr): Stabilize lhs if we're narrowing. + * cvt.c (convert_to_void): Don't warn about the RHS of a comma + being useless if TREE_NO_UNUSED_WARNING is set. + + 2003-12-18 Richard Henderson + + * cp-tree.h (struct lang_type_header): Remove __extension__. + + 2003-12-18 Jason Merrill + + PR c++/12253 + * init.c (build_vec_init): Initialization of an element from + an initializer list is also a full-expression. + + * parser.c, pt.c, semantics.c: Rename constant_expression_p + to integral_constant_expression_p. + + 2003-12-18 Kriang Lerdsuwanakij + + PR c++/13262 + * pt.c (instantiate_decl): Wrap push_nested_class and + pop_nested_class around cp_finish_decl call for static member + variable. + + 2003-12-18 Giovanni Bajo + + PR c++/9154 + * parser.c (cp_parser_template_argument): A type-id followed by '>>' + is just an user typo, and should be accepted as last resort if any + other parsing fails. + (cp_parser_enclosed_template_argument_list): If the argument list is + parsed correctly, but the next token is '>>', emit a diagnostic. + (cp_parser_next_token_ends_template_argument): Accept '>>' as + delimiter of template argument, it will be later detected as a typo. + + 2003-12-17 Kelley Cook + + * Make-lang.in: Replace cp/g++.1 with $(docobjdir)/g++.1. + + 2003-12-17 Mark Mitchell + + PR c++/10603 + PR c++/12827 + * parser.c (cp_parser_error): Help c_parse_error print good + messages if the next token is a keyword. + (cp_parser_parameter_declaration_list): When resynchronizing after + a bad parameter declaration, stop if a comma is found. + (cp_parser_parameter_declaration): Avoid backtracking. + + 2003-12-16 Mark Mitchell + + PR c++/12696 + * decl.c (reshape_init): Recover quickly from errors. + + 2003-12-16 Nathan Sidwell + + PR c++/9043 + C++ ABI change: Mangling array indices in templates. + * decl.c (compute_array_index_type): Reorganize for earlier + template errors. Use value_dependent_expression_p for abi-2. + * mangle.c (write_array_type): Check broken mangling for + expression indices on abi-1 + + 2003-12-16 Mark Mitchell + + PR c++/12696 + * decl.c (reshape_init): Recover quickly from errors. + + PR c++/13275 + * lex.c (reswords): Add "__offsetof" and "__offsetof__". + * parser.c (cp_parser): Add in_offsetof_p. + (cp_parser_new): Initialize it. + (cp_parser_primary_expression): Handle __offsetof__ (...). + (cp_parser_postfix_expression): Allow casts to pointer type and + uses of "->" in a constant expression if implementing offsetof. + (cp_parser_unary_expression): Allow the use of "&" in a constant + expression if implementing offsetof. + + 2003-12-16 Giovanni Bajo + + PR c++/2294 + * name-lookup.c (push_overloaded_decl): always construct an OVERLOAD + if the declaration comes from an using declaration. + + 2003-12-16 Giovanni Bajo + + * semantics.c (finish_id_expression): Refactor the code to handle + template parameters, and emit a more informative error message + when they are used within an integral constant expression. + + 2003-12-16 Nathan Sidwell + + PR c++/13387 + * class.c (finish_struct_1): Compute mode and alias set for + CLASSTYPE_AS_BASE. + * call.c (build_over_call): Use CLASSTYPE_AS_BASE for trivial + assignment of a class, as necessary. + * cp-lang.c (cxx_get_alias_set): The alias set as a base is the + same as for the complete type. + + PR c++/13242 + C++ ABI change. Mangling template parameters of reference type + * mangle.c (write_template_args): Remove unreachable code. + (write_template_arg): Look through an argument of reference type. + + 2003-12-16 Giovanni Bajo + + PR c++/2294 + * name-lookup.c (push_overloaded_decl): always construct an OVERLOAD + if the declaration comes from an using declaration. + + 2003-12-15 Mark Mitchell + + PR c++/10926 + * decl2.c (grokfield): Robustify. + + PR c++/11116 + * parser.c (cp_parser_throw_expression): Determine whether or not + an assignment-expression is present by doing one-token lookahead. + + PR c++/13269 + * parser.c (cp_parser_function_definition_after_declarator): Stop + scanning tokens when reaching EOF. + + PR c++/12989 + * typeck.c (cxx_sizeof_or_alignof_expr): Robustify. + + PR c++/13310 + * pt.c (dependent_template_p): Handle OVERLOADs. + + 2003-12-15 Mark Mitchell + + PR c++/13243 + PR c++/12573 + * parser.c (cp_parser_postfix_expression): Tighten handling of + integral constant expressions. + (cp_parser_unary_expression): Likewise. + * pt.c (value_dependent_expression_p): Remove handling for + COMPONENT_REFs. + + 2003-12-15 Nathan Sidwell + + * class.c (add_method): Disallow destructor for java classes. + * decl.c (xref_basetypes): Check java class inheritance. + * decl2.c (check_java_method): Skip artificial params. + + PR c++/13241 + C++ ABI change. Mangling of symbols in expressions. + * mangle.c (write_mangled_name): Add top_level flag. Rework for + nested and unnested mangling. Deal with abi version 1 and version + 2 differences. + (write_expression): Adjust write_mangled_name call. + (mangle_decl_string): Use write_mangled_name for all non-type decls. + + 2003-12-14 Mark Mitchell + + PR c++/10779 + PR c++/12160 + * parser.c (struct cp_parser): Add in_template_argument_list_p. + (cp_parser_error): Use c_parse_error. + (cp_parser_name_lookup_error): New function. + (cp_parser_new): Initialize it. + (cp_parser_declarator): Add parenthesized_p parameter. + (cp_parser_nested_name_specifier_opt): Use + cp_parser_name_lookup_error. + (cp_parser_parenthesized_expression_list): Improve comments. + (cp_parser_condition): Adjust call to cp_parser_declarator. + (cp_parser_template_parameter): Adjust call to + cp_parser_parameter_declaration. + (cp_parser_template_argument_list): Set + in_template_argument_list_p. + (cp_parser_explicit_instantiation): Adjust call to + cp_parser_declarator. + (cp_parser_simple_type_specifier): Remove unncessary code. + (cp_parser_using_declaration): Use cp_parser_name_lookup_error. + (cp_parser_init_declarator): Handle member function definitions. + (cp_parser_direct_declarator): Adjust call to + cp_parser_declarator. + (cp_parser_type_id): Adjust call to cp_parser_declarator. + (cp_parser_parameter_declaration_list): Avoid backtracking where + possible. + (cp_parser_parameter_declaration): Add parenthesized_p parameter. + (cp_parser_function_definition): Remove. + (cp_parser_member_declaration): Do not backtrack to look for + function definitions. + (cp_parser_exception_declaration): Adjust call to + cp_parser_declarator. + (cp_parser_single_declaration): Handle function definitions via + cp_parser_init_declarator. + (cp_parser_save_member_function_body): New function. + + 2003-12-14 Kriang Lerdsuwanakij + + PR c++/13106 + * decl.c (finish_function): Check if return type is dependent before + issuing no return statement warning. + + 2003-12-12 Nathan Sidwell + + PR c++/13118 + * cp-tree.h (lang_decl_u): Add thunk_alias member. + (THUNK_VIRTUAL_OFFSET): Must be a FUNCTION_DECL. + (THUNK_ALIAS_P): Remove. + (THUNK_ALIAS): Adjust. + * class.c (update_vtable_entry_for_fn): Get the vbase within the + overriding function's return type. + (dump_thunk): Adjust THUNK_ALIAS printing. + (build_vtbl_initializer): Adjust THUNK_ALIAS use. + * method.c (make_thunk): Revert 12881 test change. Clear + THUNK_ALIAS. + (finish_thunk): Adjust THUNK_ALIAS setting. + (use_thunk): Adjust THUNK_ALIAS use. + * semantics.c (emit_associated_thunks): Likewise. + + PR c++/13114, c++/13115 + * class.c (layout_empty_base): Propagate the move of an empty base + to offset zero. + + PR c++/12881 + * method.c (make_thunk): Deal with thunk aliases when searching + for a thunk. Robustify assertion. + + 2003-12-11 Nathan Sidwell + + * mangle.c (conv_type_names): Holds IDENTIFIER_NODEs only. + (hash_type): Use TYPE_UID of the identifier's type. + (compare_type): Adjust. + (mangle_conv_op_name_for_type): Store identifier nodes only, use + TYPE_UID has hash value. + + 2003-12-10 Mark Mitchell + + * cp-tree.h (DECL_CONV_FN_P): Check that DECL_NAME is non-NULL. + + 2003-12-08 Matt Austern + + PR c/13134 + * decl.c (duplicate_decls): Copy visibility flag when appropriate. + + 2003-12-09 Giovanni Bajo + + * init.c (build_new_1): Deal with an OVERLOAD set when + looking up for _Jv_AllocObject. + * except.c (build_throw): Likewise for _Jv_Throw. + + 2003-12-08 Jason Merrill + + PR c++/11971 + * tree.c (build_local_temp): Split out from build_cplus_new. + (force_target_expr): New fn. + * call.c (call_builtin_trap): Call it. Take a type parm. + (convert_arg_to_ellipsis): Pass it. + (build_x_va_arg): Use call_builtin_trap. + + PR c++/11929 + * call.c (magic_varargs_p): New fn. + (build_over_call): Do no ellipsis conversions for arguments to + functions with magic varargs. + + * name-lookup.c, init.c, except.c: Revert Giovanni's patch from + yesterday. + + Give the anonymous namespace a null DECL_NAME. + * cp-tree.h: Don't declare anonymous_namespace_name. + * decl.c: Don't define it. + * dump.c (cp_dump_tree): Don't check for it. + * cxx-pretty-print.c (pp_cxx_original_namespace_definition): Likewise. + * error.c (dump_decl): Likewise. + * name-lookup.c: Define it here. + (push_namespace): Put it in DECL_ASSEMBLER_NAME instead. + * mangle.c (write_unqualified_name): Adjust. + + 2003-12-07 Giovanni Bajo + + PR c++/2294 + * name-lookup.c (push_overloaded_decl): Always construct an + OVERLOAD unless the declaration is a built-in. + (set_namespace_binding): While binding OVERLOADs with only one + declaration, we still need to call supplement_binding. + * init.c (build_new_1): Deal with an OVERLOAD set when + looking up for _Jv_AllocObject. + * except.c (build_throw): Likewise for _Jv_Throw. + + 2003-12-06 Mark Mitchell + + PR c++/13323 + * class.c (same_signature_p): Handle conversion operators + correctly. + (check_for_override): Likewise. + + 2003-12-06 Kelley Cook + + * Make-lang.in (GXX_CROSS_NAME, CXX_CROSS_NAME): Delete. + (c++.install_common, cp/g++.1, c++.install-man): Adjust for above. + (c++.uninstall): Likewise. + + 2003-12-05 Danny Smith + Mark Mitchell + + PR c++/13305 + * parser.c (cp_parser_elaborated_type_specifier): Accept + attributes. + + 2003-12-05 Mark Mitchell + + PR c++/13314 + * parser.c (cp_parser_class_specifier): Match push_scope/pop_scope + calls. + (cp_parser_class_head): Likewise. + + 2003-12-05 Kriang Lerdsuwanakij + + PR c++/13166 + * parser.c (cp_parser_late_parsing_default_args): Make sure the + context is a class before calling push_nested_class and + pop_nested_class. + + 2003-12-03 James E Wilson + + * g++spec.c (lang_specific_driver): Delete USE_LIBUNWIND_EXCEPTIONS + support. + + 2003-12-03 Mark Mitchell + + PR c++/9127 + * cp-tree.h (at_namespace_scope_p): New function. + * parser.c (cp_parser_class_head): Handle invalid explicit + specializations. + * search.c (at_namespace_scope_p): New function. + + PR c++/13179 + * semantics.c (finish_handler_parms): Do not call eh_type_info for + types used in templates. + + PR c++/10771 + * parser.c (cp_parser_check_for_invalid_template_id): New + function. + (cp_parser_simple_type_specifier): Use it. + (cp_parser_elaborated_type_specifier): Likewise. + (cp_parser_class_head): Likewise. + + 2003-12-02 Giovanni Bajo + + PR c++/10126 + * pt.c (convert_nontype_argument): Handle default conversions + while converting a pointer to member function. + + 2003-12-02 Giovanni Bajo + + PR c++/12573 + * pt.c (value_dependent_expression_p): Handle COMPONENT_REFs by + looking into them recursively. + + 2003-12-02 Richard Henderson + + * name-lookup.h (struct cp_binding_level): Use ENUM_BITFIELD. + * parser.c (struct cp_token): Likewise. + (struct cp_parser_token_tree_map_node): Likewise. + * lex.c (struct resword): Move const after ENUM_BITFIELD. + + 2003-11-30 Mark Mitchell + + PR c++/9849 + * parser.c (cp_lexer_prev_token): New function. + (cp_parser_skip_to_closing_parenthesis): Add consume_paren + parameter. + (cp_parser_nested_name_specifier_opt): Add is_declaration + parameter. + (cp_parser_nested_name_specifier): Likewise. + (cp_parser_class_or_namespace_name): Likewise. + (cp_parser_class_name): Likewise. + (cp_parser_template_id): Likewise. + (cp_parser_template_name): Likewise. + (cp_parser_id_expression): Adjust calls to + cp_parser_nested_name_specifier_op, cp_parser_template_id, + cp_parser_class_name. + (cp_parser_unqualified_id): Likewise. + (cp_parser_postfix_expression): Likewise. + (cp_parser_pseudo_destructor_name): Likewise. + (cp_parser_cast_expression): Likewise. + (cp_parser_mem_initializer_id): Likewise. + (cp_parser_simple_type_specifier): Likewise. + (cp_parser_type_name): Likewise. + (cp_parser_elaborated_type_specifier): Likewise. + (cp_parser_qualified_namespace_specifier): Likewise. + (cp_parser_using_declaration): Likewise. + (cp_parser_using_directive): Likewise. + (cp_parser_ptr_operator): Likewise. + (cp_parser_declarator_id): Likewise. + (cp_parser_class_head): Likewise. + (cp_parser_base_specifier): Likewise. + (cp_parser_constructor_declarator_p): Likewise. + (cp_parser_direct_declarator): Fix typo in comment. + (cp_parser_parenthesized_expression_list): Adjust call to + cp_parser_skip_to_closing_parenthesis. + (cp_parser_selection_statement): Likewise. + + 2003-11-23 Kriang Lerdsuwanakij + + PR c++/12924 + * typeck.c (finish_class_member_access_expr): Handle TEMPLATE_ID_EXPR + with OVERLOAD and DECL nodes as the first operand. + + 2003-11-22 Kriang Lerdsuwanakij + + * pt.c (tsubst) : Remove erroneous argument to build_nt. + + 2003-11-22 Kriang Lerdsuwanakij + + PR c++/5369 + * friend.c (is_friend): Handle member function of a class + template as template friend. + (do_friend): Likewise. + * decl2.c (check_classfn): Add template_header_p parameter. + * decl.c (start_decl): Adjust check_classfn call. + (grokfndecl): Likewise. + * pt.c (is_specialization_of_friend): New function. + (uses_template_parms_level): Likewise. + (push_template_decl_real): Use uses_template_parms_level. + (tsubst_friend_function): Adjust check_classfn call. + * cp-tree.h (check_classfn): Adjust declaration. + (uses_template_parms_level): Add declaration. + (is_specialization_of_friend): Likewise. + + 2003-11-21 Mark Mitchell + + PR c++/12515 + * pt.c (build_non_dependent_expr): Handle GNU extension to ?: + operator. + + 2003-11-21 Jan Hubicka + + * parser.c (cp_parser_postfix_expression): Initialize 's' to + NULL_TREE. + + 2003-11-20 Joseph S. Myers + + * Make-lang.in (c++.extraclean): Delete. + + 2003-11-20 Joseph S. Myers + + * Make-lang.in (check-g++, lang_checks): Add. + + 2003-11-18 Kriang Lerdsuwanakij + + PR c++/12932 + * class.c (currently_open_derived_class): Check if + current_class_type is NULL_TREE. + * semantics.c (finish_call_expr): Check if + currently_open_derived_class returns NULL_TREE. + * cp-tree.h (DERIVED_FROM_P): Add parenthesis around PARENT + parameter. + + 2003-11-17 Jason Merrill + + * init.c (build_new_1): Preevaluate placement args. + * call.c (build_op_delete_call): Don't expose placement args to + overload resolution. + + 2003-11-16 Jason Merrill + + * Make-lang.in (c++.tags): Create TAGS.sub files in each directory + and TAGS files that include them for each front end. + + 2003-11-15 Bernardo Innocenti + + PR c++/2294 + * name-lookup.c: Revert previous patch for PR c++/2294 to prevent + build failure on libjava. + + 2003-11-14 Giovanni Bajo + + PR c++/2294 + * name-lookup.c (push_overloaded_decl): Always construct an OVERLOAD + unless the declaration is a built-in. + (set_namespace_binding): While binding OVERLOADs with only one + declaration, we still need to call supplement_binding. + + 2003-11-14 Mark Mitchell + + PR c++/12762 + * parser.c (cp_parser_enclosed_template_argument_list): New + function. + (cp_parser_template_id): Use it. + (cp_parser_simple_type_specifier): Recognize invalid template + syntax. + + 2003-11-14 Giovanni Bajo + + PR c++/2094 + * pt.c (unify): Add support for PTRMEM_CST and + FIELD_DECL unification. + + 2003-11-13 Richard Earnshaw + + * decl.c (grokfndecl): Change OK to type tree. + + 2003-11-12 Mark Mitchell + + * tree.c (build_target_expr_with_type): Treate VA_ARG_EXPR like + CONSTRUCTOR. + + * decl.c (cp_make_fname_decl): When creating a top-level + __FUNCTION__-like symbol, do register it with pushdecl. + + * decl.c (finish_case_label): Do not check that we are within a + switch statement here. + * parser.c (struct cp_parser): Add in_iteration_statement_p and + in_switch_statement_p. + (cp_parser_new): Initialize them. + (cp_parser_labeled_statement): Check validity of case labels + here. + (cp_parser_selection_statement): Set in_switch_statement_p. + (cp_parser_iteration_statement): Set in_iteration_statement_p. + (cp_parser_jump_statement): Check validity of break/continue + statements here. + + PR c++/12735 + * cp-tree.h (duplicate_decls): Return a tree. + * decl.c (duplicate_decls): Clarify documentation. Return + error_mark_node to indicate a failed redeclaration. + * friend.c (do_friend): Handle that case. + * name-lookup.c (pushdecl): Likewise. + + 2003-11-11 Jason Merrill + + * cp-tree.h (DECL_NAMESPACE_ASSOCIATIONS): New macro. + * name-lookup.c (parse_using_directive): New fn. + (is_associated_namespace): New fn. + (arg_assoc_namespace): Also check associated namespaces. + * name-lookup.h: Declare new fns. + * pt.c (maybe_process_partial_specialization): Allow + specialization in associated namespace. + * parser.c (cp_parser_using_directive): Accept attributes. Use + parse_using_directive. + + 2003-11-10 Richard Henderson + + * cvt.c (convert_to_void): Use void_zero_node after overload failure. + + 2003-11-10 Gabriel Dos Reis + + PR c++/12832 + * name-lookup.c (supplement_binding): Gracefully handle names + used at non-class scope prior declaration. + + 2003-11-06 Matt Austern + + * decl.c (duplicate_decls): copy DECL_VISIBILITY field. + * method.c (use_thunk): give thunk same visibility as function. + * optimize.c (maybe_clone_body): copy DECL_VISIBILITY field. + + 2003-11-05 Kriang Lerdsuwanakij + + PR c++/11616 + * pt.c (instantiate_pending_templates): Save and restore + input_location. + + 2003-11-05 Kriang Lerdsuwanakij + + PR c++/2019 + * friend.c (add_friend): Don't display previous declaration in + case of duplicate friend warning. + + 2003-11-02 Kriang Lerdsuwanakij + + PR c++/9810 + * call.c (build_over_call): Check access using primary template + if FN is a member function template. + + 2003-11-01 Kriang Lerdsuwanakij + + PR c++/12796 + * class.c (handle_using_decl): Set input_location before calling + error_not_base_type. + + 2003-10-26 Kriang Lerdsuwanakij + + PR c++/10371 + * semantics.c (finish_non_static_data_member): Handle when + both processing_template_decl and qualifying_scope are true. + + 2003-10-24 Kriang Lerdsuwanakij + + PR c++/11076 + * class.c (handle_using_decl): Swap arguments of error_not_base_type. + * parser.c (cp_parser_direct_declarator): Only resolve typename for + namespace scope declarations. + + 2003-10-24 Nathan Sidwell + + PR c++/12698, c++/12699, c++/12700, c++/12566 + * cp-tree.h (THUNK_ALIAS_P, THUNK_ALIAS): New. + (debug_class, debug_thunks): New. + * class.c (dump_class_hierarchy_1): New break out from ... + (dump_class_hierarchy): ... here. + (dump_thunk, debug_thunks, debug_class): New. + (update_vtable_entry_for_fn): Add ssizetype casts. Correct + continued search for primary binfo via virtual. + (build_vtbl_initializer): Follow covariant thunk alias. + * method.c (make_thunk): Clear DECL_THUNKS of the thunk. + (finish_thunk): Look for an alias of the covariant thunk and point + to it. + (use_thunk): We should never use an alias. + * semantics.c (emit_associated_thunks): Do not emit aliases. + + PR c++/12566 + * cp-tree.h (cp_fname_init): Add TYPE pointer param. + * decl.c (cp_fname_init): Add TYPE pointer param. Set it. Don't + create an ad-hoc ERROR_MARK. + (cp_make_fname_decl): Adjust. + * pt.c (tsubst_expr): Adjust. + + 2003-10-23 Jason Merrill + + PR c++/12726 + * tree.c (build_target_expr_with_type): Don't call force_rvalue + for CONSTRUCTORs. + + 2003-10-22 Kazu Hirata + + * call.c: Fix comment formatting. + * class.c: Likewise. + * cxx-pretty-print.c: Likewise. + * init.c: Likewise. + * parser.c: Likewise. + * pt.c: Likewise. + * semantics.c: Likewise. + * tree.c: Likewise. + * typeck.c: Likewise. + * typeck2.c: Likewise. + + 2003-10-21 Mark Mitchell + + PR c++/11962 + * typeck.c (build_x_conditional_expr): Handle missing middle + operands in templates. + * mangle.c (write_expression): Issue errors about attempts to + mangle a non-existant middle operator to the ?: operator. + + 2003-10-21 Robert Bowdidge + * decl.c (cp_finish_decl): Remove clause intended for asm directives + in struct or class fields: this code is never executed. + + 2003-10-22 Kriang Lerdsuwanakij + + * decl.c (start_decl): Exit if push_template_decl returns + error_mark_node. + + 2003-10-20 Kazu Hirata + + * ChangeLog: Fix typos. + * call.c: Fix comment typos. + * class.c: Likewise. + * cp-tree.h: Likewise. + * cvt.c: Likewise. + * cxx-pretty-print.c: Likewise. + * decl.c: Likewise. + * decl2.c: Likewise. + * init.c: Likewise. + * mangle.c: Likewise. + * name-lookup.c: Likewise. + * parser.c: Likewise. + * search.c: Likewise. + * semantics.c: Likewise. + * tree.c: Likewise. + * typeck.c: Likewise. + + 2003-10-20 Jan Hubicka + + * decl.c (start_cleanup_fn): Set DECL_DECLARED_INLINE_P to deffer + the expansion. + + 2003-10-20 Mark Mitchell + + * Make-lang.in (c++.install-info): Remove. + + 2003-10-20 Jason Merrill + + * class.c (layout_class_type): Set DECL_ARTIFICIAL on padding + field. + + 2003-10-20 Kriang Lerdsuwanakij + + PR c++/9781, c++/10583, c++/11862 + * decl.c (cp_finish_decl): Exit immediately if decl is an + error_mark_node. + * pt.c (push_template_decl_real): Return error_mark_node for + invalid template declaration of variable. + + 2003-10-18 Kriang Lerdsuwanakij + + PR c++/12495 + * pt.c (lookup_template_class): Handle when current_class_type + is a local class. + + 2003-10-17 Kriang Lerdsuwanakij + + PR c++/2513 + * decl.c (make_typename_type): Use dependent_type_p. + (make_unbound_class_template): Likewise. + * pt.c (instantiate_class_template): Increment + processing_template_decl during substitution of template friend + function. Preincrement processing_template_decl rather than + postincrement. + (get_mostly_instantiated_function_type): Increment + processing_template_decl during partial substitution of function + type. + + 2003-10-15 Jan Hubicka + + PR c++/12574 + * decl2.c (cxx_callgraph_analyze_expr): Deal with baselink. + + 2003-10-14 Jason Merrill + + PR c++/11878 + * tree.c (build_target_expr_with_type): Call force_rvalue for + classes with non-trivial copy ctors. + + PR c++/11063 + * typeck.c (build_modify_expr): Call convert rather than abort. + + 2003-10-14 Gabriel Dos Reis + + Breack out decl.c (3/n) + * name-lookup.c: Include flags.h + (lookup_name_current_level): Make static. + (add_decl_to_level): Likewise. + (push_local_binding): Likewise. + (push_overloaded_decl): Likewise. + (lookup_using_namespace): Likewise. + (qualified_lookup_using_namespace): Likewise. + (lookup_type_current_level): Likewise. + (unqualified_namespace_lookup): Likewise. + (namespace_ancestor): Likewise. + (push_using_directive): Likewise. + * decl.c (pushdecl): Move to name-lookup.c. + (pushdecl_top_level_1): Likewise. + (pushdecl_top_level): Likewise. + (pushdecl_top_level_and_finish): Likewise. + (maybe_push_decl): Likewise. + (push_using_decl): Likewise. + (push_overloaded_decl): Likewise. + (make_anon_name): Likewise. + (anon_cnt): Likewise. + (clear_anon_tags): Likewise. + (maybe_inject_for_scope_var): Likewise. + (check_for_out_of_scope_variable): Likewise. + * Make-lang.in (cp/name-lookup.o): Depend on flags.h. + * decl.c (warn_extern_redeclared_static): Export. + * cp-tree.h (warn_extern_redeclared_static): Declare. + + 2003-10-14 Nathanael Nerode + + * Make-lang.in: Replace uses of $(target_alias) with + $(target_noncanonical). + + 2003-10-13 Volker Reichelt + + * ChangeLog: Add PR number to patch for PR c++/12370. + + 2003-10-13 Gabriel Dos Reis + + * name-lookup.h (cxx_scope_find_binding_for_name): Don't export. + (binding_for_name): Likewise. + (cxx_binding_clear): Move to name-lookup.c. + * name-lookup.c (cxx_scope_find_binding_for_name): Now static. + (binding_for_name): Likewise. + * decl2.c (is_ancestor): Move to name-lookup.c + (namespace_ancestor): Likewise. + (add_using_namespace): Likewise. + (ambiguous_decl): Likewise. + (lookup_using_namespace): Likewise. + (qualified_lookup_using_namespace): Likewise. + (set_decl_namespace): Likewise. + (decl_namespace): Likewise. + (current_decl_namespace): Likewise. + (push_decl_namespace): Likewise. + (pop_decl_namespace): Likewise. + (push_scope): Likewise. + (pop_scope): Likewise. + (struct arg_lookup): Likewise. + (arg_assoc): Likewise. + (arg_assoc_args): Likewise. + (arg_assoc_type): Likewise. + (add_function): Likewise. + (arg_assoc_namespace): Likewise. + (arg_assoc_class): Likewise. + (arg_assoc_template_arg): Likewise. + (do_namespace_alias): Likewise. + (validate_nonmember_using_decl): Likewise. + (do_nonmember_using_decl): Likewise. + (do_toplevel_using_decl): Likewise. + (do_local_using_decl): Likewise. + (do_class_using_decl): Likewise. + (do_using_directive): Likewise. + (constructor_name_full): Likewise. + (constructor_name): Likewise. + (constructor_name_p): Likewise. + + 2003-10-13 Gabriel Dos Reis + + Break out decl.c (2/n) + * name-lookup.c: Include diagnostic.h + (cxx_binding_free): Make static. + (cxx_binding_make): Likewise. + (binding_table_new): Likewise + (binding_table_free): Likewise. + (binding_table_insert): Likewise. + (binding_table_find_anon_type): Likewise. + (binding_table_reverse_maybe_remap): Likewise. + (supplement_binding): Likewise. + * name-lookup.h (global_scope_name): Declare extern. + (global_type_node): Likewise. + (cxx_binding_free): Don't export. + (cxx_binding_make): Likewise. + (binding_table_new): Likewise. + (binding_table_free): Likewise. + (binding_table_insert): Likewise. + (binding_table_find_anon_type): Likewise. + (binding_table_reverse_maybe_remap): Likewise. + * Make-lang.in (cp/name-lookup.o): Depend on $(DIAGNOSTIC_H) + * decl.c (lookup_namespace_name): Move to name-lookup.c + (select_decl): Likewise. + (unqualified_namespace_lookup): Likewise. + (lookup_qualified_name): Likewise. + (lookup_name_real): Likewise. + (lookup_name_nonclass): Likewise. + (lookup_function_nonclass): Likewise. + (lookup_name): Likewise. + (lookup_name_current_level): Likewise. + (lookup_type_current_level): Likewise. + (lookup_flags): Likewise. + (qualify_lookup): Likewise. + (lookup_tag): Likewise. + (lookup_tag_reverse): Likewise. + (getdecls): Likewise. + (storedecls): Remove. + (cxx_remember_type_decls): Move to name-lookup.c. + (global_bindings_p): Likewise. + (innermost_nonclass_level): Likewise. + (toplevel_bindings_p): Likewise. + (namespace_bindings_p): Likewise. + (kept_level_p): Likewise. + (innermost_scope_kind): Likewise. + (template_parm_scope_p): Likewise. + (push_binding): Likewise. + (push_local_binding): Likewise. + (add_decl_to_level): Likewise. Make extern. + (push_class_binding): Move to name-lookup.c. + (resume_level): Likewise. Rename to resume_scope. + (begin_scope): Move to name-lookup.c. + (indent): Likewise. + (binding_depth): Likewise. + (is_class_level): Likewise. + (cxx_scope_descriptor): Likewise. + (cxx_scope_debug): Likewise. + (namespace_scope_ht_size): Likewise. + (leave_scope): Likewise. + (pushlevel_class): Likewise. + (poplevel_class): Likewise. + (clear_identifier_class_values): Likewise. + (pushdecl_with_scope): Likewise. + (pushdecl_namespace_level): Likewise. + (pushdecl_class_level): Likewise. + (push_class_level_binding): Likewise. + (push_using_directive): Likewise. + (identifier_global_value): Likewise. + (keep_next_level_flag): Likewise. + (keep_next_level): Likewise. + (free_binding_level): Likewise. + (set_class_shadows): Likewise. + (maybe_push_cleanup_level): Likewise. + (cp_namespace_decls): Likewise. + (bt_print_entry): Likewise. + (print_binding_level): Likewise. + (print_other_binding_stack): Likewise. + (print_binding_stack): Likewise. + (push_namespace): Likewise. + (pop_namespace): Likewise. + (push_nested_namespace): Likewise. + (pop_nested_namespace): Likewise. + (cxx_saved_binding_make): Likewise. + (struct cxx_saved_binding_make): Likewise. + (store_bindings): Likewise. + (maybe_push_to_top_level): Likewise. + (push_to_top_level): Likewise. + (pop_from_top_level): Likewise. + (identifier_type_value): Likewise. + (set_identifier_type_value): Likewise. + (set_identifier_type_value_with_scope): Likewise. + (pop_everything): Likewise. + (pushtag): Likewise. + (follow_tag_typedef): Likewise. + (maybe_process_template_type_declaration): Likewise. + (pop_binding): Likewise. + * cp-tree.h: Move corresponding declarations to name-lookup.h + + 2003-10-12 Steven Bosscher + + * cvt.c (ocp_convert): Move warning to C common code. + + 2003-10-09 Jason Merrill + + PR c++/6392 + * tree.c (build_cplus_array_type): Handle all quals the same. + (cp_build_qualified_type_real): Look through arrays first. + + * tree.c (build_cplus_new): Use build_decl to create a VAR_DECL. + (build_target_expr_with_type): Likewise. + + * pt.c (instantiate_class_template): Sanity check that our + enclosing class has been instantiated. + + 2003-10-08 Giovanni Bajo + + * cp_tree.h: Added TFF_NO_FUNCTION_ARGUMENTS. + * error.c (dump_function_decl): Use it to skip the dump of the + arguments. + (dump_expr): When dumping a declaration found within an + expression, always set TFF_NO_FUNCTION_ARGUMENTS + in the flags. + + 2003-10-08 Giovanni Bajo + + PR c++/11097 + * pt.c (tsubst_decl): Substitute also the DECL_NAME node of + USING_DECL. + + 2003-10-06 Mark Mitchell + + PR c++/10147 + * call.c (initialize_reference): Tweak error message. + * cxx-pretty-print.h (cxx_pretty_printer_flags): Remove + pp_cxx_flag_qualified_id and pp_cxx_flag_global_scope. + * cxx-pretty-print.c (pp_cxx_id_expression): Always display + qualified entities using qualified names. + + PR c++/12337 + * init.c (build_new_1): Make sure that the expression returned is + not an lvalue. + + PR c++/12344, c++/12236, c++/8656 + * decl.c (start_function): Do not ignore attributes embedded in a + function declarator. + + 2003-10-06 Mark Mitchell + + * Make-lang.in (c++.info): Remove. + (c++.dvi): Remove. + (c++.generated-manpages): Replace with ... + (generated-manpages): ... this. + + 2003-10-03 Gabriel Dos Reis + + * decl.c (struct cp_binding_level): Move to name-lookup.h + (current_binding_level): Likewise. + (class_binding_level): Likewise. + * cp-tree.h (enum scope_kind): Likewise. + + 2003-10-03 Gabriel Dos Reis + + * name-lookup.c (binding_entry_free): Nullify name and type + fields. + + 2003-10-02 Mark Mitchell + + PR c++/12486 + * typeck.c (finish_class_member_access_expr): Issue diagnostic + on erroneous use of qualified name. + + 2003-09-30 Richard Henderson + + PR c++/12370 + * decl.c (duplicate_decls): Copy DECL_SAVED_INSNS too. + + 2003-09-30 Kelley Cook + + * g++spec.c: Convert to ISO C90 prototypes. + * parser.c: Likewise. + + 2003-09-30 Gabriel Dos Reis + + * decl.c (pop_binding): Don't mess with nullifying binding->scope + here. + * name-lookup.c: Re-format. + (cxx_binding_free): Nullify binding->scope. + + 2003-09-29 Jan Hubicka + + PR C++/12047 + * except.c (build_eh_type_type): Call mark_used on the type. + + 2003-09-28 Richard Henderson + + * typeck.c (c_expand_asm_operands): Take location_t, instead of + individual file and line. + + 2003-09-28 Andreas Jaeger + + * decl.c (cxx_builtin_type_decls): Convert to ISO C90 function + definition. + * init.c (push_base_cleanups): Likewise. + * decl2.c (finish_file): Likewise. + * mangle.c (init_mangle): Likewise. + (dump_substitution_candidates): Likewise. + * search.c: Likewise. + + 2003-09-27 Gabriel Dos Reis + + * name-lookup.h (get_global_value_if_present): New function. + (is_typename_at_global_scope): Likewise. + * except.c (do_begin_catch): Use get_global_value_if_present. + (do_end_catch): Likewise. + (do_allocate_exception): Likewise. + (do_free_exception): Likewise. + (build_throw): Likewise. + * parser.c (cp_parser_member_declaration): Likewise. + * rtti.c (throw_bad_cast): Likewise. + (throw_bad_typeid): Likewise. + * decl.c (check_tag_decl): Use is_typename_at_global_scope. + (grokdeclarator): Likewise. + * cp-tree.h (global_namespace): Move to name-lookup.h + * call.c (call_builtin_trap): Tidy. + + 2003-09-27 Kriang Lerdsuwanakij + + PR c++/11415 + * parser.c (cp_parser_nested_name_specifier_opt): Issue correct + error message when parser->scope is global_namespace. + + 2003-09-27 Gabriel Dos Reis + + * cp-tree.h, name-lookup.h, decl.c, decl2.c: Remove reference to + macros BINDING_SCOPE, BINDING_VALUE and BINDING_TYPE. + + 2003-09-26 Gabriel Dos Reis + + * decl.c (pop_binding_level, suspend_binding_level, + find_class_binding_level): Merge into leave_scope. Remove. + (leave_scope): New function. + (poplevel): Update. + (poplevel_class): Likewise. + (pop_namespace): Likewise. + + 2003-09-25 Kriang Lerdsuwanakij + + PR c++/5655 + * parser.c (cp_parser_check_access_in_redeclaration): New function. + (cp_parser_member_declaration): Use it. + (cp_parser_template_declaration_after_export): Likewise. + + 2003-09-22 Gabriel Dos Reis + + * cp-tree.h (scope_kind): Add new enumerator. + (keep_next_level): Change parameter type to bool. + (begin_scope): Change prototype. + (pushlevel): Remove declaration. + * decl.c (push_binding_level): Fold in begin_scope. Remove. + (struct cp_binding_level): Remove tag_tranparent field. Make keep + of bitsize one. + (keep_next_level_flag): Make a bool. + (cxx_scope_descriptor): Update scope names table + (make_cxx_scope): Fold in begin_scope. Remove.. + (namespace_scope_ht_size): New function. + (begin_scope): Change prototype. Return a scope. Tidy. + (kept_level_p): Update. + (pushlevel): Remove. + (maybe_push_cleanup_level): Simplify. + (poplevel): Update for sk_cleanup and keep change. + (print_binding_level): Likewise. + (initial_push_namespace_scope): Fold in begin_scope. Remove. + (push_namespace): Update. + (pushtag): Likewise. + (lookup_tag): Likewise. + (lookup_name_current_level): Likewise. + (lookup_type_current_level): Likewise. + (cxx_init_decl_processing): Likewise. + (start_function): Likewise. + (begin_function_body): Likewise. + (start_method): Likewise. + * pt.c (push_inline_template_parms_recursive): Likewise. + (begin_template_parm_list): Likewise. + (begin_specialization): Likewise. + * semantics.c (do_pushlevel): Likewise. + (begin_compound_stmt): Likewise. + (begin_stmt_expr): Likewise. + + 2003-09-21 Richard Henderson + + * class.c, cp-tree.h, decl.c, decl2.c, error.c, init.c, + method.c, optimize.c, pt.c, semantics.c, tree.c: Revert. + + 2003-09-21 Richard Henderson + + * class.c, cp-tree.h, decl.c, decl2.c, error.c, init.c, + method.c, optimize.c, pt.c, semantics.c, tree.c: Update for + DECL_SOURCE_LOCATION rename and change to const. + + 2003-09-20 Richard Henderson + + * decl.c, decl2.c, pt.c: Use %J in diagnostics. + + 2003-09-20 Kriang Lerdsuwanakij + + PR c++/157 + * parser.c (cp_parser_direct_declarator): Clear + parser->num_template_parameter_lists when parsing function + parameters. + (cp_parser_constructor_declarator_p): Likewise. + + 2003-09-19 Kriang Lerdsuwanakij + + PR c++/495 + * pt.c (tsubst_friend_class): Only use innermost template + arguments for the injected friend class template. + + 2003-09-19 Nathan Sidwell + + PR c++/12332 + * pt.c (instantiate_class_template): Increment + processing_template_decl around the tsubst of a template member + function. + + 2003-09-19 Gabriel Dos Reis + + * decl.c (cxx_scope_descriptor): Fix thinko. + (struct cp_binding_level): Adjust type of binding_depth field. + + 2003-09-18 Danny Smith + + PR c++/12320 + * call.c (type_passed_as): Check for incomplete type. + (convert_for_arg_passing): Likewise. + + 2003-09-18 Nathan Sidwell + + PR c++/9848 + * optimize.c (maybe_clone_body): Don't set MARK_USED on parameters + here. + * semantics.c (expand_body): Set it here on the remaining clones. + + 2003-09-18 Roger Sayle + + * lex.c (init_operators): Remove operator_name_info for FFS_EXPR. + * class.c (instantiate_type): Remove FFS_EXPR case. + + 2003-09-18 Volker Reichelt + + * ChangeLog: Fix recent commit. + + 2003-09-18 Volker Reichelt + + * ChangeLog: Add PR number to patch for PR c++/12316. + + 2003-09-18 Gabriel Dos Reis + + * error.c (dump_type): Simplify. Use pp_type_specifier_seq for + "C" types. + * cxx-pretty-print.c (pp_cxx_type_specifier_seq): Fix thinko. + + 2003-09-17 Richard Henderson + + * semantics.c (expand_body): Don't save/restore input_location. + + 2003-09-17 Mark Mitchell + + PR c++/12266 + * cp-tree.h (tsubst_flags_t): Add tf_conv. + * class.c (standard_conversion): Pass tf_conv to + instantiate_type. + (resolve_address_of_overloaded_function): Do not call mark_used + when just checking conversions. + + PR debug/12066 + * cp-lang.c (LANG_HOOKS_BUILTIN_TYPE_DECLS): Define. + * cp-tree.h (cxx_builtin_type_decls): Declare. + * decl.c (builtin_type_decls): New variables. + (cxx_builtin_type_decls): New function. + (record_builtin_type): Add to builtin_type_decls. + + 2003-09-17 Richard Henderson + + PR c++/12316 + * semantics.c (expand_or_defer_fn): Inc/dec function_depth. + + 2003-09-16 Kriang Lerdsuwanakij + + PR c++/7939 + * typeck.c (comptypes): Don't ICE when its first argument is + error_mark_node. + (compparms): Reverse the arguments of same_type_p. + + 2003-09-15 Nathan Sidwell + + PR c++/12184 + * typeck.c (convert_arguments): Return error_mark_node for an + incomplete parameter. Make error message more informative. + + 2003-09-12 Mark Mitchell + + PR c++/3907 + * class.c (maybe_note_name_used_in_class): Refine test for whether + or not we are in a class scope. + + * cp-tree.h (language_function): Remove x_expanding_p. + (expanding_p): Remove. + (doing_semantic_analysis_p): Remove. + (scope_kind): Add sk_function_parms, sk_class, + sk_namespace. + (innermost_scope_kind): New method. + * call.c (cxx_type_promotes_to): Use type_decays_to. + * cp-lang.c (LANG_HOOKS_PUSHLEVEL): Redefine. + (LANG_HOOKS_POPLEVEL): Likewise. + * decl.c (cp_binding_level): Remove parm_flag, template_parms_p, + template_spec_p, namespace_p, is_for_scope, is_try_scope, and + is_catch_scope. Add kind and explicit_spec_p. + (cxx_scope_descriptor): Use a lookup table. + (find_class_binding_level): Use "kind" field in binding_level, not + the various flags. + (pop_binding_level): Likewise. + (innermost_nonclass_level): Likewise. + (toplevel_bindings_p): Likewise. + (namespace_bindings_p): Likewise. + (template_parm_scope_p): Likewise. + (innermost_scope_kind): New method. + (current_tmpl_spec_kind): Use "kind" field in binding_level, not + the various flags. + (pushlevel): Remove check for doing_semantic_analysis_p. + (begin_scope): Simplify. + (add_decl_to_level): Use "kind" field in binding_level, not + the various flags. + (push_local_binding): Likewise. + (pop_label): Remove check for doing_semantic_analysis_p. + (poplevel): Use "kind" field in binding_level, not + the various flags. + (set_block): Remove check for doing_semantic_analysis_p. + (pushlevel_class): Use "kind" field in binding_level, not + the various flags. + (poplevel_class): Likewise. + (initial_push_namespace_scope): Likewise. + (maybe_push_to_top_level): Likewise. + (set_identifier_type_value_with_scope): Likewise. + (pop_everything): Likewise. + (maybe_process_template_type_declaration): Likewise. + (pushtag): Likewise. + (pushdecl): Likewise. + (pushdecl_with_scope): Likewise. + (check_previous_goto_1): Likewise. + (define_label): Likewise. + (finish_case_label): Likewise. + (lookup_tag): Likewise. + (unqualified_namespace_lookup): Likewise. + (lookup_name_real): Likewise. + (lookup_name_current_level): Likewise. + (lookup_type_current_level): Likewise. + (record_builtin_type): Likewise. + (cp_make_fname_decl): Likewise. + (maybe_inject_for_scope_var): Likewise. + (cp_finish_decl): Remove check for doing_semantic_analysis_p. + (start_function): Use begin_scope, not pushlevel. + (finish_function): Use "kind" field in binding_level, not + the various flags. + (start_method): Use begin_scope, not pushlevel. + (make_label_decl): Do not check expanding_p. + (save_function-data): Do not set expanding_p. + (cxx_push_function_context): Do not clear expanding_p. + * semantics.c (cxx_expand_function_start): Do not set expanding_p. + + 2003-09-14 Mark Mitchell + + * class.c (layout_class_type): Make DECL_MODE match TYPE_MODE for + an bit-field whose width exceeds that of its type. + + 2003-09-14 Geoffrey Keating + + * rtti.c (get_tinfo_decl): Set TREE_PUBLIC for typeinfo decls. + + 2003-09-14 Kazu Hirata + + * ChangeLog: Follow spelling conventions. + * parser.c: Likewise. + + 2003-09-13 Richard Henderson + + * decl2.c (finish_file): Check cgraph_assemble_pending_functions + during relaxation loop. + + 2003-09-11 David Edelsohn + + * decl2.c (var_finalized_p): Swap arms of conditional. + + 2003-09-10 Nathan Sidwell + + PR c++/11788 + * typeck.c (build_address): If it is a function, mark it used. + (build_unary_op): Do not lose object's side-effects when taking + address of static member function. + * class.c (resolve_address_of_overloaded_function): Use + tsubst_flags_t parameter. Only expect overload sets. Adjust. + (instantiate_type): Adjust flags passing. Do not lose object's + side-effects when taking address of static member function. + + 2003-09-11 Richard Henderson + + * semantics.c (expand_or_defer_fn): Update for new + cgraph_finalize_function argument. + + 2003-09-10 Richard Henderson + + * decl2.c (cxx_callgraph_analyze_expr): Mark argument unused. + + 2003-09-10 Jan Hubicka + + * decl2.c (var_finalized_p): New. + (maybe_emit_vtables, write_out_vars, finish_file): Use it. + + 2003-09-10 Richard Henderson + + * decl2.c (cxx_callgraph_analyze_expr): New, from corpse of + mark_member_pointers. + (lower_function): Remove. + * cp-tree.h: Update to match. + * cp-lang.c (LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR): New. + (LANG_HOOKS_CALLGRAPH_LOWER_FUNCTION): Remove. + + 2003-09-09 Richard Henderson + + * semantics.c (expand_or_defer_fn): Update call to + cgraph_finalize_function. + + * semantics.c (expand_or_defer_fn): Use cgraph_finalize_function + always. + + * decl2.c (finish_file): Avoid out-of-bounds array reference + during memmove. + + 2003-09-09 Richard Henderson + + * decl2.c (mark_member_pointers): Rename from + mark_member_pointers_and_eh_handlers and don't check eh handlers. + + 2003-09-09 Christian Ehrhardt + + PR bootstrap/12168 + * method.c (use_thunk): Clear DECL_RTL of copied nodes. + + 2003-09-08 Mark Mitchell + + * cp-lang.c (LANG_HOOKS_REGISTER_BUILTIN_TYPE): Define to + c_register_builtin_type. + + PR c++/11786 + * decl2.c (add_function): Do not complain about seeing the same + non-function twice. + * semantics.c (perform_koenig_lookup): Improve documentation. + + PR c++/5296 + * pt.c (try_one_overload): Add addr_p parameter. + (resolve_overloaded_unification): Pass it. + + 2003-09-08 Richard Henderson + + * optimize.c (maybe_clone_body): Inc/dec function_depth. + + 2003-09-08 Richard Henderson + + * decl.c (finish_function): Clear current_function_decl. + * decl2.c (mark_used): Don't push/pop gc context. + * optimize.c (optimize_function): Likewise. + * tree.c (cp_cannot_inline_tree_fn): Likewise. + * pt.c (instantiate_decl): Inc/dec function_depth instead. + * semantics.c (expand_body): Update for tree_rest_of_compilation + nested argument. + + 2003-09-07 Gabriel Dos Reis + + PR c++/11762 + * error.c (dump_decl): Handle namespace-alias-definition. + * decl.c (warn_extern_redeclared_static): There is no point in + checking changes in storage class specifier for a namespace + declaration. + (duplicate_decls): Tidy diagnostic message. + * cxx-pretty-print.c (pp_cxx_left_brace): New macro. + (pp_cxx_right_brace): Likewise. + (pp_cxx_original_namespace_definition): New function. + (pp_cxx_namespace_alias_definition): Likewise. + (pp_cxx_declaration): Use them. Handle NAMESPACE_DECLs. + + 2003-09-07 Jan Hubicka + + * decl2.c (maybe_emit_vtables, write_out_vars, finish_file): + Avoid re-emitting variables in unit-at-a-time mode. + + 2003-09-06 Mark Mitchell + + PR c++/11867 + * call.c (standard_conversion): Improve comments. + (perform_direct_initialization): Make sure we return an expression + of the correct type. + * typeck.c (build_static_cast): Check for ambiguity and + accessibility when performing conversions. + + 2003-09-06 Gabriel Dos Reis + + * cp-tree.h (add_binding): Remove declaration. + * name-lookup.h (supplement_binding): Declare. + * decl.c (add_binding): Move to name-lookup.c. + (push_local_binding): Adjust. + (push_class_binding): Likewise. + (set_identifier_type_value_with_scope): Likewise. + * name-lookup.c (supplement_binding): Rename from add_binding. + Return a bool. Improve documentation. + (set_namespace_binding): Adjust. + * Make-lang.in (cp/name-lookup.o): Depend on toplev.h + + 2003-09-06 Nathan Sidwell + + PR c++/11794 + * class.c (pushclass): Push dependent using decls for nested + classes of templates too. + + 2003-09-06 Roger Sayle + + PR c++/11409 + * class.c (resolve_address_of_overloaded_function): When building + list of matching non-template function decls, ignore anticipated + declarations of undeclared or shadowed GCC builtins. + + 2003-09-06 Steven Bosscher + + PR c++/11595 + * decl.c (define_label): Remove unreachable timevar pop. + Always return the decl, even if the definition is invalid. + + 2003-09-06 Nathan Sidwell + + PR c++/12167 + * parser.c (cp_parser_late_parsing_default_args): Push & pop the + unparsed functions queue. + + 2003-09-05 Mark Mitchell + + PR c++/12163 + * call.c (perform_direct_initialization): Correct logic for + direct-initialization of a class type. + + PR c++/12146 + * pt.c (lookup_template_function): Robustify. + + 2003-09-05 Nathan Sidwell + + PR c++/11922 + * pt.c (tsubst_qualified_id): Make sure we get a non-type. + (tsubst_expr, tsubst_copy_and_build): Pass false, not zero, as + is_type_p to lookup_qualified_name. + + * semantics.c (finish_call_expr): Refactor some code. + + PR c++/12037 + * cp-tree.h (COMPOUND_EXPR_OVERLOADED): New. + (build_min_non_dep): Declare. + * tree.c (build_min): Propagate TREE_SIDE_EFFECTS. + (build_min_non_dep): New. + * cvt.c (convert_to_void): Don't explicitly copy + TREE_SIDE_EFFECTS, TREE_NO_UNUSED_WARNING. + * call.c (build_new_method_call): Use build_min_non_dep. + * decl2.c (grok_array_decl): Likewise. + (build_offset_ref_call_from_tree): Likewise. + * typeck.c (finish_class_member_access_expr, + build_x_indirect_ref, build_x_binary_op, build_x_unary_op, + build_x_conditional_expr, build_x_compound_expr): Likewise. + (build_static_cast, build_reinterpret_cast, + build_const_cast): Propagate TREE_SIDE_EFFECTS inside a template. + * typeck2.c (build_x_arrow): Use build_min_non_dep. + (build_functional_cast): Propagate TREE_SIDE_EFFECTS inside a + template. + * rtti.c (build_dynamic_cast_1): Set DECL_IS_PURE. + (build_dynamic_cast): Set TREE_SIDE_EFFECTS. + * pt.c (build_non_dependent_expr): Check COMPOUND_EXPR_OVERLOADED. + + 2003-09-04 Richard Henderson + + * decl2.c (mark_member_pointers_and_eh_handlers): Update for + change in cgraph_mark_needed_node arguments. + + 2003-09-02 Geoffrey Keating + + PR 12161 + * decl2.c (mark_used): Use ggc_push_context/ggc_pop_context. + * tree.c (cp_cannot_inline_tree_fn): Likewise. + + 2003-09-04 Nathan Sidwell + + * cp-tree.h (finish_sizeof, finish_alignof): Remove. + (expr_sizeof): Replace with ... + (cxx_sizeof_or_alignof_expr): ... here. + (cxx_sizeof_or_alignof_type): Make complain parameter a bool. + * parser.c (cp_parser_unary_expression): Commonize alignof and + sizeof handling. + * pt.c (tsubst_copy_and_build): Adjust alignof and sizeof + substitution. + * semantics.c (finish_sizeof, finish_alignof): Remove. + * typeck.c (cxx_sizeof_or_alignof_type): Complain parameter + becomes bool. Set TREE_READONLY. + (expr_sizeof): Replace with ... + (cxx_sizeof_or_alignof_expr): ... here. Clear TREE_SIDE_EFFECTS. + + 2003-09-04 Mark Mitchell + + Remove cast-as-lvalue extension. + * call.c (build_conditional_expr): Correct formatting. + (convert_like_real): Use lvalue_p, not non_cast_lvalue_p. + (initialize_real): Use real_lvalue_p, not real_non_cast_lvalue_p. + * cp-tree.h (non_cast_lvalue_p): Remove. + (real_non_cast_lvalue_p): Remove. + (non_cast_lvalue_or_else): Remove. + * tree.c (lvalue_p_1): Remove allow_cast_as_lvalue parameter. + (real_lvalue_p): Adjust call to lvalue_p_1. + (non_cast_lvalue_p): Remove. + (non_cast_lvalue_or_else): Remove. + (lvalue_p): Adjust call to lvalue_p_1. + (lvalue_or_else): Simplify. + * typeck.c (build_unary_op): Use lvalue_or_else, not + non_cast_lvalue_or_else. + (build_static_cast): Use real_lvalue_p, not real_non_cast_lvalue_p. + + 2003-09-03 DJ Delorie + + * decl.c (finish_function): Pass fndecl to aggregate_value_p. + + 2003-09-03 Mark Mitchell + + PR c++/12053 + * class.c (include_empty_classes): Correct logic for ABI version 1. + + 2003-09-03 Richard Henderson + + * optimize.c (optimize_function): Push/pop ggc context around + the call to optimize_inline_calls. + + 2003-09-02 Scott Brumbaugh + + PR c++/11553 + * parser.c (cp_parser_decl_specifier_seq): Add check for a + duplicate friend decl-specifier. + + 2003-09-02 Mark Mitchell + + PR c++/11847 + * pt.c (convert_nontype_argument): Correct representation of + REFERENCE_TYPE expressions. + + PR c++/11808 + * cp-tree.h (KOENIG_LOOKUP_P): New macro. + (finish_call_expr): Change prototype. + * parser.c (cp_parser_postfix_expression): Adjust call to + finish_call_expr. + * pt.c (tsubst_copy_and_build): Use KOENIG_LOOKUP_P. + * semantics.c (finish_call_expr): Add koenig_p parameter. + + 2003-09-01 Mark Mitchell + + PR c++/12114 + * cp-tree.h (initialize_reference): Change prototype. + * call.c (initialize_reference): Add cleanup parameter. + * decl.c (grok_reference_init): Likewise. + (check_initializer): Likewise. + (cp_finish_decl): Insert a CLEANUP_STMT if necessary. + (duplicate_decls): When replacing an anticipated builtin, do not + honor TREE_NOTHROW. + * typeck.c (convert_for_initialization): Correct call to + initialize_reference. + + PR c++/11972 + * pt.c (dependent_type_p_r): Pass only the innermost template + arguments to any_dependent_template_arguments_p. + + 2003-09-01 Josef Zlomek + + * error.c (dump_expr): Kill BIT_ANDTC_EXPR. + * lex.c (init_operators): Kill BIT_ANDTC_EXPR. + * pt.c (tsubst_copy): Kill BIT_ANDTC_EXPR. + * typeck.c (build_binary_op): Kill BIT_ANDTC_EXPR. + (tsubst_copy_and_build): Kill BIT_ANDTC_EXPR. + + 2003-08-29 Mark Mitchell + + PR c++/12093 + * pt.c (build_non_dependent_expr): Do not build a + NON_DEPENDENT_EXPR for a STRING_CST. + + PR c++/11928 + * search.c (add_conversions): Avoid adding two conversion + operators for the same type. + + 2003-08-29 Mark Mitchell + + PR c++/6196 + * pt.c (tsubst_copy_and_build): Correct handling of + address-of-label extension. + * semantics.c (finish_goto_stmt): The address of a label must go + through the lvalue-to-rvalue conversion. + + 2003-08-29 Richard Henderson + Jason Merrill + + * cp-lang.c (LANG_HOOKS_RTL_EXPAND_START): New. + (LANG_HOOKS_RTL_EXPAND_STMT): New. + * cp-tree.h (cxx_expand_function_start): Declare. + * decl.c (start_function): Use allocate_struct_function. + Move stmts_are_full_exprs_p assertion from expand_body. + Do not free_after_parsing or free_after_compilation. + (cxx_push_function_context): Move code to set struct function + data from genrtl_start_function. + * optimize.c (optimize_function): Don't inc/dec function_depth. + * semantics.c (expand_body): Use tree_rest_of_compilation. + (cxx_expand_function_start): Rename from genrtl_start_function, + omit bits done by tree_rest_of_compilation. + (genrtl_finish_function): Remove. + (clear_decl_rtl): Move to ../tree-optimize.c. + + 2003-08-29 Gabriel Dos Reis + + PR c++/11811 + * cxx-pretty-print.c (pp_cxx_canonical_template_parameter): New + function. + * cxx-pretty-print.h: Declare. + * error.c (dump_template_parameter): Use it. + (dump_type): Likewise. + + 2003-08-28 Mark Mitchell + + * init.c (decl_constant_value): Deal with COND_EXPR specially. + * call.c (build_conditional_expr): Revert previous patch. + + PR optimization/5079 + * call.c (build_conditional_expr): Use decl_constant_value to + simplify the arguments. + + 2003-08-26 Dan Nicolaescu + + * parser.c (struct cp_token): Use enum bitfields. + (CP_TOKEN_BLOCK_NUM_TOKENS): Make sure cp_token_block fits in a + 512B allocation unit. + (cp_parser_token_tree_map_node): Use enum bitfields. + + 2003-08-26 Nathan Sidwell + + PR c++/11871 + * decl.c (push_class_level_binding): Correct old_decl value from + my 2003-07-29 reorganization. + + * call.c (build_call): Don't set TREE_SIDE_EFFECTS here. + (build_new_method_call): Add goto finish. + * semantics.c (simplify_aggr_init_exprs_r): Don't set + TREE_SIDE_EFFECTS on a call. + + 2003-08-25 Richard Henderson + + * cxx-pretty-print.c (pp_cxx_class_name): Remove unused function. + + 2003-08-25 Gabriel Dos Reis + + * cxx-pretty-print.h (pp_cxx_flag_default_argument): New flag. + (cxx_pretty_printer): Adjust base type. + (pp_cxx_function_specifier): Declare. + * cxx-pretty-print.c (pp_cxx_whitespace): New macro. + (pp_cxx_left_paren): Likewise. + (pp_cxx_right_paren): Likewise. + (pp_cxx_dot): Likewise. + (pp_cxx_arrow): Likewise. + (pp_cxx_semicolon): Likewise. + (pp_cxx_identifier): Likewise. + (pp_cxx_cv_qualifier_seq): Likewise. + (pp_cxx_storage_class_specifier): Likewise. + (pp_cxx_expression_list): Likewise. + (pp_cxx_space_for_pointer_operator): Likewise. + (pp_cxx_init_declarator): Likewise. + (pp_cxx_call_argument_list): Likewise. + (pp_cxx_nonconsecutive_character): Tidy. + (pp_cxx_conversion_function_id): New function. + (pp_cxx_template_id): Likewise. + (pp_cxx_template_keyword_if_needed): Likewise. + (pp_cxx_nested_name_specifier): Likewise. + (pp_cxx_unqualified_id): Tidy + (pp_cxx_qualified_id): Handle more nodes. + (pp_cxx_primary_expression): Tidy. + (pp_cxx_postfix_expression): Likewise. + (pp_cxx_new_expression): Tidy. + (pp_cxx_delete_expression): Likewise. + (pp_cxx_cast_expression): New function. + (pp_cxx_pm_expression): Tidy. + (pp_cxx_conditional_expression): Likewise. + (pp_cxx_assignment_operator): New function. + (pp_cxx_assignment_expression): Tidy. + (pp_cxx_expression): New function. + (pp_cxx_function_specifier): Likewise. + (pp_cxx_decl_specifier_seq): Likewise. + (pp_cxx_simple_type_specifier): Tidy. + (pp_cxx_type_specifier_seq): Likewise. + (pp_cxx_ptr_operator): New function. + (pp_cxx_implicit_parameter_type): Likewise. + (pp_cxx_parameter_declaration): Tidy. + (pp_cxx_parameter_declaration_clause): New function. + (pp_cxx_exception_specification): Likewise. + (pp_cxx_direct_declarator): Tidy. + (pp_cxx_declarator): Likewise. + (pp_cxx_ctor_initializer): New function. + (pp_cxx_function_definition): Likewise. + (pp_cxx_abstract_declarator): Tidy. + (pp_cxx_direct_abstract_declarator): Likewise. + (pp_cxx_type_id): Likewise. + (pp_cxx_exception_declaration): New function. + (pp_cxx_statement): Likewise. + (pp_cxx_simple_declaration): Likewise. + (pp_cxx_template_parameter_list): Likewise. + (pp_cxx_template_parameter): Likewise. + (pp_cxx_template_declaration): Likewise. + (pp_cxx_explicit_specialization): Likewise. + (pp_cxx_explicit_instantiation): Likewise. + (pp_cxx_declaration): Tidy. + (pp_cxx_pretty_printer_init): Initialize more fields. + + 2003-08-25 Mark Mitchell + + PR c++/8795 + * cp-tree.h (build_cplus_method_type): Remove. + * call.c (standard_conversion): Use build_method_type_directly + instead of build_cplus_method_type. + * class.c (build_clone): Likewise. + (adjust_clone_args): Likewise. + * decl.c (build_ptrmem_type): Likewise. + (grokdeclarator): Likewise. + (check_function_type): Likewise. + * decl2.c (grok_method_quals): Likewise. + (maybe_retrofit_in_chrg): Likewise. + * pt.c (copy_default_args_to_explicit_spec): Likewise. + (tsubst_function_type): Likewise. + (tsubst): Likewise. + * tree.c (build_cplus_method_type): Remove. + * typeck.c (merge_types): Use build_method_type_directly. + + 2003-08-23 Kriang Lerdsuwanakij + + PR c++/3765 + * search.c (dfs_access_in_type): Fix typo in comment. + (dfs_accessible_queue_p): Likewise. + (dfs_accessible_p): Only terminate when a friend is found. + (accessible_p): Return immediately if access_in_type allows + access. + + 2003-08-23 Kriang Lerdsuwanakij + + PR c++/641, c++/11876 + * friend.c (add_friend): Add complain parameter. + (make_friend_class): Likewise. + (do_friend): Adjust add_friend call. + * decl.c (grokdeclarator): Adjust make_friend_class call. + * parser.c (cp_parser_member_declaration): Likewise. + (cp_parser_template_declaration_after_export): Likewise. + * pt.c (instantiate_class_template): Adjust make_friend_class + and add_friend call. + * cp-tree.h (make_friend_class): Adjust declaration. + (add_friend): Likewise. + + 2003-08-21 Jason Merrill + + PR c++/11283 + * call.c (build_conditional_expr): Ignore cv-qual differences for + non-class types. + + 2003-08-21 Mark Mitchell + + PR c++/11551 + * parser.c (cp_parser_id_expression): Add declarator_p parameter. + (cp_parser_primary_expression): Adjust call to + cp_parser_id_expression. + (cp_parser_unqualified_id): Complain about the use of + typedef-names in a destructor declarator. + (cp_parser_postfix_expression): Adjust call to + cp_parser_id_expression. + (cp_parser_type_parameter): Likewise. + (cp_parser_template_argument): Likewise. + (cp_parser_declarator_id): Likewise. + + PR c++/11919 + * call.c (standard_conversion): Use same_type_p, not pointer + equality, to compare types. + + PR c++/10762 + * parser.c (cp_parser_using_declaration): Check for invalid uses + of template-ids here... + * decl2.c (do_class_using_decl): ... rather than here. + + 2003-08-20 Mark Mitchell + + PR c++/11834 + * pt.c (more_specialized): Bump processing_template_decl. + + 2003-08-21 Jason Merrill + + PR c++/11614 + * decl.c (grokdeclarator): Recognize a flexible array based on the + type, not the form of the declarator. + + 2003-08-20 Jason Merrill + + * semantics.c (simplify_aggr_init_expr): Split out from + simplify_aggr_init_exprs_r. Convert slot address to match + the return type. + * cp-tree.h: Declare it. + * tree.c (cp_copy_res_decl_for_inlining): Don't clobber the + DECL_NAME of a user variable. + + 2003-08-20 Nathan Sidwell + + PR c++/11945 + * pt.c (build_non_dependent_expr): Look inside COND_EXPR and + COMPOUND_EXPR. + * semantics.c (finish_expr_stmt): Always convert to void. + * typeck.c (build_x_compound_exp): Always convert to void. + + 2003-08-19 Mark Mitchell + + PR c++/11684 + * cp-tree.h (grok_op_properties): Change prototype. + * decl.c (grok_op_properties): Add complain parameter. + (grokfndecl): Pass it. + * pt.c (tsubst_decl): Adjust accordingly. + + PR c++/10926 + * decl.c (start_method): Return immediately if push_template_decl + does not like the declaration. + * pt.c (push_template_decl_real): Disallow member template + destructors. + + PR c++/11036 + * cp-tree.h (add_binding): Add prototype. + * class.c (add_method): Set TYPE_HAS_DESTRUCTOR if appropriate. + (maybe_warn_about_overly_private_class): Use + CLASSTYPE_DESTRUCTORS. + (pushclass): Adjust call to set_identifier_type_value. + * decl.c (add_binding): Give it external linkage. + (push_local_binding): Adjust call to add_binding. + (push_class_binding): Likewise. + (set_identifier_type_value_with_scope): Change prototype. Use + add_binding for global bindings. + (set_identifier_type_value): Adjust accordingly. + (pushtag): Likewise. + (pushdecl): Use set_identifier_type_value, not + set_identifier_type_value_with_scope. + (pushdecl_namespace_level): Adjust calls to + SET_IDENTIFIER_TYPE_VALUE to pass a DECL. + (pushdecl_class_level): Likewise. + (lookup_tag): Use select_decl. + (select_decl): Improve comment. + (record_builtin_type): Do not call pushdecl. + (cxx_init_decl_processing): Do not call xref_tag for bad_alloc. + (cp_finish_decl): Adjust call to set_identifier_type_value. + (check_elaborated_type_specifier): Improve checks for invalid uses + of typedefs. + (xref_tag): Adjust call to check_elaborated_type_specifier. + * decl2.c (grokclassfn): Do not set TYPE_HAS_DESTRUCTOR. + * name-lookup.c (set_namespace_binding): Use add_binding. + * parser.c (cp_parser_simple_type_specifier): Return a TYPE_DECL, + rather than an IDENTIFIER_NODE, to represent built-in types, if + requested by the caller. + (cp_parser_postfix_expression): Adjust call. + (cp_parser_type_specifier): Likewise. + (cp_parser_elaborated_type_specifier): Adjust call to + check_elaborated_type_specifier. + * typeck2.c (build_functional_cast): Do not perform name lookups. + + PR c++/10717 + * decl.c (expand_static_init): Remove unnecessary code. + + 2003-08-19 Andrew Pinski + + PR c++/10538, PR c/5582 + * cp/cp-lang.c (LANG_HOOKS_DECL_UNINIT): Define. + + 2003-08-19 Kriang Lerdsuwanakij + + PR c++/11174 + * init.c (build_offset_ref): Perform access checking for + pointer to member correctly. + + 2003-08-19 Gabriel Dos Reis + + * cp-lang.c (LANG_HOOKS_INITIALIZE_DIAGNOSTICS): Fix spelling. + + 2003-08-18 Nathan Sidwell + + PR c++/11957 + * cp-tree.h (finish_stmt_expr): Add bool parameter. + * init.c (finish_init_stmts): Pass true to finish_stmt_expr. Don't + adjust the stmt_expr here. + (build_vec_init): Use finish_stmt_expr_expr, convert result to + array type. + * parser.c (cp_parser_primar_expression): Adjust finish_stmt_expr + call. + * pt.c (tsubst_copy): Likewise. + * semantics.c (finish_stmt_expr): Add parameter. + + * pt.c (instantiate_class_template): Push to class's scope before + tsubsting base. + + 2003-08-17 Jan Hubicka + + PR C++/11702 + * semantics.c (finish_id_expression): Mark all functions as used. + + 2003-08-16 Nathan Sidwell + + PR c++/11512 + * cvt.c (convert_to_void): Indicate which side of conditional has + no effects, and rhs of comma operator. Test for no sideeffect + expressions here and always build a convert expr. + * init.c (expand_default_init): Convert the init to void. + * typeck.c (build_x_compound_expr): Do not check for side effects + here. + (build_compound_expr): Do not convert lhs when building a + template. + + 2003-08-15 Nathan Sidwell + + * cp-tree.def (NON_DEPENDENT_EXPR): Add operand. + * decl2.c (build_offset_ref_call_from_tree): Use + build_non_dependent_expr. + * error.c (dump_expr) : Dump the operand. + * pt.c (build_non_dependent_expr): Set operand. + + 2003-08-14 Jan Hubicka + + * decl2.c (mark_member_pointers): Rename to... + (mark_member_pointers_and_eh_tinfos): ... this one; deal with eh tinfos + (lower_function): Update call. + * except.c (eh_type_info): Break out from ... + (build_eh_type): ... here; tinfo is already used. + (finish_eh_spec_block): Mark tinfos as used. + * semantics.c (finish_handler_params): Mark tinfo as used. + * cp-tree.h (eh_type_info): Declare. + + 2003-08-15 Nathan Sidwell + + * pt.c (instantiate_class_template): Set location before + substuting bases. + + * decl.c (make_typename_type): Use my_friendly_assert. + * pt.c (tsubst_aggr_type): Rearrange context substitution. + + 2003-08-14 Jan Hubicka + + * method.c (use_thunk): Expand body directly. + + 2003-08-12 Mark Mitchell + + PR c++/11703 + * call.c (type_passed_as): Use TYPE_SIZE, not TYPE_PRECISION to + determine whether or not to promote types. + (convert_for_arg_passing): Likewise. + * decl2.c (cp_build_parm_decl): Do not set DECL_ARG_TYPE in + templates. + * pt.c (tsubst_decl): Do not expect it to be set. + + PR c++/9512 + PR c++/10923 + * cp-tree.h (check_elaborated_type_specifier): Declare. + (handle_class_head): Remove. + (note_got_semicolon): Likewise. + (note_list_got_semicolon): Likewise. + (finish_class_definition): Likewise. + * decl.c (check_elaborated_type_specifier): Make it public. + Robustify. + (handle_class_head): Remove. + * parser.c (cp_parser_elaborated_type_specifier): Use + check_elaborated_type_specifier. + (cp_parser_class_specifier): Do not call finish_class_definition. + (cp_parser_class_head): Or handle_class_head. Check for + over-qualified names. + * semantics.c (finish_class_definition): Remove. + + * parser.c (cp_parser_check_for_definition_in_return_type): New + function. + (cp_parser_simple_declaration): Adjust call to + cp_parser_init_declarator. + (cp_parser_decl_specifier_seq): Change type of + declares_class_or_enum parameter. + (cp_parser_explicit_instantiation): Adjust accordingly. + (cp_parser_type_specifier): Change type of + declares_class_or_enum parameter. + (cp_parser_init_declarator): Add declares_class_or_enum + parameter. + (cp_parser_parameter_declaration): Adjust call to + cp_parser_decl_specifier_seq. + (cp_parser_function_definition): Likewise. + (cp_parser_member_declaration): Likewise. + (cp_parser_single_declaration): Likewise. + + * cp-tree.h (lang_type_class): Remove has_call_overloaded, + has_array_ref_overloaded, has_arrow_overloaded, and got_semicolon. + (TYPE_OVERLOADS_CALL_EXPR): Remove. + (TYPE_OVERLOADS_ARRAY_REF): Likewise. + (TYPE_OVERLOADS_ARROW): Likewise. + (CLASSTYPE_GOT_SEMICOLON): Likewise. + * class.c (check_bases): Do not set them. + (finish_struct_1): Likewise. + * decl.c (cp_finish_decl): Do not set CLASSTYPE_GOT_SEMICOLON. + (build_ptrmemfunc_type): Likewise. + (grok_op_properties): Do not set TYPE_OVERLOADS_*. + (start_function): Do not check CLASSTYPE_GOT_SEMICOLON. + * decl2.c (grokfield): Do not set CLASSTYPE_GOT_SEMICOLON. + * lex.c (note_got_semicolon): Remove. + (note_list_got_semicolon): Likewise. + * parser.c (cp_parser_simple_declaration): Do not call + note_list_got_semicolon. + * pt.c (list_eq): Remove. + (lookup_template_class): Do not set CLASSTYPE_GOT_SEMICOLON. + (instantiate_class_template): Do not set TYPE_OVERLOADS*. + (instantiate_class_template): Do not set CLASSTYPE_GOT_SEMICOLON. + * ptree.c (cxx_print_type): Do not print them. + * semantics.c (finish_member_class_template): Do not call + note_list_got_semicolon. + + 2003-08-11 Aldy Hernandez + + * call.c (standard_conversion): Opaque pointers interconvert. + + * testsuite/g++.dg/other/opaque-3.C: New. + + 2003-08-11 Mark Mitchell + + * typeck.c (merge_types): Handle cv-qualified pointer-to-member + types correctly. + + 2003-08-10 Mark Mitchell + + PR c++/11789 + * cp-tree.h (get_vbase): Remove. + (get_vbase_types): Remove. + * init.c (expand_member_init): Correct logic for looking up base + classes. + + 2003-08-10 Gabriel Dos Reis + + * error.c (dump_expr): Tidy. + * cxx-pretty-print.c (pp_cxx_nonconsecutive_character): New. + (pp_cxx_begin_template_argument_list): Likewise. + (pp_cxx_end_template_argument_list): Likewise. + (is_destructor_name): Likewise. + (pp_cxx_unqualified_id): Likewise. + (pp_cxx_qualified_id): Likewise. + (pp_cxx_id_expression): Likewise. + (pp_cxx_new_expression): Likewise. + (pp_cxx_delete_expression): Likewise. + (pp_cxx_pm_expression): Likewise. + (pp_cxx_type_specifier): Rework. + (pp_cxx_type_id): Likewise. + (pp_cxx_primary_expression): Likewise. + (pp_cxx_postfix_expression): Likewise. + (pp_cxx_unary_expression): Likewise. + (pp_cxx_multiplicative_expression): Likewise. + (pp_cxx_conditional_expression): Likewise. + (pp_cxx_assignment_expression): Likewise. + (pp_cxx_pretty_printer_init): Tidy. + + 2003-08-10 Nathan Sidwell + + * cp-tree.h (TMPL_ARGS_HAVE_MULTIPLE_LEVELS): non-NULL + NODE is always a TREE_VEC of nonzero size. + (NUM_TMPL_ARGS): NODE is always a TREE_VEC. + * decl2.c (arg_assoc): Template args will be a vec. + * error.c (dump_decl) : Call + dump_template_argument_list. + (dump_template_parms): Args will be a vec. + * parser.c (cp_parser_template_argument_list): Produce a + vector, not a list. + * pt.c (coerce_template_parms): Args are always vectors. + (mangle_class_name_for_template): Likewise. + (lookup_template_function): Likewise. + (lookup_template_class): Likewise. + (tsubst_template_args): Likewise. + (tsubst_baselink): Use tsubst_template_args. + (tsubst_qualified_id): Likewise. + (tsubst_copy) : Likewise. + (tsubst_copy_and_build) : Likewise. + (any_dependent_template_args_p): Args are always vectors. + * tree.c (cp_tree_equal): Add TEMPLATE_ID_EXPR case. + + PR c++/11670 + * call.c (convert_like_real): Add rvalue binding error message. + * error.c (dump_expr) : Detect when the no expr is + really a cast. + + PR c++/10530 + * pt.c (dependent_type_p_r): A dependent template-id is a class + type with dependent template arguments, or a bound template + template parameter. + (type_dependent_expression_p): A template function decl cannot + have a dependent context. + + 2003-08-07 Kriang Lerdsuwanakij + + PR c++/5767 + * parser.c (cp_parser_class_name): Return immediately when scope + is error_mark_node. + + 2003-08-07 Aldy Hernandez + + * cp/Make-lang.in (cp/call.o): Add dependency for target.h. + + * cp/call.c (standard_conversion): Support opaque types. + Include target.h. + (strip_top_quals): Use cp_build_qualified_type instead of + TYPE_MAIN_VARIANT. + + * cp/typeck.c (convert_for_assignment): Support opaque types. + + * testsuite/g++.dg/other/opaque-1.C: New. + + * testsuite/g++.dg/other/opaque-2.C: New. + + 2003-08-06 Aldy Hernandez + + * decl.c (grokparms): Use cp_build_qualified_type instead + TYPE_MAIN_VARIANT. + + 2003-08-05 Gabriel Dos Reis + + * cxx-pretty-print.h: New file. + * cxx-pretty-print.c: Likewise. + * error.c (scratch_pretty_printer): Change type. + (init_error): Tidy. + (dump_aggr_type): Likewise. + (dump_global_iord): Likewise. + (dump_expr): Likewise. + (dump_char): Remove. + * cp-lang.c (LANG_HOOKS_INITIALIZE_DIAGNOSTITCS): Define. + (cxx_initialize_diagnostics): New function. + * Make-lang.in (CXX_OBJS): Add cp/cxx-pretty-print.o + (CXX_PRETTY_PRINT_H): New variable. + (cp/cxx-pretty-print.o): New rule. + (cp/cp-lang.o): Update dependence. + (cp/error.o): Likewise. + + 2003-08-05 Steven Bosscher + + * cp-tree.h (struct lang_decl): Don't include c_lang_decl. + (DECL_DECLARED_INLINE_P): Remove. + * decl2.c (import_export_decl): Only look at DECL_DECLARED_INLINE_P + if decl is a FUNCTION_DECL. This never made sense, but now it is + required to avoid a tree check failure. + * decl.c (grokfndecl): Don't touch DID_INLINE_FUNC. + * optimize.c (maybe_clone_body): Likewise. + + 2003-08-04 Roger Sayle + + * decl.c (cxx_insert_default_attributes): Delete. + * cp-tree.h (cxx_insert_default_attributes): Don't prototype. + * cp-lang.c (LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES): Don't define. + + 2003-08-03 Nathan Sidwell + + PR c++/11704 + * pt.c (type_dependent_expression_p): Cope with COMPONENT_REF with + unknown type. + + PR c++/11766 + * typeck.c (comp_ptr_ttypes_real): Don't loop on pointers to + member functions. + + 2003-08-02 Nathan Sidwell + + PR c++/9447 + * cp-tree.def (USING_DECL): Document its type. + * class.c (pushclass): If we're entering a template, push any + dependent using decls it has. + * decl2.c (do_class_using_decl): Refactor. Type is NULL iff it is + a dependent scope. + * pt.c (tsubst_decl) : Set type. + (tsubst): Remove USING_DECL checks. + (type_dependent_expression_p): Remove USING_DECL case. + * semantics.c (finish_member_declaration): A USING_DECL's type + indicates whether it is dependent. + + 2003-08-02 Nathan Sidwell + + * cp-tree.h (pushclass): Remove unneeded parameter. + * class.c (pushclass): Remove unneeded MODIFY parm. Adjust. + (push_nested_class): Adjust pushclass call. + * pt.c (instantiate_class_template): Likewise. + * semantics.c (begin_class_definition): Likewise. + + 2003-08-01 Nathanael Nerode + + * typeck2.c (add_exception_specifier): Use 'bool' where appropriate. + + 2003-08-01 Mark Mitchell + + PR c++/11697 + * decl.c (decls_match): Don't ignore the types of template + classes. + + PR c++/11744 + * pt.c (tsubst_copy_and_build): Refine Koenig lookup logic. + + 2003-08-01 Kriang Lerdsuwanakij + + PR c++/8442, c++/8806 + * decl.c (qualify_lookup): Accept TEMPLATE_DECL if types are + preferred. + (check_elaborated_type_specifier): Add allow_template_p + parameter. Check tag mismatch and class template. + (xref_tag): Add template_header_p parameter. Add assertion + that name is an IDENTIFIER_NODE. Remove implicit typename + warning. Simplify lookup process if globalize is true. + (cxx_init_decl_processing): Adjust call to xref_tag. + (xref_tag_from_type): Likewise. + * decl2.c (handle_class_head): Likewise. + * parser.c (cp_parser_elaborated_type_specifier, + cp_parser_class_head): Likewise. + * rtti.c (init_rtti_processing, build_dynamic_cast1, + tinfo_base_init, emit_support_tinfos): Likewise. + * class.c (is_base_of_enclosing_class): Remove. + * pt.c (convert_template_argument): Don't accept RECORD_TYPE as + template template argument. + * cp-tree.h (xref_tag): Adjust declaration. + (is_base_of_enclosing_class): Remove. + * NEWS: Document template template argument change. + + 2003-08-01 Nathan Sidwell + + * parser.c (cp_parser_init_declarator, + cp_paser_member_declaration): Reformat. + * pt.c (lookup_template_class, type_unification_real, unify, + type_dependent_expression_p): Reformat. + + PR c++/11295 + * cp-tree.h (tubst_flags_t): Add tf_stmt_expr_cmpd, + tf_stmt_expr_body. + (finish_stmt_expr_expr): Declare. + * parser.c (cp_parser_primary_expression): Tell + cp_parser_compount_statement that it is a statement expression. + (cp_parser_statement, cp_parser_labeled_statement, + cp_parser_compound_statement, cp_parser_statement_seq_opt): Add + in_statement_expr_p parameter. + (cp_parser_expression_statement): Likewise. Call + finish_stmt_expr_expr for final expression of a statement + expression. + (cp_parser_for_init_statement, + cp_parser_implicitly_scoped_statement, + cp_parser_already_scoped_statement, cp_parser_function_definition, + cp_parser_try_block, cp_parser_handled): Adjust. + * pt.c (tsubst_copy) : Pass tf_stmt_expr. + (tsubst_expr): Process tf_stmt_expr and tf_stmt_exprs flags. + (tsubst_expr) : Check tf_stmt_exprs flag. + * semantics.c (finish_expr_stmt): Do not deal with statement + expressions. + (begin_stmt_expr): Clear last_expr_type. + (finish_stmt_expr_expr): New. + (finish_stmt_expr): Process the value expression. + + * typeck.c (build_compound_expr): If RHS is a TARGET_EXPR, put the + compound expr inside the target's initializer. + + PR c++/11525 + * parser.c (cp_parser_primary_expression): Do not set + non-constant-p merely because it is a dependent scope. + + PR c++/9447 + * decl2.c (do_class_using_decl): Set type to NULL_TREE. + * semantics.c (finish_expr_stmt): Do not convert to void in a + template. + + 2003-07-31 Nathan Sidwell + + * pt.c (coerce_template_parms): Refactor. + (fn_type_unification): Increment processing_template_decl when + tsubsting an incomplete set of explicit args. + + PR c++/11347 + * pt.c (instantiate_class_template): Increment + processing_template_decl around the tsubst of a template member + class. + (tsubst_qualified_id): Assert we do not have a dependent scope. + + * pt.c (coerce_template_template_parms, lookup_template_class, + can_complete_type_without_circularity, instantiate_class_template, + tsubst_decl, unify): Reformat. + + 2003-07-31 Jan Hubicka + + * decl2.c (maybe_make_one_only): Use mark_referenced. + * method.c (use_thunk): Likewsie. + + 2003-07-30 Jan Hubicka + + * class.c (build_vtable_entry_ref): Kill. + (build_vtbl_ref_1): Do not call build_vtable_entry_ref. + (build_vfn_ref): Do not call build_vtable_entry_ref. + * cp-lang.c (LANG_HOOKS_PREPARE_ASSEMBLE_VARIABLE): Kill. + * cp-tree.h (prepare_assemble_variable): Kill. + * cp-decl.c (prepare_assemble_variable): Kill. + + 2003-07-29 Geoffrey Keating + + * parser.c (cp_lexer_new_main): Use c_common_no_more_pch instead + of setting valid_pch by hand. + + 2003-07-29 Rainer Orth + + * decl.c (finish_enum): Initialize underlying_type. + + 2003-07-29 Nathan Sidwell + + PR c++/9447 + * decl.c (add_binding): Add bval local variable. + (push_class_level_binding): Likewise. Allow a USING_DECL to be + pushed. + * decl2.c (do_class_using_decl): The type of a using decl is + unknown. + * parser.c (cp_parser_postfix_expression): Refactor unqualified-id + function call lookup code. + * pt.c (tsubst): A USING_DECL will have unknown type. + (tsubst_copy_and_build): Allow a using decl. + (type_dependent_expression_p): A USING_DECL will make it + dependent. + * semantics.c (finish_member_declaration): Push a dependent using + declaration. + + 2003-07-28 Mark Mitchell + + PR c++/11530 + * parser.c (cp_parser_postfix_expression): Do not call mark_used. + * semantics.c (finish_id_expression): Call mark_used for all + declarations. + + 2003-07-28 Mark Mitchell + + PR c++/11667 + * call.c (standard_conversion): Allow all integral->enumeral + conversions, after marking them as bad. + * decl.c (finish_enum): Make sure that all enumerators are + properly converted to the underlying type. + (build_enumerator): Set DECL_CONTEXT for namespace-scope + enumeration types. + * pt.c (tsubst_copy): Adjust handling of CONST_DECLs accordingly. + (tsubst_enum): Tidy. + + * Make-lang.in (typeck.o): Depend on convert.h. + (class.o): Likewise. + (rtti.o): Likewise. + * call.c: Include convert.h. + (convert_arg_to_ellipsis): Use convert_to_real. + * class.c: Include convert.h. + (build_base_path): Use convert_to_integer. + * rtti.c: Include convert.h. + (build_headof): Use convert_to_integer. + * typeck.c: Include convert.h. + (decay_conversion): Use convert_to_integer. + (build_unary_op): Use build_nop. + (get_delta_difference): Use convert_to_integer. + (build_ptrmemfunc): Avoid unnecessary conversions. + + 2003-07-28 Jan Hubicka + + * decl2.c (mark_member_pointers): Verify that member pointer points to + the function. + + 2003-07-28 Nathan Sidwell + + * cp-tree.h (begin_compound_stmt): No scope arg is a bool. + (finish_compound_stmt): Remove no scope arg. + * decl.c (register_dtor_fn): Adjust begin_compound_stmt and + end_compound_stmt calls. + (expand_static_init, begin_destructor_body, begin_function_body, + finish_function_body): Likewise. + * decl2.c (start_objects, finish_objects, + start_static_storage_duration_function, + finish_static_storage_duration_function): Likewise. + * init.c (begin_init_stmts, finish_init_stmts, + construct_virtual_base, build_vec_init): Likewise. + * method.c (do_build_assign_ref, synthesize_method): Likewise. + * parser.c (cp_parser_compound_statement, + cp_parser_implicitly_scoped_statement, + cp_parser_already_scoped_statement): Likewise. + * pt.c (tsubst_expr): Likewise. + * semantics.c (begin_compound_stmt): No scope arg is a bool. + (finish_compound_stmt): Remove no scope arg. + + * error.c (dump_expr) : A compound expr is + always dyadic. + + 2003-07-27 Mark Mitchell + + * call.c (standard_conversion): Tweak handling of + pointer-to-member types. + * pt.c (tsubst): Correctly qualify pointers-to-data member types. + * typeck.c (comp_ptr_ttypes_real): Check qualifiers on + pointer-to-data member types. + + 2003-07-27 Nathan Sidwell + + * parser.c (cp_parser_type_parameter): Reformat. + (cp_parser_parameter_declaration): Deprecate default args where + not allowed. + + 2003-07-26 Nathan Sidwell + + * cfns.h: Rebuilt. + + * cp-tree.h (begin_init_stmts, finish_init_stmts): Remove. + (begin_global_stmt_expr, finish_global_stmt_expr): Remove. + * init.c (begin_init_stmts): Make static. Return is_global + value. Always call begin_stmt_expr. + (finish_init_stmts): Make static. Add is_global parm. Always + building a stmt tree. + (build_aggr_init): Adjust begin_init_stmts, finish_init_stmts calls. + (build_vec_init): Likewise. Always building a stmt tree. + (expand_default_init): Always building a stmt tree. + (get_temp_regvar): Likewise. + * semantics.c (begin_global_stmt_expr, + finish_global_stmt_expr): Remove. + + 2003-07-25 Nathan Sidwell + + * cp-tree.h (build_compound_expr): Take LHS & RHS args. + (build_x_compound_expr_from_list): Declare. + * typeck.c (build_x_compound_expr_from_list): New. + (build_x_compound_expr): Adjust. + (build_compound_expr): Remove unreachable code. Take two + parameters, adjust. + * decl.c (grok_reference_init): Use + build_x_compound_expr_from_list. + (expand_static_init): Adjust build_compound_expr call. + (cxx_maybe_build_cleanup): Likewise. + * init.c (perform_member_init): Use + build_x_compound_expr_from_list. + (build_new_1): Likewise. + (build_vec_delete): Adjust build_compound_expr calls. + (build_vbase_delete): Likewise. + * typeck2.c (store_init_value): Use + build_x_compound_expr_from_list. + (build_functional_cast): Likewise. + + 2003-07-25 Nathan Sidwell + + * cp-tree.h (enum tsubst_flags_t): Add tf_user. + * decl.c (make_typename_type): Pass it. + * pt.c (lookup_template_class): Use it. + (resolve_typename_type): Pass it. + * semantics.c (finish_template_type): Pass it. + + 2003-07-25 Nathan Sidwell + + PR c++/11617 + * cp-tree.h (qualified_name_lookup_error): Declare. + * pt.c (tsubst_qualified_id): Use qualified_name_lookup_error for + errors. + (tsubst_expr) : Likewise. + (tsubst_copy_and_build) : Likewise. + * semantics.c (qualified_name_lookup_error): New, broken out of ... + (finish_id_expression): ... here. Use it. + + 2003-07-25 Falk Hueffner + + * cfns.gperf: Add '%%' delimiter to placate gperf 3.0. + + 2003-07-25 Nathan Sidwell + + PR c++/11596 + * pt.c (maybe_fold_nontype_arg, maybe_fold_nontype_args): Remove. + (tsubst_template_arg): New. + (tsubst_template_arg_vector): Rename to ... + (tsubst_template_args): ... this. Accept a TREE_LIST form. Use + tsubst_template_arg. + (coerce_template_parms): Use tsubst_template_arg for default + value. + (tsubst_template_parms): Likewise. + (tsubst_aggr_type): Adjust. + (tsubst_decl): Likewise. + (tsubst): Use tsubst_template_arg for a DOMAIN. Adjust. + (tsubst_copy) : Use tsubst_template_args. + + 2003-07-25 Gabriel Dos Reis + + * Make-lang.in (cp/error.o): Depend on DIAGNOSTIC_H. + * error.c: Use the new pretty-printer framework. + + 2003-07-24 Per Bothner + + * decl.c (pushdecl_class_level): Don't use push_srcloc/pop_srcloc + which causes errors messages to incorrectly mention included files. + + 2003-07-24 Mark Mitchell + + * cp-tree.h (convert_to_base_statically): Declare. + * call.c (build_special_member_call): Convert INSTANCE to the base + type. + * class.c (convert_to_base_statically): New method. + * init.c (construct_virtual_base): Use it. + * method.c (do_build_assign_ref): Fix typo in comment. + + 2003-07-24 Jason Merrill + + * decl.c: Just set truthvalue_* to boolean_*. + + 2003-07-24 Nathan Sidwell + + * decl.c (reshape_init): Remove unreachable code. + + 2003-07-24 Kriang Lerdsuwanakij + + PR c++/11513 + * cp-tree.h (PROCESSING_REAL_TEMPLATE_DECL_P): Use current_scope. + + 2003-07-23 Mark Mitchell + + PR c++/11645 + * cp-tree.h (accessible_base_p): Declare. + * call.c (build_over_call): Use it. + * search.c (accessible_base_p): New function, split out from ... + (lookup_base): ... here. + + PR c++/11517 + * call.c (build_conditional_expr): Use perform_implicit_conversion + and error_operand_p. Robustify. + * typeck.c (build_unary_op): Use perform_implicit_conversion. + + 2003-07-23 Nathan Sidwell + + PR c++/10953 + * parser.c (cp_parser_nested_name_specifier): Reset scope on + failure. + (cp_parser_elaborated_type_specifier): Likewise. + + 2003-07-22 Mark Mitchell + + Eliminate use of POINTER_TYPE for pointers-to-members. + * call.c (standard_conversion): Rework pointer-to-member handling. + Add comments. + (add_builtin_candidate): Likewise. + (resolve_scoped_fn_name): Remove. + (build_conditional_expr): Rework pointer-to-member handling. + (compare_ics): Likewise. + * class.c (check_field_decls): Use TYPE_PTR_P. + * cp-lang.c (cp_var_mod_type_p): Rework pointer-to-member + handling. + * cp-tree.h (SCALAR_TYPE_P): Use TYPE_PTR_TO_MEMBER_P. + (TYPE_PTRMEM_P): Add comment. + (TYPE_PTR_P): Simplify. + (TYPE_PTROB_P): Correct definition. + (TYPE_PTR_TO_MEMBER_P): New macro. + (TYPE_PTRMEM_CLASS_TYPE): Adjust. + (TYPE_PTRMEM_POINTED_TO_TYPE): Likewise. + (resolved_scoped_fn_name): Remove declaration. + (build_offset_ref): Change prototype. + (resolve_offset_ref): Remove. + (comp_target_types): Remove. + * cvt.c (cp_convert_to_pointer): Rework pointer-to-member + handling. + (convert_to_reference): Use can_convert. + (ocp_convert): Improve error handling. Rework pointer-to-member + handling. + (perform_qualification_conversions): Rework pointer-to-member + handling. + * decl.c (build_ptrmem_type): Handle functions too. + (create_array_type_for_decl): Remove OFFSET_TYPE error message. + (grokdeclarator): Use OFFSET_TYPE for pointers to data members. + (grokparms): Remove OFFSET_TYPE error message. + * dump.c (cp_dump_tree): Rework pointer-to-member handling. + * error.c (dump_type_prefix): Likewise. + * expr.c (cplus_expand_constant): Use build_nop. + * init.c (build_offset_ref): Add address_p parameter. Fold in + necessary bits from resolve_offset_ref. + (resolve_offset_ref): Remove. + * parser.c (cp_parser_postfix_expression): Remove special case + code for OFFSET_TYPE. + * pt.c (convert_nontype_argument): Rework pointer-to-member + handling. + (convert_template_argument): Likewise. + (unify): Likewise. + (invalid_nontype_parm_type_p): Likewise. + (dependent_type_p_r): Likewise. + * rtti.c (get_tinfo_decl): Remove OFFSET_TYPE special case. + (target_incomplete_p_): Rework pointer-to-member + handling. + (get_pseudo_ti_init): Likewise. + (get_pseudo_ti_desc): Likewise. + * semantics.c (finish_qualified_id_expr): Adjust call to + build_offset_ref. Remove use of resolve_offset_ref. + * tree.c (pod_type_p): Use TYPE_PTR_TO_MEMBER_P. + * typeck.c (target_type): Use TYPE_PTRMEM_P. + (type_unknown_p): Remove obsolete code about the time before + non-dependent expressions were handled correctly. + (qualify_type_recursive): Remove. + (composite_pointer_type_r): New function. + (composite_pointer_type): Use it. + (merge_types): Remove dead comments. + (comp_cv_target_types): Remove. + (comp_target_types): Likewise. + (comp_target_parms): Likewise. + (cxx_sizeof_or_alignof_type): Remove OFFSET_TYPE error. + (build_indirect_ref): Use TYPE_PTR_TO_MEMBER_P. + (build_binary_op): Do not use of comp_target_types. + (pointer_diff): Remove OFFSET_TYPE case. + (build_unary_op): Adjust pointer-to-member handling. + (unary_complex_lvalue): Likewise. + (check_for_casting_away_constness): Add description parameter. + (build_static_cast): Pass it. + (build_reinterpret_cast): Use check_for_casting_away_constness. + (build_const_cast): Adjust pointer-to-member handling. + (build_c_cast): Likewise. + (convert_for_assignment): Remove OFFSET_TYPE error message. + (comp_ptr_ttypes_real): Adjust pointer-to-member handling. + (comp_ptr_ttypes_reinterpret): Remove. + (casts_away_constness_r): Adjust pointer-to-member handling. + (casts_away_constness): Liekwise. + (strip_all_pointer_quals): Remove. + * typeck2.c (digest_init): Adjust pointer-to-member handling. + (build_m_component_ref): Likewise. + + 2003-07-22 Wolfgang Bangerth + + * lex.c (unqualified_fn_lookup_error): Mention that the error + message needs to be kept in synch with the manual. + + 2003-07-22 Nathan Sidwell + + PR c++/11614 + * decl.c (grokdeclarator): An array member is only a flexible + array member if the field itself is the array. + + 2003-07-22 Kriang Lerdsuwanakij + + PR c++/10793 + * decl.c (xref_basetypes): Handle error_mark_node. + + 2003-07-22 Nathan Sidwell + + * cp-tree.h (enum cp_lvalue_kind): Add clk_packed. + * tree.c (lvalue_p_1): Set it. + * class.c (check_field): Don't allow non-packed non-POD fields to + be packed. + * call.c (reference_binding): Need a temporary for all bitfield + and packed fields. + (convert_like_real): Check it is ok to make a temporary here. + + 2003-07-21 Nathan Sidwell + + * cp-tree.h (hack_identifier): Remove. + * method.c (hack_identifier): Remove. + * semantics.c (finish_id_expression): Expand hack_identifier + here. Simplify. + + 2003-07-19 Kaveh R. Ghazi + + * call.c class.c decl.c decl2.c g++spec.c lex.c parser.c pt.c rtti.c + semantics.c typeck.c: Remove unnecessary casts. + + 2003-07-18 Nathan Sidwell + + * cp-tree.h (hack_identifier): Remove. + * method.c (hack_identifier): Remove. + * semantics.c (finish_id_expression): Expand hack_identifier + here. Simplify. + + 2003-07-18 Nathan Sidwell + + * cp-tree.h (finish_non_static_data_member): Add object param. + * method.c (hack_identifier): Adjust. + * pt.c (tsubst_copy_and_build) : Don't search + again for a FIELD_DECL. + * semantics.c (finish_non_static_data_member): Add object + parameter. Always save the DECL in the COMPONENT_REF. + * call.c (resolve_scoped_fn_name): Adjust. + + 2003-07-17 Zack Weinberg + + * pt.c (get_bindings): Make definition consistent with + forward declaration. + + 2003-07-17 Kriang Lerdsuwanakij + + PR c++/7809 + * friend.c (add_friend): Check access for member functions + and templates. + + 2003-07-17 Gabriel Dos Reis + + PR c++/10668 + * typeck.c (build_class_member_access_expr): Improve diagnostic. + + 2003-07-16 Mark Mitchell + + PR c++/11547 + * cp-tree.h (DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P): New + macro. + (DECL_PRETTY_FUNCTION_P): Use VAR_DECL_CHECK. + * decl.c (duplicate_decls): Merge + DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P. + * parser.c (cp_parser_postfix_expression): Adjust call to + cp_parser_initializer_list and + cp_parser_parenthesized_expression_list. + (cp_parser_parenthesized_expression_list): Add non_constant_p. + (cp_parser_new_placement): Adjust call to + cp_parser_parenthesized_expression_list. + (cp_parser_direct_new_declarator): Likewise. + (cp_parser_conditional_expression): Remove. + (cp_parser_constant_expression): Parse an assignment-expression, + not a conditional-expression. + (cp_parser_simple_declaration): Resolve expression/declaration + ambiguity more quickly. + (cp_parser_mem_initializer): Adjust call to + cp_parser_parenthesized_expression_list. + (cp_parser_init_declarator): Keep track of whether or not the + initializer is a constant-expression. + (cp_parser_initializer): Add non_constant_p parameter. + (cp_parser_initializer_clause): Likewise. + (cp_parser_initializer_list): Likewise. + (cp_parser_attribute_list): Adjust call to + cp_parser_parenthesized_expression_list. + (cp_parser_functional_cast): Likewise. + * pt.c (tsubst_decl): Copy + DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P. + (tsubst_expr): Tweak use of DECL_PRETTY_FUNCTION_P. + * semantics.c (finish_id_expression): Use + DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P. + + 2003-07-16 Neil Booth + + * lang-options.h: Remove. + + 2003-07-16 Andrew Pinski + + PR c/10962 + * class.c (field_decl_cmp): Remove. + (resort_field_decl_cmp): Remove. + (resort_sorted_fields): Remove. + (add_fields_to_vec): Rename to ... + (add_fields_to_record_type): this. + (finish_struct_1): Change to be using + sorted_fields_type's fields. + * cp-tree.h (lang_decl): In lang_decl_u3 + change sorted_fields to be a pointer to + sorted_fields_type. + (resort_sorted_fields): Remove prototype. + * search.c (lookup_field_1): Change to be using + sorted_fields_type's fields. + + 2003-07-16 Kriang Lerdsuwanakij + + PR c++/5421 + * decl.c (grokdeclarator): Handle TEMPLATE_ID_EXPR if friend + is a member of other class. + * friend.c (do_friend): Don't build TEMPLATE_DECL if friend + is a specialization of function template. + + 2003-07-16 Gabriel Dos Reis + + PR c++/10903 + * pt.c (convert_nontype_argument): Fix thinko in diagnostic. + Improve. + + 2003-07-15 Mark Mitchell + + * cp-tree.def (LOOKUP_EXPR): Remove. + * cp-tree.h (cp_id_kind): Add CP_ID_KIND_UNQUALIFIED_DEPENDENT. + (LOOKUP_EXPR_GLOBAL): Remove. + (get_bindings): Remove. + (is_aggr_type_2): Remove. + * call.c (resolved_scoped_fn_name): Remove support for + LOOKUP_EXPR. + * decl.c (grokfndecl): Likewise. + (grokdeclarator): Likewise. + * error.c (dump_decl): Likewise. + (dump_expr): Likewise. + * friend.c (do_friend): Likewise. + * init.c (build_offset_ref): Likewise. + * lex.c (unqualified_fn_lookup_error): Use pedwarn. Do not create + LOOKUP_EXPRs + * mangle.c (write_expression): Remove support for LOOKUP_EXPR. + * parser.c (cp_parser_postfix_expression): Modify Koenig lookup + test. + * pt.c (get_bindings): Give it internal linkage. + (check_explicit_specialization): Remove support for LOOKUP_EXPR. + (lookup_template_function): Likewise. + (for_each_tempalte_parm_r): Likewise. + (tsubst_decl): Likewise. + (tsubst_qualified_id): Handle template template parameters. + (tsubst_copy): Remove support for LOOKUP_EXPR. + (tsubst_copy_and_build): Likewise. + (most_general_template): Likewise. + (value_dependent_expression_p): Likewise. + (type_dependent_expression_p): Note that IDENTIFIER_NODEs are + always dependent. + * semantics.c (perform_koenig_lookup): Do not create + IDENTIFIER_NODEs. + (finish_fname): Likewise. + (finish_id_expression): Likewise. + * tree.c (is_aggr_type_2): Remove. + + 2003-07-16 Gabriel Dos Reis + + PR c++/11531 + * typeck.c (check_return_expr): Fix thinko in diagnostic. + + 2003-07-15 Kriang Lerdsuwanakij + + PR c++/10108 + * pt.c (tsubst_decl) : Add a check for + error_mark_node. + + 2003-07-14 Mark Mitchell + + PR c++/11509 + * pt.c (dependent_scope_ref_p): New function. + (value_dependent_expression_p): Use it. + (type_dependent_expression_p): Likewise. + + * pt.c (tsubst_friend_function): Use reregister_specialization. + + PR c++/7019 + * cp-tree.h (lookup_qualified_name): Adjust prototype. + * decl.c (lookup_qualified_name): Add complain parameter. Adjust + call to is_aggr_type. + * parser.c (cp_parser_lookup_name): Adjust call to + lookup_qualified_name. + * pt.c (tsubst_qualified_id): Likewise. + (tsubst_copy_and_build): Likewise. + * semantics.c (finish_qualified_id_expr): Deal with erroneous + expressions. + + 2003-07-14 Gabriel Dos Reis + + PR c++/11510 + * call.c (op_error): Properly format REALPART_EXPR and + IMAGPART_EXPR. + * error.c (dump_expr): Likewise. + + 2003-07-14 Gabriel Dos Reis + + * error.c (dump_expr): Handle EMPTY_CLASS_EXPR. + + 2003-07-14 Gabriel Dos Reis + + PR c++/5293 + * call.c (initialize_reference): Improve diagnostic. + + 2003-07-14 Kriang Lerdsuwanakij + + PR c++/11154 + * pt.c (more_specialized_class): Add full_args parameter. + (most_specialized_class): Adjust calls to more_specialized_class. + * cp-tree.h (more_specialized_class): Adjust declaration. + + 2003-07-14 Dan Nicolaescu + + * lex.c (enum tree_node_kind): Delete. + + 2003-07-13 Mark Mitchell + + PR c++/11503 + * cp-tree.h (DECL_SELF_REFERENCE_P): New macro. + (SET_DECL_SELF_REFERENCE_P): Likewise. + * class.c (build_self_reference): Use SET_DECL_SELF_REFERENCE_P. + * pt.c (tsubst_decl): Copy it. + * search.c (lookup_base): Use DECL_SELF_REFERENCE_P. + + * pt.c (reregister_specialization): Fix thinko in previous change. + + * cp-tree.h (cp_id_kind): New type. + (unqualified_name_lookup_error): Change prototype. + (unqualified_fn_lookup_error): New function. + (do_identifier): Remove. + (do_scoped_id): Likewise. + (tsubst_copy_and_build): Change prototype. + (reregister_specialization): New function. + (perform_koenig_lookup): Likewise. + (finish_id_expression): Likewise. + * call.c (build_method_call): Adjust call to + unqualified_name_lookup_error. + * decl.c (duplicate_decls): Use reregister_specialization. + * lex.c (is_global): Remove. + (unqualified_name_lookup_error): Return a value. + (do_identifier): Remove. + (do_scoped_id): Likewise. + (identifier_typedecl_value): Remove. + (unqualified_fn_lookup_error): New function. + * parser.c (cp_parser_id_kind): Remove. + (cp_parser_non_constant_id_expression): Remove. + (cp_parser_primary_expression): Use finish_id_expression. + (cp_parser_class_or_namespace_name): Use cp_id_kind, not + cp_parser_id_kind. + (cp_parser_postfix_expression): Use perform_koenig_lookup. + (cp_parser_template_argument): Use cp_id_kind. + (cp_parser_fold_non_dependent_expr): Adjust call to + tsubst_copy_and_build. + * pt.c (unregister_specialization): Rename to ... + (reregister_specialization): This. + (tsubst_friend_function): Use it. + (maybe_fold_nontype_arg): Adjust call to tsubst_copy_and_build. + (tsubst_qualified_id): Likewise. + (tsubst_expr): Likewise. + (tsubst_copy_and_build): Add function_p parameter. Use + finish_id_expression. Introduce RECUR macro. + (tsubst_non_call_postfix_expression): New function. + (regenerate_decl_from_template): Use reregister_specialization. + * semantics.c (perform_koenig_lookup): New function. + (finish_id_expression): Likewise. + + 2003-07-13 Kriang Lerdsuwanakij + + * pt.c (push_access_scope_real): Remove. + (push_access_scope): Move code from push_access_scope_real. + (pop_access_scope): Don't check for TEMPLATE_DECL. + (instantiate_template): Defer access checking during template + substitution. + (regenerate_decl_from_template): Tidy. + + 2003-07-11 Nathanael Nerode + + PR c++/11437 + * operators.def: Add definitions for __imag__, __real__. + + 2003-07-11 Nathan Sidwell + + PR c++/11050 + * parser.c (cp_parser_expression_list): Rename to ... + (cp_parser_parenthesized_expression_list): ... here. Add attribute + parameter, parse the surounding parentheses. + (cp_parser_skip_to_closing_parenthesis): Add recover and or_comma + parameters. Return int. + (cp_parser_skip_to_closing_parenthesis or comma): Remove. + (cp_parser_postfix_expression): Adjust function call parsing. + (cp_parser_new_placement): Adjust. + (cp_parser_new_initializer): Likewise. + (cp_parser_cast_expression): Likewise. + (cp_parser_selection_statement): Likewise. + (cp_parser_mem_initializer): Likewise. + (cp_parser_asm_definition): Likewise. + (cp_parser_init_declarator): Likewise. + (cp_parser_declarator): Make + cdtor_or_conv_p an int ptr. + (cp_parser_direct_declarator): Likewise. Check for a parameter + list on cdtors & conv functions. + (cp_parser_initializer): Adjust. + (cp_parser_member_declaration): Adjust. + (cp_parser_attribute_list): Move code into + cp_parser_parens_expression_list. + (cp_parser_functional_cast): Adjust. + * pt.c (type_dependent_expression_p): Erroneous expressions are + non-dependent. + + 2003-07-11 Geoffrey Keating + + * decl.c (cp_finish_decl): Handle 'used' attribute. + + * cp-lang.c (c_reset_state): New dummy routine. + * cp-tree.h (finish_file): Move prototype to c-common.h. + * parser.c (c_parse_file): Rename from yyparse; don't call finish_file. + + 2003-07-11 Mark Mitchell + + PR c++/8327 + * pt.c (tsubst_qualified_id): Implement suggested resolution for + Core Issue 2. + (type_dependent_expression_p): Likewise. + + 2003-07-10 Mark Mitchell + + * typeck.c (build_binary_op): Do not warn about signed + vs. unsigned comparisons in the bodies of templates. + + PR c++/9411 + * parser.c (cp_parser_postfix_expression): Check dependency of + functions. + + 2003-07-09 Mark Mitchell + + PR c++/10032 + * decl.c (cxx_init_decl_processing): With -pedantic, pedwarns are + still errors. + + PR c++/10527 + * error.c (decl_to_string): Do not print default argument + expressions. + + * cp-tree.h (break_out_calls): Remove declaration. + * tree.c (break_out_calls): Remove. + * typeck.c (build_modify_expr): Avoid invalid sharing of trees. + + 2003-07-09 Nathan Sidwell + + PR c++ 9483 + * class.c (check_field_decls): Pass DECL_NAME to constructor_name_p. + * decl2.c (constructor_name_p): Avoid repeated constructor_name + calls. + * decl.c (grokdeclarator): Refactor ctor/dtor detection. + + 2003-07-09 Mark Mitchell + + * typeck.c (build_x_unary_op): Take note of the fact that + PREINCREMENT_EXPR and POSTINCREMENT_EXPR are binary operations on + trees. + + * parser.c (cp_parser_primary_expression): Preserve the form of + qualified expressions in templates, even if they are not + dependent. + * pt.c (convert_nontype_argument): Handle non-dependent SCOPE_REFs. + (tsubst_qualified_id): Likewise. + * search.c (accessible_p): Treat everything in the body of a + template as accessible. + + 2003-07-08 Mark Mitchell + + * cp-tree.def (NON_DEPENDENT_EXPR): New node. + * cp-tree.h (build_call_from_tree): Remove. + (build_member_call): Likewise. + (dependent_template_arg_p): Remove. + (any_dependent_template_arguments_p): New function. + (dependent_template_id_p): Likewise. + (any_type_dependent_arguments_p): Likewise. + (build_non_dependent_expr): Likewise. + (build_non_dependent_args): Likewise. + (build_x_compound_expr): Adjust prototype. + * call.c (build_new_method_call): Handle non-dependent expressions + correctly. + * decl2.c (grok_array_decl): Likewise. + (build_offset_ref_call_from_tree): Likewise. + (build_call_from_tree): Remove. + * error.c (dump_decl): Handle NON_DEPENDENT_EXPR. + (dump_expr): Likewise. + * init.c (build_member_call): Remove. + * mangle.c (write_expression): Update handling for template-ids. + * parser.c (cp_parser_primary_expression): Use + any_dependent_template_arguments_p. Update constant-expression + handling. + (cp_parser_postfix_expression): Use + any_type_dependent_arguments_p. Simplify call processing. + (cp_parser_unary_expression): Simplify. + (cp_parser_expression): Adjust for changes to + build_x_compound_expr. + (cp_parser_template_argument): Implement standard-conforming + parsing of non-type template arguments. + (cp_parser_direct_declarator): Use + cp_parser_fold_non_dependent_expr. + (cp_parser_fold_non_dependent_expr): New function. + (cp_parser_next_token_ends_template_argument_p): Likewise. + * pt.c (convert_template_argument): Do not call + maybe_fold_nontype_arg. + (tsubst_baselink): Likewise. + (tsubst_copy_and_build): Share common code. Make sizeof/alignof + processing work correctly for non-dependent expressions. Adjust + handling of COMPOUND_EXPR. Simplify call processing. + (value_dependent_expression_p): Deal with functional casts and + sizeof/alignof correctly. + (type_dependent_expression_p): Handle overloaded functions. + (any_type_dependent_arguments_p): New function. + (any_dependent_template_arguments_p): Likewise. + (dependent_template_p): Treat SCOPE_REFs as dependent. + (dependent_template_id_p): Simplify. + (build_non_dependent_expr): New function. + (build_non_dependent_args): Likewise. + * semantics.c (finish_stmt_expr): Don't make dependent + statement-expresions have void type. + (finish_call_expr): Handle non-dependent expressions + correctly. + * tree.c (lvalue_p_1): Treat NON_DEPENDENT_EXPRs as lvalues. + * typeck.c (cxx_sizeof_or_alignof_type): Give the expression + type size_t, even in templates. + (expr_sizeof): Likewise. + (finish_class_member_access_expr): Handle non-dependent expressions + correctly. + (build_x_indirect_ref): Likewise. + (build_x_binary_op): Likewise. + (build_x_unary_op): Likewise. + (build_x_conditional_expr): Likewise. + (build_x_compound_expr): Likewise. + * typeck2.c (build_x_arrow): Likewise. + + 2003-07-09 Jan Hubicka + + * cp-lang.c (LANG_HOOKS_TREE_INLINING_ESTIMATE_NUM_INSNS): New. + * decl.c (duplicate_decls): Use DECL_ESTIMATED_INSNS. + (start_function): Use DECL_ESTIMATED_INSNS. + * optimize.c (maybe_clone_body): Use DECL_ESTIMATED_INSNS. + + * decl2.c (maybe_emit_vtables): Fix marking vtables as needed in + unit-at-a-time + + 2003-07-08 Kriang Lerdsuwanakij + + PR c++/11030 + * pt.c (instantiate_class_template): Don't call xref_tag to + inject name when the friend class is a specialization. + + 2003-07-07 Mark Mitchell + + * cp-tree.h (build_scoped_method_call): Remove. + (lookup_qualified_name): Remove parameter. + (tsubst_copy_and_build): Declare. + (finish_qualified_object_call_expr): Remove. + (check_accessibility_of_qualified_id): New function. + (finish_qualified_id_expr): Likewise. + (non_reference): Likewise. + (build_expr_from-tree): Remove. + * call.c (non_reference): Remove. + (build_scoped_method_call): Likewise. + (build_method_call): Use error_operand_p. Assert that we are not + processing a template. + (standard_conversion): Use non_reference. + * class.c (build_vtbl_entry_ref): Likewise. + (build_vtbl_ref_1): Likewise. + * cvt.c (build_expr_type_conversion): Use non_reference. + * decl.c (lookup_qualified_name): Remove flags parameter. + (grok_op_properties): Use non_reference. + * decl2.c (grok_array_decl): Likewise. + (build_expr_from_tree): Remove. + (build_offset_ref_call_from_tree): Update comment. + * error.c (parm_to_string): Call reinit_global_formatting_buffer. + * except.c (prepare_eh_types): Use non_reference. + (can_convert_eh): Likewise. + * init.c (build_dtor_call): Avoid using build_method_call. + * mangle.c (write_template_param): Remove misleading comment. + * method.c (locate_copy): Use non_reference. + * parser.c (cp_parser_scope_through_which_access_occurs): Remove. + (cp_parser_primary_expression): Do not create SCOPE_REFs is + non-dependent contexts. + (cp_parser_postfix_expression): Use finish_qualified_id_expr. + (cp_parser_direct_declarator): Use tsubst_copy_and_build, not + build_expr_from_tree. + (cp_parser_lookup_name): Adjust call to lookup_qualified_name. + Use check_accessibility_of_qualified_id. + * pt.c (maybe_fold_nontype_arg): Use tsubst_copy_and_build, not + build_expr_from_tree. + (tsubst_baselink): New function. + (tsubst_qualified_id): Likewise. + (tsubst_copy): Use them. Remove support for METHOD_CALL_EXPR. + (tsubst_expr): Adjust call to lookup_qualified_name. + (tsubst_copy_and_build): Handle SCOPE_REFs specially. Adjust + handling of CALL_EXPRs. + (value_dependent_expression_p): Use INTEGRAL_OR_ENUMERATION_TYPE_P. + * rtti.c (get_tinfo_decl_dynamic): Use non_reference. + * search.c (check_final_overrider): Likewise. + * semantics.c (check_accessibility_of_qualified_id): New function. + (finish_qualified_object_call_expr): Remove. + * typeck.c (target_type): Use non_reference. + (cxx_sizeof_or_alignof_type): Likewise. + (dubious_conversion_warnings): Likewise. + (convert_for_initialization): Likewise. + (non_reference): New function. + + 2003-07-07 Kaveh R. Ghazi + + * decl.c (print_binding_level, print_other_binding_stack, + print_binding_stack): Merge uses of HOST_PTR_PRINTF with adjacent + stdio calls. + * ptree.c (cxx_print_decl, cxx_print_binding): Likewise. + + 2003-07-07 Andreas Jaeger + + * friend.c: Convert to ISO C90 prototypes. + + * Make-lang.in ($(srcdir)/cp/cfns.h): Use ANSI-C as output + language. + * cfns.h: Regenerate. + + * typeck.c: Convert remaining prototypes to ISO C90. + * search.c: Likewise. + + * decl2.c (build_expr_from_tree): Convert prototype to ISO C90. + * semantics.c (expand_or_defer_fn): Likewise + * mangle.c (discriminator_for_string_literal): Likewise. + * g++spec.c (lang_specific_driver): Likewise. + + * search.c (lookup_base_r): Remove unused variable. + + 2003-07-07 Nathan Sidwell + + * semantics.c: (genrtl_try_block) Adjust emit_line_note + calls. + + 2003-07-07 Andreas Jaeger + + * search.c (lookup_base_r): Remove unused variable. + + 2003-07-06 Michael Chastain + + PR debug/10055 + * lex.c (cxx_init): Call push_srcloc and pop_srcloc rather than + assigning to input_filename directly. + + 2003-07-06 Kazu Hirata + + * call.c: Fix comment formatting. + * class.c: Likewise. + * cp-tree.h: Likewise. + * decl.c: Likewise. + * decl2.c: Likewise. + * error.c: Likewise. + * method.c: Likewise. + * name-lookup.c: Likewise. + * parser.c: Likewise. + * pt.c: Likewise. + * rtti.c: Likewise. + * search.c: Likewise. + * typeck.c: Likewise. + + 2003-07-06 Mark Mitchell + + PR c++/11345 + * search.c (lookup_base_r): Remove is_non_public and + within_current_scope parameters. Remove other dead code. + (lookup_base): Adjust call to lookup_base_r. + (adjust_result_of_qualified_name_lookup): Improve comment. + * semantics.c (finish_call_expr): Use maybe_dummy_object. + + 2003-07-06 Neil Booth + + * cp-lang.c (LANG_HOOKS_HANDLE_FILENAME, + LANG_HOOKS_MISSING_ARGUMENT): Override. + + 2003-07-05 Mark Mitchell + + PR c++/11431 + * typeck.c (build_static_cast): Check for reference conversions + earlier. + + 2003-07-04 Mark Mitchell + + * cp-tree.h (perform_integral_promotions): Declare. + * call.c (build_addr_func): Use decay_conversion. + (convert_arg_to_ellipsis): Likewise. Remove misleading comment. + (convert_for_arg_passing): Use perform_integral_promotions. + * cvt.c (build_expr_type_conversion): Use decay_conversion. + (type_promotes_to): Do not return a cv-qualified type. + * decl.c (grok_reference_init): Fix formatting. + (get_atexit_node): Use decay_conversion. + (build_enumerator): Use perform_integral_promotions. + * init.c (build_vec_init): Use decay_conversion. + * semantics.c (finish_expr_stmt): Likewise. + (finish_switch_cond): Use perform_integral_promotions. + * typeck.c (default_conversion): Likewise. + (perform_integral_promotions): New function. + (build_indirect_ref): Use decay_conversion. + (build_array_ref): Use perform_integral_promotions. + (convert_arguments): Use decay_conversion. + (build_unary_op): Use perform_integral_promotions. + (build_c_cast): Use decay_conversion. + (build_modify_expr): Likewise. + (convert_for_initialization): Likewise. + * typeck2.c (build_x_arrow): Likewise. + + 2003-07-04 Kazu Hirata + + * call.c: Fix comment typos. + * class.c: Likewise. + * cp-tree.h: Likewise. + * cvt.c: Likewise. + * decl2.c: Likewise. + * decl.c: Likewise. + * init.c: Likewise. + * mangle.c: Likewise. + * parser.c: Likewise. + * pt.c: Likewise. + * search.c: Likewise. + * semantics.c: Likewise. + * tree.c: Likewise. + * typeck.c: Likewise. + + 2003-07-04 Zack Weinberg + + * parser.c (cp_lexer_read_token): No need to handle string + constant concatenation. + + 2003-07-03 Kaveh R. Ghazi + + * cp-tree.h (GCC_DIAG_STYLE, ATTRIBUTE_GCC_CXXDIAG): Define. + (cp_error_at, cp_warning_at, cp_pedwarn_at): Mark with + ATTRIBUTE_GCC_CXXDIAG. + + 2003-07-03 Mark Mitchell + + * call.c (build_addr_func): Handle bound pointers-to-members. + (build_method_call): Do not call resolve_offset_ref. + (implicit_conversion): Likewise. + (resolve_scoped_fn_name): Use finish_non_static_data_member, not + resolve_offset_ref. + (resolve_args): Do not call resolve_offset_ref. + (build_conditional_expr): Likewise. + (build_new_method_call): Likewise. + * cp-tree.def (OFFSET_REF): Update documentation. + * cvt.c (cp_convert_to_pointer): Update handling of conversions from + pointers to members to pointers. + (ocp_convert): Do not call resolve_offset_ref. + (convert_to_void): Likewise. + (build_expr_type_conversion): Likewise. + * decl2.c (delete_sanity): Likewise. + * init.c (resolve_offset_ref): Simplify greatly. + (build_vec_delete): Do not call resolve_offset_ref. + * parser.c (cp_parser_postfix_expression): Call resolve_offset_ref + if appropriate. + (cp_parser_unary_expression): Use + cp_parser_simple_cast_expression. + (cp_parser_delete_expression): Likewise. + (cp_parser_cast_expression): Likewise. + (cp_parser_pm_expression): Use cp_parser_binary_op. + (cp_parser_simple_cast_expression): New function. + * rtti.c (build_dynamic_cast_1): Do not call resolve_offset_ref. + * semantics.c (finish_increment_expr): Likewise. + (finish_typeof): Likewise. + * tree.c (lvalue_p_1): Do not handle OFFSET_REF. + * typeck.c (require_complete_type): Do not handle OFFSET_REFs. + (decay_conversion): Do not call resolve_offset_ref. + (finish_class_member_access_expr): Likewise. + (convert_arguments): Likewise. + (build_x_binary_op): Handle DOTSTAR_EXPR. + (condition_conversion): Do not call resolve_offset_ref. + (unary_complex_lvalue): Likewise. + (build_static_cast): Likewise. + (build_reinterpret_cast): Likewise. + (build_const_cast): Likewise. + (build_c_cast): Likewise. + (build_modify_expr): Likewise. + (convert_for_assignment): Likewise. + (convert_for_initialization): Likewise. + * typeck2.c (build_x_arrow): Likewise. + (build_m_component_ref): Simplify. + + * call.c (build_scoped_method_call): Use convert_to_void. + (build_method_call): Likewise. + * class.c (check_field_decls): Remove dead code. + * cvt.c (convert_from_reference): Remove OFFSET_TYPE handling. + * decl2.c (grok_array_decl): Remove dead code. + (arg_assoc_type): Avoid relying on POINTER_TYPE over OFFSET_TYPE + as pointer-to-member representation. + * init.c (build_offset_ref): Tidy. + (build_vec_delete_1): Use convert_to_void. + * mangle.c (write_type): Avoid relying on POINTER_TYPE over OFFSET_TYPE + as pointer-to-member representation. + + 2003-07-03 Nathan Sidwell + + PR c++/9162 + * decl.c (grokdeclarator): Return friend decls, not + void_type_node. + * decl2.c (grokfield): Alter friend decl check. + * parser.c (struct cp_parser): Document default_arg chain on + unparsed_functions_queue. + (cp_parser_save_default_args): New. + (cp_parser_init_declarator, cp_parser_function_definition, + cp_parser_member_declaration): Call it. + (cp_parser_class_specifier): Remove unused variable. Alter + processing of unparsed_functions_queue. + + 2003-07-03 Kaveh R. Ghazi + + * class.c (add_method, check_field_decl): Fix format specifier. + * decl.c (duplicate_decls, pushdecl, check_goto, + fixup_anonymous_aggr, maybe_commonize_var, grokdeclarator, + start_enum): Likewise. + * decl2.c (ambiguous_decl): Likewise. + * pt.c (redeclare_class_template): Likewise. + + 2003-07-02 Nathan Sidwell + + PR c++/10219 + * pt.c (type_unification_real): Don't unify exprs of error type. + * tree.c (error_type): Don't die on error_type. + + PR c++/9779 + * decl2.c (arg_assoc_class): Don't die on NULL type. + * typeck.c (type_unknown_p): Don't die on untyped expressions. + + 2003-07-01 Mark Mitchell + + PR c++/6949 + * decl2.c (grokfield): Create TEMPLATE_DECLs for methods in local + classes. + + 2003-07-01 Kaveh R. Ghazi + + * error.c (locate_error): %P takes an `int', not a `tree'. + + 2003-07-02 Jan Hubicka + + * decl2.c (defer_fn): Set DECL_DEFER_OUTPUT. + (finish-file): Do not process function with DECL_DEFER_OUTPUT clear; + clear DECL_DEFER_OUTPUT once function is processed; avoid flags + massaging. + + * cp-tree.h (DECL_NEEDED_P): Support unit-at-a-time + (expand_or_defer_fn): Declare. + (lower_function): Declare. + * decl.c (start_cleanup_fn): Use expand_or_defer_fn. + * decl2.c: Include cgraph.h and varpool.h + (maybe_emit_vtables): Make explicit instantations as needed. + (mark_member_pointers, lower_function): New functions. + (finish_file): Do unit-at-a-time. + * method.c (synthesize_method): Use expand_or_defer_fn. + * optimize.c (maybe_clone_body): Use expand_or_defer_fn. + * parser.c (cp_parser_function_definition_after_decl): Use + expand_or_defer_fn. + * pt.c (instantiate_decl): Likewise. + * semantics.c: Include cgraph.h + (expand_or_defer_fn): Break out from ... + (expand_body): ... here; deal with unit-at-a-time. + * cp-lang.c (LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION, + LANG_HOOKS_CALLGRAPH_LOWER_FUNCTION): Define. + + 2003-07-01 Mark Mitchell + + * call.c (resolve_scoped_fn_name): Return error_mark_node for + erroneous cases. + + 2003-07-01 Mark Mitchell + + PR c++/11149 + * call.c (resolve_scoped_fn_name): Check that the qualifying scope + is a class type. + + 2003-07-01 Giovanni Bajo + + PR c++/8046 + * error.c (dump_decl): Handle BIT_NOT_EXPR as + pseudo destructor calls. + + 2003-07-01 Nathan Sidwell + + * cp-tree.h (define_label): Replace filename and lineno + arguments with a location_t. + * decl.c (pop_label): Adjust define_label call. + (define_label): Replace filename and lineno arguments with a + location_t. + * semantics.c (finish_label): Adjust define_label call. + + 2003-07-01 Mark Mitchell + + PR c++/9559 + * decl2.c (grokfield): Do not build NOP_EXPRs around the + error_mark_node. + + 2003-06-30 Neil Booth + + * Make-lang.in: Update. + * cp-lang.c (c_language): Define. + (LANG_HOOKS_INIT_OPTIONS): Use common hook. + * cp-tree.h (cxx_init_options): Remove. + * lex.c: Don't include diagnostic.h. + (cxx_init_options): Remove. + + 2003-06-30 Giovanni Bajo + + PR c++/4933 + * error.c (dump_expr): Support correctly the COMPOUND_EXPR + tree generated within a template. Use dump_expr to dump an + expression sizeof. + + 2003-06-30 Giovanni Bajo + + * mangle.c (write_expression): Exit gracefully when trying to + mangle a CALL_EXPR. + + 2003-06-30 Giovanni Bajo + + PR c++/10750 + * parser.c (cp_parser_primary_expression): A VAR_DECL with a + (value- or type-) dependent expression as DECL_INITIAL is a + valid constant-expression (at parser time). + + 2003-06-30 Giovanni Bajo + + PR c++/11106 + * error.c (dump_decl): Call dump_decl to dump the DECL_NAME for a + USING_DECL, instead of print_tree_identifier. + + 2003-06-29 Gabriel Dos Reis + + * cp-tree.h (language_to_string): Adjust declaration. + * dump.c (cp_dump_tree): Adjust usage. + * error.c (dump_char): Use output_formatted_scalar. Tidy. + (parm_to_string): Lose unused parameter. Tidy. + (expr_to_string): Likewise. + (code_to_string): Likewise. + (language_to_string): Likewise. + (op_to_string): Likewise. + (assop_to_string): Likewise. + (digit_buffer): Remove. + (dump_type): Format builtin vector type as __vector__. + + 2003-06-29 Gabriel Dos Reis + + * error.c (print_integer): Remove. + (dump_type_suffix): Adjust. + (dump_expr): Likewise. + + 2003-06-28 Nathan Sidwell + + * error.c (print_instantiation_partial_context): Take a + location_t. + (print_instantiation_full_context): Adjust. + (print_instantiation_context): Adjust. + + * cp-tree.h (cp_line_of, cp_file_of): Remove. + * error.c (cp_line_of, cp_file_of): Merge into ... + (location_of): ... here. Make static, return a location_t. + (cp_error_at, cp_warning_at, cp_pedwarn_at): Adjust. + + 2003-06-28 Nathan Sidwell + + PR c++/10784 + * call.c (joust): Move warn_conversion check outwards. + + 2003-06-27 Zack Weinberg + + * decl.c (build_typename_type) + * mangle.c (write_template_template_arg) + * parser.c (cp_parser_scope_through_which_access_occurs) + * pt.c (push_access_scope_real, push_access_scope, pop_access_scope) + * repo.c (get_base_filename) + * semantics.c (maybe_convert_cond): + Mark the definition static, matching the forward declaration. + + 2003-06-27 Mark Mitchell + + PR c++/10468 + * pt.c (tsubst): Handle qualified TYPEOF_TYPEs correctly. + + 2003-06-27 Mark Mitchell + + PR c++/10796 + * decl.c (finish_enum): Implement DR377. + + * decl.c (cp_finish_decl): Don't make variables with reference + type readonly while they are being initialized. + + 2003-06-26 Mark Mitchell + + PR c++/11332 + * typeck.c (build_static_cast): Avoid returning expressions with + reference type. + + 2003-06-26 Nathan Sidwell + + * call.c (build_op_delete_call): Use strip_array_call. Correct + error message to say 'delete' or 'delete[]'. + + 2003-06-26 Giovanni Bajo + + PR c++/8266 + * pt.c (check_explicit_specialization): When looking up a + template function from an identifier outside class-scope, bind + it to CP_DECL_CONTEXT. + + 2003-06-25 Mark Mitchell + + PR c++/10990 + * search.c (lookup_base_r): Rely on accessible_p, rather than + trying to emulate that logic here. + + PR c++/10931 + * call.c (convert_like): Pass issue_conversion_warnings. + (convert_like_with_context): Likewise. + (convert_like_real): Add issue_conversion_warnings parameter. + (perform_direct_initialization_if_possible): New function. + * cp-tree.h (perform_direct_initialization_if_possible): Declare it. + * typeck.c (check_for_casting_away_constness): New function. + (build_static_cast): Rewrite. + + 2003-06-24 Nathan Sidwell + + * call.c (enforce_access): Assert we get a binfo. + (build_op_delete_call): Pass a binfo to + perform_or_defer_access_check. + * class.c (alter_access): Likewise. + * decl.c (make_typename_type): Likewise. + (make_unbound_class_template): Likewise. + * lex.c (do_identifier): Likewise. + * method.c (hack_identifier): Likewise. + * parser.c (cp_parser_lookup_name): Likewise. + * search.c (lookup_member): Likewise. Move IDENTIFIER_CLASS_VALUE + test. + * semantics.c (finish_non_static_data_member): Likewise. + (perform_or_defer_access_check): Expect a binfo. + * typeck.c (comptypes): Expect types. + + * mangle.c (find_substitution): Don't pass a non-type to same_type_p + * friend.c (make_friend_class): Likewise. + * pt.c (check_default_tmpl_args): Likewise. + (lookup_template_class): Likewise. + + 2003-06-24 Jan Hubicka + + * method.c (thunk_labelno): Move outside ifdef block to make garbage + collector happy. + + 2003-06-24 Jan Hubicka + + * class.c (build_vtable): Make vtables. + * cp-tree.h (DECL_VTABLE_OR_VTT_P): New macro. + * decl2.c (output_vtable_inherit): Rename to ... + (prepare_assemble_variable): ... this one; change interface. + (maybe_emit_vtables): Do not call output_vtable_inherit. + * cp-lang.c (LANG_HOOKS_PREPARE_ASSEMBLE_VARIABLE): Define. + * cp-tree.h (prepare_assemble_variable): New. + + 2003-06-23 Andrew Pinski + + * method.c: add prototype for make_alias_for_thunk. + (thunk_labelno, make_alias_for_thunk): only define + if ASM_OUTPUT_DEF is defined. + + 2003-06-23 Jakub Jelinek + + * method.c (thunk_labelno): New variable. + (make_alias_for_thunk): New function. + (use_thunk): Use it if defined ASM_OUTPUT_DEF. Put the thunk + into the same section as the function it is calling. + Include gt-cp-method.h. + * Make-lang.in (gt-cp-method.h): Depend on s-gtype. + (cp/method.o): Depend on gt-cp-method.h. + * config-lang.in (gtfiles): Add $(srcdir)/cp/method.c. + + 2003-06-23 Jan Hubicka + + * decl.c (register_dtor_fn): Mark cleanup as used. + * decl2.c (mark_vtable_entries): Skip nops. + * rtti.c (get_tinfo_ptr): Mark tinfo as used. + (build_dynamic_cast_1): Likewise. + (tinfo_base_init): Likewise. + (emit_tinfo_decl): Likewise. + + 2003-06-23 Jakub Jelinek + + * mangle.c (hash_type): Val is the TREE_LIST itself, not a pointer + to it. + + 2003-06-21 Gabriel Dos Reis + + PR c++/10784 + * call.c (joust): Warn about choosing conversion sequence only if + -Wconversion. + + 2003-06-21 Gabriel Dos Reis + + PR c++/10864 + * call.c (op_error): Tidy. + * error.c (dump_expr): Properly format 'T()' when T is an + aggregate type. + + 2003-06-21 Gabriel Dos Reis + + PR c++/10915 + * decl.c (grok_op_properties): Warn possible confusing conversion + only if -Wconversion. + + 2003-06-20 Mark Mitchell + + PR c++/10749 + * parser.c (cp_parser_class_head): See through dependent names + when parsing a class-head. + + PR c++/10845 + * pt.c (try_class_unification): Correct handling of member class + templates. + + 2003-06-20 Nathan Sidwell + + * semantics.c (genrtl_finish_function): Adjust + expand_function_end call. + + 2003-06-19 Mark Mitchell + + PR c++/10939 + * pt.c (tsubst_decl): Do not try to substitute into non-dependent + functions. + (value_dependent_expression_p): Correct logic for FUNCTION_DECLs. + + PR c++/9649 + * cp-tree.h (pushdecl_class_level): Change prototype. + (push_class_level_binding): Likewise. + * decl.c (add_binding): Reject duplicate static data members. + (pushdecl_class_level): Return a value indicating whether or not + the binding was valid. + (push_class_level_binding): Likewise. + * semantics.c (finish_member_declaration): Don't keep invalid + declarations. + + PR c++/11041 + * call.c (initialize_reference): Do not use cp_finish_decl to emit + temporary variables. + * cp-tree.h (static_aggregates): Declare. + (pushdecl_top_level_and_finish): Likewise. + * decl.c (pushdecl_top_level_1): New function. + (pushdecl_top_level): Use it. + (pushdecl_top_level_and_finish): New function. + (initialize_local_var): Remove redundant code. + (cp_finish_decl): Remove support for RESULT_DECLs. Don't check + building_stmt_tree. + * decl.h (static_aggregates): Remove. + * decl2.c (get_guard): Use pushdecl_top_level_and_finish. + * rtti.c (get_tinfo_decl): Use pushdecl_top_level_and_finish. + (tinfo_base_init): Likewise. + + 2003-06-19 Matt Austern + + PR c++/11228 + * init.c (build_zero_init): Assert that number of array elements + is an integer constant. + (build_default_init) Don't use build_zero_init for arrays with + variable number of elements. + + 2003-06-19 Andreas Jaeger + + * cp-tree.h: Remove duplicated declarations. + + 2003-06-18 Nathanael Nerode + + * pt.c: Convert to ISO C. + * semantics.c: Convert to ISO C. + + 2003-06-18 Nathan Sidwell + + * cp-tree.h (comp_except_specs, compparms, cp_has_mutable_p, + at_least_as_qualified_p, more_qualified_p): Return bool. + * typeck.c: ANSIFY function definitions. + (comp_array_types): Take redeclaration bool parameter. + (comptypes): Rearrange STRICT handling. + (at_least_as_qualified_p, more_qualified_p, + comp_cv_qualification): Cache cv quals. + (compparms): Rearrange loop. + + 2003-06-18 Nathan Sidwell + + * cp-tree.h (COMPARE_RELAXED): Rename to ... + (COMPARE_DERIVED): ... here. Adjust comment. + (resolve_typename_type_in_current_instantiation): Remove. + (cp_tree_equal, comptypes): Return a bool. + * cvt.c (convert_to_reference): Adjust comptypes call. + * pt.c (template_args_equal, unify,): Adjust cp_tree_equal call. + (resolve_typename_type_in_current_instantiation): Remove. + * tree.c (cp_tree_equal): Return bool. Cope with TEMPLATE_DECLs and + IDENTIFIER_NODEs. Abort if undeciderable. Adjust recursive + calls. Refactor code. + * typeck.c (comp_array_types): Return bool. Lose callback. + parameter. Adjust cp_tree_equal calls. + (comptypes): Return bool. Adjust strict handling. Remove relaxed + enumeration and java type handling. Deal with typename types here. + Adjust recursive and cp_tree_equals calls. Adjust base and derived + checking. + (comp_target_types): Remove unreachable code. Adjust + same_or_base_type_p calls. + (ptr_reasonably_similar): Adjust base and derived check. + + * typeck.c (maybe_warn_about_returning_address_of_local): Remove + unused calculation. + (check_return_expr): Adjust error messages. + * cp-tree.def (SCOPE_REF): Correct comment. + + 2003-06-17 Mark Mitchell + + * mangle.c (mangle_conv_op_name_for_type): Correct sprintf format + string again. + + 2003-06-17 Robert Abeles + + * optimize.c (dump_function): Form complete flag name by + prefixing 'fdump-' to string returned by dump_flag_name(). + + 2003-06-17 Mark Mitchell + + * mangle.c (mangle_conv_op_name_for_type): Correct sprintf format + string. + + 2003-06-17 Jason Merrill + + PR c++/10929 + * decl.c (grokfndecl): Don't mark a function inline for + -finline-functions if it isn't defined. + + 2003-06-17 Mark Mitchell + + PR c++/10712 + * class.c (handle_using_decl): Robustify. + + PR c++/11105 + * cp-tree.h (DECL_CONV_FN_TYPE): New method. + * mangle.c (struct globals): Remove internal_mangling_p. + (write_unqualified_name): Use DECL_CONV_FN_TYPE. + (write_template_parm): Don't write out the level number. + (conv_type_names): New variable. + (hash_type): New function. + (compare_type): Likewise. + (mangle_conv_op_name_for_type): Don't try to mangle conversion + operator names. + * search.c (lookup_conversion_operator): New function. + (lookup_fnfields_1): Use it. + + 2003-06-17 Andreas Jaeger + + * except.c: Remove duplicate declaration of push_eh_cleanup. + + * call.c: Remove extra declaration of inhibit_warnings. + + 2003-06-16 Nathanael Nerode + + 2003-06-16 Jens-Michael Hoffmann + * mangle.c: Convert to ISO C. + + 2003-06-16 Kaveh R. Ghazi + + * cp/decl.c, cp/pt.c, cp/search.c, cp/tree.c: Don't use the PTR + macro. + + 2003-06-16 Nathanael Nerode + + * tree.c: Convert to ISO C. + + 2003-06-16 Kazu Hirata + + * cp-tree.h: Follow spelling conventions. + * mangle.c: Likewise. + * method.c: Likewise. + * parser.c: Likewise. + + 2003-06-14 Nathan Sidwell + + * decl.c (start_function): Adjust init_function_start call. + * method.c (use_thunk): Likewise. + * semantics.c (genrtl_start_function): Likewise. + + 2003-06-14 Neil Booth + + * Make-lang.in: Remove c-options.o. + + 2003-06-13 Nathanael Nerode + + * lex.c: Convert to ISO C. + + 2003-05-19 Jens-Michael Hoffmann + * init.c: removes use of PARAMS macro. Use ISO style function + declarations. (Not copyright-significant change.) + + * rtti.c: Remove PARAMS. + + * typeck2.c: Convert to ISO C. + + 2003-06-12 Mark Mitchell + + PR c++/10635 + * typeck.c (build_c_cast): Check that the destination type is + complete. + + 2003-06-11 Mark Mitchell + + PR c++/10432 + * cp-tree.h (finish_declarator): Remove. + * decl.c (cp_finish_decl): Make sure to pop_nested_class even for + erroneous declarations. + * semantics.c (finish_declarator): Remove. + + 2003-06-11 Roger Sayle + + * decl2.c (generate_ctor_or_dtor_function): Avoid expanding a + global static constructor/destructor if it will be empty, i.e. + either doesn't call any ctors/dtors or only calls pure or const + ctors/dtors. + + 2003-06-11 Mark Mitchell + + * mangle.c (tm_p.h): Include it. + * Make-lang.in (cp/mangle.o): Depend on $(TM_P_H). + + PR c++/11131 + * tree.c (cp_cannot_inline_fn): Check for "inline" before + instantiation. + + 2003-06-10 Jason Merrill + + PR c++/10968 + * pt.c (mark_decl_instantiated): Clear DECL_COMDAT. + + 2003-06-10 Andrew Pinski + + * decl.c (start_cleanup_fn): Move static 'counter' out, mark with GTY. + (start_cleanup_cnt): New. + + 2003-06-10 Mark Mitchell + + PR c++/11131 + * cp-tree.h (template_for_substitution): Declare. + * decl2.c (mark_used): Use it when figuring out whether or not a + function is inline. + * pt.c (template_for_substitution): Give it external linkage. + * tree.c (cp_cannot_inline_tree_fn): Instantiate as early as + possible. + + 2003-06-09 Zack Weinberg + + PR 8861 + * mangle.c (write_real_cst): New function. Implement + ABI-compliant mangling of floating-point literals when + -fabi-version>=2; provide backward compatibility with 3.3 when + -fabi-version=1 (with warning). Clarify commentary. + (write_template_arg_literal): Use write_real_cst. + + 2003-06-07 Andreas Jaeger + + * cp/decl.c (xref_tag): Remove undefined macro NONNESTED_CLASSES. + + 2003-06-07 Neil Booth + + * cp-lang.c (LANG_HOOKS_DECODE_OPTON): Drop. + (LANG_HOOKS_HANDLE_OPTION): Override. + * cp-tree.h (cxx_init_options): Update. + * lex.c (cxx_init_options): Update. + + 2003-06-05 Jan Hubicka + + * Make-lang.in: Add support for stageprofile and stagefeedback + + 2003-06-04 J"orn Rennecke + + * decl.c (grokdeclarator): Error_mark_node in, error_mark_node out. + + 2003-06-04 Andreas Jaeger + + * g++spec.c (lang_specific_driver): Remove ALT_LIBM usage. + + 2003-06-03 Jason Merrill + + * cp/cp-tree.h (CP_AGGREGATE_TYPE_P): Accept vectors. + + * cp/decl.c (reshape_init): Handle vectors. + + * testsuite/g++.dg/init/array10.C: New. + + 2003-06-03 Kriang Lerdsuwanakij + + PR c++/10940 + * pt.c (check_explicit_specialization): Check for 'static' + earlier. + + 2003-05-31 Diego Novillo + + * class.c (dump_array): Call CONSTRUCTOR_ELTS to access + the operand of a CONSTRUCTOR node. + + 2003-05-31 Gabriel Dos Reis + + * decl.c (cp_binding_level::this_entity): Rename from this_class. + (cxx_scope_descriptor): New function. + (cxx_scope_debug): Likewise. + (push_binding_level): Use it. + (pop_binding_level): Likewise. + (suspend_binding_level): Likewise. + (resume_binding_level): Likewise. + (pushlevel_class): Adjust use of this_class. + (pushtag): Likewise. + (lookup_name_real): Likewise. + (global_scope_name): New variable. + (initialize_predefined_identifiers): Initialize it. + (push_namespace): Use it. + (make_cxx_scope): New function. + (pushlevel): Use it. + (pushlevel_class): Likewise. + (push_binding_level): Simplify. Loose the last two arguments. + (make_binding_level): Remove. + (initial_push__namespace_scope): New function. + (push_namespace): Use it. Simplify. + (cxx_init_decl_processing): Likewise. + (declare_namespace_level): Remove. + + 2003-05-31 Kriang Lerdsuwanakij + + PR c++/10956 + * pt.c (instantiate_decl): Don't use full template arguments if + we are dealing with specializations. + + 2003-05-29 Gabriel Dos Reis + + * decl.c (ENABLE_SCOPE_CHECKING): Rename from DEBUG_BINDING_LEVELS. + (binding_depth): Unconditionally define. + (is_class_level): Likewise. + (indent): Likewise. Take an indenting parameter. + (push_binding_level): Remove conditional definittion. + (pop_binding_level): Likewise. + (suspend_binding_level): Likewise. + (resume_binding_level): Likewise. + (pushlevel): Likewise. + (pushlevel_class): Likewise. + (poplevel_class): Likewise. + (pop_everything): Likewise. + + 2003-05-27 Gabriel Dos Reis + + * name-lookup.h (global_scope_p): New macro. + * decl.c (pop_binding_level): Use it. Don't refer directly to + global_binding_level. + (suspend_binding_level): Likewise. + (global_bindings_p): Likewise. + (print_other_binding_stack): Likewise. + (print_binding_stack): Likewise. + (maybe_push_to_top_level): Likewise. + (pushdecl_namespace_level): Likewise. + (cxx_init_decl_processing): Likewise. + (start_decl): Likewise. + (cp_finish_decl): Likewise. + (start_function): Likewise. + (global_binding_level): Remove. + + 2003-05-25 Kriang Lerdsuwanakij + + * parser.c (cp_parser_explicit_instantiation): Restore old + access before template instantiation. + + 2003-05-23 Geoffrey Keating + + * lang-specs.h: Use -o to specify preprocessor's output file. + Make -no-integrated-cpp work when building PCH files. + + 2003-05-23 Kriang Lerdsuwanakij + + PR c++/10682 + * pt.c (instantiate_class_template): Use DECL_ARTIFICIAL to + check for implicitly created typedef to an enum. + + 2003-05-21 Jason Merrill + + * init.c (build_vec_delete): Copy the address into a temporary + variable before calling build_vec_delete_1. + * decl2.c (delete_sanity): Don't call stabilize_reference. + + 2003-05-21 Nathan Sidwell + + * pt.c (register_specialization): Update the decl's location, + if necessary. + (check_explicit_specialization): Likewise. + + 2003-05-20 Kaveh R. Ghazi + + * error.c (dump_expr): Use HOST_WIDE_INT_PRINT_DOUBLE_HEX. + + 2003-05-21 Danny Smith + + PR c++/9738 + * decl.c (duplicate_decls): Re-invoke make_decl_rtl + if the old decl had instantiated DECL_RTL. + (Base on Richard Henderson 2003-05-13 patch to c-decl.c). + + 2003-05-19 Matt Austern + + * lang-options.h: Document -Wno-invalid-offsetof + * typeck.c (build_class_member_access_expr): Don't complain about + (Foo *)p->x for non-POD Foo if warn_invalid_offset is zero. + + 2003-05-18 Andrew Pinski + + * name-lookup.c (free_binding_entry): fix where the GTY markers are. + (binding_entry_make): Make entry->chain NULL after getting an entry. + fix the spelling of chain in a comment. + (binding_table_free): speed up by having temporary variable. + (binding_table_new): set table->chain to be NULL after allocating + a table. + (cxx_binding_make): use gcc_alloc instead of ggc_alloc_cleared and set + binding->previous to NULL after getting an binding for speed. + + 2003-05-18 Gabriel Dos Reis + + * cp-tree.h (struct lang_type_class): Replace data member tags + with hash-table nested_udts. + (CLASSTYPE_NESTED_UTDS): Rename from CLASSTYPE_TAGS. + * class.c (unreverse_member_declarations): Don't touch + CLASSTYPE_TAGS. + (pushclass): Use cxx_remember_type_decls. + * decl.c (struct cp_binding_level): Replace data member tags with + hash-table type_decls. + (pop_binding_level): Handle level->type_decls. + (kept_level_p): Adjust. + (poplevel): Remove unused local variable. + (bt_print_entry): New function. + (print_binding_level): Use it. + (push_namespace): Build current_binding_level->type_decls. + (maybe_process_template_type_declaration): Adjust. + (pushtag): Likewise. + (clear_anon_tags): Use binding_table_remove_anonymous_types. + (gettags): Remove. + (cxx_remember_type_decls): Rename from storetags. Adjust. + (lookup_tag): Use binding_table_find_anon_type. Tidy. + (lookup_tag_reverse): Use binding_table_reverse_maybe_remap. + (cxx_init_decl_processing): Build global_binding_level->type_decls. + (store_parm_decls): Remove pointless code. + * name-lookup.c (free_binding_entry): New variable. + (ENTRY_INDEX): New macro. + (struct binding_table_s): New datatype. + (binding_entry_make): New function. + (binding_entry_free): Likewise. + (binding_table_construct): Likewise. + (binding_table_free): Likewise. + (binding_table_new): Likewise. + (binding_table_expand): Likewise. + (binding_table_insert): Likewise. + (binding_table_find): Likewise. + (binding_table_find_anon_type): Likewise. + (binding_table_reverse_maybe_remap): Likewise. + (binding_table_remove_anonymous_types): Likewise. + (binding_table_foreach): Likewise. + * name-lookup.h (binding_table): New type. + (binding_entry): Likewise. + (bt_foreach_proc): Likewise. + (struct binding_entry_s): New datatype. + (SCOPE_DEFAULT_HT_SIZE): New macro. + (CLASS_SCOPE_HT_SIZE): Likewise. + (NAMESPACE_ORDINARY_HT_SIZE): Likewise. + (NAMESPACE_STD_HT_SIZE): Likewise. + (GLOBAL_SCOPE_HT_SIZE): Likewise. + (binding_table_new): Declare. + (binding_table_free): Likewise. + (binding_table_insert): Likewise. + (binding_table_find_anon_type): Likewise. + (binding_table_reverse_maybe_remap): Likewise. + (binding_table_remove_anonymous_types): Likewise. + (binding_table_foreach): Likewise. + (binding_table_find): Likewise. + (cxx_remember_type_decls): Likewise. + * pt.c (bt_instantiate_type_proc): New function. + (do_type_instantiation): Use it. + * search.c (lookup_field_r): Use binding_table_find. + + 2003-05-18 Kriang Lerdsuwanakij + + * semantics.c (perform_deferred_access_checks): Don't discard + checked access. + + 2003-05-17 Kaveh R. Ghazi + + * error.c (cp_error_at, cp_warning_at, cp_pedwarn_at): Eliminate + libiberty VA_ macros, always use stdarg. + * rtti.c (create_pseudo_type_info): Likewise. + * tree.c (build_min_nt, build_min): Likewise. + + 2003-05-16 Kaveh R. Ghazi + + * ptree.c (cxx_print_type, cxx_print_xnode): Use string + concatentation on HOST_WIDE_INT_PRINT_* format specifier to + collapse multiple function calls into one. + * tree.c (debug_binfo): Likewise. + + 2003-05-15 Jason Merrill + + PR c++/5388 + * call.c (conditional_conversion): Don't consider implicit + conversions if T2 is a base of T1. + * cp-tree.h (DERIVED_FROM_P, UNIQUELY_DERIVED_FROM_P): Make boolean. + (ACCESSIBLY_UNIQUELY_DERIVED_P, PUBLICLY_UNIQUELY_DERIVED_P): Likewise. + + * parser.c (cp_parser_primary_expression): Convert a static data + member from reference. + + 2003-05-15 Mark Mitchell + + * call.c (build_op_delete_call): Avoid creating unnecessary types. + * class.c (instantiate_type): Remove tests for tf_no_attributes. + * cp-tree.h (tsubst_flags_t): Remove tf_no_attributes. + (COMPARE_NO_ATTRIBUTES): Remove. + * typeck.c (comptypes): Do not check COMPARE_NO_ATTRIBUTES. + + PR c++/8385 + * semantics.c (finish_typeof): Refine type-dependency check. + + 2003-05-13 Jason Merrill + + * typeck.c (build_modify_expr): Don't always stabilize the lhs and + rhs. Do stabilize the lhs of a MODIFY_EXPR used on the lhs. + + 2003-05-11 Kriang Lerdsuwanakij + + * method.c (synthesize_method): Call push/pop_deferring_access_checks. + + 2003-05-11 Kriang Lerdsuwanakij + + PR c++/10230, c++/10481 + * semantics.c (finish_non_static_data_member): Handle when the + non-static member is not from a base of the current class type. + + 2003-05-11 Kriang Lerdsuwanakij + + PR c++/10552 + * pt.c (tsubst_copy): Handle TEMPLATE_DECL that is a member class + template and has dependent context. + + 2003-05-10 Kriang Lerdsuwanakij + + * pt.c (instantiate_decl): Call push/pop_deferring_access_checks. + + 2003-05-10 Kriang Lerdsuwanakij + + PR c++/9252 + * cp-tree.h (saved_scope): Remove check_access field. + (tsubst_flags_t): Remove tf_parsing. + * decl.c (maybe_push_to_top_level): Don't initialize + scope_chain->check_access. + (make_typename_type, make_unbound_class_template): Don't use + tf_parsing. + (register_dtor_fn): Use push/pop_deferring_access_checks + instead of scope_chain->check_access. + * method.c (use_thunk): Likewise. + * parser.c (cp_parser_explicit_instantiation + (cp_parser_constructor_declarator_p): Don't call + push/pop_deferring_access_checks here. + (cp_parser_template_argument, cp_parser_class_name): Don't use + tf_parsing. + (yyparse): Check flag_access_control. + * pt.c (instantiate_class_template): Call + push/pop_deferring_access_checks. + * semantics.c (push_deferring_access_checks): Propagate + dk_no_check. + (perform_or_defer_access_check): Make sure basetype_path is + a type before comparison. + * call.c (build_op_delete_call, build_over_call): Use + perform_or_defer_access_check. + * class.c (alter_access): Likewise. + * init.c (build_offset_ref): Likewise. + * lex.c (do_identifier): Likewise. + * method.c (hack_identifier): Likewise. + * search.c (lookup_member): Likewise. + * semantics.c (finish_non_static_data_member): Likewise. + (simplify_aggr_init_exprs_r): Use push/pop_deferring_access_checks + instead of flag_access_control. + + 2003-05-10 Kriang Lerdsuwanakij + + PR c++/9554 + * parser.c (cp_parser_class_name): Remove check_access parameter. + All caller adjusted. Update declaration. + (cp_parser_lookup_name): Likewise. + * semantics.c (push_deferring_access_checks): Change parameter type + to enum deferring_kind. All caller adjusted. + (resume_deferring_access_checks): Adjust to use new enum. + (stop_deferring_access_checks): Likewise. + (perform_or_defer_access_check): Likewise. + * cp-tree.h (deferring_kind): New enum. + (deferred_access): Adjust field type. + (push_deferring_access_checks): Update declaration. + + 2003-05-09 Kriang Lerdsuwanakij + + PR c++/10555, c++/10576 + * pt.c (lookup_template_class): Handle class template with + multiple levels of parameters when one of the levels contain + errors. + + 2003-05-08 Jason Merrill + + * init.c (build_new_1): Don't reuse a TARGET_EXPR in an + expression. Undo some of the recent reorg. + + 2003-05-07 Richard Henderson + + PR c++/10570 + * cfns.gperf: Comment out POSIX thread cancellation points, + plus abort and raise. + * cfns.h: Regenerate. + + 2003-05-07 Jason Merrill + + * call.c (build_conditional_expr): Don't assume that the folded + expression has result_type. + + 2003-05-06 Kriang Lerdsuwanakij + + * typeck.c (build_unary_op): Deal with const qualifier in + invalid pointer-to-member earlier. + + 2003-05-05 Jason Merrill + + PR c++/9537 + * call.c (conditional_conversion): Build an RVALUE_CONV if + we're just changing the cv-quals. + (build_conditional_expr): Don't call convert to change + cv-quals. + + 2003-05-05 Kriang Lerdsuwanakij + + PR c++/10496 + * typeck.c (build_unary_op): Don't output const qualifier when + output invalid pointer-to-member diagnostics. + + 2003-05-05 Kriang Lerdsuwanakij + + * decl.c: Fix typos. + + 2003-05-05 Kriang Lerdsuwanakij + + PR c++/4494 + * decl.c (start_function): Use same_type_p to check return type + of main. + + 2003-05-03 Zack Weinberg + + PR c/10604 + * cp/typeck.c (build_x_compound_expr): No need to check + extra_warnings as well as warn_unused_value. + + 2003-05-03 Kriang Lerdsuwanakij + + PR c++/9364, c++/10553, c++/10586 + * decl.c (make_typename_type): Don't crash on illegal code. + + 2003-05-03 Nathan Sidwell + + * class.c (finish_struct): Use location_t and input_location + directly. + * decl.c (make_label_decl): Likewise. + (use_label): Likewise. + * decl2.c (warn_if_unknown_interface): Likewise. + (start_static_initialization_or_destruction): Likewise. + (generate_ctor_or_dtor_function): Likewise. + (finish_file): Likewise. + * error.c (print_instantiation_full_context): Likewise. + * init.c (create_temporary_var): Likewise. + * method.c (synthesize_method): Likewise. + * parser.c (cp_token): Likewise. + (cp_lexer_set_source_position_from_token): Likewise. + (cp_lexer_get_preprocessor_token): Likewise. + (cp_parser_statement): Likewise. + * pt.c (tsubst_friend_function): Likewise. + (instantiate_class_template): Likewise. + (tsubst_decl): Likewise. + (tsubst): Likewise. + (instantiate_decl): Likewise. + * semantics.c (begin_class_definition): Likewise. + (expand_body): Likewise. + + 2003-05-01 Nathan Sidwell + + * class.c (finish_struct): Rename lineno to input_line. + * decl.c (push_binding_level, pop_binding_level, + suspend_binding_level, resume_binding_level, make_label_decl, + use_label, start_function): Likewise. + * decl2.c (warn_if_unknown_interface, + start_static_initialization_or_destruction, + generate_ctor_or_dtor_function, finish_file): Likewise. + * error.c (cp_line_of, print_instantiation_full_context, + print_instantiation_context): Likewise. + * except.c (check_handlers_1, check_handlers): Likewise. + * init.c (create_temporary_var): Likewise. + * method.c (use_thunk, synthesize_method): Likewise. + * parser.c (cp_lexer_set_source_position_from_token, + cp_lexer_get_preprocessor_token): Likewise. + * pt.c (push_tinst_level, pop_tinst_level, + tsubst_friend_function, instantiate_class_template, tsubst_decl, + tsubst, tsubst_expr, instantiate_decl): Likewise. + * semantics.c (genrtl_try_block, finish_label_stmt, + begin_class_definition, expand_body, + genrtl_finish_function): Likewise. + * tree.c (build_min_nt, build_min): Likewise. + + 2003-05-01 Mark Mitchell + + * decl2.c (comdat_linkage): Don't externalize explicit + instantiations. + + 2003-05-01 Kriang Lerdsuwanakij + + PR c++/10554 + * decl2.c (do_class_using_decl): Check if operand 0 of SCOPE_REF + is not NULL. + + 2003-05-01 Steven Bosscher + + * cp-tree.h (struct lang_id2): Remove. Move fields from here... + (struct lang_identifier): ... to here. + (LANG_ID_FIELD): Remove. + (SET_LANG_ID): Remove. + (IDENTIFIER_LABEL_VALUE): Adjust for new lang_identifier. + (SET_IDENTIFIER_LABEL_VALUE): Likewise. + (IDENTIFIER_IMPLICIT_DECL): Likewise. + (SET_IDENTIFIERL_IMPLICIT_DECL): Likewise. + (IDENTIFIER_ERROR_LOCUS): Likewise. + (SET_IDENTIFIER_ERROR_LOCUS): Likewise. + + 2003-05-01 Kriang Lerdsuwanakij + + PR c++/8772 + * pt.c (convert_template_argument): Correct diagnostic. + + 2003-04-30 Kriang Lerdsuwanakij + + PR c++/9432, c++/9528 + * decl2.c (validate_nonmember_using_decl): Handle SCOPE_REF. + + 2003-04-30 Garbiel Dos Reis + + * decl.c (check_previous_goto_1): Adjust prototype. + (check_previous_goto): Adjust use. + (check_switch_goto): Likewise. + (use_label): Adjust. + (check_previous_goto_1): Don't use pedwarn_with_file_and_line. + (struct named_label_use_list): Use location_t datatype. + + 2003-04-29 Mark Mitchell + + PR c++/10551 + * pt.c (mark_decl_instantiated): Defer all explicit instantiations + that have not yet been written out. + + 2003-04-29 Mark Mitchell + + PR c++/10549 + * class.c (layout_class_type): Mark overlong bitfields as having + the maximum size permitted by their type, after layout. + + PR c++/10527 + * error.c (dump_expr): Correctly handling of NEW_EXPR.4 + + 2003-04-29 Kriang Lerdsuwanakij + + * call.c (build_operator_new_call): Fix typo. + * lang-options.h: Likewise. + + 2003-04-29 Mark Mitchell + + PR c++/10515 + * cp-tree.h (lookup_field_1): Declare it. + * search.c (lookup_field_1): Make it public. + * decl.c (reshape_init): Handle designated initializers. + + * decl.c (maybe_commonize_var): Further tweak support for systems + without weak symbols. + + 2003-04-27 Mark Mitchell + + * decl.c (maybe_commonize_var): Fix thinko in last patch. + + 2003-04-27 Mark Mitchell + + PR c++/10506 + * method.c (use_thunk): Decrement immediate_size_expand. + + PR c++/10503 + * cp-tree.h (DECL_VAR_MARKED_P): New macro. + (DECL_MAYBE_TEMPLATE): Remove. + * class.c (fixed_type_or_null): Avoid infinite recursion. + + * decl.c (maybe_commonize_var): Make the code match the comments. + * pt.c (instantiate_decl): Move call to import_export_decl. + + 2003-04-26 Mark Mitchell + + * decl2.c (finish_file): Fix merge botch. + + 2003-04-25 Mark Mitchell + + * decl2.c (finish_file): Don't call import_export_decl for + functions that are not defined. + (handle_class_head): Robustify. + * pt.c (instantiate_decl): Do not call cp_finish_decl for + variables that are not defined. + + 2003-04-24 Sylvain Pion + + * call.c (print_z_candidates): Fix off by one error. + + 2003-04-24 Nathan Sidwell + + PR c++/10337 + * call.c (joust): Don't warn about conversion ops that are exact + or cv-conversions. Rearrange to avoid multiple type comparisons. + + 2003-04-23 Mark Mitchell + + PR c++/10471 + * call.c (build_cxx_call): Robustify. + + 2003-04-23 Neil Booth + + * Make-lang.in (lex.o): Remove mbchar.h. + * lex.c (MULTIBYTE_CHARS): Lose. + * parser.c (cp_lexer_get_preprocessor_token): CPP_OTHER handled + in c-lex.c. + + 2003-04-23 Mark Mitchell + + PR c++/9847 + * cp-tree.h (duplicate_tag_error): Remove. + * class.c (duplicate_tag_error): Remove. + * semantics.c (begin_class_definition): Return immediately for a + duplicate class definition. + + PR c++/10451 + * decl.c (grokdeclarator): Correct logic for "mutable" errors. + + 2003-04-22 Mark Mitchell + + PR c++/10446 + * search.c (lookup_fnfields_1): Handle empty slots in the method + vector. + + PR c++/10428 + * decl.c (check_elaborated_type_specifier): New function, split + out from ... + (xref_tag): ... here. Use the new function in more places. + + * rtti.c (throw_bad_typeid): Use build_cxx_call. + + 2003-04-21 Mark Mitchell + + * call.c (build_over_call): Use build_cxx_call. + (build_cxx_call): New method, split out of build_over_call. + * cp-tree.h (language_function): Add can_throw. + (build_cxx_call): Declare it. + * decl.c (finish_function): If a function does not contain any + calls to functions that can throw an exception, indicate that + fact. + * decl2.c (mark_used): Do not defer the instantiation of + functions, if the current function does not throw. + * optimize.c (maybe_clone_body): Copy TREE_NOTHROW to the clones. + * pt.c (instantiate_decl): Make sure import_export_decl is called + before emitting things. + * rtti.c (throw_bad_cast): Use build_cxx_call. + (build_dynamic_cast_1): Likewise. + * typeck.c (build_function_call): Likewise. + + 2003-04-21 Nathan Sidwell + + PR c++/9881 + * typeck.c (build_unary_op): Fold all COMPONENT_REF addr + expressions. Reverts my 2002-08-08 patch. + + * typeck.c (comp_ptr_ttypes_real): Swap final && operands for + cheaper early exit. + + 2003-04-20 Nathan Sidwell + + * cp/decl2.c (start_static_storage_duration_function): Take count + arg, don't check if it wraps round. + (generate_ctor_or_dtor_function): Add locus arg, use it. + (generate_ctor_and_dtor_functions_for_priority): Data arg is a + locus. + (finish_file): Set line numbers to past EOF for synthesized + functions. + + 2003-04-20 Nathan Sidwell + + PR c++/10405 + * search.c (lookup_field_1): Final scan goes backwards for + types, forwards for non-types. + + 2003-04-17 Roger Sayle + + PR c/10375 + * decl.c (duplicate_decls): Preserve "const", "noreturn" and + "nothrow" function attributes. + + 2003-04-17 Kriang Lerdsuwanakij + + PR c++/10347 + * pt.c (type_dependent_expression_p): Handle array new. + + 2003-04-15 Mark Mitchell + + PR c++/10381 + * parser.c (cp_parser_primary_expression): Reorganize logic for + dealing with name lookup failures. + + 2003-04-15 Jason Merrill + + * decl2.c (mark_used): Don't instantiate anything if + skip_evaluation. + + 2003-04-14 Ziemowit Laski + + * tree.c (build_cplus_array_type_1): Do not call + uses_template_parms() on a NULL index_type. + + 2003-04-13 Roger Sayle + + * decl.c (duplicate_decls): Preserve pure and malloc attributes. + + 2003-04-12 Mark Mitchell + + PR c++/10300 + * init.c (build_new_1): Reorganize. + + 2003-04-12 Zack Weinberg + + * class.c (initialize_array) + * decl.c (reshape_init) + * decl2.c (build_expr_from_tree) + * init.c (build_zero_init) + * pt.c (tsubst_copy, tsubst_copy_and_build) + * rtti.c (tinfo_base_init, generic_initializer, ptr_initializer) + (ptm_initializer, class_initializer, get_pseudo_ti_init) + * semantics.c (finish_compound_literal) + * typeck.c (build_ptrmemfunc1) + * typeck2.c (store_init_value, process_init_constructor) + (build_functional_cast): Use build_constructor. + + 2003-04-12 Zack Weinberg + + * call.c (print_z_candidates): Use gcc_gettext_width, not + strlen, to determine how much padding to use. + + 2003-04-10 Zack Weinberg + + * decl.c: Update all calls to shadow_warning. + + 2003-04-10 Mark Mitchell + + * class.c (layout_class_type): Correct handling for overlong + bit-fields whose width is the same as an integer type. + + 2003-04-06 Zack Weinberg + + * cp-tree.def: Make fourth element for all 'c' and 'x' nodes zero. + * cp-lang.c (cp_tree_size): New function. + (LANG_HOOKS_TREE_SIZE): Override. + + * cp-tree.h (SOURCE_LOCUS, SRCLOC_FILE, SRCLOC_LINE, struct + tree_srcloc, TS_CP_COMMON, TS_CP_SRCLOC): Kill. + (union lang_tree_node): Remove common and srcloc members. + (build_srcloc_here): Don't prototype. + * decl.c (cp_tree_node_structure): Kill SRCLOC case. + * pt.c (pending_templates): Correct comment. + * tree.c (build_srcloc, build_srcloc_here): Kill. + + 2003-04-06 Zack Weinberg + + * call.c: Include intl.h. + (print_z_candidate): Always use inform; get rid of errfn + argument. Reorganize so that all the strings get picked up + by xgettext. Note obligation of caller to pass first argument + through gettext. + (print_z_candidates): Update to match. Indent second and + successive candidates by strlen() of translated message. + (joust): Restructure ambiguous-conversion pedwarn so that + translators see a complete sentence. Update calls to + print_z_candidate. + + * Make-lang.in (cp/call.o): Update dependencies. + + 2003-04-05 Kaveh R. Ghazi + + * decl.c (set_current_binding_level): Delete, revert last change. + (current_binding_level): Modify to allow it as as lvalue. + + 2003-04-04 Kaveh R. Ghazi + + * name-lookup.c (find_binding): Pass appropriate pointer type to + POP_TIMEVAR_AND_RETURN. + + 2003-04-03 Kaveh R. Ghazi + + * Make-lang.in (cp-warn): Add $(STRICT_WARN). + * cp-tree.h: Don't insist on having GNUC. + + 2003-04-03 Jason Merrill + + * cvt.c (ocp_convert): Only abort if we try to convert an object + of TREE_ADDRESSABLE type. + + * class.c (build_vtable): Set DECL_ALIGN here. + (get_vtable_decl): Not here. + (layout_vtable_decl): Or here. + (create_vtable_ptr): Or here. + (layout_class_type): Or here. + (check_bitfield_decl): Don't mess with field alignment. + + 2003-04-03 Kaveh R. Ghazi + + * operators.def (DEF_SIMPLE_OPERATOR, DEF_ASSN_OPERATOR, + DEF_ASSN_OPERATOR): Delete spurious semi-colon. + * rtti.c (dfs_class_hint_mark): Likewise. + + * decl.c (push_local_name, push_class_level_binding, + maybe_inject_for_scope_var): Don't use POP_TIMEVAR_AND_RETURN in + functions returning void. + * decl2.c (add_using_namespace): Likewise. + + * decl.c (print_binding_level, print_other_binding_stack, + print_binding_stack): Cast argument of %p specifier to void*. + * ptree.c (cxx_print_decl): Likewise. + + * cp-tree.h (VAR_OR_FUNCTION_DECL_CHECK, + VAR_FUNCTION_OR_PARM_DECL_CHECK, + VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK, RECORD_OR_UNION_TYPE_CHECK, + BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK, LANG_TYPE_CLASS_CHECK, + LANG_TYPE_PTRMEM_CHECK, LANG_DECL_U2_CHECK): Add __extension__. + + * decl.c (set_current_binding_level): New macro. Use throughout + when setting the current binding level. + + * cp-tree.h (cp_lvalue_kind, base_access): Delete trailing comma + in enum. + * method.c (mangling_flags): Likewise. + + * cp-tree.h (lang_type_header): Add __extension__ and use + CHAR_BITFIELD for members. + + 2003-04-02 Geoffrey Keating + + PR other/9274 + * mangle.c: Include gt-cp-mangle.h. + (subst_identifiers): Mark with GTY. + * config-lang.in (gtfiles): Add cp/mangle.c. + * Make-lang.in: (gt-cp-mangle.h): New rule. + (cp/mangle.o): Depends on gt-cp-mangle.h. + + 2003-04-01 Andrew Pinski + + * config-lang.in (gtfiles): Add \$(srcdir)/cp/name-lookup.c + after \$(srcdir)/cp/name-lookup.h. + * name-lookup.c: (cxx_binding_make): Use ggc_alloc_clearedinstead + of ggc_alloc. Include gt-cp-name-lookup.h at the end of the file. + * Make-lang.in: (gt-cp-name-lookup.h): Is generated by gengtype. + (cp/name-lookup.o): Depends on gt-cp-name-lookup.h. + + 2003-03-31 Jason Merrill + + PR java/10145 + * class.c (check_field_decl): Don't set DECL_ALIGN. + + 2003-03-30 Mark Mitchell + + PR c++/7647 + * decl.c (grokdeclarator): Tidy, slightly. + * search.c (lookup_field_1): Add want_type parameter. + (lookup_field_r): Adjust call to lookup_field_1. + + 2003-03-30 Gabriel Dos Reis + + * Make-lang.in (cp/name-lookup.o): Add more dependencies. + + 2003-03-30 Gabriel Dos Reis + + * cp-tree.h (binding_for_name: Move to name-lookup.h Adjust + prototype. + (cxx_scope_find_binding_for_name): Likewise. + * decl.c (find_binding: Move to name-lookup.c. + (binding_for_name): Likewise. + (cxx_scope_find_binding_for_name): Likewise. + (BINDING_LEVEL): Remove. + (push_binding): Tidy. + (push_class_binding): Likewise. + (pop_binding): Likewise. + (poplevel): Likewise. + (poplevel_class): Likewise. + (set_identifier_type_value_with_scope): Likewise. + (push_overloaded_decl): Likewise. + (lookup_tag): Likewise. + (unqualified_namespace_lookup): Likewise. + (lookup_name_current_level): Likewise. + (maybe_inject_for_scope_var): Likewise. + (namespace_binding): Move to name-lookup.c. + (set_namespace_binding): Likewise. + * decl2.c (lookup_using_namespace): Tidy. + (qualified_lookup_using_namespace): Likewise. + (do_toplevel_using_decl): Likewise. + * name-lookup.c: Include "timevar.h" + * name-lookup.h (cxx_scope): Declare. + (struct cxx_binding): Lose member "has_level". Adjust "scope" + member declaration. + (BINDING_SCOPE): Adjust definition. + (BINDING_HAS_LEVEL_P): Remove. + + 2003-03-30 Gabriel Dos Reis + + * name-lookup.c: New file. + * name-lookup.h: Likewise.. + * decl.c (push_binding): Adjust use cxx_binding_make. + (free_bindings): Move to name-lookup.c + (pop_binding): Use cxx_binding_free. + (binding_for_name): Tidy. + * cp-tree.h: Include "name-lookup.h" + (cxx_binding_make): Move to name-lookup.h + (cxx_binding_clear): Likewise. + (struct cxx_binding): Likewise. + (LOCAL_BINDING_P): Likewise. + (INHERITED_VALUE_BINDING_P): Likewise. + (BINDING_SCOPE): Likewise. + (BINDING_HAS_LEVEL_P): Likewise. + (BINDING_VALUE): Likewise. + (BINDING_TYPE): Likewise. + * config-lang.in (gtfiles): Add cp/name-lookup.h + * Make-lang.in (cp/name-lookup.o): New rule. + (CXX_OBJS): Add cp/name-lookup.o + (CXX_TREE_H): Add cp/name-lookup.h + + 2003-03-28 Jason Merrill + + PR c++/10245 + * cvt.c (force_rvalue): New fn. + * call.c (build_conditional_expr): Use it. + * cp-tree.h: Declare it. + + 2003-03-28 Mike Stump + + * error.c (dump_expr): Add 0x to printed hex numbers to make + output match source code better. + + 2003-03-28 Mark Mitchell + + PR c++/10218 + * decl.c (grokfndecl): Return NULL_TREE for bogus out-of-class + definitions. + + * decl2.c (generate_ctor_or_dtor_function): Tolerate a + non-existant ssdf_decls array. + (finish_file): Call generator_ctor_or_dtor_function when there are + static constructors or destructors and no other static + initializations. + + 2003-03-28 Nathan Sidwell + + PR c++/10047 + * decl2.c (finish_file): Don't warn about explicitly instantiated + inline decls. + + 2003-03-27 Nathan Sidwell + + PR c++/10224 + * pt.c (lookup_template_class): Only check instantiated args if + they do not contain template parameters. + + 2003-03-27 Nathan Sidwell + + PR c++/10158 + * parser.c (cp_parser_function_definition): Set + DECL_INITIALIZED_IN_CLASS for members. + * pt.c (instantiate_decl): Only reduce the template args for + friends that are not defined in class. + + 2003-03-25 Jason Merrill + + * call.c (print_z_candidate): Change name of first arg to msgid. + (joust): Add comment for translators. + + 2003-03-24 Nathan Sidwell + + PR c++/9898, PR c++/383, DR 322 + * pt.c (maybe_adjust_types_for_deduction) : Look + through reference types on both PARM and ARG. + + 2003-03-24 Nathan Sidwell + + PR c++/10119 + * error.c (dump_expr) : Use dump_expr. + * pt.c (maybe_fold_nontype_args): New function. + (tsubst_copy) : Subst any template_id args. + : Break out folding code, call it. + (tsubst_copy_and_build) : Call + maybe_fold_nontype_args. + + 2003-03-24 Nathan Sidwell + + PR c++/10026 + * decl2.c (arg_assoc_type) : Don't die. + + 2003-03-23 Mark Mitchell + + PR c++/7086 + * typeck.c (cxx_mark_addressable): Adjust call to + gen_mem_addressof or put_var_into_stack. + + 2003-03-22 Nathan Sidwell + + PR c++/9978, c++/9708 + * cp-tree.h (instantiate_template): Add tsubst_flags parameter. + * call.c (add_template_candidate_real): Adjust + instantiate_template call. + * class.c (resolve_address_of_overloaded_function): Likewise. + * decl.c (build_enumerator): Set TREE_CONSTANT. + * pt.c (check_instantiated_args): New. + (push_inline_template_parms_recursive): Set TREE_CONSTANT, + TREE_READONLY. + (build_template_parm_index): Copy TREE_CONSTANT, TREE_READONLY. + (reduce_template_parm_level): Likewise. + (process_template_parm): Likewise. + (check_explicit_specialization): Adjust instantiate_template call. + (convert_template_argument): Don't check non-type argument here. + (lookup_template_class): Check them here. + (tsubst_friend_function): Adjust instantiate_template call. + (instantiate_template): Add tsubst_flags parameter, use it. Check + instantiated args. + + 2003-03-21 Zack Weinberg + + * decl.c: Update calls to shadow_warning. + + 2003-03-21 Nathan Sidwell + + PR c++/9898 + * error.c (dump_decl) [CONST_DECL]: Print ''. + (dump_expr) [CONSTRUCTOR]: Print default ctor as a function call. + + 2003-03-20 Mark Mitchell + + * cp/decl2.c (arg_assoc_class): Correct check for namespace-scope + friends. + * cp/pt.c (instantiate_class_template): Fix formatting. + + 2003-03-14 Matt Austern + + * cp-tree.h (unemitted_tinfo_decls): Declaration of a new varray. + (unemitted_tinfo_decl_p): Remove. + (emit_tinfo_decl): Change declaration to remove unused parameter. + * decl2.c (finish_file): Change tinfo emission to loop through + unemitted_tinfo_decls array instead of looping through all decls. + * rtti.c (unemitted_tinfo_decl_p): Declare as static, remove + unused second parameter. + (init_rtti_processing): initialize unemitted_tinfo_decls varray. + (get_tinfo_decls): push new tinfo decl on unemitted_tinfo_decls. + (emit_tinfo_decl): remove unused second parameter, add assertion + that decl hasn't already been emitted. + + 2003-03-19 Nathanael Nerode + + * dump.c (cp_dump_tree), cp-tree.h (cp_dump_tree): Change return + type from 'int' to 'bool'. Replace 0 and 1 with true and false in + return statements. + + 2003-03-19 Jason Merrill + + PR c++/8316, c++/9315, c++/10136 + * call.c (print_z_candidate): Split out from... + (print_z_candidiates): ...here. + (joust): Use it. + + 2003-03-17 Roger Sayle + + PR c++/10031 + * decl.c (duplicate_decls): Use the new type when prototyping + anticipated decls, even when the types match. This defines the + exception list for the built-in function. + + 2003-03-17 Jason Merrill + + PR c++/10091 + * typeck.c (build_class_member_access_expr): Compare + TYPE_MAIN_VARIANTs. + + 2003-03-17 Mark Mitchell + + PR c++/9639 + * parser.c (cp_parser_declarator_id): Clear parser->scope. + + 2003-03-16 Jason Merrill + + PR c++/9993 + * decl.c (finish_function): Only allow the NRVO to use variables + declared at function scope. + + 2003-03-17 Andreas Jaeger + + * Make-lang.in (cp/TAGS): Remove. + + 2003-03-16 Nathan Sidwell + + PR c++/9629 + * cp-tree.h (struct language_function): Add in_base_initializer. + (in_base_initializer): define it. + (expand_member_init): Remove INIT param. + * init.c (expand_member_init): Remove INIT param, return the member. + (emit_mem_initializers): Set in_base_initializer. + * class.c (build_base_path): Check in_base_initializer. + * parser.c (cp_parser_mem_initializer): Set in_base_initializer. + * pt.c (tsubst_initializer_list): Likewise. + + 2003-03-16 Gabriel Dos Reis + + * decl.c (binding_for_name): Fix initialization thinko. + + 2003-03-15 Gabriel Dos Reis + + Compile-time improvement: 2/n. + * cp-tree.h (struct cxx_binding): New datatype; + (struct lang_identifier): Use it. + (LOCAL_BINDING_P): Adjust definition. + (INHERITED_VALUE_BINDING_P): Likewise. + (BINDING_SCOPE): Likewise. + (BINDING_HAS_LEVEL_P): Likewise. + (BINDING_VALUE): Likewise. + (BINDING_TYPE): Likewise. + (IDENTIFIER_VALUE): Likewise. + (struct tree_binding): Remove. + (TS_CP_BINDING): Likewise. + ((union lang_tree_node): Remove field "binding". + (cxx_binding_clear): New macro. + (binding_for_name): Adjust return type. + (qualified_lookup_using_namespace): Adjust prototype. + (lookup_using_namespace): Adjust prototype. + (cxx_scope_find_binding_for_name): Declare. + * cp-tree.def: Remove CPLUS_BINDING definition. + * decl.c (push_binding): Adjust local variable type. + (add_binding): Likewise. + (push_class_binding): Likewise. + (pop_binding): Likewise. + (poplevel): Likewise. + (poplevel_class): Likewise. + (free_bindings): Adjust type. + (find_binding): Adjust return type, add a third parameter. Remove + non-useful assertion now that we use static typing. + (cxx_scope_find_binding_for_name): New function. + (binding_for_name): Use it. Adjust local variable type. Simplify. + (namespace_binding): Simplify. + (set_namespace_binding): Likewise. + (set_identifier_type_value_with_scope): Adjust local variable type. + (lookup_tag): Don't type-abuse of local variable 'old'. + (lookup_namespace_name): Likewise. Allocate binding on stack. + (select_decl): Adjust prototype. + (unqualified_namespace_lookup): Allocate binding on stack. + Don't type-abuse of local variable 'val'. + (lookup_name_real): Likewise. + (maybe_inject_for_scope_var): Adjust local variable type. + (cp_tree_node_structure): Remove CPLUS_BINDING case label. + (namespace_binding): Adjust logic, simplify. + (BINDING_LEVEL): Adjust definition. + (push_class_level_binding): Adjust local variable type. + (struct cxx_saved_binding): Adjust field 'binding' type. + * decl2.c (ambiguous_decl): Adjust prototype. + (lookup_using_namespace): Adjust local variable type. + (qualified_lookup_using_namespace): Catch type error and correct + ensueing logic error. + (do_nonmember_using_decl): Adjust local variable type. Allocate + temporary cxx_binding on stack. + (do_toplevel_using_decl): Adjust local variable type. + * ptree.c (cxx_print_cxx_binding): New function. + (cxx_print_identifier): Use it. + (cxx_print_xnode): Delete CPLUS_BINDING case label. + + 2003-03-15 Roger Sayle + + * tree.c (count_functions): Fix whitespace. + + 2003-03-15 Neil Booth + + * Make-lang.in: Update. + + 2003-03-15 Kriang Lerdsuwanakij + + PR c++/6440 + * pt.c (maybe_process_partial_specialization): Handle + member class template when enclosing class template is + explicit specialized. + (most_general_template): Stop looking when DECL is already + specialized. + + 2003-03-13 Jason Merrill + + PR c++/9420 + * search.c (lookup_conversions): Call complete_type here. + * call.c (implicit_conversion): Not here. + + 2003-03-13 Mark Mitchell + + * decl2.c (do_nonmember_using_decl): Correct handling of + simultaneous type/non-type bindings. + + * call.c (initialize_reference): Remove bogus assertion. + * decl.c (build_ptrmemfunc_type): Revert change of 2003-03-09. + + 2003-03-12 Andrew Lewycky + + PR c++/7050 + * expr.c (cxx_expand_expr): Return const0_rtx for throw + expressions. + + 2003-03-11 Mark Mitchell + + PR c++/9474 + * decl2.c (do_nonmember_using_decl): Do not call duplicate decls + to merge old and new declarations. + + 2003-03-12 Alexandre Oliva + + * g++.1: Remove. + * Make-lang.in (c++.generated-manpages): Build cp/g++.1. + (cp/g++.1): Build it from scratch in the build tree. + (c++.install-man): Depend on it. Install it from the build tree. + (c++.mostlyclean): Clean it. + + 2003-03-11 Mark Mitchell + + PR c++/9474 + * decl2.c (do_nonmember_using_decl): Do not call duplicate decls + to merge old and new declarations. + + PR c++/9924 + * decl2.c (do_nonmember_using_decl): Ignore anticipated builtins. + + 2003-03-11 Jason Merrill + + PR c++/9820 + * search.c (lookup_member): Fix handling of functions in a class + being defined. + + 2003-03-11 Mark Mitchell + + PR c++/8700 + * call.c (convert_class_to_reference): Adjust usage of + splice_viable. + (any_viable): Remove. + (splice_viable): Combine with any_viable. + (print_z_candidates): Avoid printing duplicates. + (build_user_type_conversion_1): Adjust usage of splice_viable. + (build_new_function_call): Likewise. + (build_operator_new_call): Likewise. + (build_object_call): Likewise. + (build_conditional_expr): Likewise. + (build_new_op): Likewise. + (build_new_method_call): Likewise. + (joust): Remove spurious comment. + * cp-tree.h (DECL_FRIENDLIST): Correct documentation. + * decl2.c (arg_assoc_class): Simplify. + * friend.c (add_friend): Likewise. + + 2003-03-11 Jason Merrill + + PR c++/8660 + * decl2.c (check_classfn): A member template only matches a + member template. + + 2003-03-11 Neil Booth + + * Make-lang.in (CXX_C_OBJS): Update. + * lang-specs.h: Don't define __GNUG__ here. + + 2003-03-10 Mark Mitchell + + * call.c (perform_overload_resolution): New function. + (build_new_function_call): Use it. + (build_operator_new_call): Likewise. + (add_candidates): Add explicit_targs and template_only parameters. + (build_new_op): Adjust accordingly. + * cp-tree.h (build_operator_new_call): New function. + (build_function_call_real): Remove. + (build_function_call_maybe): Likewise. + * init.c (build_new_1): Use build_operator_new_call. + * typeck.c (build_function_call_real): Rename to ... + (build_function_call): ... this. + + 2003-03-10 Devang Patel + + PR c++/9394 + * g++spec.c (lang_specific_driver): Use DEFAULT_WORD_SWTCH_TAKES_ARG. + + 2003-03-10 Jason Merrill + + PR c++/9798 + * decl.c (push_using_directive): Push before recursing. + + PR c++/9868, c++/9524 + * call.c (resolve_scoped_fn_name): Handle the case of a function + pointer member. + + * decl2.c (build_offset_ref_call_from_tree): Only mess with 'this' + argument in the pointer-to-member case. + + 2003-03-09 Mark Mitchell + + PR c++/9373 + * cp-lang.c (cxx_get_alias_set): Use alias set zero for + pointers to member functions. + + PR c++/8534 + * decl.c (build_ptrmemfunc_type): Do not allow default arguments + in pointer-to-member-function types. + + 2003-03-10 Gabriel Dos Reis + + * expr.c (cplus_expand_constant): Use C90 prototype style. + (cxx_expand_expr): Likewise. + + 2003-03-09 Kriang Lerdsuwanakij + + PR c++/9970 + * decl.c (duplicate_decls): Only copy DECL_THUNKS for virtual + functions. + + 2003-03-08 Geoffrey Keating + + * lang-specs.h (c++-header): Change .pch to .gch. + + 2003-03-08 Neil Booth + + * cp-tree.h (cxx_init): Update prototype. + * lex.c (cxx_init): Similarly. + + 2003-03-08 Mark Mitchell + + PR c++/9823 + * cp-tree.h (begin_mem_initializers): Remove. + * parser.c (cp_parser_mem_initializer_list): Inline it here. + Do not call finish_mem_initializers if not in a constructor. + (cp_parser_class_head): Fix typo in error message. + * semantics.c (begin_mem_initializers): Remove. + * testsuite/g++.dg/parser/constructor1.C: New test. + + PR c++/9809 + * call.c (add_function_candidate): Skip builtin fuctions that have + not yet been declared. + + PR c++/9982 + * init.c (build_new_1): Correct logic for determining whether or + not to use an array cookie. + + PR c++/9524 + * parser.c (cp_parser_postfix_expression): Call + finish_non_static_data_member, even when processing_template_decl. + + PR c++/9912 + * cp-tree.h (is_ancestor): New function. + (handle_class_head): Change prototype. + * decl2.c (is_namespace_ancestor): Rename to ... + (namespace_anecestor): ... this. + (set_decl_namespace): Adjust accordingly. + (handle_class_head): Remove unnecessary parameters. + * parser.c (cp_parser_class_head): Check that + nested-name-specifiers are used appropriately. + + 2003-03-07 Mark Mitchell + + * call.c (reference_binding): Remove REF_IS_VAR parameter. + (implicit_conversion): Adjust call to reference_binding. + (make_temporary_var_for_ref_to_type): Add TYPE parameter. + (initialize_reference): Adjust handling for references bound to + rvalues. + * cp-tree.h (make_temporary_var_for_ref_to_temp): Change + prototype. + (real_non_cast_lvalue_p): New method. + * cvt.c (build_up_reference): Adjust use of + make_temporary_var_for_ref_to_temp. + * tree.c (real_non_cast_lvalue_p): New method. + + 2003-03-07 Gabriel Dos Reis + + * except.c (init_exception_processing): Use C90 prototype style. + (cp_protect_cleanup_actions): Likewise. + (prepare_eh_type): Likewise. + (build_eh_type_type): Likewise. + (build_exc_ptr): Likewise. + (do_begin_catch): Likewise. + (dtor_nothrow): Likewise. + (do_end_catch): Likewise. + (push_eh_cleanup): Likewise. + (decl_is_java_type): Likewise. + (choose_personality_routine): Likewise. + (initialize_handler_parm): Likewise. + (expand_start_catch_block): Likewise. + (expand_end_catch_block): Likewise. + (begin_eh_spec_block): Likewise. + (finish_eh_spec_block): Likewise. + (do_allocate_exception): Likewise. + (do_free_exception): Likewise. + (wrap_cleanups_r): Likewise. + (stabilize_throw_expr): Likewise. + (build_throw): Likewise. + (complete_ptr_ref_or_void_ptr_p): Likewise. + (is_admissible_throw_operand): Likewise. + (nothrow_libfn_p): Likewise. + (can_convert_eh): Likewise. + (check_handlers_1): Likewise. + (check_handlers): Likewise. + + 2003-03-06 Mark Mitchell + + * call.c (merge_conversion_sequences): New function. + (build_conv): Set ICS_USER_FLAG for USER_CONVs. + (convert_class_to_reference): Correct handling of second + standard conversion sequence in a user-defined conversion + sequence. + (build_user_type_conversion_1): Use merge_conversion_sequences. + * cp-tree.def: Add comments for CONV nodes. + * rtti.c (get_tinfo_decl): Use build_address/build_nop. + + 2003-03-07 Gabriel Dos Reis + + * error.c (init_error): Use C90 prototype style. + (dump_scope): Likewise. + (dump_qualifiers): Likewise. + (dump_template_argument): Likewise. + (dump_template_argument_list): Likewise. + (dump_template_parameter): Likewise. + (dump_template_bindings): Likewise. + (dump_type): Likewise. + (dump_typename): Likewise. + (class_key_or_enum): Likewise. + (dump_aggr_type): Likewise. + (dump_type_prefix): Likewise. + (dump_type_suffix): Likewise. + (dump_global_iord): Likewise. + (dump_simple_decl): Likewise. + (dump_decl): Likewise. + (dump_template_decl): Likewise. + (dump_function_decl): Likewise. + (dump_parameters): Likewise. + (dump_exception_spec): Likewise. + (dump_function_name): Likewise. + (dump_template_parms): Likewise. + (dump_char): Likewise. + (dump_expr_list): Likewise. + (dump_expr): Likewise. + (dump_binary_op): Likewise. + (dump_unary_op): Likewise. + (type_as_string): Likewise. + (expr_as_string): Likewise. + (decl_as_string): Likewise. + (context_as_string): Likewise. + (lang_decl_name): Likewise. + (cp_file_of): Likewise. + (cp_line_of): Likewise. + (decl_to_string): Likewise. + (expr_to_string): Likewise. + (fndecl_to_string): Likewise. + (code_to_string): Likewise. + (language_to_string): Likewise. + (parm_to_string): Likewise. + (op_to_string): Likewise. + (type_to_string): Likewise. + (assop_to_string): Likewise. + (args_to_string): Likewise. + (cv_to_string): Likewise. + (cxx_print_error_function): Likewise. + (cp_diagnostic_starter): Likewise. + (cp_diagnostic_finalizer): Likewise. + (cp_print_error_function): Likewise. + (function_category): Likewise. + (print_instantiation_full_context): Likewise. + (print_instantiation_partial_context): Likewise. + (maybe_print_instantiation_context): Likewise. + (print_instantiation_context): Likewise. + (cp_printer): Likewise. + (print_integer): Likewise. + (print_non_consecutive_character): Likewise. + (locate_error): Likewise. + + 2003-03-06 Mark Mitchell + + PR c++/9965 + * call.c (reference_binding): Add ref_is_var parameter. + (implicit_conversion): Adjust call to reference_binding. + (initialize_reference): Likewise. + + PR c++/9400 + * decl.c (pushdecl): Don't check for shadowing of DECL_ARTIFICIAL + PARM_DECLs. + + PR c++/9791 + * class.c (get_basefndecls): Use lookup_fnfields_1. + + 2003-03-06 Kriang Lerdsuwanakij + + PR c++/9188 + * parser.c (cp_parser_type_parameter): Remove redundant `expect' + in error message. + (cp_parser_single_declaration): Likewise. + + 2003-03-05 Jason Merrill + + PR c++/9440 + * call.c (build_conditional_expr): Use convert rather than an + explicit NOP_EXPR. + + 2003-03-02 Matt Austern + + * decl.c (cp_binding_level): Add static_decls varray member. + (add_decl_to_level): Add static/inline namespace scope + declarations to static_decls array. + (wrapup_global_for_namespace): Pass static_decls only, instead of + all decls, to wrapup_global_declarations/check_global_declarations. + (push_namespace): Initialize static_decls for ordinary namespaces. + (cxx_init_decl_processing): Initialize static_decls for global + namespace. + + 2003-03-05 Mark Mitchell + + * class.c (end_of_class): Correct thinko. + + 2003-03-04 Nathanael Nerode + + * config-lang.in: Replace ${libstdcxx_version} by its value. + + 2003-03-04 Gabriel Dos Reis + + * cp-tree.h (cxx_saved_binding): Declare. + (struct saved_scope): Adjust type of field 'old_binding'. + * decl.c (cxx_saved_binding_make): New macro. + (struct cxx_saved_binding): Define. + (store_bindings): Adjust prototype. Use cxx_saved_binding to save + C++ bindings. + (maybe_push_to_top_level): Adjust local variable type. + (pop_from_top_level): Likewise. + + 2003-03-04 Tom Tromey + + * Make-lang.in (c++.tags): New target. + + 2003-03-04 Neil Booth + + * Make-lang.in: Update. + + 2003-03-03 Jason Merrill + + * decl.c (finish_enum): Do set the type in a template. Simplify. + * pt.c (tsubst_enum, tsubst_copy): Revert last patch. + + 2003-03-03 Mark Mitchell + + PR c++/9878 + * call.c (convert_class_to_reference): Correct conversion + sequences. + (reference_binding): Add ref_bound_directly_to_rvalue_p parameter. + (implicit_conversion): Adjust call to reference_binding. + (add_candidate): Change type of candidates parameter. + (add_function_candidate): Likewise. + (add_conv_candidate): Likewise. + (build_builtin_candidate): Likewise. + (add_builtin_candidate): Likewise. + (add_builtin_candidates): Likewise. + (add_template_candidate_real): Likewise. + (add_template_candidate): Likewise. + (add_template_conv_candidate): Likewise. + (build_user_type_conversion_1): Adjust accordingly. + (build_object_call): Likewise. + (build_conditional_expr): Likewise. + (add_candidates): Likewise. + (build_new_op): Likewise. + (convert_like_real): Use USER_CONV_CAND. Use build_nop. + (build_new_method_call): Adjust calls to add_function_candidate. + (make_temporary_var_for_ref_to_temp): New function. + (initialize_reference): Add decl parameter. + * class.c (build_rtti_vtbl_entries): Use build_address and + build_nop. + * cp-tree.h (initialize_reference): Change prototype. + (make_temporary_var_for_ref_to_temp): New function. + (build_type_conversion): Change prototype. + (build_address): New function. + (build_nop): Likewise. + * cvt.c (cp_convert_to_pointer): Adjust call to + build_type_conversion. Avoid indicating redundant NOP_EXPRs. + Use build_nop. + (convert_to_pointer_force): Use build_nop. + (build_up_reference): Use make_temporary_var_for_ref_to_temp. + (convert_to_reference): Adjust call to build_type_conversion. + (ocp_convert): Likewise. + (build_type_conversion): Remove for_sure parameter. + * decl.c (grok_reference_init): Use initialize_reference. + * typeck.c (build_address): New function. + (build_nop): Likewise. + (build_unary_op): Use them. + (build_ptrmemfunc): Tidy slightly. + (convert_for_initialization): Adjust call to + initialize_reference. + * typeck2.c (store_init_value): Remove #if 0'd code. + + 2003-03-03 Jason Merrill + + * decl.c (start_function): Clear DECL_NUM_STMTS. + + * class.c (get_vtable_decl): Use vtbl_type_node. + (build_primary_vtable): Check for it. + + 2003-03-02 Aldy Hernandez + + * decl.c (check_initializer): Check for vector_opaque_p. + + 2003-03-02 Ashif Harji + + * lang-specs.h (default_compilers): Add -no-integrated-cpp flag to + invoke an external cpp during compilation. + + 2003-03-01 Gabriel Dos Reis + + * decl.c (duplicate_decls): Convert use of warning_with_decl() to + that of warning(). + (start_decl): Likewise. + (start_function): Likewise. + + 2003-03-01 Neil Booth + + * Make-lang.in (CXX_C_OBJS): Update. + + 2003-02-28 Mark Mitchell + + PR c++/9892 + * pt.c (instantiate_decl): Clear DECL_RTL for a VAR_DECL when + instantiating it. + + 2003-02-28 Aldy Hernandez + + * parser.c (cp_parser_init_declarator): Revert opaque + vector_opaque_p change. + Do not include target.h. + + 2003-02-28 Mark Mitchell + + PR c++/9879 + * cp-tree.h (build_zero_init): Add parameter. + * decl.c (cp_finish_decl): Adjust call. + * init.c (build_zero_init): Add nelts parameter. Adjust recursive + calls. + (build_default_init): Add nelts parameter. Adjust calls to + build_zero_init. + (build_new_1): Adjust call to build_default_init. + * typeck2.c (process_init_constructor): Adjust call to build_zero_init. + + 2003-02-26 Devang Patel + + * decl.c (finish_enum): Merge two 'for' loops. Copy value node if + required. Postpone enum setting for template decls. + (build_enumerator): Delay copying value node until finish_enum + (). Remove #if 0'ed code. + * pt.c (tsubst_enum): Set TREE_TYPE and copy value node. + (tsubst_copy): Add check for enum type. + + 2003-02-25 Mark Mitchell + + PR c++/9683 + * decl2.c (prune_vars_needing_no_initialization): Do not throw + away initializations for DECL_EXTERNAL VAR_DECLs. + (finish_file): Adjust accordingly. + * pt.c (instantiate_decl): Do not defer VAR_DECLs. + + 2003-02-24 Gabriel Dos Reis + + * decl.c (add_binding): Time TV_NAME_LOOKUP. + (push_class_binding): Likewise. + (set_namespace_binding): Likewise. + + 2003-02-24 Mark Mitchell + + PR c++/9836 + * cp-tree.h (CLASSTYPE_PRIMARY_TEMPLATE): Do not skip from + specializations back to the main template. + * parser.c (cp_parser_diagnose_invalid_type_name):Adjust use. + * pt.c (resolve_typename_type): Likewise. + + 2003-02-24 Jeffrey D. Oldham + + PR c++/9778 + * pt.c (tsubst_copy_and_build): For a templated function inside a + scope, process template arguments. + + 2003-02-24 Kriang Lerdsuwanakij + + PR c++/9602 + * typeck2.c (abstract_virtuals_error): Don't check when + TYPE is still template parameter dependent. + + 2003-02-23 Mark Mitchell + + PR c++/5333 + * cp-tree.h (CLASSTYPE_PRIMARY_TEMPLATE): New macro. + * parser.c (cp_parser_diagnose_invalid_type_name): Use it. + * pt.c (instantiate_class_template): Don't try to instantiate + dependent types. + (resolve_typename_type): Use CLASSTYPE_PRIMARY_TEMPLATE. + + 2003-02-21 Mark Mitchell + + PR c++/9749 + * decl.c (grokdeclarator): Do not allow parameters with variably + modified types. + + 2003-02-21 Nathan Sidwell + + * search.c (grow_bfs_bases): Remove. Fold into ... + (bfs_walk): ... here, fix fencepost error. Fix merge lossage + in previous patch. + + 2003-02-20 Mark Mitchell + + PR c++/9729 + * mangle.c (mangle_conv_op_name_for_type): Issue an error message + when the G++ 3.2 ABI prevents correct compilation. + + 2003-02-20 Nathan Sidwell + + Change base class access representation. Share virtual base + binfos. + * cp/call.c (build_special_member_call): Remove binfo_for_vbase + call. + * cp/class.c (build_base_path): Likewise. + (build_primary_vtable): Adjust BINFO_NEW_VTABLE_MARKED use. + (build_secondary_vtable): Remove FOR_TYPE arg. Adjust. + (make_new_vtable): Adjust. + (force_canonical_binfo_r): Delete. + (force_canonical_binfo): Delete. + (mark_primary_virtual_base): Delete. + (dfs_unshared_virtual_bases): Delete. + (mark_primary_bases): Adjust. + (maybe_warn_about_overly_private_class): Adjust. + (dfs_base_derived_from): Delete. + (base_derived_from): Follow the inheritance chain. + (struct find_final_overrider_data): Add vpath member. + (dfs_find_final_overrider): Adjust. + (dfs_find_final_overrider_q, dfs_find_final_overrider_post): New. + (find_final_overrider): Adjust. + (update_vtable_entry_for_fn): Adjust. + (modify_all_vtables): Adjust. + (walk_subobject_offsets): Adjust. + (layout_nonempty_base_or_field): Adjust. + (layout_empty_base): Remove last parameter. Adjust. + (build_base_field): Adjust. + (build_base_fields): Adjust. + (propagate_binfo_offsets): Remove last parameter. Adjust. + (dfs_set_offset_for_unshared_vbases): Delete. + (layout_virtual_bases): Adjust. + (finish_struct_1): Adjust. + (init_class_processing): Don't init access nodes. + (dfs_get_primary_binfo): Delete. + (get_primary_binfo): Adjust. + (dump_class_hierarchy_r): Remove most derived arg, add IGO + parameter. Adjust. + (dump_class_hierarchy): Adjust. + (finish_vtbls): Adjust. + (get_original_base): Delete. + (build_vtt_inits): Adjust. + (dfs_build_secondary_vptr_vtt_inits): Adjust. + (dfs_ctor_vtable_bases_queue_p): Adjust. + (build_ctor_vtbl_group): Adjust. + (dfs_accumulate_vtbl_inits): Adjust. + (build_vtbl_initializer): Adjust. + (build_vbase_offset_vtbl_entries): Adjust. + (add_vcall_offset_vtbl_entries_1): Adjust. + * cp/cp-tree.h (CPTI_ACCESS_*): Remove. + (access_*_node): Remove. + (CANONICAL_BINFO): Delete. + (BINFO_UNSHARED_MARKED): Remove. + (BINFO_MARKED): Set LANG_FLAG_0 directly. + (SET_BINFO_MARKED, CLEAR_BINFO_MARKED): Delete. + (BINFO_VTABLE_PATH_MARKED): Set LANG_FLAG_3 directly. + (SET_BINFO_VTABLE_PATH_MARKED, CLEAR_BINFO_VTABLE_PATH_MARKED): + Delete. + (BINFO_NEW_VTABLE_MARKED): Set LANG_FLAG_4 directly. + (SET_BINFO_NEW_VTABLE_MARKED): Adjust. + (SET_BINFO_PUSHDECLS_MARKED, CLEAR_BINFO_PUSHDECLS_MARKED): + Delete. + (BINFO_DEPENDENT_BASE_P): New. + (dfs_walk, dfs_walk_real): Queue function takes derived binfo and + index. + (markedp, unmarkedp): Adjust. + (dfs_unmarked_real_bases_queue_p, dfs_marked_real_bases_queue_p, + dfs_skip_vbases, marked_vtable_pathp, unmarked_vtable_pathp, + find_vbase_instance, binfo_for_vbase): Delete. + (copied_binfo, original_binfo): Declare. + (finish_base_specifier): Add virtual_p arg. + (unshare_base_binfos): Delete. + (copy_base_binfos): Declare. + (reverse_path): Delete. + * cp/decl.c (xref_basetypes): Access and virtuality passed + differently. Don't copy direct base binfos here. Call + copy_base_binfos. + * cp/init.c (dfs_initialize_vtbl_ptrs): Adjust. + (initialize_vtbl_ptrs): Adjust. + (expand_member_init): Adjust. + * cp/parser.c (cp_parser_base_specifier): Adjust. + * cp/pt.c (instantiate_class_template): Adjust. + (get_template_base_recursive): Adjust. + * cp/rtti.c (get_pseudo_ti_init): Adjust. + (get_pseudo_ti_desc): Adjust. + * cp/tree.c (unshare_base_binfos): Rename to ... + (copy_base_binfos): ... here, reimplement. + (make_binfo): Set BINFO_DEPENDENT_BASE_P. + (reverse_path): Remove. + * cp/typeck.c (get_delta_difference): Adjust error messages. + * cp/semantics.c (finish_base_specifier): Add virtual arg, adjust. + * cp/search.c (lookup_base_r): Adjust. + (dynamic_cast_base_recurse): Adjust. + (canonical_binfo): Remove. + (dfs_canonical_queue): Remove. + (dfs_assert_unmarked_p): Remove. + (assert_canonical_unmarked): Remove. + (shared_marked_p, shared_unmarked_p): Remove. + (BINFO_ACCESS, SET_BINFO_ACCESS): Use TREE_PUBLIC & TREE_PRIVATE. + (dfs_access_in_type): Adjust. + (access_in_type): Adjust. + (dfs_accessible_queue_p): Adjust. + (dfs_accessible_p): Adjust. + (is_subobject_of_p_1, is_subobject_of_p): Remove. + (struct lookup_field_info): Remove from_dep_base_p field. + (lookup_field_queue_p): Adjust, test BINFO_DEPENDENT_BASE_P. + (lookup_field_r): Remove dependent base code. + (lookup_member): Likewise. + (dfs_walk, dfs_walk_real): Add access arg to queue fn. + (dfs_unmarked_real_bases_queue_p): Remove. + (dfs_marked_real_bases_queue_p): Remove. + (dfs_skip_vbases): Remove. + (dfs_get_pure_virtuals): Adjust. + (markedp, unmarkedp): Adjust. + (marked_vtable_pathp, unmarked_vtable_pathp): Remove. + (marked_pushdecls_p, unmarked_pushdecls_p): Adjust. + (dfs_unmark): Adjust. + (dfs_get_vbase_types):Remove. + (dfs_build_inheritance_graph_order): Remove. + (get_vbase_types): Remove + (dfs_find_vbase_instance): Remove. + (find_vbase_instance): Remove. + (dfs_debug_unmarkedp): Adjust. + (dependent_base_p): Remove. + (dfs_push_type_decls): Adjust. + (dfs_push_decls): Adjust. + (dfs_no_overlap_yet): Adjust. + (copied_binfo): New function. + (original_binfo): New function. + (binfo_for_vbase): Remove. + + 2003-02-18 Zack Weinberg + + * cp/search.c (grow_bfs_bases): New subroutine of bfs_walk. + (bfs_walk): Rewritten using circular queue of BINFO_BASETYPES + vectors, for speed. + + 2003-02-18 Mark Mitchell + + PR c++/9704 + * class.c (layout_class_type): In the 3.2 ABI, take into account + trailing bit fields when computing CLASSTYPE_SIZE_UNIT. + + 2003-02-18 Matt Austern + + * cp/cp-lang.c: Change lang hooks so that final_write_globals does + nothing for C++. + * cp/decl.c (wrapup_globals_for_namespace): Remove special + handling of global namespace. + + 2003-02-18 Geoffrey Keating + + * cp-tree.h (rid_to_yy): Delete. + (C_RID_YYCODE): Delete. + (finish_file): Delete redundant declaration. + + 2003-02-18 Jason Merrill + + PR c++/9623 + * decl.c (reshape_init): Don't mess with initializer labels. + + PR c++/9485 + * parser.c (cp_parser_postfix_expression): Set idk properly for + object->scope::member. + + 2003-02-18 Ben Elliston + + PR other/7350 + * decl.c (duplicate_decls): Fix typo in comment. + + 2003-02-17 Michael Elizabeth Chastain + + PR debug/9717 + * class.c (build_base_field): Mark fields for base classes with + DECL_IGNORED_P. + + 2003-02-17 Kriang Lerdsuwanakij + + PR c++/9457 + * pt.c (tsubst_copy_and_build) [CONSTRUCTOR]: Substitute + CONSTRUCTOR_ELTS only once. + + 2003-02-16 Kriang Lerdsuwanakij + + PR c++/9459 + * error.c (dump_type_prefix): Handle TYPEOF_TYPE. + (dump_type_suffix): Likewise. + + 2003-02-14 Nathan Sidwell + + * search.c: ANSIfy function declarations and definitions. + * cp-tree.h (lookup_field, lookup_member): Last parameter is a bool. + * call.c (build_method_call, resolve_scoped_fn_name, + build_java_interface_fn_ref): Adjust lookup_field, lookup_member + calls. + * class.c (handle_using_decl): Likewise. + * decl.c (make_typename_type, make_unmound_class_template, + start_decl, compute_array_index_type): Likewise. + * decl2.c (build_expr_from_tree, build_call_from_tree): Likewise. + * init.c (expand_member_init, build_member_call): Likewise. + * pt.c (tsubst_copy, tsubst_copy_and_build, do_decl_instantiation, + resolve_typename_type): Likewise. + * typeck.c (lookup_destructor, finish_class_member_access_exprm + build_prememfunc_access_expr): Likewise. + + 2003-02-13 Gabriel Dos Reis + + * decl2.c: Include "timevar.h". + (namespace_ancestor): Time name lookup. + (add_using_namespace): Likewise. + (lookup_using_namespace): Likewise. + (qualified_lookup_using_namespace): Likewise. + (decl_namespace): Likewise. + (lookup_arg_dependent): Likewise. + * lex.c (do_identifier): Likewise. + (do_scoped_id): Likewise. + * pt.c (lookup_template_class): Likewise. + + 2003-02-14 Andrew Pinski + + * decl.c: (define_label): Fix warning for return 0 instead of NULL. + + 2003-02-13 Gabriel Dos Reis + + * decl.c: Include "timevar.h". + (poplevel): Time name lookup. + (find_binding): Likewise. + (push_namespace): Likewise. + (pop_nested_namespace): Likewise. + (store_bindings): Likewise. + (maybe_push_to_top_level): Likewise. + (pop_from_top_level): Likewise. + (push_local_name): Likewise. + (pushtag): Likewise. + (pushdecl): Likewise. + (pushdecl_with_scope): Likewise. + (pushdecl_namespace_level): Likewise. + (pushdecl_top_level): Likewise. + (pushdecl_class_level): Likewise. + (push_class_level_binding): Likewise. + (push_using_decl): Likewise. + (push_using_directive): Likewise. + (push_overloaded_decl): Likewise. + (lookup_label): Likewise. + (define_label): Likewise. + (lookup_tag): Likewise. + (lookup_tag_reverse): Likewise. + (lookup_namespace_name): Likewise. + (select_decl): Likewise. + (unqualified_namespace_lookup): Likewise. + (lookup_name_real): Likewise. + (lookup_name_current_level): Likewise. + (lookup_type_current_level): Likewise. + (maybe_inject_for_scope_var): Likewise. + (xref_tag): Likewise. + + * Make-lang.in (cp/decl.o): Add dependency on timevar.h + + 2003-02-12 Phil Edwards + + * decl.c (build_enumerator): Remove unneeded test. + + 2003-02-09 Dan Nicolaescu + + * cp-tree.h (struct lang_type_header): Make all fields unsigned + char. + + 2003-02-03 Mark Mitchell + + PR c++/7129 + * call.c (z_candidate): Add args. + (convert_class_to_reference): Set it. + (implicit_conversion): Tidy. + (add_candidate): Add args parameter. + (add_function_candidate): Adjust call to add_candidate. + (add_conv_candidate): Likewise. + (build_builtin_candidate): Likewise. + (build_user_type_conversion_1): Eliminate wasteful tree_cons + usage. + (build_new_function_call): Likewise. + (build_object_call): Likewise. + (add_candidates): New function. + (build_new_op): Use it. + (covert_like_real): Adjust call to build_over_call. + (build_over_call): Remove args parameter. + * operators.def: Add ?=. + + 2003-02-01 Richard Sandiford + + * typeck.c (build_indirect_ref): Don't check flag_volatile. + + 2003-01-31 Kriang Lerdsuwanakij + + PR c++/8849 + * pt.c (resolve_overloaded_unification): Handle FUNCTION_DECL. + + 2003-01-31 Nathan Sidwell + + * cp-tree.h (BINFO_SUBVTT_INDEX, BINFO_VPTR_INDEX, + BINFO_PRIMARY_BASE_OF): Use BINFO_ELTS. + (BINFO_LANG_ELTS): New #define. + * tree.c (make_binfo): Use BINFO_LANG_ELTS. + + 2003-01-30 Geoffrey Keating + + * cp/Make-lang.in: Remove -Wno-error from cp/decl.o. + + 2003-01-30 Mark Mitchell + + * class.c (check_field_decls): Only check C_TYPE_FIELDS_READONLY + for class types. + * cp-tree.h (C_TYPE_FIELDS_READONLY): Use a lang-specific bit + rather than TYPE_LANG_FLAG_0. + (TYPE_BUILT_IN): Remove. + (TYPE_DEPENDENT_P): New macro. + (TYPE_DEPENDENT_P_VALID): Likewise. + (lang_type_class): Add fields_readonly. + * decl.c (record_builtin_type): Don't set TYPE_BUILT_IN. + * pt.c (dependent_type_p_r): New function, split out from ... + (dependent_type_p): ... here. Memoize results. + * search.c (dependent_base_p): Use dependent_type_p, not + uses_template_parms. + * typeck.c (build_modify_expr): Only check C_TYPE_FIELDS_READONLY + for class types. + + 2003-01-29 Mark Mitchell + + * call.c (build_field_call): Use build_new_op, not build_opfncall. + (prep_operand): New function. + (build_new_op): Use it. Remove dead code. + * class.c (pushclass): Change "modify" parameter type from int to + bool. + (currently_open_class): Use same_type_p, not pointer equality. + (push_nested_class): Adjust calls to pushclass, remove modify + parameter. + * cp-tree.h (INTEGRAL_OR_ENUMERATION_TYPE_P): New macro. + (pushclass): Change prototype. + (push_nested_class): Likewise. + (grokoptypename): Remove. + (build_opfncall): Remove. + (value_dependent_expression_p): Declare. + (resolve_typename_type): Likewise. + (resolve_typename_type_in_current_instantiation): Likewise. + (enter_scope_of): Remove. + (tsubst): Remove. + (tsubst_expr): Likewise. + (tsubst_copy): Likewise. + (tsubst_copy_and_build): Likewise. + * decl.c (warn_about_implicit_typename_lookup): Remove. + (finish_case_label): Return error_mark_node for erroneous labels. + (start_decl): Adjust calls to push_nested_class. + (grokfndecl): Call push_scope/pop_scope around call to + duplicate_decls. + (grokdeclarator): Do not call tsubst. + (start_function): Adjust calls to push_nested_class. + * decl2.c (grok_array_decl): Use build_new_op, not build_opfncall. + (check_classfn): Use push_scope/pop_scope around type comparisions. + (grokoptypename): Remove. + (push_sscope): Adjust call to push_nested_class. + * error.c (dump_type): Show cv-qualification of typename types. + * init.c (build_member_call): Use build_new_op, not + build_opfncall. + * method.c (build_opfncall): Remove. + * parser.c (cp_parser): Add allow_non_constant_expression_p and + non_constant_expression_p. + (cp_parser_constant_expression): Adjust prototype. + (cp_parser_resolve_typename_type): Remove. + (cp_parser_non_constant_expression): New function. + (cp_parser_non_constant_id_expression): Likewise. + (cp_parser_new): Set allow_non_constant_expression_p and + non_constant_expression_p. + (cp_parser_primary_expression): Reject `this' and `va_arg' in + constant-expressions. Note that dependent names aren't really + constant. + (cp_parser_postfix_expression): Reject conversions to non-integral + types in constant-expressions. Neither are increments or + decrements. + (cp_parser_unary_expression): Reject increments and decrements in + constant-expressions. + (cp_parser_direct_new_declarator): Adjust call to + cp_parser_constant_expression. + (cp_parser_cast_expression): Reject conversions to non-integral + types in constant-expressions. + (cp_parser_assignment_expression): Rejects assignments in + constant-expressions. + (cp_parser_expression): Reject commas in constant-expressions. + (cp_parser_labeled_statement): Adjust call to + cp_parser_constant_expression. + (cp_parser_direct_declarator): Simplify array bounds, even in + templates, when they are non-dependent. Use + resolve_typename_type, not cp_parser_resolve_typename_type. + (cp_parser_class_head): Use resolve_typename_type, not + cp_parser_resolve_typename_type. + (cp_parser_member_declaration): Adjust call to + cp_parser_constant_expression. + (cp_parser_constant_initializer): Likewise. + (cp_parser_constructor_declarator): Use resolve_typename_type, not + cp_parser_resolve_typename_type. + (cp_parser_late_parsing_default_args): Adjust call to + push_nested_class. + * pt.c (tsubst): Give it internal linkage. + (tsubst_expr): Likewise. + (tsubst_copy): Likewise. + (tsubst_copy_and_build): Likewise. + (push_access_scope_real): Likewise. + (tsubst_friend_class): Likewise. + (instantiate_class_template): Adjust call to pushclass. + (value_dependent_expression_p): Give it external linkage. + Robustify. + (resolve_typename_type): New function. + * semantics.c (finish_call_expr): Use build_new_op, not + build_opfncall. + (begin_constructor_declarator): Remove. + (begin_class_definition): Adjust call to pushclass. + (enter_scope_of): Remove. + * typeck.c (comptypes): Resolve typename types as appropriate. + (build_x_indirect_ref): Use build_new_op, not build_opfncall. + (build_x_compound_expr): Likewise. + (build_modify_expr): Likewise. + (build_x_modify_expr): Likewise. + * typeck2.c (build_x_arrow): Likewise. + + 2003-01-29 Fariborz Jahanian + + * pt.c (last_pending_template) Declare GTY(). + + 2003-01-29 Kriang Lerdsuwanakij + + PR c++/8591 + * parser.c (cp_parser_elaborated_type_specifier): Convert + TEMPLATE_DECL to TYPE_DECL only when processing template friends. + (cp_parser_maybe_treat_template_as_class): Remove redundant tests. + + 2003-01-28 Nathan Sidwell + + PR c++/9437 + * pt.c (unify): Don't unify '*T' with 'U C::*'. + + PR c++/3902 + * parser.c (cp_parser_decl_specifier_seq): Cannot have constructor + inside a declarator. + + 2003-01-27 Nathan Sidwell + + * class.c (update_vtable_entry_for_fn): Add index parameter. + Generate vcall thunk for covariant overriding from a virtual + primary base. + (dfs_modify_vtables): Adjust. + + 2003-01-25 Nathan Sidwell + + PR c++/9403 + * parser.c (cp_parser_class_or_namespace_name): Reject duplicate + template keyword. + (cp_parser_base_specifier): Look for and consume a + TEMPLATE keyword. Replace switch with array index. + + PR c++/795 + * semantics.c (finish_non_static_data_member): Remember the + field's type even in a template. + + PR c++/9415 + * pt.c (tsubst_copy_and_build, CALL_EXPR): BASELINK exprs are + already scoped. + + PR c++/8545 + * parser.c (cp_parser_cast_expression): Be more tentative. + + 2003-01-25 Kriang Lerdsuwanakij + + * cp-tree.h (flagged_type_tree_s): Remove. + (check_for_new_type): Likewise. + * typeck2.c (check_for_new_type): Likewise. + + 2003-01-23 Nathanael Nerode + + * dump.c: ANSIfy function declarations and definitions. + + * cp-tree.h, decl.h: Get rid of PARAMS. Again. + + 2003-01-22 Mark Mitchell + + PR c++/9354 + * init.c (build_new): Set the type of the new-expression, even + when processing_templte_decl. + + PR c++/9216 + * parser.c (cp_parser_primary_expression): Improve error message + for templates used in an expression context. + + PR c++/8696 + * parser.c (cp_parser_decl_specifier_seq): Commit to tentative + parse when encountering "typedef". + + 2003-01-22 Nathanael Nerode + + * class.c, parser.c: ANSIfy function definitions and declarations. + + 2003-01-22 Mark Mitchell + + PR c++/9328 + * error.c (dump_decl): For an OVERLOAD, just print the name of the + function; it doesn't make sense to try to print its type. + * semantics.c (finish_typeof): Issue errors about invalid uses. + + PR c++/9298 + * parser.c (cp_parser_consume_semicolon_at_end_of_statement): New + function. + (cp_parser_expression_statement): Use it. + (cp_parser_explicit_instantiation): Likewise. + * pt.c (do_decl_instantiation): Improve error handling logic. + + 2003-01-22 Mark Mitchell + + PR c++/9384 + * parser.c (cp_parser_using_declaration): Issue error messages + about name resolution failures here. + + PR c++/9388 + * class.c (currently_open_derived_class): Use dependent_type_p. + * cp-tree.h (dependent_type_p): New function. + (dependent_template_arg_p): Likewise. + (dependent_template_p): Likewise. + (type_dependent_expression_p): Likewise. + * parser.c (cp_parser_dependent_type_p): Remove. + (cp_parser_value_dependent_type_p): Likewise. + (cp_parser_type_dependent_expression_p): Likewise. + (cp_parser_dependent_template_arg_p): Likewise. + (cp_parser_dependent_template_id_p): Likewise. + (cp_parser_dependent_template_p): Likewise. + (cp_parser_diagnose_invalid_type_name): Replace + cp_parser_dependent_type_p with dependent_type_p, etc. + (cp_parser_primary_expresion): Likewise. + (cp_parser_nested_name_specifier_opt): Likewise. + (cp_parser_postfix_expression): Likewise. + (cp_parser_unary_expression): Likewise. + (cp_parser_template_name): Likewise. + (cp_parser_class_name): Likewise. + (cp_parser_lookup_name): Likewise. + * pt.c (dependent_type_p): New function. + (value_dependent_expression_p): Likewise. + (type_dependent_expression_p): Likewise. + (dependent_template_arg_p): Likewise. + (dependent_template_id_p): Likewise. + (dependent_template_p): Likewise. + + PR c++/9285 + PR c++/9294 + * parser.c (cp_parser_simple_declaration): Return quickly when + encountering errors. + + 2003-01-21 Kaveh R. Ghazi + + Make-lang.in (cp/decl.o-warn): Add -Wno-error. + + 2003-01-17 Jason Merrill + + PR c++/9167, c++/9358 + * decl.c (require_complete_types_for_parms): Also update DECL_ARG_TYPE. + + 2003-01-17 Jason Merrill + + PR c++/9342 + * call.c (build_conditional_expr): Always do lvalue-rvalue + conversion. + + 2003-01-17 Mark Mitchell + + PR c++/9294 + * cp-tree.def (BASELINK): Make it class 'x', not class 'e'. + * cp-tree.h (BASELINK_BINFO): Adjust. + (BASELINK_FUNCTIONS): Likewise. + (BASELINK_ACCESS_BINFO): Likewise. + (tree_baselink): New structure. + (cp_tree_node_structure_enum): Add TS_CP_BASELINK. + (lang_tree_node): Add baselink. + * decl.c (cp_tree_node_structure): Add BASELINK case. + * search.c (build_baselink): Adjust. + * tree.c (cp_walk_subtrees): Add BASELINK case. Remove BASELINK_P + test from TREE_LIST case. + + PR c++/9272 + * parser.c (cp_parser_constructor_declarator_p): Do not assume + that a constructor cannot be declared outside of its own class. + + * parser.c (cp_parser_resolve_typename_type): If the scope cannot + be resolved, neither can the qualified name. + + * rtti.c (get_pseudo_ti_desc): Fix thinko. + + 2003-01-16 Jason Merrill + + PR c++/8564 + * init.c (build_vec_init): Re-add maxindex parm. + (perform_member_init, build_aggr_init): Pass it. + (build_new_1): Pass it. Use an incomplete array type for full_type. + * typeck.c (build_modify_expr): Pass it. + * cp-tree.h: Adjust. + + 2003-01-16 Jeffrey D. Oldham + + * cp-tree.h (tsubst_copy_and_build): New declaration. + * pt.c (tsubst_copy): Remove 'build_expr_from_tree' from comment. + (tsubst_expr): Use 'tsubst_copy_and_build'. Update initial comment. + (tsubst_copy_and_build): New function. + + 2003-01-16 Mark Mitchell + + * cp-tree.h (lang_type_class): Remove is_partial_instantiation. + (PARTIAL_INSTANTIATION_P): Remove. + (IMPLICIT_TYPENAME_P): Likewise. + (IMPLICIT_TYPENAME_TYPE_DECL_P): Likewise. + (build_typename_type): Remove declaration. + (parmlist_is_exprlist): Likewise. + * decl.c (build_typename_type): Make it static, remove third + parameter. + (push_class_binding): Don't do implicit typename stuff. + (make_typename_type): Likewise. + (lookup_name_real): Likewise. + (grokdeclarator): Don't try to convert declarations into + initializations. Don't do implicit typename stuff. + (parmlist_is_exprlist): Remove. + (xref_basetypes): Simplify. + * decl2.c (grokfield): Don't try to convert declarations into + initializations. + (build_anon_union_vars): Do this while processing templates, too. + (finish_anon_union): Likewise. + * error.c (dump_type): Remove implicit typename handling. + * parser.c (cp_parser_diagnose_invalid_type_name): New method. + (cp_parser_primary_expression): Correct handling of names not + found by unqualified name lookup in templates. + (cp_parser_nested_name_specifier_opt): Avoid checking dependency + of types when possible. + (cp_parser_simple_declaration): Complain intelligently about some + invalid declarations. + (cp_parser_member_declaration): Likewise. + (cp_parser_constructor_declarator_p): Don't check when we're in a + function scope. + * pt.c (instantiate_class_template): Remove + PARTIAL_INSTANTIATION_P gunk. + * search.c (lookup_field_r): Don't build implicit typenames. + (marked_pushdecls_p): Don't enter dependent base types. + (unmarked_pushdecls_p): Likewise. + * semantics.c (begin_class_definition): Remove implicit typename + stuff. + + 2003-01-16 Nathan Sidwell + + PR c++/9212 + * parser.c (cp_parser_direct_declarator): If accepting either + abstract or named, the name must be an unqualified-id. + + 2003-01-16 Kaveh R. Ghazi + + * class.c (layout_virtual_bases): Avoid signed/unsigned warning. + + 2003-01-14 Kaveh R. Ghazi + + * decl2.c (check_classfn): Fix uninitialized warning. + (build_anon_union_vars): Likewise. + * pt.c (tsubst_copy): Likewise. + + 2003-01-14 Jeffrey D. Oldham + + Further conform g++'s __vmi_class_type_info to the C++ ABI + specification. + * rtti.c (dfs_class_hint_mark): Do not set hints not specified by + the specification. + (class_hint_flags): Likewise. + + 2003-01-14 Kriang Lerdsuwanakij + + * config-lang.in: Add semantics.c to gtfiles. + * cp-tree.h (flagged_type_tree_s): Remove lookups field. + (saved_scope): Likewise. + (type_lookups): Remove. + (deferred_access): New structure. + (type_access_control): Remove. + (save_type_access_control): Likewise. + (reset_type_access_control): Likewise. + (decl_type_access_control): Likewise. + (push_deferring_access_checks): Declare. + (resume_deferring_access_checks): Likewise. + (stop_deferring_access_checks): Likewise. + (pop_deferring_access_checks): Likewise. + (get_deferred_access_checks): Likewise. + (pop_to_parent_deferring_access_checks): Likewise. + (perform_deferred_access_checks): Likewise. + (perform_or_defer_access_check): Likewise. + * decl.c (make_typename_type): Use perform_or_defer_access_check. + (make_unbound_class_template): Likewise. + (grokdeclarator): Don't call decl_type_access_control. + * parser.c (cp_parser_context): Remove deferred_access_checks + and deferring_access_checks_p fields. + (cp_parser_context_new): Adjust. + (cp_parser): Remove access_checks_lists. + (cp_parser_defer_access_check): Remove. + (cp_parser_start_deferring_access_checks): Remove. + (cp_parser_stop_deferring_access_checks): Remove. + (cp_parser_perform_deferred_access_checks): Remove. + (cp_parser_nested_name_specifier_opt): Use new deferred access + functions. + (cp_parser_simple_declaration): Likewise. + (cp_parser_template_id): Likewise. + (cp_parser_function_definition): Likewise. + (cp_parser_class_specifier): Likewise. + (cp_parser_lookup_name): Likewise. + (cp_parser_single_declaration): Likewise. + (cp_parser_pre_parsed_nested_name_specifier): Likewise. + (cp_parser_parse_tentatively): Likewise. + (cp_parser_parse_definitely): Likewise. + (yyparse): Likewise. + (cp_parser_init_declarator): Remove access_checks parameter. + Use new deferred access functions. + (cp_parser_function_definition_from_specifiers_and_declarator): + Likewise. + (cp_parser_class_head): Remove deferring_access_checks_p and + saved_access_checks parameters. Use new deferred access functions. + (cp_parser_member_specification_opt): Don't call + reset_type_access_control. + * search.c (type_access_control): Remove. + * semantics.c: Include "gt-cp-semantics.h". + (deferred_type_access_control): Remove. + (deferred_access_stack): New variable. + (deferred_access_free_list): Likewise. + (push_deferring_access_checks): New function. + (resume_deferring_access_checks): Likewise. + (stop_deferring_access_checks): Likewise. + (pop_deferring_access_checks): Likewise. + (get_deferred_access_checks): Likewise. + (pop_to_parent_deferring_access_checks): Likewise. + (perform_deferred_access_checks): New function, adapted from + cp_parser_perform_deferred_access_checks. + (perform_or_defer_access_check): New function, adapted from + cp_parser_defer_access_check. + (current_type_lookups): Remove. + (deferred_type_access_control): Likewise. + (decl_type_access_control): Likewise. + (save_type_access_control): Likewise. + (reset_type_access_control): Likewise. + (begin_function_definition): Adjust. + (begin_class_definiton): Likewise. + + 2003-01-13 Jason Merrill + + PR c++/8748 + * class.c (build_base_path): Take the address before calling save_expr. + + * call.c (build_user_type_conversion_1): Do set ICS_BAD_FLAG if + all the ambiguous conversions are bad. + + * class.c (maybe_warn_about_overly_private_class): Don't stop + searching when we find a nonprivate method. + + * typeck.c (build_class_member_access_expr): Use unary_complex_lvalue. + + 2003-01-12 Mark Mitchell + + * cp-tree.h (get_arglist_len_in_bytes): Remove. + + PR c++/9264 + * parser.c (cp_parser_elaborated_type_specifier): Handle erroneous + typeame types more robustly. + + 2003-01-11 Phil Edwards + + * parser.c: Fix comment typos. + + 2003-01-10 Mark Mitchell + + PR c++/9099 + * parser.c (cp_parser_scope_through_which_access_occurs): Handle + an object_type which is not a class type. + + 2003-01-10 Geoffrey Keating + + * parser.c (cp_parser_late_parsing_for_member): Don't cast to void. + (cp_parser_late_parsing_default_args): Likewise. + + 2003-01-10 Nathanael Nerode + + * cfns.gperf: ANSIfy function declarations. + * cfns.h: Regenerate. + * cp-tree.h: ANSIfy function declarations. + + 2003-01-10 Mark Mitchell + + * cp-tree.h (reparse_absdcl_as_expr): Remove. + (reparse_absdcl_as_casts): Likewise. + (reparse_decl_as_expr): Likewise. + (finish_decl_parsing): Likewise. + * decl2.c (reparse_absdcl_as_expr): Remove. + (reparse_absdcl_as_casts): Likewise. + (repase_decl_as_expr): Likewise. + (finish_decl_parsing): Likewise. + + PR c++/9128 + PR c++/9153 + PR c++/9171 + * parser.c (cp_parser_pre_parsed_nested_name_specifier): New + function. + (cp_parser_nested_name_specifier_opt): Correct the + check_dependency_p false. + (cp_parser_postfix_expression): Fix formatting. + (cp_parser_decl_specifier_seq): Avoid looking for constructor + declarators when possible. + (cp_parser_template_id): Avoid performing name-lookup when + possible. + (cp_parser_class_head): Do not count specializations when counting + levels of templates. + (cp_parser_constructor_declarator_p): Return immediately if + there's no chance that the tokens form a constructor declarator. + * rtti.c (throw_bad_typeid): Add comment. Do not return an + expression with reference type. + (get_tinfo_decl_dynamic): Do not return an expression with + reference type. + (build_typeid): Add comment. Do not return an expression with + reference type. + * typeck.c (build_class_member_access_expr): Improve handling of + conditionals and comma-expressions as objects. + + 2003-01-09 Nathanael Nerode + + * cfns.gperf: ANSIfy function declarations. + * cfns.h: Regenerate. + * cp-tree.h: ANSIfy function declarations. + * parser.c: ANSIfy function declarations & definitions. + + * decl.c (bad_specifiers): Fix parameter order error I introduced. + + 2003-01-09 Geoffrey Keating + + Merge from pch-branch: + + 2003-01-09 Geoffrey Keating + + Merge to tag pch-merge-20030102: + + * semantics.c (finish_translation_unit): Don't call finish_file. + * parser.c: Don't include ggc.h. + (cp_lexer_new_main): Rename from cp_lexer_new, only create main lexer, + read first token here. Don't allow PCH files after the first + token is read. + (cp_lexer_new_from_tokens): Duplicate functionality from cp_lexer_new. + (cp_lexer_get_preprocessor_token): Allow LEXER to be NULL. + (cp_parser_new): Call cp_lexer_new_main before allocating GCed memory. + (cp_parser_late_parsing_for_member): Don't duplicate call to + cp_lexer_set_source_position_from_token. + (cp_parser_late_parsing_default_args): Likewise. + (yyparse): Call finish_file after clearing the_parser. + + 2002-12-11 Geoffrey Keating + + * Make-lang.in: Remove $(GGC_H) from all dependencies. + (CXX_TREE_H): Add $(GGC_H). + * class.c: Don't include ggc.h. + (field_decl_cmp): Make parameters be 'const void *' to match qsort. + (method_name_cmp): Likewise. + (resort_data): New variable. + (resort_field_decl_cmp): New. + (resort_method_name_cmp): New. + (resort_sorted_fields): New. + (resort_type_method_vec): New. + (finish_struct_methods): Delete cast. + (finish_struct_1): Delete cast. + * cp-tree.h: Include ggc.h. + (struct lang_type_class): Add reorder attribute to field `methods'. + (union lang_decl_u3): Add reorder attribute to field `sorted_fields'. + (resort_sorted_fields): New prototype. + (resort_type_method_vec): New prototype. + * call.c: Don't include ggc.h. + * decl.c: Likewise. + * decl2.c: Likewise. + * init.c: Likewise. + * lex.c: Likewise. + * method.c: Likewise. + * optimize.c: Likewise. + * parse.y: Likewise. + * pt.c: Likewise. + * repo.c: Likewise. + * search.c: Likewise. + * semantics.c: Likewise. + * spew.c: Likewise. + * tree.c: Likewise. + + * lang-specs.h: Remove comment. + + 2002-12-03 Geoffrey Keating + + * cp-tree.h (struct operator_name_info_t): Mark for GTY machinery. + (operator_name_info): Mark to be saved for PCH, specify size. + (assignment_operator_name_info): Likewise. + + 2002-11-19 Geoffrey Keating + + * decl.c (anon_cnt): Mark to be saved for PCH. + + 2002-10-25 Geoffrey Keating + + * lex.c (init_reswords): Delete now-untrue comment. + Allocate ridpointers using GGC. + + 2002-10-04 Geoffrey Keating + + * cp-tree.h (union lang_decl_u2): Add tags to all fields. + + * g++spec.c (lang_specific_driver): Don't include standard + libraries in `added'. + + 2002-08-27 Geoffrey Keating + + * decl2.c (finish_file): Call c_common_write_pch. + * Make-lang.in (CXX_C_OBJS): Add c-pch.o. + + 2002-08-17 Geoffrey Keating + + * g++spec.c (lang_specific_driver): Treat .h files as C++ header + files when using g++. + * lang-specs.h: Handle compiling C++ header files. + + 2003-01-09 Jakub Jelinek + + * decl.c (start_decl): Only check DECL_THREAD_LOCAL for VAR_DECLs. + + 2003-01-09 Kriang Lerdsuwanakij + + * pt.c (push_access_scope_real): Call push_to_top_level for + function in namespace scope. + (pop_access_scope): Call pop_from_top_level for function in + namespace scope. + + 2003-01-09 Jakub Jelinek + + * decl.c (start_decl): Don't set DECL_COMMON for __thread variables. + + 2003-01-09 Christian Cornelssen + + * Make-lang.in (c++.install-common, c++.install-man, + c++.uninstall): Prepend $(DESTDIR) to destination paths in + all (un)installation commands. + (c++.install-common): Rewrite $(LN) commands to support + DESTDIR with "ln" as well as with "ln -s". + + 2003-01-08 Jason Merrill + + * parser.c (cp_parser_primary_expression): See through explicitly + scoped ALIAS_DECLs, too. + + 2003-01-08 Nathanael Nerode + + * decl.c: Remove some #if 0 code. + + * decl.c: ANSIfy function declarations. + + 2003-01-07 Mark Mitchell + + * parser.c (cp_parser_asm_definition): Correct handling of omitted + operands. + + 2003-01-08 Kriang Lerdsuwanakij + + PR c++/9030 + * decl.c (make_typename_type): Check access only when tf_error. + (make_unbound_class_template): Likewise. + * pt.c (saved_access_scope): New variable. + (push_access_scope_real): New function. + (push_access_scope): Likewise. + (pop_access_scope): Likewise. + (tsubst_default_argument): Use them. + (instantiate_template): Likewise. + (regenerate_decl_from_template): Likewise. + (instantiate_decl): Likewise. + (get_mostly_instantiated_function_type): Likewise. + + 2003-01-07 Nathanael Nerode + + * tree.c: Delete bogus #if 0 code. + + 2003-01-07 Andreas Schwab + + * class.c (layout_class_type): Don't use + PCC_BITFIELD_TYPE_MATTERS if not defined. + + 2003-01-06 Mark Mitchell + + PR c++/9165 + * decl2.c (build_cleanup): Mark the object as used. + + * pt.c (retrieve_local_specialization): Revert 2003-01-05 change. + (hash_local_specialization): New function. + (register_local_specialization): Revert 2003-01-05 change. + (instantiate_decl): Use hash_local_specialization when creating + the local_specializations table. + + * decl2.c (mark_used): Do not synthesize thunks. + + * class.c (layout_class_type): Correct handling of unnamed + bitfields wider than their types. + + PR c++/9189 + * parser.c (cp_parser): Remove default_arg_types. Update + documentation for unparsed_functions_queues. + (cp_parser_late_parsing_default_args): Take a FUNCTION_DECL as the + parameter. + (cp_parser_new): Don't set parser->default_arg_types. + (cp_parser_function_definition): Adjust usage of + unparsed_funtions_queues. + (cp_parser_class_specifier): Don't mess with + parser->default_arg_types. Handle default argument processing in + a separate phase from function body processing. + (cp_parser_template_declaration_after_export): Adjust usage of + unparsed_functions_queues. + (cp_parser_late_parsing_for_member): Do not handle default + arguments. + + 2003-01-06 Nathan Sidwell + + PR c++/9109 + * parser.c (cp_parser_declarator_kind): New enum. + (cp_parser_declarator): Adjust. + (cp_parser_direct_declarator): Adjust. Allow for either named or + abstract declarator. Prefer abstract, if possible. Allow + parenthesized function name. + (cp_parser_condition): Adjust cp_parser_declarator call. + (cp_parser_explicit_instantiation): Likewise. + (cp_parser_init_declarator): Likewise. + (cp_parser_type_id): Likewise. + (cp_parser_function_definition): Likewise. + (cp_parser_member_declaration): Likewise. + (cp_parser_parameter_declaration): Use cp_parser_declarator to do + the tentative parsing. + (cp_parser_exception_declaration): Likewise. + + 2003-01-05 Mark Mitchell + + * parser.c (cp_parser_template_parameter): Adjust call to + cp_parser_parameter_declaration. + (cp_parser_parameter_declaration_list): Likewise. + (cp_parser_parameter_declaration): Replace + greater_than_is_operator_p with template_parm_p parameter. Do not + cache tokens for template default arguments. + + * pt.c (retrieve_local_specialization): Use htab_find, not + htab_find_with_hash. + (register_local_specialization): Use htab_find_slot, not + htab_find_slot_with_hash. + (instantiate_decl): Pass a hash function to htab_create. + + 2003-01-04 Kaveh R. Ghazi + + * parser.c (cp_parser_binary_expression, + cp_parser_multiplicative_expression, + cp_parser_additive_expression, cp_parser_shift_expression, + cp_parser_relational_expression, cp_parser_equality_expression, + cp_parser_and_expression, cp_parser_exclusive_or_expression, + cp_parser_inclusive_or_expression, + cp_parser_logical_and_expression, cp_parser_logical_or_expression, + cp_parser_binary_expression): Const-ify. + + 2003-01-04 Mark Mitchell + + * method.c (use_thunk): Disable access control while building the + body of the thunk. + + 2003-01-03 Nathanael Nerode + + * cvt.c, decl.c, decl2.c: This is the C++ front end, not the C + front end. + + 2003-01-03 Matt Austern + + * cp-tree.h (struct lang_type_class): add field for key method + (cp_global_trees): rename dynamic_classes to keyed_classes + (key_method): add definition + * class.c (finish_struct_1): compute class's key method, and add + the class to keyed_classes list if there is no key method. + * decl.c (finish_function): add class to keyed_classes list if we + see a definition of the class's key method. + * pt.c (instantiate_class_template): add template specialization + of a dynamic class to keyed_classes list. + * decl2.c (key_method): remove + (finish_file): iterate only through keyed_classes list when + deciding whether to emit vtables, remove class from its list after + we do the emission. + + 2003-01-02 Jason Merrill + + * call.c (build_conditional_expr): Stabilize lvalues properly. + * cvt.c (ocp_convert): Don't build NOP_EXPRs of class type. + * tree.c (lvalue_p_1): Don't allow sloppy NOP_EXPRs as lvalues. + Don't allow CALL_EXPR or VA_ARG_EXPR, either. + + * call.c (convert_like_real): Call decl_constant_value for an + IDENTITY_CONV even if there are no more conversions. + + * cvt.c (build_up_reference): Don't push unnamed temps. + + * decl2.c (do_namespace_alias): Namespace aliases are DECL_EXTERNAL. + + * dump.c (cp_dump_tree): Don't try to dump class-specific fields + for a backend struct. + + * except.c (wrap_cleanups_r, build_throw): Make + MUST_NOT_THROW_EXPRs void. + * init.c (expand_default_init): Update to handle MUST_NOT_THROW_EXPR. + + * init.c (build_vec_delete_1): Pre-evaluate the base address. + + * init.c (get_temp_regvar): Simplify logic. + + * tree.c (cp_copy_res_decl_for_inlining): Only do debug tweaks if + our replacement is a decl. + + * decl.c (cp_make_fname_decl): Push the decls inside the + outermost scope. + + 2003-01-03 Nathan Sidwell + + PR c++/45, c++/3784 + * tree.c (cp_tree_equal, TEMPLATE_PARM_INDEX): The types must be + the same too. + + 2003-01-03 Graham Stott + + * parser.c (struct cp_parser): Add access_checks_lists field + (cp_parser_simple_declaration): Use. + (cp_parser_init_declarator): Likewise. + + 2003-01-02 Mark Mitchell + + * parser.c (cp_parser_declaration): Accept the __extension__ + keyword before the declaration. + + PR c++/2843 + * parser.c (cp_parser_parameter_declaration): Allow attributes to + appear after the declarator. + + * call.c (build_new_method_call): Fix typo in message format + string. + + 2003-01-02 Mark Mitchell + + * parser.c (cp_lexer_next_token_is): Declare it inline. + (cp_lexer_set_source_position_from_token): Likewise. + (cp_lexer_debugging_p): Likewise. + (cp_parser_parsing_tentatively): Likewise. + (cp_parser_nested_name_specifier_opt): Reduce the number of calls + to the cp_lexer_peek_token. + + * parser.c (cp_parser_sizeof_operand): Do not evaluate the + expression. + + 2003-01-02 Steven Bosscher + + * cp/except.c, cp/expr.c, cp/friend.c, cp/g++spec.c, + cp/lang-options.h, cp/lang-specs.h, cp/lex.h, cp/ptree.c, + cp/repo.c: Fix copyright years. + + 2003-01-01 Neil Booth + + * lex.c: Remove superfluous include of cpplib.h. + (CONSTRAINT): Define without conditions. + (init_cp_pragma): Use c_register_pragma. + + 2002-12-31 Neil Booth + + * .cvsignore: Remove. + + 2002-12-31 Steven Bosscher + + * call.c, class.c, cp-lang.c, cp-tree.h, cvt.c, dump.c, error.c, + except.c, expr.c friend.c, g++spec.c, init.c, lang-options.h, + lang-specs.h, lex.c, mangle.c, method.c, optimize.c, parser.c, + pt.c, ptree.c, repo.c, rtti.c, search.c, semantics.c, tree.c, + typeck.c, typeck2.c: Replace "GNU CC" with "GCC" in the + copyright header. + * lex.h: parse.y is dead, so don't mention it. Also replace the + copyright header with the default GNU copyright header. + + 2002-12-31 Mark Mitchell + + * cp-tree.h (LOOKUP_TEMPLATES_EXPECTED): Remove. + (lookup_name_namespace_only): Likewise. + (begin_only_namespace_names): Likewise. + (end_only_namespace_names): Likewise. + * decl.c (only_namespace_names): Remove. + (qualify_lookup): Do not check LOOKUP_TEMPLATES_EXPECTED. + (lookup_name_real): Do not check only_namespace_names. + (lookup_name_namespace_only): Remove. + (begin_only_namespace_names): Likewise. + (end_only_namespace_names): Likewise. + * parser.c (cp_parser_nested_name_specifier_opt): Handle erroneous + nested-name-specifiers more gracefully. + (cp_parser_class_or_namespace_name): Avoid looking up namespace + names when they cannot possibly appear. + (cp_parser_template_name): Adjust call to cp_parser_lookup_name. + (cp_parser_elaborated_type_specifier): Likewise. + (cp_parser_namespace_name): Only look for namespace names. + (cp_parser_lookup_name): Add is_namespace parameter. + (cp_parser_lookup_name_simple): Adjust call to + cp_parser_lookup_name. + + * parser.c (cp_parser_dependent_type_p): Fix thinko. + + 2002-12-31 Neil Booth + + * .cvsignore: Update. + + 2002-12-31 Nathan Sidwell + + * class.c (modify_vtable_entry): Remove unused variable. + (get_vcall_index): Always expect a non-thunk. + (update_vtable_entry_for_fn): Combine covariant adjustments, when + overriding a thunk. Pass get_vcall_index a non-thunk. + + * decl2.c (finish_file): Mark undefined inlines as extern. + + 2002-12-31 Mark Mitchell + + * cp-tree.def (RETURN_INIT): Remove. + * cp-tree.h (DECL_IN_MEMORY_P): Remove. + (scope_kind): Add sk_block, sk_try, sk_catch, sk_for. + (note_level_for_for): Remove. + (note_level_for_try): Likewise. + (note_level_for_catch): Likewise. + (finish_named_return_value): Likewise. + (do_pushlevel): Change prototype. + (pending_lang_change): Remove. + * decl.c (begin_scope): Handle sk_block, sk_try, sk_catch, + sk_for. + (note_level_for_for): Remove. + (note_level_for_try): Likewise. + (note_level_for_catch): Likewise. + (maybe_inject_for_scope_var): Remove use of DECL_IN_MEMORY_P. + * parser.c (cp_parser_context_free_list): Make it "deletable". + (cp_parser_template_argument): Remove misleading comment. + * pt.c (tsubst_expr): Remove RETURN_INIT code. + * semantics.c (genrtl_named_return_value): Remove. + (do_pushlevel): Take a scope kind as an argument. + (begin_if_stmt): Adjust. + (begin_while_stmt): Likewise. + (begin_for_stmt): Likewise. + (finish_for_init_stmt): Likewise. + (begin_switch_stmt): Likewise. + (begin_handler): Likewise. + (begin_compound_stmt): Likewise. + (finish_named_return_value): Remove. + (cp_expand_stmt): Remove RETURN_INIT case. + * tree.c (cp_statement_code_p): Remove RETURN_INIT case. + + 2002-12-31 Mark Mitchell + + PR c++/9112 + * parser.c (cp_parser_direct_declarator): Handle erroneous + parenthesized declarators correctly. + + 2002-12-31 Gabriel Dos Reis + + * cp-tree.h (pending_lang_change): Declare. + + 2002-12-30 Mark Mitchell + + * parser.c (cp_parser_context_free_list): New variable. + (cp_parser_context_new): Use it. + (cp_parser_error): Check return code from + cp_parser_simulate_error. + (cp_parser_simulate_error): Return a value. + (cp_parser_id_expression): Optimize common case. + (cp_parser_class_name): Likewise. + (cp_parser_class_specifier): Adjust call to + cp_parser_late_parsing_default_args. + (cp_parser_lookup_name): Optimize common case. + (cp_parser_late_parsing_for_member): Adjust call to + cp_parser_late_parsing_default_args. + (cp_parser_late_parsing_default_args): Add scope parameter. + (cp_parser_require): Avoid creating the error message unless it's + needed. + (cp_parser_parse_definitely): Place free'd contexts on the free + list. + + * parser.c (cp_parser_declaration_seq_opt): Handle pending_lang_change. + + 2002-12-30 David Edelsohn + + * parser.c (cp_parser_parameter_declaration_clause): Treat system + header as extern "C" if NO_IMPLICIT_EXTERN_C undefined. + + 2002-12-30 Nathanael Nerode + + * config-lang.in, Make-lang.in, operators.def, cp-tree.def: + GCC, not GNU CC. + + 2002-12-30 Mark Mitchell + + * parse.y: Remove. + * spew.c: Likewise. + * Make-lang.in (gt-cp-spew.h): Remove. + * cp-tree.h (do_pending_lang_change): Remove. + (do_identifier): Change prototype. + (finish_id_expr): Remove. + * decl.c (lookup_name_real): Remove yylex variable. + * decl2.c (build_expr_from_tree): Adjust call to do_identifier. + * lex.c (init_cpp_parse): Remove. + (reduce_cmp): Likewise. + (token_cmp): Likewise. + (yychar): Likewise. + (lastiddecl): Likewise. + (token_count): Likewise. + (reduce_count): Likewise. + (yyhook): Likewise. + (print_parse_statistics): Likewise. + (do_pending_lang_change): Likewise. + (do_identifier): Remove parsing parameter. + * lex.h (lastiddecl): Remove. + (looking_for_typename): Remove. + (looking_for_template): Likewise. + (pending_lang_change): Likewise. + (yylex): Likewise. + * semantics.c (finish_id_expr): Remove. + + * decl.c (grokdeclarator): Diagnost "extern thread" and "static + thread" correctly. + + 2002-12-30 Nathanael Nerode + + * decl.c, decl2.c, decl.h: GCC, not GNU CC. This is the C++ front + end, not the C front end. + + 2002-12-30 Nathan Sidwell + + * cp-tree.h (THUNK_TARGET): New macro. + (THUNK_VIRTUAL_OFFSET): For result thunks it is always a binfo. + (finish_thunk): Remove offset parms. + * class.c (find_final_overrider): Look through thunks. + (get_vcall_index): Use THUNK_TARGET. + (update_vtable_entry_for_fn): Look through thunks. Set covariant + fixed offset here. Adjust finish_thunk call. + (build_vtbl_initializer): Adjust finish_thunk calls. + * mangle.c (mangle_call_offset): Remove superfluous if. + (mangle_thunk): Adjust. + * method.c (make_thunk): Adjust. + (finish_thunk): Adjust. + (thunk_adjust): Remove assert. + (use_thunk): Use THUNK_TARGET + * dump1.c (cp_dump_tree): Adjust thunk dumping. + + PR c++/9054 + * class.c (layout_class_type): Set TYPE_CONTEXT of type for base. + * dump.c (cp_dump_tree, RECORD_TYPE): Deal with type for base types. + + 2002-12-28 Gabriel Dos Reis + + Remove traditional C constructs 4/n. + * decl2.c (grok_method_quals, warn_if_unknown_interface, + grok_x_components, cp_build_parm_decl, build_artificial_parm, + maybe_retrofit_in_chrg, grokclassfn, grok_array_decl, + delete_sanity, check_member_template, check_java_method, + check_classfn, finish_static_data_member_decl, grokfield, + grokbitfield, grokoptypename, grok_function_init, + cplus_decl_attributes, constructor_name, defer_fn, + build_anon_union_vars, finish_anon_union, coerce_new_type, + coerce_delete_type, comdat_linkage, maybe_make_one_only, + key_method, import_export_vtable, import_export_class, + output_vtable_inherit, import_export_decl, import_export_tinfo, + build_cleanup, get_guard, get_guard_bits, get_guard_cond, + set_guard, start_objects, finish_objects, + start_static_storage_duration_function, + finish_static_storage_duration_function, get_priority_info, + start_static_initialization_or_destruction, + finish_static_initialization_or_destruction, + do_static_initialization, do_static_destruction, + prune_vars_needing_no_initialization, write_out_vars, + reparse_decl_as_expr, finish_decl_parsing, namespace_ancestor, + add_using_namespace, merge_functions, ambiguous_decl, + lookup_using_namespace, lookup_using_namespace, + qualified_lookup_using_namespace, set_decl_namespace, + decl_namespace, current_decl_namespace, push_decl_namespace, + pop_decl_namespace, push_scope, pop_scope, add_function, + arg_assoc_namespace, arg_assoc_template_arg, arg_assoc, + lookup_arg_dependent, do_namespace_alias, + validate_nonmember_using_decl, do_nonmember_using_decl, + do_toplevel_using_decl, do_local_using_decl, + do_class_using_decl, do_using_directive, check_default_args, + mark_used, handle_class_head): Use C90 prototypings. Use booleans. + * parser.c (cp_parser_class_head): Use booleanss. + * decl.c (walk_globals, walk_vtables): Likewise. + * cp-tree.h (walk_globals_pred, walk_globals_fn, walk_vtables, + walk_globals): Change return type from 'int' to 'bool'. + * rtti.c (init_rtti_processing, build_headof, throw_bad_cast + throw_bad_typeid, get_tinfo_decl_dynamic, typeid_ok_p, + build_typeid, tinfo_name, get_tinfo_decl, get_tinfo_ptr, + get_typeid, ifnonnull, build_dynamic_cast_1, build_dynamic_cast, + qualifier_flags, tinfo_base_init, generic_initializer, + ptr_initializer, dfs_class_hint_mark, ptm_initializer, + dfs_class_hint_unmark, class_hint_flags, class_initializer, + typeinfo_in_lib_p, get_pseudo_ti_init, create_pseudo_type_info, + get_pseudo_ti_desc, create_tinfo_types, emit_support_tinfos, + unemitted_tinfo_decl_p, emit_tinfo_decl): Likewise. + * repo.c (repo_compile_flags, repo_template_declared, + repo_template_defined, repo_class_defined, repo_get_id, + repo_template_used, repo_vtable_used, repo_inline_used, + repo_tinfo_used, repo_template_instantiated, extract_string, + open_repo_file, afgets, init_repo, reopen_repo_file_for_write, + finish_repo): Likewise. + * ptree.c (cxx_print_decl, cxx_print_type, cxx_print_identifier, + cxx_print_xnode): Likewise.. + * cp-lang.c (ok_to_generate_alias_set_for_type, cxx_get_alias_set, + cxx_warn_unused_global_decl, cp_expr_size): Likewise. + * cxxfilt.c (demangle_it, print_demangler_list, usage, + standard_symbol_characters, hp_symbol_characters, main, fatal): + Likewise. + (strip_underscore): Change type from 'int' to 'bool'. + (main): Use boolean constants. + + 2002-12-28 Gabriel Dos Reis + + Remove traditional C constructs 3/n. + * cvt.c (cp_convert_to_pointer, convert_to_pointer_force, + build_up_reference, warn_ref_binding, convert_to_reference, + convert_from_reference, convert_lvalue, cp_convert, ocp_convert, + convert_to_void, convert, convert_force, build_type_conversion, + build_expr_type_conversion, type_promotes_to, + perform_qualification_conversions): Use C90 prototyping style. + * decl2.c (grok_array_decl): Use boolean constant. + (delete_sanity): Likewise. + * typeck.c (build_unary_op): Likewise. + * semantics.c (finish_switch_cond): Likewise. + * parser.c (cp_parser_direct_new_declarator): Likewise. + * init.c (build_new): Likewise. + + 2002-12-27 Mark Mitchell + + * Make-lang.in (po-generated): Remove parse.c. + (CXX_OBJS): Remove parse.o and spew.o. Add parser.o. + ($(srcdir)/cp/parse.h): Remove target. + ($(srcdir)/cp/parse.c): Likewise. + (gt-cp-parse.h): Likewise. + (gt-cp-parser.h): New target. + (c++.distclean): Do not remove parse.output. + (c++.maintainer-clean): Do not remove parse.c or parse.h. + (cp/spew.o): Remove target. + (cp/lex.o): Adjust dependencies. + (cp/pt.o): Likewise. + (cp/parse.o): Likewise. + (cp/TAGS): Do not mention parse.c. + (cp/parser.o): New target. + * NEWS: Mention the new parser. + * call.c (build_scoped_method_call): Simplify. + (build_method_call): Likewise. + (build_new_function_call): Adjust calls to add_function_candidate + and add_template_candidate. + (build_new_op): Improve handling of erroroneous operands. + (convert_default_arg): Remove circular argument processing. + (name_as_c_string): New function. + (build_new_method_call): Use it. + (perform_implicit_conversion): Use error_operand_p. + * class.c (finish_struct_anon): Use constructor_name_p. + (check_field_decls): Likewise. + (pop_nested_class): Use OVL_NEXT, not OVL_CHAIN. + (resolve_address_of_overloaded_function): Likewise. + (instantiate_type): Tweak pointer-to-member handling. + (get_primary_binfo): Remove incorrect assertion. + * config-lang.in (gtfiles): Add parser.c, remove parse.c. + * cp-tree.h (DEFARG_TOKENS): New macro. + (default_arg): New structure. + (cp_tree_node_structure_enum): Add TS_CP_DEFAULT_ARG. + (lang_tree_node): Add default_arg. + (cp_tree_index): Add CPTI_TYPE_INFO_REF_TYPE. + (type_info_ref_type): New macro. + (saved_scope): Make processing_explicit_instantiation a boolean. + (check_access): New field. + (unparsed_text): Remove. + (language_function): Remove unparsed_inlines. + (error_operand_p): New macro. + (lang_decl): Adjust pending_inline_info. + (DEFARG_POINTER): Remove. + (tag_types): Add typenames. + (lookup_ualified_name): Declare. + (lookup_name_real): Likewise. + (shadow_tag): Adjust prototype. + (get_scope_of_declarator): Declare it. + (process_next_inline): Remove it. + (check_for_missing_semicolon): Likewise. + (maybe_get_template_decl_from_type_decl): Declare it. + (finish_label_stmt): Adjust prototype. + (finish_non_static_data_meber): Declare it. + (finish_pseudo_destructor_call_expr): Rename to ... + (finish_pseudo_destructor_expr): ... this. + (finish_compound_literal): Declare it. + (begin_inline_definitions): Remove it. + (init_spew): Remove. + (peekyylex): Likewise. + (arbitrate_lookup): Likewise. + (frob_opname): Likewise. + (maybe_snarf_defarg): Likewise. + (add_defarg_fn): Likewise. + (do_pending_defargs): Likewise. + (done_pending_defargs): Likewise. + (unprocessed_defarg_fn): Likewise. + (replace_defarg): Likewise. + (end_input): Likewise. + (get_overloaded_fn): Likewise. + * cvt.c (convert_to_reference): Improve error handling. + * decl.c (lookup_name_real): Do not declare it static. + (maybe_push_to_top_level): Set check_access. + (identifier_type_value): Adjust call to lookup_name_real. + (lookup_qualified_name): New method. + (lookup_name_real): Remove special-case parsing code. + (lookup_name-nonclass): Adjust call to lookup_name_real. + (lookup_name_namespace_only): Likewise. + (lookup_name): Likewise. + (check_tag_decl): Return the type declared. + (shadow_tag): Likewise. + (register_dtor_fn): Tweak check_access. + (grokfndecl): Use constructor_name_p. + (get_scope_of_declarator): New function. + (grokdeclarator): Obscure tweaks for slightly different declarator + representations. + (start_method): Return error_mark_node to indicate failure. + (cp_tree_node_structure_enum): Use TS_CP_DEFAULT_ARG for DEFAULT_ARGs. + * decl2.c (constructor_name_full): Simplify. + (constructor_name): Use it. + (build_expr_from_tree): Adjust for changes to do new parser. + (push_scope): Improve robustness. + (validate_nonmember_using_decl): Process declarations, not names. + (do_class_using_decl): Likewise. + (handle_class_head): Do not mess with CLASSTYPE_DECLARED_CLASS + here. + * error.c (dump_expr): Handle IDENTIFIER_NODEs and BASELINKs. + * expr.c (cxx_expand_expr): Handle BASELINKs. + * init.c (member_init_ok_or_else): Issue more errors. + (build_offset_ref): Tweak handling of FUNCTION_DECLs. + * lex.c: Do not include parse.h. + (yypring): Do not declare. + (yylval): Likewise. + (make_reference_declarator): Remove error-generating code. + (rid_to_yy): Remove. + (cxx_init): Do not call init_spew. + (yypring): Remove. + (check_for_missing_semicolon): Remove. + * lex.h (got_scope): Remove. + (got_object): Remove. + * method.c (hack_identifier): Use finish_non_static_data_member. + (implicitly_declare_fn): Adjust use of constructor_name. + * parser.c: New file. + * pt.c (parse.h): Do not include it. + (maybe_get_template_decl_from_template): Do not declare it. + (finish_member_template_decl): Tweak. + (begin_explicit_instantiation): Adjust for + processing_explicit_instantiation being boolean. + (end_explicit_instantiation): Likewise. + (maybe_process_partial_specialization): Tighten specialization + test. + (retrieve_local_specialization): Adjust ue of hash table. + (eq_local_specializations): New function. + (register_local_specialization): Likewise. + (push_template_decl_real): Remove unnecessary test. + (maybe_get_template_decl_from_type_decl): Don't make it static. + (for_each_template_parm_r): Handle TYPEOF_TYPE. + (tsubst_copy): Use retrieive_local_specialization to handle + PARM_DECL. Adjust handling of CONST_DECLs. Handle BASELINKs. + Handle COMPONENT_REFs with pseudo-destructor-expressions. + Simplify handling of CALL_EXPR and METHOD_CALL_EXPR. + (tsubst_expr): Pass decls, not names, to do_local_using_decl. + (unify): Tweak handling of CONST_DECLs. + (regenerate_decl_from_template): Use push_nested_class. + (template_for_substitution): New funciton. + (instantiate_decl): Use it. Register parameters as local + specializations. + * rtti.c (init_rtti_processing): Set type_info_ref_type. + (build_typeid): Use it. + (get_typeid): Likeise. + * search.c (accessible_p): Use check_access, not + flag_access_control. + (adjust_result_of_qualified_name_lookup): Pay attention to the + context_class. + * semantics.c (finish_asm_stmt): Adjust error handling. + (finish_label_stmt): Return the statement. + (finish_non_static_data_member): New function. + (finish_class_expr): Handle BASELINKs. + (finish_call_expr): Handle PSEUDO_DTOR_EXPR. + (finish_object_call_expr): Simplify handling during templates. + (finish_pseudo_destructor_call_expr): Rename to ... + (finish_pseudo_dtor_expr): ... this. + (finish_compound_literal): New function. + (begin_inline_definitions): Remove. + (finish_sizeof): Remove special template handling. + * spew.c: Do not include parse.h. + * tree.c (get_overloaded_fn): Remove. + * typeck.c (build_class_member_access_expr): Handle + PSEUDO_DTOR_EXPR. Adjust handling of static member functions. + (lookup_destructor): New function. + (finish_class_member_access_expr): Use it. + (convert_arguments): Simplify. + (build_unary_op): Handle BASELINKs. + + 2002-12-26 Nathan Sidwell + + PR c++/4803 + * decl2.c (mark_used): Defer inline functions. + (finish_file): Merge deferred_fns loops. Check all used + inline functions have a definition. + * method.c (make_thunk): Thunks are not inline. + + PR c++/5116, c++/764 + * call.c (build_new_op): Make sure template class operands are + instantiated. + + 2002-12-24 Nathan Sidwell + + PR C++/7964 + * cp-tree.h (resolve_scoped_fn_name): Prototype. + * call.c (resolve_scoped_fn_name): New function. Deal with + more template expansion. Broken out of ... + * parse.y (parse_finish_call_expr): ... here. Call it. + * decl2.c (build_expr_from_tree, CALL_EXPR): Use + resolve_scoped_fn_name and build_call_from_tree. + + PR c++/9053 + * decl.c (duplicate_decls): Templates may be disambiguated by + return type. + + PR c++/8702 + * decl2.c (check_classfn): Use lookup_fnfield_1. List all + conversion operators on failure. + + 2002-12-23 Gabriel Dos Reis + + Remove traditional C constructs 2/n. + * call.c (tourney, build_field_call, equal_functions, joust, + compare_ics, build_over_call, build_java_interface_fn_ref, + convert_like_real, op_error, build_object_call, resolve_args, + build_vfield_ref, check_dtor_name, build_scoped_method_call, + build_addr_func, build_call, build_method_call, null_ptr_cst_p, + sufficient_parms_p, build_conv, non_reference, strip_top_quals, + standard_conversion, reference_related_p, + reference_compatible_p, convert_class_to_reference, + direct_reference_binding, reference_binding, + ,implicit_conversion, is_complete, promoted_arithmetic_type_p, + add_template_conv_candidate, any_viable, any_strictly_viable, + build_this, splice_viable, print_z_candidates, + build_user_type_conversion, build_new_function_call, + conditional_conversion, build_conditional_expr, build_new_op, + build_op_delete_call, enforce_access, call_builtin_trap, + convert_arg_to_ellipsis, build_x_va_arg, cxx_type_promotes_to, + convert_default_arg, type_passed_as, convert_for_arg_passing, + in_charge_arg_for_name, is_properly_derived_from, + maybe_handle_implicit_object, maybe_handle_ref_bind, + source_type, add_warning, can_convert, can_convert_arg, + perform_implicit_conversion, can_convert_arg_bad, + initialize_reference, add_conv_candidate, + add_template_candidate_real, add_template_candidate): Ansify. + + 2002-12-22 Nathan Sidwell + + PR c++/8572 + * cp-tree.h (grokoptypename): Add SCOPE parameter. + * decl2.c (grokoptypename): Add SCOPE parameter. tsubst the type + if in a template scope. + * parse.y (unoperator): Return the scope. + (operator_name): Adjust grokoptypename call. + + 2002-12-22 Kriang Lerdsuwanakij + + * cp-tree.h (make_unbound_class_template): Use tsubst_flags_t. + * decl.c (make_unbound_class_template): Adjust. Check for tf_error. + * pt.c (tsubst) [OFFSET_TYPE]: Check for tf_error. + + 2002-12-20 Kazu Hirata + + * ChangeLog: Fix a typo. + * class.c: Fix comment typos. + * cp-tree.h: Likewise. + + 2002-12-18 Jason Merrill + + Handle anonymous unions at the tree level. + C++ ABI change: Mangle anonymous unions using the name of their + first named field (by depth-first search). Should not cause + binary compatibility problems, though, as the compiler previously + didn't emit anything for affected unions. + * cp-tree.def (ALIAS_DECL): New tree code. + * decl2.c (build_anon_union_vars): Build ALIAS_DECLs. Return the + first field, not the largest. + (finish_anon_union): Don't mess with RTL. Do set DECL_ASSEMBLER_NAME, + push the decl, and write it out at namespace scope. + * decl.c (lookup_name_real): See through an ALIAS_DECL. + (pushdecl): Add namespace bindings for ALIAS_DECLs. + * rtti.c (unemitted_tinfo_decl_p): Don't try to look at the name + of a decl which doesn't have one. + * typeck.c (build_class_member_access_expr): Don't recurse if + we already have the type we want. + + 2002-12-18 Kriang Lerdsuwanakij + + PR c++/8099 + * friend.c (make_friend_class): Allow partial specialization + when declaration is not a template friend. + + 2002-12-18 Kriang Lerdsuwanakij + + PR c++/3663 + * pt.c (lookup_template_class): Copy TREE_PRIVATE and + TREE_PROTECTED to created decl nodes. + + 2002-12-18 Mark Mitchell + + * class.c (build_base_field): Do not set DECL_PACKED on the + FIELD_DECL. + + 2002-12-18 Gabriel Dos Reis + + * cp-tree.h (struct tree_srcloc): Use location_t. + (SOURCE_LOCUS): New. + (SRCLOC_FILE, SRCLOC_LINE): Adjust. + + 2002-12-17 Jason Merrill + + * decl.c (finish_function): Also complain about no return in + templates. + * semantics.c (finish_return_stmt): Also call check_return_expr in + templates. + * typeck.c (check_return_expr): In a template, just remember that we + saw a return. + + 2002-12-16 Jason Merrill + + * semantics.c (simplify_aggr_init_exprs_r): Don't change the type + of the CALL_EXPR. + + * semantics.c (do_pushlevel): Call pushlevel after adding the + SCOPE_STMT. + (do_poplevel): Call poplevel before adding the SCOPE_STMT. + * parse.y (function_body): Go back to using compstmt. + * decl.c (pushdecl): Skip another level to get to the parms level. + + * call.c (build_new_method_call): Use is_dummy_object to determine + whether or not to evaluate the object parameter to a static member + function. + + 2002-12-14 Jason Merrill + + * semantics.c (simplify_aggr_init_exprs_r): Also prepend the + return slot for normal functions. Set CALL_EXPR_HAS_RETURN_SLOT_ADDR. + * tree.c (build_cplus_new): If the type isn't TREE_ADDRESSABLE, + don't bother with an AGGR_INIT_EXPR. + (cp_copy_res_decl_for_inlining): If the type isn't TREE_ADDRESSABLE, + just generate a new decl normally. Take return slot parm. + * cp-tree.h: Adjust prototype. + + 2002-12-13 Gabriel Dos Reis + + PR C++/8031 + * cvt.c (convert_to_pointer_force): Don't try comparing against + erronous type. + + 2002-12-13 Geoffrey Keating + + * cp-tree.h: Have the multiple-include guards around + the entire file. + + 2002-12-10 David Edelsohn + + * cp/spew.c (feed_input): Change limit to last_pos and pos to cur_pos + for SPEW_DEBUG. + (snarf_method): Same. + (snarf_defarg): Same. + + 2002-12-10 Mark Mitchell + + PR c++/8372 + * pt.c (tsubst_copy): Handle destructor names more correctly. + + 2002-12-10 Matt Austern + + * cp-tree.h: get rid of needs_virtual_reinit bit. + + 2002-12-09 Mark Mitchell + + * NEWS: Document removal of in-class initialization extension for + static data members of non-arithmetic, non-enumeration type. + * decl.c (check_static_variable_definition): Do not allow that + extension. + * decl2.c (grokfield): Do not call digest_init when processing + templates. + + 2002-12-05 Kaveh R. Ghazi + + * error.c (dump_expr): Fix format specifier warning. + + 2002-12-04 Geoffrey Keating + + * class.c (finish_struct_1): Correct comment. + * cp-tree.c (DECL_SORTED_FIELDS): Likewise. + + 2002-12-04 Gabriel Dos Reis + + PR C++/8799 + * error.c (dump_expr): Don't ever try to dump a non-existent + expression. + + 2002-12-03 Nathan Sidwell + + Implement covariant returns. + * cp-tree.h (IS_AGGR_TYPE_2): Remove. + (struct lang_decl_flags): Add this_thunk_p flag. + Rename vcall_offset to virtual_offset. + (struct lang_decl): Rename delta to fixed_offset. + (DECL_THIS_THUNK_P, DECL_RESULT_THUNK_P): New #defines. + (SET_DECL_THUNK_P): Add THIS_ADJUSTING arg. + (THUNK_DELTA, THUNK_VCALL_OFFSET): Rename to ... + (THUNK_FIXED_OFFSET, THUNK_VIRTUAL_OFFSET): ... here. + (make_thunk): Add this_adjusting arg. + (finish_thunk): Declare. + (mangle_thunk): Add this_adjusting arg. + * class.c (get_vcall_index): Use base function for lookup. + (update_vtable_entry_for_fn): Generate covariant thunk. + (finish_struct_1): Set DECL_VINDEX to NULL for thunks. + (build_vtbl_initializer): Use base function for lookup. + Finish covariant thunk here. Adjust thunk generation. + * dump.c (cp_dump_tree): Simplify DECL_GLOBAL_[CD]TOR_P handling. + Adjust thunk dumping. + * mangle.c (mangle_call_offset): New function. + (mangle_thunk): Adjust for covariant thunks. + * method.c (make_thunk): Adjust. Do not set name here. + (finish_thunk): New function. Set name here. + (use_thunk): Generate covariant thunks too. + (thunk_adjust): New function. + * search.c (covariant_return_p): Remove. Fold into ... + (check_final_overrider): ... here. Simplify. + * semantics.c (emit_associated_thunks): Walk covariant thunk lists. + + 2002-12-03 Jason Merrill + + PR c++/8674 + * call.c (build_over_call): Check specifically for TARGET_EXPR + when eliding. + + PR c++/8461, c++/8625 + * call.c (convert_for_arg_passing): Don't mess with error_mark_node. + (cp_convert_parm_for_inlining): Remove. + * cp-lang.c (LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING): + Remove. + * cp-tree.h (ADDR_IS_INVISIREF): Remove. + * except.c (stabilize_throw_expr): Remove ADDR_IS_INVISIREF code. + + * call.c (build_user_type_conversion_1): Don't set ICS_BAD_FLAG on + an ambiguous conversion. + + 2002-12-03 Mark Mitchell + + PR c++/8688 + * decl.c (reshape_init): Handle erroneous initializers. + + 2002-12-02 Mark Mitchell + + PR c++/8720 + * spew.c (remove_last_token): Make sure that last_chunk is set + correctly. + + PR c++/8615 + * error.c (dump_expr): Handle character constants with + TREE_OVERFLOW set. + + 2002-12-02 Kriang Lerdsuwanakij + + DR 180 + * decl.c (grokdeclarator): Require class-key for all friend class. + Output the correct type and context in the error message. + + 2002-12-01 Mark Mitchell + + PR c++/5919 + * pt.c (unify): Use variably_modified_type_p to test validity of + template argument types. + + PR c++/8727 + * cp-tree.h (lang_type_class): Add typeinfo_var. + (CLASSTYPE_TYPEINFO_VAR): New macro. + * rtti.c (get_tinfo_decl): Use it. + + PR c++/8663 + * init.c (expand_member_init): Always get the main variant of a + base class. + + 2002-12-01 Mark Mitchell + + PR c++/8332 + PR c++/8493 + * decl.c (cxx_init_decl_processing): Use size_type_node, not + c_size_type_node. + * decl2.c (coerce_new_type): Likewise. + * except.c (do_allocate_exception): Likewise. + + 2002-11-30 Zack Weinberg + + * call.c, class.c, cp-lang.c, cvt.c, cxxfilt.c, decl.c, decl2.c, + dump.c, error.c, except.c, expr.c, friend.c, g++spec.c, init.c, + lex.c, mangle.c, method.c, optimize.c, parse.y, pt.c, ptree.c, + repo.c, rtti.c, search.c, semantics.c, spew.c, tree.c, typeck.c, + typeck2.c: Include coretypes.h and tm.h. + * Make-lang.in: Update dependencies. + + 2002-11-30 Mark Mitchell + + PR c++/8227 + * decl.c (layout_var_decl): Deal gracefully with erroneous types. + (check_initializer): Validate the type of the initialized + variable, even if the initializer is absent. + * typeck.c (cp_type_quals): Deal gracefully with erroneous types. + + PR c++/8214 + * typeck.c (convert_for_assignment): Do not use + decl_constant_value on the operand. + + PR c++/8511 + * pt.c (instantiate_decl): Handle template friends defined outside + of the class correctly. + + 2002-11-29 Joe Buck + + * parse.y (class_head_defn): Set CLASSTYPE_DECLARED_CLASS for + anonymous structs. + + 2002-11-29 Mark Mitchell + + * class.c (walk_subobject_offsets): Recur on binfos as well as on + types. + (layout_nonempty_base_or_field): Pass it a binfo when processing a + base class. + (layout_empty_base): Likewise. + (build_base_field): Likewise. + + 2002-11-27 Mark Mitchell + + * class.c (build_base_field): Make sure we get the canonical base + when descending through primary bases. + + 2002-11-26 Geoffrey Keating + + * decl.c (check_initializer): Don't error on initialisation of + a scalar with a brace-enclosed expression. + + 2002-11-26 Nathan Sidwell + + * cp-tree.h (DECL_LANG_FLAG_4): Document more uses. + (template_parms_equal): Remove prototype. + * typeck.c (buuld_indirect_ref): Reformat. + + 2002-11-25 Jason Merrill + + * init.c (build_vec_init): Use a FOR_STMT instead of an IF_STMT + and a DO_STMT. + + 2002-11-25 Mark Mitchell + + * tree.c (cp_build_qualified_type_real): Correct handling of + array types. + * class.c (walk_subobject_offsets): Fix thinko. + (build_base_field): Record offsets of empty bases in primary + virtual bases. + (layout_class_type): Record offsets of empty bases in fields. + + * search.c (is_subobject_of_p_1): Fix thinko. + (lookup_field_queue_p): Likewise. + + 2002-11-24 Mark Mitchell + + * class.c (layout_class_type): Reuse tail padding when laying out + virtual bases. + + 2002-11-22 Mark Mitchell + + * rtti.c (qualifier_flags): Fix thinko. + + 2002-11-21 Gabriel Dos Reis + + Remove traditional C constructs 1/n. + * cp-tree.h (init_method, set_mangled_name_for_decl, + build_opfncall, hack_identifier, make_thunk, use_thunk, + synthesize_method, implicitly_declare_fn, + skip_artificial_parms_for, optimize_function, calls_setjmp_p, + maybe_clone_body): Remove use of PARAMS. + + * method.c (do_build_assign_ref, do_build_copy_constructor, + synthesize_exception_spec, locate_dtor, locate_ctor, locate_copy): + Likewise. + (synthesize_method): Use 'bool' type and constants instead of + 'int'. + (locate_copy): Likewise. + (implicitly_declare_fn): Likewise. + + * optimize.c (calls_setjmp_r, update_cloned_parm, dump_function): + Remove old-style declaration. + (maybe_clone_body): Use 'bool' type and constants. + + 2002-11-21 Glen Nakamura + + PR c++/8342 + * typeck.c (get_member_function_from_ptrfunc): Make sure that a + SAVE_EXPR for instance_ptr doesn't get evaluated first inside one + of the branches of a COND_EXPR. + + 2002-11-19 Mark Mitchell + + * pt.c (for_each_template_parm): Free allocated memory. + * search.c (is_subobject_of_p_1): New function. + (is_subobject_of_p): Avoid walking virtual bases multiple times. + + 2002-11-19 Jason Thorpe + + * g++spec.c (lang_specific_spec_functions): New. + + 2002-11-15 Kazu Hirata + + * ChangeLog: Follow spelling conventions. + * class.c: Likewise. + * decl2.c: Likewise. + + 2002-11-14 Zack Weinberg + + * search.c (dfs_push_decls): Do not try to reorder elements + 3..n of method_vec if method_vec has only two elements. + Reverse order of two tests to avoid accessing unallocated + memory. + + 2002-11-14 Mark Mitchell + + * class.c (dfs_find_final_overrider): Adjust so that the most + derived object is a binfo, rather than a class type. + (find_final_overrider): Likewise. + (add_vcall_offset_vtbl_entries_1): Simplify accordingly. + (add_vcall_offset): Likewise. + + 2002-11-09 Kriang Lerdsuwanakij + + PR c++/8389 + * pt.c (instantiate_template): Push class scope for member + functions. + (get_mostly_instantiated_function_type): Likewise. Don't call + tsubst on context. Remove CONTEXTP and TPARMSP parameters. + * cp-tree.h (get_mostly_instantiated_function_type): Adjust. + * mangle.c (write_encoding, write_unqualified_name): Adjust. + + 2002-11-07 Mark Mitchell + + * class.c (add_vcall_offset_vtbl_entries_1): Correct ordering of + vcall offfsets. Split out ... + (add_vcall_offset): ... new function. + + PR c++/8338 + * pt.c (for_each_template_parm): Add htab parameter. + (process_partial_specialization): Adjust call. + (push_template_decl_real): Likewise. + (pair_fn_data): Add visited. + (for_each_template_parm_r): Avoid walking duplicates more than + once. + (uses_template_parms): Adjust call to for_each_template_parm. + + 2002-11-07 Mark Mitchell + + * class.c (add_implicitly_declared_members): Put implicitly + declared functions at the end of TYPE_METHODs when -fabi-version + is at least 2. + + 2002-11-05 Geoffrey Keating + + * decl2.c (finish_file): Correct spelling. + + 2002-11-03 Mark Mitchell + + * call.c (build_special_member_call): Do not try to lookup VTTs by + name. + * class.c (vtbl_init_data): Add generate_vcall_entries. + (get_vtable_decl): Do not look up virtual tables by name. + (copy_virtuals): Do not use BV_USE_VCALL_INDEX_P. + (set_primary_base): Do not set CLASSTYPE_RTTI. + (determine_primary_base): Likewise. + (get_matching_virtual): Remove. + (get_vcall_index): New function. + (update_vtable_entry_for_fn): Do not try to use virtual thunks + when they are not required. Assign vcall indices at this point. + (finish_struct_1): Do not set CLASSTYPE_NEEDS_VIRTUAL_REINIT. + Do update dynamic_classes. + (build_vtt): Do not add VTTs to the symbol table. + (build_ctor_vtbl_group): Likewise. + (build_vtbl_initializer): Simplify handling of vcall indices. + (build_vcall_offset_vtbl_entries): Pretend to build vcall offsets + for the most derived class. + (add_vcall_offset_vtbl_entries_1): But do not actually add them to + the vtable. + * cp-tree.h (dynamic_classes): New macro. + (lang_type_class): Remove rtti. Add vtables. Add vcall_indices. + (CLASSTYPE_RTTI): Remove. + (CLASSTYPE_NEEDS_VIRTUAL_REINIT): Remove. + (CLASSTYPE_VCALL_INDICES): New macro. + (CLASSTYPE_VTABLES): Likewise. + (BV_USE_VCALL_INDEX_P): Remove. + (build_vtable_path): Remove. + * decl2.c (finish_vtable_vardecl): Remove. + (key_method): Remove #if 0'd code. + (finish_vtable_vardecl): Rename to ... + (maybe_emit_vtables): ... this. + (finish_file): Use it. + * search.c (look_for_overrides_here): Update comment. + + 2002-11-01 Zack Weinberg + + PR c/7353 redux + * decl2.c (grokfield): Reject TYPE_DECLs with initializers. + + 2002-10-30 Jason Merrill + + PR c++/8186 + * cp-tree.h (ADDR_IS_INVISIREF): New macro. + * call.c (convert_for_arg_passing): Set it. + * except.c (stabilize_throw_expr): Recurse for such an arg. + + 2002-10-31 Mark Mitchell + + * cp-tree.h (lang_decl_flags): Remove init_priority. + (lang_decl): Add delta. + (GLOBAL_INIT_PRIORITY): Remove. + (THUNK_DELTA): Revise definition. + * decl2.c (start_objects): Don't set GLOBAL_INIT_PRIORITY. + * dump.c (cp_dump_tree): Don't dump it. + + 2002-10-30 Mark Mitchell + + PR c++/8160 + * typeck2.c (process_init_constructor): Call complete_array_type. + + PR c++/8149 + * decl.c (make_typename_type): Issue errors about invalid results. + + 2002-10-30 Kriang Lerdsuwanakij + + Core issue 287, PR c++/7639 + * cp-tree.h (lang_type_class): Add decl_list field. + (CLASSTYPE_DECL_LIST): New macro. + (maybe_add_class_template_decl_list): Add declaration. + * class.c (duplicate_tag_error): Initialize CLASSTYPE_DECL_LIST. + (unreverse_member_declarations): Reverse CLASSTYPE_DECL_LIST. + (maybe_add_class_template_decl_list): New function. + (add_implicitly_declared_members): Use it. + * decl.c (maybe_process_template_type_declaration): Likewise. + (pushtag): Likewise. + * friend.c (add_friend): Likewise. + (make_friend_class): Likewise. + * semantics.c (finish_member_declaration): Likewise. + (begin_class_definition): Initialize CLASSTYPE_DECL_LIST. + * pt.c (instantiate_class_template): Use CLASSTYPE_DECL_LIST + to process members and friends in the order of declaration. + + 2002-10-29 Mark Mitchell + + PR c++/8287 + * decl.c (finish_destructor_body): Create the label to jump to + when returning from a destructor here. + (finish_function_body): Rather than here. + + 2002-10-25 Zack Weinberg + + PR c++/7266 + * decl.c (grokdeclarator): Check that TREE_OPERAND 0 of a + SCOPE_REF is not null before dereferencing it. + + 2002-10-25 Mark Mitchell + + * call.c (build_over_call): Use DECL_CONTEXT, not + DECL_VIRTUAL_CONTEXT. + * class.c (modify_vtable_entry): Don't mess with + DECL_VIRTUAL_CONTEXT. + (set_vindex): Remove. + (set_primary_base): Remove vfuns_p parameter. + (determine_primary_base): Likewise. + (modify_all_vtables): Likewise. + (layout_class_type): Likewise. Adjust calls to other functions + accordingly. + (finish_struct_1): Adjust calls to modified functions. Set + DECL_VINDEX here. + * cp-tree.h (lang_type_class): Remove vsize. + (CLASSTYPE_VSIZE): Remove. + (lang_decl): Remove thunks. + (DECL_THUNKS): Adjust. + (DECL_VIRTUAL_CONTEXT): Remove. + (duplicate_decls): Don't copy it. + * pt.c (build_template_decl): Don't set it. + (tsubst_decl): Likewise. + * typeck.c (expand_ptrmemfunc_cst): Don't use it. + + * class.c (build_vtbl_initializer): Don't use build_vtable_entry. + (build_vtable_entry): Remove. + * cp-tree.h (BINFO_VIRTUALS): Expand documentation. + (lang_decl): Add thunks. + (DECL_THUNKS): New macro. + * decl.c (duplicate_decls): Copy it. + * method.c (make_thunk): Simplify, and add thunks to DECL_THUNKS. + * semantics.c (emit_associated_thunks): Simplify. + + 2002-10-24 David Edelsohn + + PR c++/7228 + * cp-tree.h (CLASSTYPE_READONLY_FIELDS_NEED_INIT): Check that + lang_type structure exists before accessing field. + (SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT): New macro. + (CLASSTYPE_REF_FIELDS_NEED_INIT): Similar. + (SET_CLASSTYPE_REF_FIELDS_NEED_INIT): New macro. + * class.c (check_field_decls): Use new macros. + * typeck2.c (process_init_constructor): Remove redundant check for + existence of lang_type structure. + + 2002-10-24 Mark Mitchell + + * class.c (end_of_base): New method. + (end_of_class): Use it. Check indirect virtual bases. + + * class.c (check_field_decls): Fix typo. + + 2002-10-23 Mark Mitchell + + PR c++/8067 + * decl.c (maybe_inject_for_scope_var): Ignore __FUNCTION__ and + related variables. + + PR c++/7679 + * spew.c (next_token): Do not return an endless stream of + END_OF_SAVED_INPUT tokens. + (snarf_method): Add three END_OF_SAVED_INPUT tokens to the end of + the cached token stream. + (snarf_defarg): Likewise. + + 2002-10-23 Zack Weinberg + + * cp-lang.c (cp_var_mod_type_p): New: C++ hook for + variably_modified_type_p. + * cp-tree.h: Remove prototype of variably_modified_type_p. + * tree.c (variably_modified_type_p): Remove; now implemented + in language-independent code. + + 2002-10-22 Mark Mitchell + + PR c++/6579 + * spew.c (snarf_parenthesized_expression): New function. + (snarf_block): Use it. + + 2002-10-22 Richard Henderson + + * method.c (use_thunk): Always compute vcall_value; assert that + it is not zero. Use can_output_mi_thunk; use output_mi_thunk + for vcall thunks as well. + + 2002-10-21 Mark Mitchell + + * class.c (empty_base_at_nonzero_offset_p): New function. + (layout_nonempty_base_or_field): Do not check for conflicts when + laying out a virtual base using the GCC 3.2 ABI. + (build_base_field): Correct checking for presence of empty classes + at nonzero offsets when clearing CLASSTYPE_NEARLY_EMPTY_P. + + * class.c (include_empty_classes): Use normalize_rli. + (layout_class_type): Likewise. + + * decl.c (reshape_init): Tweak handling of character arrays. + + PR c++/8218 + * cp-tree.h (lang_type_class): Add contains_empty_class_p. + (CLASSTYPE_CONTAINS_EMPTY_CLASS_P): New macro. + * class.c (check_bases): Update CLASSTYPE_CONTAINS_EMPTY_CLASS_P. + (check_field_decls): Likewise. + (layout_class_type): Likewise. + (finish_struct_1): Initialize it. + (walk_subobject_offsets): Use it to prune searches. + + 2002-10-20 Mark Mitchell + + * method.c (use_thunk): Compute the vcall index as a HOST_WIDE_INT. + * optimize.c (optimize_function): Replace ASM_OUTPUT_MI_THUNK with + TARGET_ASM_OUTPUT_MI_THUNK in comments. + + 2002-10-18 Zack Weinberg + + * decl.c (start_decl): Point users of the old initialized- + typedef extension at __typeof__. + + 2002-10-18 Mark Mitchell + + * Make-lang.in (method.o): Depend on TARGET_H. + * method.c (target.h): Include it. + (use_thunk): Use target hooks. Use vcall thunks, if available. + + 2002-10-18 Mark Mitchell + + * class.c (base_derived_from): Make sure return value is a bool. + + 2002-10-18 Mark Mitchell + + * class.c (find_final_overrider_data_s): Remove overriding_fn and + overriding_base. + (dfs_base_derived_from): New function. + (base_derived_from): Likewise. + (dfs_find_final_overrider): Use base_derived_from. + (find_final_overrider): Adjust. + + 2002-10-18 Jason Merrill + + PR c++/8080 + * semantics.c (finish_for_cond, finish_while_cond): Don't mess + with condition decls in a template. + + 2002-10-17 Nathan Sidwell + + * class.c (add_method): Compare template parms too. + + 2002-10-17 Mark Mitchell + + PR c++/7584 + * class.c (handle_using_decl): Allow the declaration used to be + from an ambiguous base. + + * pt.c (convert_template_argument): Revert this change: + 2002-10-16 Mark Mitchell + * pt.c (convert_template_argument): Do not fold non-type + template rguments when inside a template. + + * init.c (expand_default_init): Handle brace-enclosed initializers + correctly. + + 2002-10-16 Mark Mitchell + + * mangle.c (write_expression): Correct handling of enumeration + constants. + (write_template_arg): Likewise. + * pt.c (convert_template_argument): Do not fold non-type template + arguments when inside a template. + + PR c++/7478 + * cvt.c (convert_to_reference): Allow references as the incoming + type. + + 2002-10-16 Mark Mitchell + + PR c++/7524 + * method.c (do_build_assign_ref): Use cp_build_qualified_type, not + build_qualified_type. + + 2002-10-15 Richard Henderson + + * error.c (dump_expr): Use real_to_decimal directly, and with + the new arguments. + + 2002-10-15 Mark Mitchell + + * decl.c (reshape_init): Fix typo. + + * cp-tree.h (operator_name_info_t): Add arity. + * lex.c (init_operators): Initialize it. + * mangle.c (write_conversion_operator_name): New function. + (write_unqualified_name): Use it. + (write_template_args): Accept template arguments as a TREE_LIST. + (write_expression): Adjust handling of qualified names to match + specification. + + 2002-10-15 Jason Merrill + + * call.c (call_builtin_trap): New fn. + (convert_arg_to_ellipsis): Use it. Downgrade error to warning. + (build_call): Don't set current_function_returns_abnormally outside + a function. + + 2002-10-14 Mark Mitchell + + * class.c (check_field_decls): Remove empty_p parameter. Instead, + clear CLASSTYPE_EMPTY_P. + (build_base_field): Likewise. + (build_base_fields): Likewise. + (check_bases_and_members): Likewise. + (create_vtbl_ptr): Likewise. + (layout_class_type): Likewise. Ensure that empty classes have + size zero when used as base classes in the 3.2 ABI. + (finish_struct_1): Initialize CLASSTYPE_EMPTY_P and + CLASSTYPE_NEARLY_EMPTY_P. Adjust calls to avoid passing empty_p + parameter. + (is_empty_class): Correct definition when using post-3.2 ABI. + * cp-tree.h (lang_type_class): Add empty_p. + (CLASSTYPE_EMPTY_P): New macro. + + 2002-10-12 Nathan Sidwell + + * init.c (build_delete): Do not apply save_expr for arrays. + (build_vec_delete): Likewise. + + 2002-10-14 Mark Mitchell + + * decl.c (layout_var_decl): Call layout_decl even for variables + whose type is an array with unspecified bounds. + + PR c++/7176 + * lex.c (do_identifier): Add another option for the parsing + parameter. + * parse.y (do_id): Use it. + + 2002-10-11 Gabriel Dos Reis + + PRs C++/6803, C++/7721 and C++/7803 + * decl.c (grokdeclarator): Gracefully handle template-name as + decl-specifier. + + 2002-10-11 Jason Molenda + + * init.c (build_field_list): Provide uses_unions_p with a default + value. + + 2002-10-11 Mark Mitchell + + PR c++/5661 + * cp-tree.h (variably_modified_type_p): New function. + (grokdeclarator) Tighten check for variably modified types as + fields. + * pt.c (convert_template_argument): Do not allow variably modified + types as template arguments. + * tree.c (variably_modified_type_p): New function. + + * NEWS: Document removal of "new X = ..." extension. + * class.c (initialize_array): Set TREE_HAS_CONSTRUCTOR on + brace-enclosed initializers. + * cp-tree.h (CP_AGGREGATE_TYPE_P): New macro. + (initialize_local_var): Remove declaration. + (expand_static_init): Likewise. + * decl.c (next_initializable_field): New function. + (reshape_init): Likewise. + (check_initializer): Use them. Build dynamic initializer for + aggregates here too. + (initialize_local_var): Simplify, and incorporate cleanup + insertion code as well. + (destroy_local_var): Remove. + (cp_finish_decl): Tidy. + (expand_static_init): Fold checks for whether or not a variable + needs initialization into this function. Simplify. + * decl2.c (do_static_initialization): Simplify. + * init.c (build_init): Do not set TREE_SIDE_EFFECTS when it will + be done for us automatically. + (expand_default_init): Handle brace-enclosed initializers + correctly. + (expand_aggr_init_1): Remove RTL-generation code. + (build_vec_init): Remove "new X = ..." support. + * parse.y (new_initializer): Likewise. + * rtti.c (get_pseudo_ti_init): Set TREE_HAS_CONSTRUCTOR on + brace-enclosed initializer. + (create_pseudo_type_info): Likewise. + * typeck2.c (store_init_value): Don't try to handle digest_init + being called more than once. + (digest_init): Tidy handling of brace-enclosed initializers. + + 2002-10-10 Kaveh R. Ghazi + + * decl.c (typename_hash): Use htab_hash_pointer. + + 2002-10-10 Jim Wilson + + * decl.c (duplicate_decls): Don't call decl_attributes. + + 2002-10-09 Zack Weinberg + + PR c/7353 + * decl.c (start_decl): Unconditionally issue error for + 'typedef foo = bar'. + (cp_finish_decl): Remove special case for TYPE_DECL with initializer. + (grokdeclarator): Remove redundant error for 'typedef foo = bar'. + + 2002-10-09 Kaveh R. Ghazi + + * decl2.c (prune_vtable_vardecl): Delete unused function. + + 2002-10-03 Mark Mitchell + + PR c++/7754 + * decl2.c (finish_anon_union): Do not expand anonymous unions when + procesing template functions. + * pt.c (tsubst_decl, case VAR_DECL): Try to complete the variable + type. Call layout_decl. + (tsubst_expr, case DECL_STMT): Handle anonymous unions. + + 2002-10-07 Richard Henderson + + * decl2.c, pt.c: Revert c++/7754 fix. + + 2002-10-05 Kriang Lerdsuwanakij + + PR c++/7804 + * error.c (dump_expr) [REAL_CST]: Output in decimal format. + + 2002-10-03 Mark Mitchell + + PR c++/7931 + * pt.c (for_each_template_parm_r): Handle BASELINKs. + + PR c++/7754 + * decl2.c (finish_anon_union): Do not expand anonymous unions when + procesing template functions. + * pt.c (tsubst_decl, case VAR_DECL): Try to complete the variable + type. Call layout_decl. + (tsubst_expr, case DECL_STMT): Handle anonymous unions. + + 2002-10-03 Mark Mitchell + + PR c++/8006 + * mangle.c (CLASSTYPE_TEMPLATE_ID_P): Handle instances of template + template parameters. + (globals): Add entity and need_abi_warning. + (decl_is_template_id): Use TYPE_TEMPLATE_INFO, not + CLASSTYPE_TEMPLATE_INFO. + (is_std_substitution): Use CLASSTYPE_TI_TEMPLATE, not + TYPE_TI_TEMPLATE. + (write_prefix): Handle typename types correctly. + (write_template_prefix): Handle template template parameters + correctly. + (start_mangling): Add entity parameter. + (finish_mangling): Warn about names whose mangling will change. + (mangle_decl_string): Adjust. + (mangle_type_string): Likewise. + (mangle_special_for_type): Likewise. + (mangle_ctor_vtbl_for_type): Likewise. + (mangle_thunk): Likewise. + (mangle_guard_variable): Likewise. + (mangle_ref_init_variable): Likewise. + + 2002-10-02 Mark Mitchell + + PR c++/7188. + * cp-tree.def (CTOR_INITIALIZER): Use one slot, not two. + * cp-tree.h (emit_base_init): Rename to .... + (emit_mem_initializers): ... this. + (expand_member_init): Change prototype. + * init.c (perform_member_init): Compute explicit, rather than + requiring it as a parameter. + (sort_member_init): Rename to ... + (sort_mem_initializers): ... this. Process bases and data members + together. + (sort_base_init): Remove. + (emit_base_init): Rename to ... + (emit_mem_initializers): ... this. + (expand_aggr_vbase_init_1): Remove. + (construct_virtual_bases): Rename to ... + (construct_virtual_base): ... this. + (expand_member_init): Rework handling of base initializers. + * method.c (do_build_copy_constructor): Use + finish_mem_initializers. + * parse.y (member_init): Adjust calls to expand_member_init. + * pt.c (tsubst_expr): Simplify CTOR_INITIALIZER case. + (tsubst_initializer_list): Use expand_member_init. + * semantics.c (finish_mem_intiailizers): Simplify. + + 2002-10-02 Matt Austern + * decl.c (walk_vtables_r): Fixed typo that caused result to + never get a nonzero value. + + 2002-10-02 Roger Sayle + + PR optimization/6627 + * cp-tree.h (enum ptrmemfunc_vbit_where_t): Delete definition + from here, and move it to tree.h. + * decl.c (cxx_init_decl_processing): If storing the vbit + in function pointers, ensure that force_align_functions_log + is atleast one. + + 2002-10-02 Matt Austern + + * class.c (check_field_decls): Changed warning about const member + variables so that it doesn't get issued for a class aggregate. + + 2002-10-01 Mark Mitchell + + * decl.c (cp_finish_decl): Make sure array types are laid out, + even if the array bounds are unknown. + + 2002-10-01 Steve Ellcey + + * class.c (build_vtbl_initializer): Change build_c_cast + to build1. + + 2002-10-01 Mark Mitchell + + * decl.c (cp_finish_decl): Make sure array types are laid out, + even if the array bounds are unknown. + + * decl.c (cp_finish_decl): Correct check for dynamic + initialization of thread-local storage. + + 2002-09-30 Nathan Sidwell + + * tree.c (really_overloaded_fn): TEMPLATE_ID_EXPRs are also + overloaded. + + 2002-09-30 Steve Ellcey + + * class.c (build_vtbl_initializer): Add cast. + (add_vcall_offset_vtbl_entries_1): + Use TARGET_VTABLE_DATA_ENTRY_DISTANCE for offset. + + 2002-09-30 Mark Mitchell + + * class.c (walk_subobject_offsets): Correct the calculation of + offsets for virtual bases. Correct the counting of array + elements. + (layout_nonempty_base_or_field): Simplify. Correct the + calculation of offsets to be propagated through the binfo + hierarchy. + (build_base_field): Avoid creating a FIELD_DECL for empty bases. + Add the FIELD_DECL to TYPE_FIELDS. + (build_base_fields): Adjust accordingly. + (layout_virtual_bases): Use build_base_field. + (end_of_class): Return a tree, not an integer. + (warn_about_ambiguous_direct_bases): Rename to ... + (warn_about_ambiguous_bases): ... this. + (include_empty_classes): New function. + (layout_class_type): Create an alternative version of the type to + be used when as a base class type. Do not call + finish_record_layout until we are done laying out the class. + * cp-tree.h (lang_type_class): Remove size, size_unit. Add + as_base. + (CLASSTYPE_SIZE): Reimplement. + (CLASSTYPE_SIZE_UNIT): Likewise. + (CLASSTYPE_ALIGN): Likweise. + (CLASSTYPE_USER_ALIGN): Likewise. + (CLASSTYPE_AS_BASE): New macro. + (DECL_INITIALIZED_P): Likewise. + (extract_init): Remove prototype. + (build_forced_zero_init): Rename to ... + (build_zero_init): ... this. + (force_store_init_value): Remove. + * decl.c (obscure_complex_init): Remove. + (duplicate_decls): Copy DECL_INITIALIZED_P. + (check_initializer): Do not leave junk in DECL_INITIAL. + (cp_finish_decl): Handle zero-initialization of entities with + static storage duration. + * expr.c (extract_init): Remove. + * init.c (build_forced_zero_init): Remove. + (build_zero_init): New function. + (build_default_init): Use it. + (build_field_list): Skip FIELD_DECLs for base subobjects. + (push_base_cleanups): Likewise. + * method.c (do_build_assign_ref): Likewise. + (synthesize_exception_spec): Likewise. + * pt.c (tsubst_decl): Clear DECL_INITIALIZED_P. + (regenerate_decl_from_template): To not set DECL_INITIAL for a + static data member whose initialization took place in its class. + (instantiate_decl): Do not pass an initializer to cp_finish_decl + in that situation. + * search.c (dfs_push_decls): Skip FIELD_DECLs for base subobjects. + (dfs_unuse_fields): Likewise. + * tree.c (pod_type_p): Handle error_mark_node. + (zero_init_p): Likewise. + * typeck.c (lookup_anon_field): Skip FIELD_DECLs for base + subobjects. + * typeck2.c (store_init_value): Remove #if 0'd code. + (force_store_init_value): Remove. + (process_init_constructor): Use build_zero_init. + + 2002-09-29 Nathan Sidwell + + PR c++/7788 + * rtti.c (unemitted_tinfo_decl_p): Check it has a field. + + 2002-09-29 Kazu Hirata + + * cp-tree.h: Fix comment typos. + * decl.c: Likewise. + * pt.c: Likewise. + + 2002-09-25 Mark Mitchell + + * cp/class.c (contains_empty_class_p): New method. + (walk_subobject_offsets): Correct computation of field offset. + (layout_empty_base): Correct placement of emtpy base classes. + (layout_class_type): Warn about ABI changes. + + 2002-09-23 Mark Mitchell + + * cp/class.c (layout_virtual_bases): Do not round the size of the + type to a multiple of the alignment before laying out virtual bases. + (layout_class_type): Correct handling of bit-fields that are wider + than their type inside unions. Round the size of the type to a + even number of bytes when computing the size without virtual + bases. + * cp/cp-tree.h (abi_version_at_least): New macro. + + 2002-09-21 Kazu Hirata + + * ChangeLog: Follow spelling conventions. + * ChangeLog.2: Likewise. + * call.c: Likewise. + * class.c: Likewise. + * cp-tree.h: Likewise. + * cvt.c: Likewise. + * decl.c: Likewise. + * decl2.c: Likewise. + * except.c: Likewise. + * friend.c: Likewise. + * g++spec.c: Likewise. + * init.c: Likewise. + * lex.c: Likewise. + * mangle.c: Likewise. + * method.c: Likewise. + * operators.def: Likewise. + * optimize.c: Likewise. + * pt.c: Likewise. + * rtti.c: Likewise. + * search.c: Likewise. + * semantics.c: Likewise. + * spew.c: Likewise. + * tree.c: Likewise. + * typeck.c: Likewise. + + 2002-09-18 Devang Patel + + * cp/cp-tree.h: New prototype for walk_vtabls(). + * cp/decl.c (walk_vtables_r): New function. + (struct cp_binding_level): Add new members, namespaces, + names_size and vtables. + (add_decl_to_level): Add decl in namespaces or vtables + chain, if conditions match. + (walk_vtables): New function. + (walk_namespaces_r): Travers separate namespace chain + for namespace decls. + (wrapup_globals_for_namespace): Use names_size instead + of list_length(). + * cp/decl2.c (finish_file): Use walk_vtables() instead of + walk_globals() to walk vtable decls. + + 2002-09-18 Nathan Sidwell + + * decl.c (grokdeclarator): Use assert, not internal_error. Don't + ICE with invalid pointers & references. + + 2002-09-17 Zack Weinberg + + * Make-lang.in: Remove all references to the demangler. + * cxxfilt.c: Moved to binutils. + + 2002-09-16 Nathan Sidwell + + PR c++/7718 + * pt.c (tsubst_decl): Remove assert. + + Remove DR 295 implementation. + * pt.c (check_cv_quals_for_unify): Disable function & method cases. + * tree.c (cp_build_qualified_type_real): Likewise. Don't warn + about ignoring volatile qualifiers. + + * search.c (lookup_member): Correct documentation. + + 2002-09-16 Geoffrey Keating + + * cp-tree.h (union lang_tree_node): Add chain_next option. + + 2002-09-16 Nathan Sidwell + + * parse.y (parse_finish_call_expr): Check lookup_member result. + + PR c++/7015 + * semantic.c (finish_asm_stmt): Fix operand/output_operands + thinko. + * typeck.c (c_expand_asm_operands): Protect from error_mark_node. + + 2002-09-15 Nathan Sidwell + + PR c++/7919 + * call.c (build_over_call): Convert this pointer for fns found by + using decls. + + 2002-09-15 Kazu Hirata + + * ChangeLog: Follow spelling conventions. + * ChangeLog.1: Likewise. + + 2002-09-14 Nathan Sidwell + + PR c++/7768 + * pt.c (build_template_decl): Copy DECL_DESTRUCTOR_P. + + 2002-09-14 Kazu Hirata + + * error.c: Fix comment formatting. + * except.c: Likewise. + * expr.c: Likewise. + * friend.c: Likewise. + * g++spec.c: Likewise. + * init.c: Likewise. + * lex.c: Likewise. + * mangle.c: Likewise. + * method.c: Likewise. + * optimize.c: Likewise. + * pt.c: Likewise. + * rtti.c: Likewise. + * search.c: Likewise. + * semantics.c: Likewise. + * spew.c: Likewise. + * tree.c: Likewise. + * typeck.c: Likewise. + * typeck2.c: Likewise. + + 2002-09-13 Matt Austern + + PR C++/7828 + * cp/cp-tree.h, cp/tree.c: New function non_cast_lvalue_p. + * cp/call.c: Change call-by-const-reference mechanism to use + non_cast_lvalue_p when deciding whether the create a temporary. + We need a temporary when passing, e.g. (long) x by const ref. + + 2002-09-13 Nathan Sidwell + + * pt.c (unify, ARRAY_TYPE): Element type can be more qualified. + + 2002-09-13 Kazu Hirata + + * decl.c: Fix comment formatting. + * decl2.c: Likewise. + + 2002-09-12 Kazu Hirata + + * call.c: Fix comment formatting. + * class.c: Likewise. + * cp-lang.c: Likewise. + * cp-tree.h: Likewise. + * cvt.c: Likewise. + + 2002-09-11 Zack Weinberg + + * Make-lang.in: Build cp/cxxfilt.o from $(srcdir)/cp/cxxfilt.c, + and c++filt from cxxfilt.o + version.o + $(LIBDEPS). + * cxxfilt.c: New file: split from libiberty/cplus-dem.c, with + minor adjustments (use version_string, eliminate yet another + duplicate of xmalloc) + + 2002-09-08 Kaveh R. Ghazi + + * cp-tree.h (require_complete_eh_spec_types): Add prototype. + + 2002-09-05 Jason Merrill + + * typeck2.c (add_exception_specifier): Only pedwarn for an + incomplete type. + (require_complete_eh_spec_types): New fn. + (cxx_incomplete_type_diagnostic): Also support pedwarning. + * typeck.c (complete_type_or_diagnostic): Likewise. + * call.c (build_call): Call require_complete_eh_spec_types. + * rtti.c (get_pseudo_ti_desc): Give an error rather than aborting + on an incomplete type. + + 2002-09-04 Jakub Jelinek + + * decl.c (start_cleanup_fn): Clear interface_only before + start_function, restore it afterwards. + + 2002-09-02 Nathan Sidwell + + * cp-tree.h (finish_builtin_type): Remove. + * decl2.c (finish_builtin_type): Move to common code. + * decl.c (build_ptrmemfunc_type): Adjust. + * rtti.c (create_pseudo_type_info): Adjust. + (create_tinfo_types): Adjust. + + 2002-08-31 Jason Merrill + + * cp-lang.c (cp_expr_size): Allow initialization from a + CONSTRUCTOR. + + 2002-08-30 Richard Henderson + + PR opt/7515 + * tree.c: Include target.h. + (cp_cannot_inline_tree_fn): Don't auto-inline functions that + don't bind locally. + * Makefile.in (tree.o): Update. + + 2002-08-27 Mark Mitchell + + * class.c (layout_virtual_bases): Warn about bugs in G++ that + result in incorrect object layouts. + (layout_class_type): Likewise. + + 2002-08-24 Matt Austern + + * tree.c (lvalue_p_1): Add argument for whether casts of lvalues + are allowable. + (real_lvalue_p): Update caller. + (lvalue_p): Ditto. + (non_cast_lvalue_or_else): New. + * tree.h: Declare it. + * typeck.c (build_unary_op): Use non_cast_lvalue_or_else. + + 2002-08-22 Mark Mitchell + + * typeck.c (build_class_member_access_expr): Handle COMPOUND_EXPR + and COND_EXPR specially; fix error message output. + + 2002-08-22 Jason Merrill + + * pt.c (tsubst_expr): RETURN_EXPR is now RETURN_STMT_EXPR. + * semantics.c (nullify_returns_r): Likewise. + + 2002-08-17 Gabriel Dos Reis + + Fix PR/7621 + * typeck.c (finish_class_member_access_expr): Diagnose cases where + name lookup finds nothing. + + 2002-08-15 Jason Merrill + + * semantics.c (finish_then_clause): Remove redundant assignment. + (finish_if_stmt, begin_switch_stmt, finish_switch_stmt): Move the + extra binding level outside the if/switch statement. + (finish_while_cond, finish_for_cond): Rewrite complex condition + into the loop body. + + 2002-08-15 Alexandre Oliva + + * parse.y (sizeof, alignof, typeof): New non-terminals to + increment skip_evaluation. Replace terminals with them and + decrement skip_evaluation at the end of rules using them. + * decl2.c (mark_used): Don't assemble_external if + skipping evaluation. + + 2002-08-15 Gabriel Dos Reis + + Fix PR/7504 + * parse.y (parse_finish_call_expr): Handle incomplete + type used to name a scope. + + 2002-08-15 Nathan Sidwell + + PR c++/7598 + * typeck.c (build_unary_op): Fold offsetof idiom. Fixes + regression caused by my 2002-08-08 patch. + + 2002-08-13 Mark Mitchell + + * decl.c (pushdecl_class_level): Honor requests to bind names to + OVERLOADs. + + 2002-08-11 Kaveh R. Ghazi + + * decl2.c (build_call_from_tree): Fix uninitialized variable. + * parse.y (parse_finish_call_expr): Likewise. + * repo.c (old_args, old_dir, old_main): Const-ify. + + 2002-08-11 Gabriel Dos Reis + + * decl.c (duplicate_decls): Replace DECL_SOURCE_FILE + DECL_SOURCE_LINE with DECL_SOURCE_LOCATION. + * optimize.c (maybe_clone_body): Likewise. + * pt.c (tsubst_enum): Likewise. + (lookup_template_class): Likewise. + * tree.c (cp_copy_res_decl_for_inlining): Likewise. + + 2002-08-10 Neil Booth + + * lang-specs.h: Remove -ansi. + + 2002-08-10 Nathan Sidwell + + * tree.c (maybe_dummy_object): Replace // with /* */ + + 2002-08-09 Mark Mitchell + + * call.c (standard_conversion): Use build_ptrmem_type. + * cp-tree.h (build_ptrmem_type): New function. + (adjust_result_of_qualified_name_lookup): Likewise. + * decl.c (grokvardecl): Do not look for OFFSET_TYPEs to indicate + static data members. + (build_ptrmem_type): New function. + (grokdeclarator): Do not use build_offset_type when encountering a + qualified name. + * parse.y (parse_finish_call_expr): Use + adjust_result_of_qualified_name_lookup. + * search.c (adjust_result_of_qualified_name_lookup): New function. + * typeck.c (qualify_type_recursive): Use TYPE_PTRMEM_* rather than + accessing OFFSET_TYPEs directly. + + 2002-08-08 Mike Stump + + * call.c (add_builtin_candidate): legal -> valid, illegal -> invalid. + (type_decays_to): Likewise. + * class.c (find_final_overrider): Likewise. + (maybe_note_name_used_in_class): Likewise. + * decl.c (current_tmpl_spec_kind): Likewise. + (add_binding): Likewise. + (push_class_binding): Likewise. + (duplicate_decls): Likewise. + (layout_var_decl): Likewise. + (grokfndecl): Likewise. + (grokdeclarator): Likewise. + (check_default_argument): Likewise. + * decl2.c (handle_class_head): Likewise. + * error.c (dump_template_decl): Likewise. + * init.c (build_offset_ref): Likewise. + * pt.c (check_specialization_scope): Likewise. + (determine_specialization): Likewise. + (check_explicit_specialization): Likewise. + (maybe_check_template_type): Likewise. + (process_partial_specialization): Likewise. + (check_default_tmpl_args): Likewise. + (push_template_decl_real): Likewise. + (convert_template_argument): Likewise. + (try_class_unification): Likewise. + (get_bindings_real): Likewise. + (do_decl_instantiation): Likewise. + * semantics.c (begin_function_definition): Likewise. + (finish_member_declaration): Likewise. + (check_multiple_declarators): Likewise. + * typeck.c (comp_array_types): Likewise. + (comptypes): Likewise. + (expr_sizeof): Likewise. + (build_binary_op): Likewise. + (dubious_conversion_warnings): Likewise. + (check_return_expr): Likewise. + + 2002-08-08 Mark Mitchell + + * typeck.c (build_class_member_access_expr): Do not return + error_mark_node when no error has occurred. + + 2002-08-08 Nathan Sidwell + + * typeck.c (build_component_addr): Remove. + (build_unary_op): Just check it's not a bitfield, and then build + an ADDR_EXPR. + + 2002-08-08 Nathan Sidwell + + * class.c (convert_to_base): Correct check for error_mark_node. + (create_vtable_ptr): Remove unused VFUNS_P parm. + + 2002-08-08 Nathan Sidwell + + * cp/Make-lang.in (c++.mostlyclean): Remove coverage files. + + 2002-08-07 Mark Mitchell + + Rework build_component_ref. + * call.c (build_vfield_ref): Do not go through build_component_ref. + (build_field_call): Use build_class_member_access_expr. + (build_user_type_conversion_1): Use BASELINK_FUNCTIONS. + (build_object_call): Likewise. + * class.c (convert_to_base): New function. + (type_requires_array_cookie): Use BASELINK_FUNCTIONS. + (instantiate_type): Handle BASELINKs. + * cp-tree.def (BASELINK): New tree code. + * cp-tree.h (BASELINK_P): Reimplement. + (SET_BASELINK_P): Remove. + (BASELINK_BINFO): Reimplement. + (BASELINK_FUNCTIONS): Likewise. + (BASELINK_ACCESS_BINFO): Likewise. + (BASELINK_OPTYPE): Likewise. + (convert_to_base): New function. + (name_p): Likewise. + (build_object_ref): Remove. + (build_component_ref_1): Likewise. + (build_component_ref): Likewise. + (build_x_component_ref): Likewise. + (build_class_member_access_expr): New function. + (finish_class_member_access_expr): Likewise. + (build_ptrmemfunc_access_expr): Likewise. + * decl.c (grokdeclarator): Handle BASELINKs. + * decl2. (build_expr_from_tree): Handle COMPONENT_REFs by using + finish_class_member_access_expr. + (arg_assoc): Handle BASELINKs. + (do_class_using_decl): Likewise. + * error.c (dump_decl): Likewise. + (dump_expr): Use build_ptrmemfunc_access_expr. + * except.c (dtor_nothrow): Use CLASSTYPE_DESTRUCTORS to find + destructors. + (build_throw): Use BASELINK_FUNCTIONS. + * init.c (perform_member_init): Use + build_class_member_access_expr. + (build_offset_ref): Handle BASELINKs. Use + build_class_member_access_expr. + * method.c (hack_identifier): Likewise. + * parse.y (do_id): Use BASELINK, not TREE_LIST. + (primary): Remove uses of build_object_ref. + * pt.c (lookup_template_function): Handle BASELINKs. + (resolve_overloaded_unification): Likewise. + * search.c (build_baselink): Build a BASELINK, not a TREE_LIST. + (lookup_field): Use BASELINK, not TREE_LIST. + (lookup_fnfiels): Likewise. + (setup_class_bindings): Likewise. + * semantics.c (finish_object_call_expr): Do not use + build_method_call when we already know what function is being + called. + * spew.c (identifier_type): Use BASELINK, not TREE_LIST. + * tree.c (really_overloaded_fn): Use OVL_CHAIN for OVERLOADs, not + TREE_CHAIN. + (name_p): New function. + * typeck.c (build_object_ref): Remove. + (build_component_ref_1): Likewise. + (build_x_component_ref): Likewise. + (build_class_member_access_expr): New function. + (finish_class_member_access_expr): Likewise. + (build_ptrmemfunc_access_expr): Likewise. + (get_member_function_from_ptrfunc): Use + build_ptrmemfunc_access_expr. + (build_binary_op): Likewise. + (build_unary_op): Likewise. + (build_ptrmemfunc): Likewise. + (pfn_from_ptrmemfunc): Likewise. + * typeck2.c (build_m_component_ref): Adjust comment. + + 2002-08-07 Neil Booth + + * Make-lang.in (CXX_C_OBJS): Update. + * cp-lang.c (LANG_HOOKS_DECODE_OPTION): Use c_common_decode_option. + * cp-tree.h (cxx_decode_option): Remove. + * decl2.c (compare_options, lang_f_options, unsupported_options, + cxx_decode_option): Remove. + + 2002-08-06 Gabriel Dos Reis + + * typeck.c (build_x_unary_op): Handle pointer-to-member. + + 2002-08-05 Geoffrey Keating + + * class.c: Don't include obstack.h. + (popclass): + * decl2.c: Delete bogus comment. + * error.c: Don't include obstack.h. + * except.c: Likewise. + (dump_type): Correct comment. + * method.c: Don't include obstack.h. + * tree.c: Likewise. + + 2002-08-04 Gabriel Dos Reis + + Fix PR/2213 + * cvt.c (cp_convert_to_pointer): Reject conversions from integral + expressions to pointer-to-data-member of pointer-to-member-functions. + + 2002-08-04 Geoffrey Keating + + * cvt.c (ocp_convert): Delete obsolete code. + * parse.y (permanent_obstack): Delete declaration. + * pt.c (permanent_obstack): Delete declaration. + * repo.c (permanent_obstack): Delete declaration. + (open_repo_file): Use xmalloc instead of permanent_obstack. + (init_repo): Use xstrdup instead of permanent_obstack. + + 2002-08-04 Nathan Sidwell + + * cp-tree.h (VF_DERIVED_VALUE): Remove. + * class.c (finish_struct_1): Use VF_BINFO_VALUE not VF_DERIVED_VALUE. + + 2002-08-03 Nathan Sidwell + + PR 7470. + C++ ABI change - vfunc ordering. + * class.c (add_virtual_function): Remove. + (dfs_modify_all_vtables): Take list of all declared + virtuals. Assign all that are not in primary base. + (check_for_override): Adjust comments. + (create_vtable_ptr): Take single list of virtuals. Build chain + of declared virtuals here. + (layout_class_type): Take single list of virtuals. Adjust. + (finish_struct_1): Keep virtuals on single list. Adjust. + + 2002-08-02 Mark Mitchell + + * init.c (build_member_call): Use build_new_method_call, not + build_method_call. + + 2002-08-02 Krister Walfridsson + + * Make-lang.in (spew.o, lex.o, pt.o): Add path to parse.h dependencies. + + 2002-08-02 Mark Mitchell + + * call.c (build_method_call): Issue a more helpful error message + about ambiguous method names. + + 2002-08-02 Nathan Sidwell + + * tree.c (build_shared_int_cst): Make cache file scope, and + GTY it. + + 2002-08-02 Jason Merrill + + * cp-lang.c (LANG_HOOKS_EXPR_SIZE): Define. + (cp_expr_size): New fn. + * call.c (build_over_call): Lose empty class hackery. + (convert_arg_to_ellipsis): Promote non-POD warning to error. + * typeck.c (build_modify_expr): Don't use save_expr on an lvalue. + + * semantics.c (expand_body): Do tree optimization in the function + context, too. + + 2002-08-01 Neil Booth + + * cp-tree.h: Move all warning and flag declarations to c-common.h. + * decl.c: Move all warning and flag variables to c-common.c. + * decl2.c: Move all warning and flag variables to c-common.c. + * lex.c (flag_digraphs): Remove. + (warn_traditional): Now in c-common.c. + + 2002-07-31 Mark Mitchell + + * call.c (build_field_call): Do not look up the field by name. + (build_method_call): Simplify. + (struct z_candidate): Add access_path and conversion_path. Remove + basetype_path. + (convert_class_to_reference): Adjust use of + add_function_candidate. + (add_candidate): Add conversion_path argument. + (add_function_candidate): Use it. + (add_conv_dndidate): Likewise. + (build_builtin_candidate): Likewise. + (add_template_candidate_real): Add conversion_path argument. + (add_template_conv_candidate): Likewise. + (add_template_candidate): Likewise. + (build_user_type_conversion_1): Use it. + (build_new_function_call): Remove name lookup code. Adjust use of + add_template_candidate and add_function_candidate. + (build_new_op): Likewise. + (convert_like_real): Use build_special_member_call. + (build_over_call): Use cand->conversion_path. + (build_special_member_call): New method. + (build_new_method_call): Remove name lookup code. + * cp-tree.def (OFFSET_REF): Update documentation. + (TEMPLATE_ID_EXPR): Likewise. + * cp-tree.h (BASELINK_ACCESS_BINFO): New macro. + (BASELINK_OPTYPE): Likewise. + (build_new_method_call): Adjust prototype. + (build_special_member_call): New method. + (build_baselink): New method. + (build_offset_ref_call_from_tree): Likewise. + (build_call_from_tree): Likewise. + (finish_qualified_call_expr): Remove. + (finish_call_expr): Adjust prototype. + (build_x_function_call): Remove. + * cvt.c (ocp_convert): Use build_special_member_call. + * decl2.c (reparse_absdcl_as_expr): Use finish_call_expr. + (build_expr_from_tree): Adjust handling for TEMPLATE_ID_EXPR and + CALL_EXPR. + (build_offset_ref_call_from_tree): New function. + (build_call_from_tree): Likewise. + * init.c (expand_cleanup): Use build_special_member_call. + (expand_default_init): Likewise. + (build_member_call): Use finish_call_expr. + (build_new_1): Use build_special_member_call. + (push_base_cleanups): Likewise. + * method.c (do_build_assign_ref): Likewise. + * parse.y (template_id): Do not pass a COMPONENT_REF to + lookup_template_function. + (primary): Use parse_finish_call_epxr, not finish_call_expr. + (parse_finish_call_expr): New function. + * pt.c (lookup_template_function): Add assertions. + * search.c (lookup_base): Allow T to be a binfo. + (build_baselink): New function. + (lookup_member): Use it. + * semantics.c (finish_call_expr): Do not do name lookup. + (finish_object_call_expr): Remove #if 0'd code. + (finish_qualified_call_expr): Remove. + * typeck.c (build_x_function_call): Remove. + (build_static_case): Use build_special_member_call. + * typeck2.c (build_functional_cast): Likewise. + + 2002-07-30 Franz Sirl + + * lang-specs.h: Remove __GXX_ABI_VERSION, moved to gcc.c. + + 2002-07-30 Gabriel Dos Reis + + * cp-tree.h (VF_DERIVED_VALUE): Restore from previous deletion. + + 2002-07-30 Nathan Sidwell + + * cp-tree.h (CLASSTYPE_VFIELDS, VF_*, BV_*): Add more + documentation. + + 2002-07-29 Alan Modra + + * cp-tree.h: Comment typo fix. + + 2002-07-29 Richard Earnshaw + + * spew.c (space_for_token): Allocate zeroed memory for a new token + chunk. + + 2002-07-27 Roger Sayle + + * decl.c (builtin_function_1): No need to explicitly mark + BUILT_IN_RETURN and BUILT_IN_EH_RETURN as noreturn. + + 2002-07-27 Roger Sayle + + * decl2.c (cxx_decode_option): Support -fno-builtin-foo. + + 2002-07-26 Jason Merrill + + * call.c (build_over_call): Likewise. + (cp_convert_parm_for_inlining): New fn. + (convert_for_arg_passing): New fn. + (convert_default_arg, build_over_call): Use it. + (type_passed_as): New fn. + * pt.c (tsubst_decl): Use it. + * decl2.c (cp_build_parm_decl): New fn. + (build_artificial_parm): Use it. + (start_static_storage_duration_function): Likewise. + * decl.c (start_cleanup_fn, grokdeclarater): Likewise. + (grokparms): Don't mess with DECL_ARG_TYPE. + * typeck.c (convert_arguments): Use convert_for_arg_passing. + * cp-lang.c (LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING): + Define. + * cp-tree.h: Declare new fns. + + 2002-07-26 Neil Booth + + * cp-tree.h (flag_operator_names): Remove. + * decl2.c (flag_operator_names): Remove. + (lang_f_options): Remove operator-names. + * lex.c (D_OPNAME): Remove. + (reswords): Remove operator names. + (rid_to_yy): Remove operator names. + (init_reswords): No need to handle D_OPNAME. + * spew.c (read_process_identifier): There are no operator + names. + + 2002-07-26 Jason Merrill + + * dump.c (cp_dump_tree): Call c_dump_tree. + * Make-lang.in (CXX_C_OBJS): Add c-dump.o. + + 2002-07-25 Neil Booth + + * error.c (print_whitespace): Remove. + * g++spec.c (LIBUNWIND): Move. + * mangle.c (mangled_position, write_signed_number): Remove. + + 2002-07-25 Neil Booth + + * decl2.c (cxx_decode_option): Similarly. + + 2002-07-25 Gabriel Dos Reis + + * cp-tree.h (cxx_sizeof_nowarn): Now a macro. + (cxx_sizeof_or_alignof_type): Take a third argument. + (cxx_sizeof): Adjust definition. + (cxx_alignof): Likewise. + * init.c (build_delete): Use cxx_sizeof_nowarn to reflect reality. + * typeck.c (cxx_sizeof_or_alignof_type): Take a third argument for + complaining. + (c_sizeof_nowarn): Remove definition. + (build_unary_op): Use cxx_sizeof_nowarn. + + 2002-07-24 Geoffrey Keating + + * tree.c (cp_build_qualified_type_real): When copying + pointer-to-method types, unshare the record that holds + the cached pointer-to-member-function type. + + 2002-07-23 Neil Booth + + * cp-tree.h (FILE_FUNCTION_PREFIX_LEN): Remove. + + 2002-07-23 Gabriel Dos Reis + + Fix PR/7363: + * typeck.c (cxx_sizeof_or_alignof_type): New function. + (c_sizeof): Remove definition. + (expr_sizeof): Use cxx_sizeof. + * decl2.c (build_expr_from_tree): Use cxx_sizeof_or_alignof_type. + * decl.c (finish_destructor_body): Use cxx_sizeof. + * semantics.c (finish_alignof): Likewise. + (finish_alignof): Use cxx_alignof. + * cp-tree.h (cxx_sizeof, cxx_alignof): New macros. + (cxx_sizeof_or_alignof_type): Declare. + (my_friendly_assert): Move to ../c-common.h. + + 2002-07-23 Neil Booth + + * class.c, method.c, pt.c, search.c: Don't define obstack macros. + + 2002-07-22 Kriang Lerdsuwanakij + + PR c++/7347, c++/7348 + * cp-tree.h (tsubst_flags_t): Add tf_parsing. + * decl.c (make_typename_type): Use it. + (make_unbound_class_template): Likewise. + (lookup_name_real): Don't call type_access_control if scope is + template parameter dependent. + * parse.y (template_arg): Call make_unbound_class_template with + tf_parsing set. + (nest_name_specifier): Call make_typename_type with tf_parsing set. + (typename_sub0): Likewise. + (typename_sub1): Likewise. + (instantiate_decl): Push class scope. + * pt.c (regenerate_decl_from_template): Call pushclass and popclass + for both static variable and member function template. + (instantiate_decl) Call pushclass and popclass when tsubst'ing type + and arguments. + * search.c (type_access_control): Do type access for TEMPLATE_DECL + too. + + 2002-07-20 Roger Sayle + + * decl2.c (cxx_decode_option): Simplify -fhandle-exceptions + test by using positive_option. Make whitespace consistent. + + 2002-07-20 Gabriel Dos Reis + + * spew.c (struct unparsed_test): Replace 'filename' and 'lineno' + members with 'locus'. Adjust use throughout. + (struct feed): Likewise. + (alloc_unparsed_test): Change prototype, take a 'const location_t *'. + Adjust use. + (snarf_defarg): Use error(), not error_with_file_and_line(). + + 2002-07-19 Chris Demetriou + + * lang-specs.h (@c++): Include "%2" (cc1plus_spec) wherever + cpp_options is included. + + 2002-07-17 Kriang Lerdsuwanakij + + PR c++/2862, c++/2863 + * pt.c (determine_specialization): Compare the length of + TYPE_ARG_TYPES. Tidy. + + 2002-07-17 Kriang Lerdsuwanakij + + PR c++/3797 + * decl.c (duplicate_decls): Don't propagate inlining parameters from + olddecl to newdecl when newdecl is a specialization of the + instantiation olddecl. + + 2002-07-17 Kriang Lerdsuwanakij + + PR c++/4802, c++/5387 + * decl.c (make_typename_type): Use enforce_access. + + 2002-07-17 Scott Snyder + + PR c++/7320 + * rtti.c (get_tinfo_decl): Set DECL_COMDAT. + + 2002-07-12 Mark Mitchell + + * class.c (add_method): Correct handling of conversion operators. + + 2002-07-11 Mark Mitchell + + PR c++/7224 + * class.c (add_method): Simplify. + + 2002-07-11 Jason Merrill + + PR c++/7279 + * tree.c (cp_copy_res_decl_for_inlining): Also copy + TREE_ADDRESSABLE. + + 2002-07-10 Graham Stott + + * pt.c (template_parm_this_level_p, push_template_decl_real): + Pass depth as int pointer. + + 2002-07-11 Tim Josling + + Remove front end hard coding from gengtype.c. + + * config-lang.in (gtfiles): Add files needed for this front end. + + 2002-07-10 Mark Mitchell + + * cp-tree.h (unqualified_name_lookup_error): Declare it. + (begin_function_definition): Adjust prototype. + * lex.c (unqualified_name_lookup_error): New function, split out + from ... + (do_identifier): ... here. + * parse.y (parse_begin_function_definition): New function. + (fn.def1): Use it. + * semantics.c (begin_function_definition): Accept decl-specifiers + and attributes as separate parameters. + + 2002-07-10 Jason Merrill + + PR c++/6255 + * decl.c (lookup_name_real): Build a new TYPENAME_TYPE rather than + modifying the old one. + + 2002-07-09 Mark Mitchell + + * cp-tree.h (constructor_name_p): Declare it. + (check_template_template_default_arg): Likewise. + * class.c (handle_using_decl): Use constructor_name_p. + * decl.c (grokdeclarator): Likewise. + * decl2.c (constructor_name_p): Define it. + * init.c (build_member_call): Use constructor_name_p. + * parse.y (template_parm): Use check_template_template_default_arg. + * pt.c (check_explicit_specialization): Use constructor_name_p. + * semantics.c (check_template_template_default_arg): New function. + + 2002-07-08 Kriang Lerdsuwanakij + + * pt.c (can_complete_type_without_circularity): Add static to + function definition. + + 2002-07-08 Mark Mitchell + + * cp-tree.h (have_extern_spec): Declare it + * decl.c (have_extern_spec): Define it. + (start_decl): Eliminate use of used_extern_spec. + (start_function): Likewise. + * parse.y (have_extern_spec): Remove declaration. + (used_extern_spec): Likewise. + (frob_specs): Eliminate use of used_extern_spec. + (.hush_warning): Likewise. + + 2002-07-07 Mark Mitchell + + * Make-lang.in (cp/parse.o): Depend on decl.h. + * cp-tree.h (do_decl_instantiation): Change prototype. + * parse.y: Include decl.h. + (parse_decl_instantiation): New function. + (explicit_instantiation): Use it. + * pt.c (do_decl_instantiation): Accept a DECL, not a DECLARATOR + and DECLSPECS. + + 2002-07-07 Roger Sayle + + * error.c (dump_function_name): Use DECL_TEMPLATE_RESULT for + constructor and destructor tests when passed a TEMPLATE_DECL. + + 2002-07-05 Jason Merrill + + * cvt.c (cp_convert_to_pointer): Call force_fit_type for null + pointers. + + PR optimization/7145 + * tree.c (cp_copy_res_decl_for_inlining): Also copy DECL_INITIAL. + + 2002-07-05 Nathan Sidwell + + Repair damage on weak-impared targets caused by my previous patch. + * cp-tree.h (import_export_tinfo): Add parameter. + * decl2.c (import_export_tinfo): Add parameter, post adjust + DECL_COMDAT. + * rtti.c (emit_tinfo_decl): DECL_COMDAT is (nearly) always setup by + import_export_tinfo. + + 2002-07-03 Kriang Lerdsuwanakij + + PR c++/6944 + * init.c (build_aggr_init): Remove qualifiers of init before calling + build_vec_init. + (build_vec_init): Flatten multi-dimensional array during cleanup. + (build_vec_delete_1): Abort if the type of each element is array. + + 2002-07-03 Graham Stott + + * pt.c (instantiate_class_template): Fix typo. + + 2002-07-02 Kriang Lerdsuwanakij + + * typeck2.c (cxx_incomplete_type_diagnostic): Fix typo caused + by CVS conflict in my last patch. + + 2002-07-02 Kriang Lerdsuwanakij + + PR c++/6716 + * pt.c (can_complete_type_without_circularity): New function. + (instantiate_class_template): Use it. + * typeck2.c (cxx_incomplete_type_diagnostic): Improve error + message due to incomplete fields. + + 2002-07-01 Mark Mitchell + + PR c++/7112 + * mangle.c (write_expression): Add mangling for sizeof when + applied to a type. + * operators.def: Remove stale comment. + + 2002-06-30 Nathan Sidwell + + * cp-tree.h (CPTI_TINFO_DECL_TYPE): Replace with ... + (CPTI_TYPE_INFO_PTR_TYPE): ... this. + (tinfo_decl_type): Replace with ... + (type_info_ptr_type): ... this. + (import_export_tinfo): Declare. + (tinfo_decl_p): Rename to ... + (unemitted_tinfo_decl_p): ... this. + * decl2.c (import_export_decl): Break out tinfo handling into ... + (import_export_tinfo): ... here. New function. + (finish_file): Adjust. + * rtti.c (TINFO_REAL_NAME): New macro. + (init_rtti_processing): Create the tinfo types. + (get_tinfo_decl_dynamic): Use type_info_ptr_type, get_tinfo_ptr. + (get_tinfo_decl): Adjust. + (get_tinfo_ptr): New function. + (get_type_id): Use it. + (tinfo_base_init): Create vtable decl here, if it doesn't exist. + (ptr_initializer): Use get_tinfo_ptr. + (ptm_initializer): Likewise. + (synthesize_tinfo_var): Break into ... + (get_pseudo_ti_init): ... this. Just create the initializer. + (get_pseudo_ti_desc): .. and this. + (create_real_tinfo_var): Remove. + (create_pseudo_type_info): Don't create the vtable decl here. + (get_vmi_pseudo_type_info): Remove. + (create_tinfo_types): Adjust. + (tinfo_decl_p): Rename to ... + (unemitted_tinfo_decl_p): ... here. Adjust. + (emit_tinfo_decl): Adjust. Create the initializer. + + 2002-06-27 Mark Mitchell + + PR c++/6695 + * pt.c (tsubst_friend_class): Substitute into the context of the + friend before using it. + + 2002-06-26 Mark Mitchell + + * cp-tree.h (xref_tag): Change prototype. + (handle_class_head): Likewise. + (build_x_component_ref): Likewise. + * decl.c (cxx_init_decl_processing): Adjust call to xref_tag. + (xref_tag): Take attributes as a separate parameter. + (xref_tag_from_type): Adjust call to xref_tag. + * decl2.c (build_expr_from_tree): Adjust call to + build_x_component_ref. + (handle_class_head): Take attributes as a separate parameter. + * parse.y (parse_xref_tag): New function. + (parse_handle_class_head): Likewise. + (primary): Use parse_xref_tag. + (class_head_decl): Use parse_handle_class_head. + (class_head_defn): Likewise. + * rtti.c (init_rtti_processing): Adjust call to xref_tag. + (build_dynamic_cast_1): Likewise. + (create_pseudo_type_info): Likewise. + (emit_support_tinfos): Likewise. + * typeck.c (build_object_ref): Adjust call to + build_x_component_ref. + (build_x_component_ref): Remove protect parameter. + + 2002-06-25 Mark Mitchell + + * call.c (build_op_delete_call): Use BASELINK_FUNCTIONS. + * class.c (handle_using_decl): Likewise. + (instantiate_type): Likewise. + * cp-tree.h (BASELINK_FUNCTIONS): New macro. + (xref_basetypes): Change prototype. + (begin_mem_initializers): New function. + (get_overloaded_fn): Likewise. + * decl.c (xref_basetypes): Simplify. + * error.c (dump_expr): Use BASELINK_FUNCTIONS. + * init.c (build_offset_ref): Likewise. + * parse.y (base_init): Use begin_mem_initializers(). + (structsp): Adjust call to xref_basetypes. + * pt.c (determine_specialization): Use BASELINK_FUNCTIONS. + (instantiate_class_template): Adjust call to xref_basetypes. + * semantics.c (begin_mem_initializers): New function. + * tree.c (is_overloaded_fn): Use BASELINK_FUNCTIONS. + (really_overloaded_fn): Likewise. + (get_overloaded_fn): New function.' + (get_first_fn): USe BASELINK_FUNCTIONS. + + 2002-06-24 Mark Mitchell + + * cp-tree.h (SCALAR_TYPE_P): New macro. + (check_for_out_of_scope_variable): New function. + (at_class_scope_p): Likewise. + (finish_fname): Likewise. + * class.c (finish_struct): Use at_function_scope_p. + * decl.c (check_for_out_of_scope_variable): New function, split + out from do_identifier. + (finish_enum): Use at_function_scope_p. + * lex.c (do_identifier): Use check_for_out_of_scope_variable. + * parse.y (VAR_FUNC_NAME): Give it . Use finish_fname. + (primary): Use at_function_scope_p. + * search.c (at_class_scope_p): New function. + * semantics.c (finish_fname): Likewise. + (check_multiple_declarators): Use at_function_scope_p. + + 2002-06-23 Mark Mitchell + + * parse.y (parse_scoped_id): New function. + (primary): Use it. + * cp-tree.h (do_scoped_id): Adjust declaration. + * lex.c (do_scoped_id): Remove call to yylex. + * decl2.c (build_expr_from_tree): Adjust use of do_scoped_id. + * typeck2.c (add_exception_specifier): Use tree_cons, rather than + expanding it inline. + + 2002-06-23 Matt Thomas + + * decl.c (finish_function): Change "#ifdef VMS_TARGET" to + "#if VMS_TARGET". + + 2002-06-21 Kaveh R. Ghazi + + * mangle.c (integer_type_codes): Const-ify. + + 2002-06-20 Richard Henderson + + PR c++/6747 + * typeck.c (mark_addressable): Don't test TREE_ADDRESSABLE early. + Call put_var_into_stack. + + 2002-06-20 Kaveh R. Ghazi + + * spew.c (remove_last_token): Use ARRAY_SIZE in lieu of explicit + array size calculation. + + 2002-06-20 Kriang Lerdsuwanakij + + PR c++/6892 + * pt.c (tsubst_expr): Handle FILE_STMT. + + 2002-06-20 Kriang Lerdsuwanakij + + PR c++/6723 + * pt.c (lookup_template_class): Don't build complete argument of + BOUND_TEMPLATE_TEMPLATE_PARM if appeared as a default template + argument. + + 2002-06-19 Akim Demaille + + * parse.y (TYPENAME): Rename as tTYPENAME to avoid the clash with + decl.h's TYPENAME. + * spew.c, lex.c: Adjust. + * parse.y (explicit_instantiation): Add empty action to override + the default $$ = $1 where it introduces a type clash. + + 2002-06-14 Jason Merrill + + * semantics.c (begin_for_stmt): Push the 'for' scope before + adding the FOR_STMT. + + C++ ABI changes. + * class.c (build_base_field): Set DECL_PACKED. + (layout_class_type): Don't use tail padding of PODs. + * mangle.c (write_unqualified_name): Fix template conversion op + mangling. + + 2002-06-16 Richard Henderson + + PR opt/6793 + * tree.c (cp_cannot_inline_tree_fn): Don't short-circuit test + after template instantiation. + + 2002-06-16 Richard Henderson + + * cp-tree.h, decl2.c (flag_ms_extensions): Move to c-common. + + 2002-06-15 Gabriel Dos Reis + + * cp-tree.h (compiler_error): Remove declaration. + * lex.c (compiler_error): Remove definition. + + 2002-06-14 Steve Ellcey + + * g++spec.c (LIBUNWIND): New. + (lang_specific_driver): Add it if USE_UNWIND_EXCEPTIONS is set. + + 2002-06-13 Jessica Han + + * class.c (build_vtable): Use TARGET_VTABLE_ENTRY_ALIGN. + (build_vtbl_initializer): Honor TARGET_VTABLE_DATA_ENTRY_DISTANCE. + (build_vbase_offset_vtbl_entries): Likewise. + * rtti.c (build_headof): Likewise. + (get_tinfo_decl_dynamic): Likewise. + (create_pseudo_type_info): Likewise. + + 2002-06-12 Stan Shebs + + * mpw-config.in: Remove file, no longer used. + * mpw-make.sed: Ditto. + + 2002-06-07 Zack Weinberg + + * decl2.c: Update call to cpp_handle_option. + + 2002-06-07 H.J. Lu (hjl@gnu.org) + + * decl2.c (flag_use_cxa_atexit): Set to DEFAULT_USE_CXA_ATEXIT. + + 2002-06-06 Gabriel Dos Reis + + * error.c (cp_error_at): Fix typo. + + 2002-06-04 Gabriel Dos Reis + + * error.c (cp_diagnostic_starter): Adjust call. + (maybe_print_instantiation_context): Change prototype to take a + 'diagnostic_info *'. + (print_instantiation_full_context): Likewise. + (print_instantiation_partial_context): Likewise. + (cp_diagnostic_starter): Likewise. + (cp_diagnostic_finalizer): Likewise. + (cp_print_error_function): Likewise. + (cp_printer): Take a secondary parameter as a 'text_info *'. + Remove output_state savings. Adjust calls. + + 2002-06-03 Geoffrey Keating + + * pt.c (inline_parm_levels): Mark for GC. + + * mangle.c (start_mangling): Allocate G.substitutions here... + (init_mangle): ... rather than here. + (finish_mangling): Clear the varray pointer when done with it. + * spew.c (yylexstring): Don't use VARRAY_FREE. + * search.c (bfs_walk): Don't use VARRAY_FREE. + * decl2.c (pending_statics): Use gengtype to mark. + (deferred_fns): Likewise. + (ssdf_decls): Likewise. + (init_decl2): Delete. + * decl.c (pop_from_top_level): Don't use VARRAY_FREE. + (cxx_init_decl_processing): Don't call init_decl2. + (cxx_pop_function_context): Don't use VARRAY_FREE. + * cp-tree.h (struct saved_scope): No need for special marking + of varrays. + (struct language_function): Likewise. + (local_classes): Use gengtype to mark. + (init_decl2): Delete prototype. + * class.c (init_class_processing): Don't use + ggc_add_tree_varray_root. + (build_vtbl_initializer): Don't use VARRAY_FREE. + + * decl.c (typename_compare): Don't use same_type_p. + + * decl.c: Include hashtab.h instead of hash.h. + (typename_hash): Update to use htab_h. + (typename_compare): Likewise. + (typename_htab): Use gengtype to mark. + (build_typename_type): Update to use htab_h. + * Make-lang.in (cp/decl.o): Use HASHTAB_H instead of hash.h. + + * Make-lang.in (gt-cp-tree.h): New rule. + (cp/tree.o): Depend on gt-cp-tree.h. + * config-lang.in (gtfiles): Add cp/tree.c. + * tree.c: Include gt-cp-tree.h. + (list_hash_table): Use gengtype to mark. + (init_tree): Use gengtype to mark trees. + + * Make-lang.in (cp/decl.o): Add debug.h dependency. + * call.c (struct z_candidate): Use gengtype. + (USER_CONV_CAND): Use WRAPPER_ZC. + (convert_class_to_reference): Use build_zc_wrapper. + (build_type_conversion_1): Likewise. + (build_over_call): Use WRAPPER_ZC. + (add_warning): Use build_zc_wrapper. + * cp-lang.c (LANG_HOOKS_MARK_TREE): Delete. + * cp-tree.h (struct lang_identifier): Use gengtype. + (struct template_parm_index_s): Likewise. + (struct ptrmem_cst): Likewise. + (struct tree_binding): Likewise. + (struct tree_overload): Likewise. + (struct tree_srcloc): Likewise. + (struct tree_wrapper): Likewise. Also modify to have a pointer + to struct z_candidate rather than void. + (enum cp_tree_node_structure_enum): New. + (union lang_tree_node): New. + (cxx_mark_tree): Delete prototype. + (cp_tree_node_structure): New prototype. + (build_ptr_wrapper): Delete prototype. + (build_int_wrapper): Delete prototype. + (build_zc_wrapper): New prototype. + * decl.c: Include debug.h + (cxx_mark_tree): Delete. + (cp_tree_node_structure): New. + * tree.c (build_ptr_wrapper): Delete. + (build_int_wrapper): Delete. + (build_zc_wrapper): New. + + * cp-tree.h [! ENABLE_TREE_CHECKING] (LANG_TYPE_PTRMEM_CHECK): + Correct typo. Patch from k_fukui@highway.ne.jp. + + * semantics.c (current_stmt_tree): Update for change to + struct language_function. + (finish_mem_initializers): Likewise. + * decl.c (cxx_init_decl_processing): Don't set mark_lang_status. + * cp-tree.h (struct language_function): Rename from + cp_language_function. Change all uses. + (cp_function_chain): Don't need to cast. + + * class.c (duplicate_tag_error): Reset discriminator. + (check_bases_and_members): Update for data structure changes. + * cp-tree.h (struct lang_id2): Use gengtype. + (flagged_type_tree): Likewise. + (SET_LANG_ID): Use GGC on struct lang_id2. + (struct cp_language_function): Use gengtype. Remove field + 'x_vcalls_possible_p'. + (current_vcalls_possible_p): Delete. + (struct lang_type_header): New. + (struct lang_type_class): Rename from struct lang_type. Include + struct lang_type_header. + (struct lang_type_ptrmem): New. + (struct lang_type): New. + (LANG_TYPE_CLASS_CHECK): New. Use it in all the appropriate macros. + (LANG_TYPE_PTRMEM_CHECK): New. Use it in all the appropriate macros. + (TYPE_SET_PTRMEMFUNC_TYPE): Set discriminator, update for changes. + (struct lang_decl_flags): Use gengtype. Add discriminators. + (struct lang_decl): Use gengtype. Add and use discriminators. + Update the macros that reference moved fields. + (LANG_DECL_U2_CHECK): New function. Use it when appropriate. + (SET_DECL_THUNK_P): Set discriminator too. + (clear_inline_text_obstack): Delete prototype. + (finish_inline_definitions): Delete prototype. + (mark_pending_inlines): Delete prototype. + (lang_check_failed): New prototype. + * decl.c (struct named_label_use_list): Use gengtype. + (struct named_label_list): Likewise. + (mark_binding_level): Delete. + (mark_named_label_lists): Delete. + (push_local_name): Set discriminator on DECL_LANG_SPECIFIC. + (cxx_init_decl_processing): Use generated marker routine. + (begin_destructor_body): Delete dead set to + current_vcalls_possible_p. + (mark_lang_function): Delete. + (mark_cp_function_context): Delete. + (lang_mark_tree): Use generated marker routines. + * decl2.c (start_objects): Set discriminator when setting + GLOBAL_INIT_PRIORITY. + * lex.c (retrofit_lang_decl): Set discriminators. + (copy_lang_type): Update for changes to lang_type structure. + (cp_make_lang_type): Set discriminator. + * parse.y: Use gengtype on YYLVAL. Don't use dots in identifiers. + * search.c: Include ggc.h. + * semantics.c (anon_aggr_type_p): Use the macro, don't hand-code it. + (finish_inline_definitions): Delete. + * spew.c (struct token): Use gengtype. + (struct token_chunk): New. + (struct unparsed_text): Use gengtype. Store tokens in chunks. + (struct feed): Use gengtype. + (feed_obstack): Delete. + (feed): Mark as GC root. + (pending_inlines): Mark as GC root. + (pending_inlines_tail): Likewise. + (processing_these_inlines): Likewise. + (token_obstack): Make static. + (first_token): Likewise. + (init_spew): Don't initialize deleted things; use gengtype for roots. + (clear_inline_text_obstack): Delete. + (feed_input): Use GC for struct feed. Update for changes to + struct unparsed_text. + (mark_pending_inlines): Delete. + (next_token): Rename from add_token. Change all callers. Update + for changes to struct unparsed_text. + (space_for_token): New. + (remove_last_token): New. + (alloc_unparsed_text): New. + (snarf_block): Take an unparsed_text. Update for changes to struct + unparsed_text. + (snarf_method): Update for changes to struct unparsed_text. + (snarf_defarg): Update for changes to struct unparsed_text. + * tree.c (lang_check_failed): New. + + * Make-lang.in (gt-cp-call.h gt-cp-decl2.h gt-cp-parse.h + gt-cp-pt.h gt-cp-repo.h gt-cp-spew.h): New rules. + (cp/spew.o): Add dependency on gt-.h. + (cp/decl2.o): Add dependency on gt-.h. + (cp/call.o): Add dependency on gt-.h. + (cp/pt.o): Add dependency on gt-.h. + (cp/repo.o): Add dependency on gt-.h. + (cp/parse.o): Add dependency on gt-.h. + * call.c: Use gengtype for roots. + * config-lang.in (gtfiles): Add cp-tree.h decl.h lex.h call.c + decl2.c parse.y pt.c repo.c spew.c. + * cp-tree.h: Use gengtype for roots. + (struct saved_scope): Use GGC, gengtype. + (cp_parse_init): Delete prototype. + (init_pt): Delete prototype. + * decl.c: Use gengtype for roots. + (mark_saved_scope): Delete. + (cxx_init_decl_processing): Don't call deleted initilisation + routines. + (signed_size_zero_node): Delete, unused. + * decl.h: Use gengtype for roots. + * decl2.c: Use gengtype for roots. + * lex.h: Use gengtype for roots. + * parse.y: Use gengtype for roots. + (cp_parse_init): Delete. + * pt.c: Use gengtype for roots. + (init_pt): Delete. + * repo.c: Use gengtype for roots. + * spew.c: Use gengtype for roots. + + * Make-lang.in: Allow for filename changes. Add gtype-cp.h. + (cp/decl.o): Add dependency on gtype-cp.h. + * decl.c: Remove use of add_deletable_root, use GTY marker instead. + Include gtype-cp.h. Allow for filename changes. + + * Make-lang.in (cp/gt-decl.h): Generate using gengtype. + (cp/decl.o): Add cp/gt-decl.h dependency. + * config-lang.in (gtfiles): New. + * tree.h: Rename struct binding_level to struct cp_binding_level. + * decl.c: Rename struct binding_level to struct cp_binding_level. + Include cp/gt-decl.h. + (struct cp_binding_level): Use gengtype. + (make_binding_level): Use GGC on struct cp_binding_level. + (mark_binding_level): Use gt_ggc_m_cp_binding_level. + (cxx_init_decl_processing): Mark free_binding_level as + deletable. + + * decl.c (mark_cp_function_context): Update calling sequence. + + * decl.c (start_function): Don't free 'struct + cp_language_function'. + (pop_cp_function_context): Likewise. + (save_function_data): Allocate it using GC. + * semantics.c (genrtl_start_function): Don't free 'struct + cp_language_function'. + + 2002-05-31 Matthew Woodcraft + + * lang-specs.h: Use cpp_debug_options. + + 2002-05-28 Zack Weinberg + + * mangle.c, tree.c: Include real.h. + * Make-lang.in: Update dependency lists. + + 2002-05-25 Neil Booth + + * lex.c: Don't include c-lex.h. + * parse.y, spew.c: Don't include c-lex.h; include c-pragma.h. + + 2002-05-23 Neil Booth + + * spew.c (yyungetc, snarf_block): Remove indent_level handling. + + 2002-05-22 Richard Henderson + + * decl.c (obscure_complex_init): Check for VAR_DECL + before using DECL_THREAD_LOCAL. + + 2002-05-22 Richard Henderson + + * decl.c (check_tag_decl): Handle RID_THREAD. + (obscure_complex_init): Reject run-time init of tls. + (grokvardecl, grokdeclarator): Handle RID_THREAD. + * lex.c (reswords): Add __thread. + (rid_to_yy): Map RID_THREAD to SCSPEC. + + 2002-05-22 Neil Booth + + * cp-lang.c (LANG_HOOKS_POST_OPTIONS): Use c_common_post_options. + * cp-tree.h (cxx_post_options): Kill. + * cp-lex.c (cxx_post_options): Kill. + + 2002-05-21 Richard Henderson + + * lex.c (rid_to_yy): Add RID_THREAD. + + 2002-05-21 Alexandre Oliva + + * init.c (build_vec_init): Test for trivial copy-assignment when + copy-assigning arrays. + + 2002-05-20 Andreas Jaeger + + * init.c (build_default_init): Remove unused variable. + + 2002-05-20 Alexandre Oliva + + * call.c (any_strictly_viable): New. + (build_new_op): Use it for COMPOUND_EXPR and ADDR_EXPRs. + + 2002-05-19 Kriang Lerdsuwanakij + + * error.c (dump_type) [TYPEOF_TYPE]: Fix parenthesis printing. + + 2002-05-19 Kriang Lerdsuwanakij + + PR c++/186, DR 259 + * pt.c (do_decl_instantiation): Don't complain explicit + instantiation after explicit specialization. + (do_type_instantiation): Likewise. + + 2002-05-19 Alexandre Oliva + + * cp-tree.h (complete_type_or_diagnostic): Changed prototype, + renamed from... + (complete_type_or_else): ... this. Redefined as macro. + (cxx_incomplete_type_diagnostic): Declare. + (cxx_incomplete_type_error): Define as macro. + * init.c (build_delete): Warn about incomplete types other than + void, and use the built-in operator delete for them. + * typeck.c (complete_type_or_diagnostic): Renamed from + complete_type_or_else. Added warn_only argument, passed to... + * typeck2.c (cxx_incomplete_type_diagnostic): ... this. Print + warnings or errors depending on new warn_only argument. Renamed + from... + (cxx_incomplete_type_error): ... this. New implementation in + terms of cxx_incomplete_type_diagnostic. + + 2002-05-18 Jason Merrill + + PR c++/6611 + * decl2.c (import_export_decl): If we clear + DECL_NOT_REALLY_EXTERN, make sure DECL_EXTERNAL is set. + + 2002-05-15 Kriang Lerdsuwanakij + + PR c++/6620 + * pt.c (verify_class_unification): Don't check if PARM is template + parameter dependent. Simplify. + (unify) [TEMPLATE_PARM_INDEX]: Handle when ARG is a template + parameter dependent expression. + + 2002-05-14 Jason Merrill + + * rtti.c (get_tinfo_decl): Don't call comdat_linkage. + Do set DECL_COMDAT. + (synthesize_tinfo_var): Take the public decl. + (create_real_tinfo_var): Likewise. Check DECL_COMDAT. + (emit_tinfo_decl): Adjust. Call import_export_decl. + * decl2.c (import_export_decl): Simplify tinfo decl handling. + + 2002-05-14 Alexandre Oliva + + * cp-tree.h (struct lang_type): Added non_zero_init. + (CLASSTYPE_NON_ZERO_INIT_P): New macro. + (zero_init_p, force_store_init_value, build_forced_zero_init): Declare. + * class.c (check_field_decls): Test non_zero_init. + * cvt.c (convert_to_pointer_force): Use cp_convert_to_pointer for + zero-to-NULL conversions. + * decl.c (obscure_complex_init): Don't reset DECL_INITIAL of a + type that needs zero-initialization without zeros. + (check_initializer_decl): Compute zero-initializer for types + that require a non-trivial one. + * init.c (build_forced_zero_init): New function. + (build_default_init): Use it. + * tree.c (zero_init_p): New function. + * typeck2.c (force_store_init_value): New function. + (process_init_constructor): Create non-trivial zero-initializers + for array members and class fields. + + 2002-05-14 Neil Booth + + * lang-specs.h: Remove redundant -lang-c++. + + 2002-05-13 Jason Merrill + + * class.c (build_vtbl_ref_1): Use fixed_type_or_null. + (fixed_type_or_null): See through reference vars. + (build_base_path): Vtable contents are constant. + * typeck.c (get_member_function_from_ptrfunc): Likewise. + + 2002-05-12 Jason Merrill + + * cp-lang.c (ok_to_generate_alias_set_for_type): Backend-created + structs are safe. + + 2002-05-09 Neil Booth + + * cp-tree.h (flag_ansi): Remove. + * decl2.c (flag_ansi): Remove. + (cxx_decode_option): Set flag_iso and flag_undef. + + 2002-05-09 Jason Merrill + + * typeck.c (get_member_function_from_ptrfunc): Reorganize. + Use subtraction rather than a bitmask to get the index. + * cvt.c (cp_convert_to_pointer): Bail on an error_mark_node. + + * pt.c (tsubst_expr) [ASM_STMT]: Copy ASM_INPUT_P. + + 2002-05-07 Neil Booth + + * Make-lang.in (decl2.o): Update. + * cp-tree.h (warn_multichar): Remove. + * decl2.c: Include c-common.h. + (warn_multichar): Remove. + + 2002-05-03 Jason Merrill + + * tree.c (build_cplus_array_type): Only const and volatile get + special handling. + + * decl.c (BOOL_TYPE_SIZE): Move default to defaults.h. + + 2002-04-30 Mark Mitchell + + ABI change, returning simple classes from functions. + * class.c (finish_struct_bits): Only mark TREE_ADDRESSABLE if + TYPE_HAS_TRIVIAL_INIT_REF is false or + TYPE_HAS_NONTRIVIAL_DESTRUCTOR is true. + + 2002-04-30 Jason Merrill + + PR debug/6436 + * decl.c (grokdeclarator): Don't override TYPE_NAME of an + anonymous class with a typedef if there are attributes. + + 2002-04-29 Paul Eggert + + * parse.y (nomods_initdcl0): Replace $3 with $$. + + 2002-04-29 Jakub Jelinek + + PR c++/6477 + * decl.c (follow_tag_typedef): Check if TYPE_NAME (original) is + non-NULL first. + + 2002-04-29 Mark Mitchell + + PR c++/6492 + * pt.c (tsubst_friend_class): If the friend has an explicit scope, + enter that scope before name lookup. + + PR c++/6486 + * method.c (do_build_copy_constructor): Avoid building + cv-qualified reference types. + + 2002-04-29 Nathan Sidwell + + PR c++/5719 + * decl.c (grok_op_properties): Assignment ops don't have to return + by value. operator% should. + + 2002-04-28 Franz Sirl + + PR c/6343 + * decl.c (duplicate_decls): Call merge_weak. + + 2002-04-26 Richard Henderson + + * parse.y (malloced_yyss, malloced_yyvs): New. + (yyoverflow): Re-add. Set them. + (free_parser_stacks): New. + + 2002-04-26 Mark Mitchell + + PR c++/6497 + * method.c (do_build_assign_ref): Pass a derivation to + build_method_call when calling base class assignment operators. + + 2002-04-26 Richard Henderson + + * parse.y (yyoverflow): Revert. + + 2002-04-26 Richard Henderson + + PR c/3581 + * parse.y (string): Remove. Update all uses to use STRING + instead, and not call combine_strings. + * rtti.c (tinfo_name): Use fix_string_type. + * semantics.c (finish_asm_stmt): Don't call combine_strings. + * spew.c (yylexstring): New. + (read_token): Use it. + + 2002-04-25 Richard Henderson + + PR c/2161 + * parse.y (yyoverflow): New. + + 2002-04-25 Jason Merrill + + PR c++/5607 + * search.c (check_final_overrider): No longer static. + * class.c (update_vtable_entry_for_fn): Call it. + * cp-tree.h: Adjust. + + 2002-04-25 Neil Booth + + * cp-lang.c (LANG_HOOKS_SET_YYDEBUG): Remove. + * cp-tree.h (cxx_set_yydebug): Die. + * lex.c (YYDEBUG): Get from c-lex.h. + (cxx_set_yydebug): Remove. + * parse.y: Include c-lex.h. + (YYDEBUG): Get from c-lex.h. + + 2002-04-24 Mark Mitchell + + PR c++/6438. + * cvt.c (convert_to_void): Don't unconditionally make COND_EXPRs + void. + + 2002-04-24 Neil Booth + + * cp-lang.c (LANG_HOOKS_COMMON_ATTRIBUTE_TABLE, + LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE, LANG_HOOKS_ATTRIBUTE_TABLE): + Redefine. + * cp-tree.h (cp_attribute_table): Rename. + * decl.c (lang_attribute_table): Remove declaration. + (cxx_init_decl_processing): Don't set it. + * tree.c (cp_attribute_table): Rename. + + 2002-04-24 Jason Merrill + + PR c++/6331 + * method.c (do_build_copy_constructor): Use cp_build_qualified_type. + * typeck.c (build_modify_expr): Allow arrays to differ in cv-quals. + The pedwarn for array assignment is now unconditional. + * tree.c (build_cplus_array_type_1): Still process simple array types + normally in templates. + + PR c++/6395 + * decl.c (make_rtl_for_nonlocal_decl): Don't mess with #pragma i/i + stuff for comdats. + + 2002-04-23 Jakub Jelinek + + * parse.y (check_class_key): Allow KEY to be union/enum/struct/class + node with attributes. + + 2002-2-23 David O'Brien + + * g++spec.c (MATH_LIBRARY_PROFILE, LIBSTDCXX_PROFILE): Add. + Use MATH_LIBRARY_PROFILE and LIBSTDCXX_PROFILE if profile flag given. + + 2002-04-23 Mark Mitchell + + PR c++/6256: + * pt.c (tsubst_friend_class): Handle templates with explicit + nested names. + + PR c++/6331: + * typeck.c (merge_types): Remember the cv-qualification of pointer + types when merging them. + + 2002-04-20 Neil Booth + + * cp-lang.c (LANG_HOOKS_FUNCTION_INIT, + LANG_HOOKS_FUNCTION_FREE, LANG_HOOKS_FUNCTION_MARK): Redefine. + * cp-tree.h (cxx_push_function_context, cxx_pop_function_context, + cxx_mark_function_context): New. + * decl.c (push_cp_function_context, pop_cp_function_context, + mark_cp_function_context): Rename for consistency. + (cxx_init_decl_processing): Don't set old hooks. + + 2002-04-19 Neil Booth + + * call.c (convert_type_from_ellipsis): Rename, update. + * cp-lang.c (LANG_HOOKS_TYPE_PROMOTES_TO): Redefine. + * cp-tree.h (convert_type_from_ellipsis): Rename. + * decl.c (cxx_init_decl_processing): Don't set hook. + + 2002-04-18 Neil Booth + + * call.c (build_new_method_call): Update. + * cp-lang.c (LANG_HOOKS_INCOMPLETE_TYPE_ERROR): Redefine. + * cp-tree.h (cxx_incomplete_type_error): New. + * decl.c (grokdeclarator, grokparms): Update. + * decl2.c (check_classfn): Update. + * pt.c (tsubst): Update. + * typeck.c (complete_type_or_else, expr_sizeof, + decay_conversion): Update. + * typeck2.c (incomplete_type_error): Rename. + (add_exception_specifier): Update. + + 2002-04-18 Jason Merrill + + PR c++/5658 + * search.c (setup_class_bindings): A class template qualifies as a + type binding. + + 2002-04-17 Jakub Jelinek + + PR c++/6316 + * decl2.c (finish_file): Clear DECL_EXTERNAL in a separate loop + before expanding. + + 2002-04-16 Mark Mitchell + + * init.c (begin_init_stmts): Remove commented out code. + (finish_init_stmts): Set STMT_EXPR_NO_SCOPE. + * semantics.c (begin_gobal_stmt_expr): Adjust call to + expand_start_stmt_expr. + + 2002-04-15 Mark Mitchell + + * decl.c (register_dtor_fn): Pass the address of dso_handle, not + dso_handle itself, to __cxa_atexit. + + 2002-04-15 Gabriel Dos Reis + + * error.c (cxx_print_error_function): Adjust call to macros. + + 2002-04-14 Jakub Jelinek + + * class.c (layout_virtual_bases): Do all dsize computation on trees. + + 2002-04-14 Jason Merrill + + * typeck.c (get_member_function_from_ptrfunc): Don't do + gratuitious division and multiplication on + ptrmemfunc_vbit_in_delta targets. + + 2002-04-12 Mark Mitchell + + PR c++/5373. + * semantics.c (finish_expr_stmt): Remember the type of the + expression before any conversions are performed. + + 2002-04-12 Mark Mitchell + + PR c++/5189. + * call.c (add_template_candidate_real): Do not treat member + templates as copy constructors. + + 2002-04-12 Mark Mitchell + + * decl.c (duplicate_decls): Do not copy the RTL for a variable + declaration if the old variable had an incomplete type and the new + variable does not. + (complete_vars): Do not call layout_decl for completed variables. + + 2002-04-12 Richard Sandiford + + * decl.c (duplicate_decls): Don't try to unify an implicit typedef + with an explicit one. + (follow_tag_typedef): New. + (lookup_tag): Use it to extract the tag of an explicit typedef. + (xref_tag): Likewise. + + 2002-04-11 Andrew Haley + + * typeck.c (type_after_usual_arithmetic_conversions): + If two types have the same variant, return immediately. + When two floating-point operands are the same precision: + convert to float if one of the operands is float; + if neither operand is one of the standard types, return the type + of the first operand. + + 2002-04-10 Nathan Sidwell + + PR c++/5507 + * decl.c (make_typename_type): Remove implicit typenameness. + + 2002-04-09 Jason Merrill + + PR optimization/6189 + * semantics.c (genrtl_start_function): Don't free + DECL_SAVED_FUNCTION_DATA for inline functions. + + * init.c (build_member_call): For now, don't convert to + intermediate base if it would cause an error. + + 2002-04-08 Paolo Carlini + + * parse.y (namespace_qualifier, maybe_identifier, + begin_explicit_instantiation, end_explicit_instantiation, + apparent_template_type, .finish_template_type, + do_id, maybe_init, defarg_again, component_decl_1): + Add ending ';', in accordance with POSIX. + + 2002-04-06 Mark Mitchell + + PR c++/5571 + * class.c (layout_class_type): Remember incomplete static + variables. + (finish_struct_1): Call complete_vars, not + hack_incomplete_structures. + * cp-tree.h (hack_incomplete_structures): Rename to ... + (complete_vars): ... this. + (struct saved_scope): Remove incomplete. + (namespace_scope_incomplete): Remove. + * decl.c (struct binding_level): Remove incomplete. + (incomplete_vars): New variable. + (mark_binding_level): Don't mark incomplete. + (print_binding_level): Don't print it. + (mark_saved_scope): Don't mark incomplete. + (pushdecl): Use maybe_register_incopmlete_var. + (cxx_init_decl_processing): Register incomplete_vars for GC. + (start_decl_1): Clarify error message. + (hack_incomplete_vars): Remove. + (maybe_register_incomplete_var): New function. + (complete_vars): Likewise. + + 2002-04-06 Jason Merrill + + PR c++/4934 + * error.c (dump_expr) [CONVERT_EXPR]: Make sure TREE_TYPE (t) is + set before checking it. + + PR c++/525 + * init.c (build_member_call): Use build_scoped_ref. + (resolve_offset_ref): Likewise. + * call.c (build_scoped_method_call): Likewise. + * tree.c (maybe_dummy_object): Kludge around current_class_type being + wrong. + * typeck2.c (build_scoped_ref): Return the binfo via binfo_p parm. + * cp-tree.h: Adjust. + + * init.c (push_base_cleanups): Just use build_scoped_method_call. + + PR c++/6179 + * method.c (implicitly_declare_fn): Pass unqualified type to + synthesize_exception_spec. + + 2002-04-04 Neil Booth + + * cp-lang.c (LANG_HOOKS_TRUTHVALUE_CONVERSION): Redefine. + * cvt.c: Update comment. + * init.c (expand_cleanup_for_base): Update. + * semantics.c (finish_parenthesized_expr): Update. + * typeck.c (cp_truthvalue_conversion): Update. + + 2002-04-04 Jason Merrill + + * semantics.c (finish_eh_cleanup): New fn. + * cp-tree.h: Add prototype. + * init.c (perform_member_init, expand_cleanup_for_base): Use + finish_eh_cleanup. + * cp-tree.def (SUBOBJECT, CTOR_STMT): Remove. + * cp-tree.h: Remove references. + * decl.c (begin_constructor_body, end_constructor_body): Likewise. + * dump.c (cp_dump_tree): Likewise. + * pt.c (tsubst_expr): Likewise. + * semantics.c (genrtl_ctor_stmt, genrtl_subobject): Remove. + (cp_expand_stmt): Remove handling of CTOR_STMT and SUBOBJECT. + * tree.c (cp_statement_code_p): Likewise. + + * init.c (build_new_1): Set CLEANUP_EH_ONLY on deleting cleanup. + + PR c++/5636 + * semantics.c (nullify_returns_r): Just set CLEANUP_EH_ONLY on + cleanup for nrv. + + PR c++/5104 + * typeck.c (comptypes) [FUNCTION_TYPE]: Don't compare exception + specifiers. + [METHOD_TYPE]: Use same code as FUNCTION_TYPE. + + 2002-04-03 Richard Henderson + + * cp-lang.c (cxx_warn_unused_global_decl): New. + (LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL): New. + + 2002-04-03 Neil Booth + + * cp-lang.c (LANG_HOOKS_SET_DECL_ASSEMBLER_NAME): Redefine. + * tree.c (init_tree): Don't set hook. + + 2002-04-03 Roger Sayle + + PR c++/5998: + * decl.c (duplicate_decls): Don't mess with assembler names when + redeclaring builtin functions as static. + + 2002-04-01 Neil Booth + + * call.c (build_addr_func): Update. + * class.c (resolve_address_of_overloaded_function): Update. + * cp-lang.c (LANG_HOOKS_MARK_ADDRESSABLE): Redefine. + * cp-tree.h (cxx_mark_addressable): New. + * decl.c (register_dtor_fn, cxx_maybe_build_cleanup): Update. + * decl2.c (build_cleanup): Update. + * except.c (build_throw): Update. + * init.c (resolve_offset_ref): Update. + * pt.c (convert_nontype_argument): Update. + * semantics.c (finish_asm_stmt, simplify_affr_init_exprs_r): Update. + * typeck.c (decay_conversion, build_array_ref, build_unary_op, + unary_complex_lvalue): Update. + (mark_addressable): Rename. + + 2002-04-01 Roger Sayle + + PR c++/5998: + * decl.c (duplicate_decls): Overwrite the RTL when (and only + when) overwriting a built-in function. Don't use COPY_DECL_RTL, + but follow the SET_DECL_RTL idiom used elsewhere in the function. + + 2002-04-01 Neil Booth + + * cp-lang.c (LANG_HOOKS_SIGNED_TYPE, LANG_HOOKS_UNSIGNED_TYPE, + LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE): New. + * decl.c (grokdeclarator): Update. + * mangle.c (write_integer_cst): Update. + * typeck.c (build_binary_op): Update. + + 2002-03-31 Neil Booth + + * cp-lang.c (LANG_HOOKS_UNSAFE_FOR_REEVAL): Redefine. + * lex.c (cxx_init): Don't set hook. + + 2002-03-31 Neil Booth + + * Make-lang.in (error.o): Update. + * cp-lang.c (LANG_HOOKS_PRINT_ERROR_FUNCTION): Redefine. + * cp-tree.h (struct diagnostic_context): Predeclare. + (cxx_print_error_function): New. + * error.c: Include langhooks-def.h. + (lang_print_error_function): Rename. Update. + (init_error): Don't set hook. + + 2002-03-29 Neil Booth + + * cp-lang.c (LANG_HOOKS_TYPE_FOR_MODE, LANG_HOOKS_TYPE_FOR_SIZE): + Redefine. + * cvt.c (cp_convert_to_pointer, type_promotes_to): Use new hooks. + * decl.c (finish_enum): Similarly. + * error.c (dump_type): Similarly. + * lex.c (cxx_init): Similarly. + * mangle.c (write_builtin_type): Similarly. + * typeck.c (comptypes): Similarly. + + 2002-03-28 Roger Sayle + + PR c++/5998: + * decl.c (cxx_init_decl_processing): Re-enable built-in functions + in the g++ front-end. + (duplicate_decl): Allow redefinition of anticipated built-ins. + Fix inlining problem by over-writing the old DECL_RTL. + (lookup_namespace_name): Fail to find an identifier in the + specified namespace if its still anticipated. + (builtin_function_1): New function split out from builtin_function + to create a builtin in the current namespace with given context. + (builtin_function): Call builtin_function_1 to define the + appropriate builtins in both the std and global namespaces. + (select_decl): Don't test for anticipated decls here. + (unqualified_namespace_lookup): Instead ignore them whilst + searching through scopes and namespaces. + * decl2.c (do_nonmember_using_decl): If a using declaration + specifies an anticipated built-in function, mark it as no longer + anticipated in that scope. + (ambiguous_decl): Avoid resolving to an anticipated decl. + * lex.c (do_scoped_id): Fail to find an identifier in the global + namespace if its still anticipated. + + 2002-03-29 Neil Booth + + * cp-lang.c (LANG_HOOKS_MAKE_TYPE): Redefine. + * cp-tree.h (cp_make_lang_type): Rename. + * lex.c (cp_make_lang_type): Rename. + (make_aggr_type): Update. + * tree.c (init_tree): Don't set make_lang_type_fn. + + 2002-03-29 Jakub Jelinek + + PR c++/6073 + * class.c (finish_struct_1): Update static field's DECL_MODE even + if its type is a variant of t. + + 2002-03-27 Neil Booth + + * cp-lang.c (LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES): Redefine. + * cp-tree.h (cxx_insert_default_attributes): New. + * decl.c (insert_default_attributes): Rename. + + 2002-03-27 Mark Mitchell + + PR c++/4884 + * call.c (build_op_delete_call): Allow for the fact the placement + may be a COMPOUND_EXPR. + + 2002-03-27 Neil Booth + + * cp-lang.c (LANG_HOOKS_EXPAND_EXPR): Redefine. + * cp-tree.h (init_cplus_expand): Remove. + (cxx_expand_expr): New. + * expr.c (cplus_expand_expr): Rename cxx_expand_expr, + fix prototype. + (init_cplus_expand): Remove. + * lex.c (cxx_init): Don't call init_cplus_expand. + + 2002-03-26 Mark Mitchell + + PR c++/4884. + * init.c (build_new_1): Allow for the fact the result of + build_function_call may be a COMPOUND_EXPR. + + 2002-03-26 Nathan Sidwell + + PR c++/5682 + * cp-tree.h (BINFO_PRIMARY_P): Explain meaning better. + (dfs_skip_nonprimary_vbases_unmarkedp): Remove. + (dfs_skip_nonprimary_vbases_markedp): Remove. + * search.c (get_shared_vbase_if_not_primary): Remove. + (dfs_skip_nonprimary_vbases_unmarkedp): Remove. + (dfs_skip_nonprimary_vbases_markedp): Remove. + (dfs_unmarked_real_bases_queue_p): Just get the canonical binfo. + (dfs_marked_real_bases_queue_p): Likewise. + + 2002-03-26 Neil Booth + + * cp-lang.c (LANG_HOOKS_MARK_TREE): Redefine. + * cp-tree.h (cxx_mark_tree): New. + * decl.c (lang_mark_tree): Rename cxx_mark_tree. + + 2002-03-25 Neil Booth + + * cp-tree.h (cxx_maybe_build_cleanup): New. + * decl.c (destroy_local_var, hack_incomplete_structures): Update. + (maybe_build_cleanup): Rename cxx_maybe_build_cleanup. + * tree.c (build_target_expr): Update. + * cp-lang.c (LANG_HOOKS_MAYBE_BUILD_CLEANUP): Redefine. + + 2002-03-24 Neil Booth + + * decl2.c (cxx_decode_option): Handle -E. + * lang-specs.h (default_compilers): Preprocess with cc1plus. + * lex.c (cxx_init): Exit quickly if c_common_init returns NULL. + + 2002-03-23 Jakub Jelinek + + PR c++/6037 + * decl.c (start_enum): Don't set TREE_ADDRESSABLE on TREE_LIST node. + + 2002-03-23 Gabriel Dos Reis + + * error.c (dump_type): Be careful about implicit typenames. + + 2002-03-21 Gabriel Dos Reis + + PR C++/3656 + * semantics.c (finish_base_specifier): Handle erronous base + classes. + + 2002-03-22 Zack Weinberg + + * error.c: Always use REAL_VALUE_TO_DECIMAL; don't test + REAL_IS_NOT_DOUBLE. + + 2002-03-22 Jeff Knaggs + + * typeck.c (get_member_function_from_ptrfunc): Scale idx down to + an index into the vtable_entry array regardless of + TARGET_PTRMEMFUNC_VBIT_LOCATION. + + 2002-03-21 Aldy Hernandez + + * tree.c (cp_cannot_inline_tree_fn): Same. + + 2002-03-21 Neil Booth + + * cp-tree.h (pushdecl, pushlevel, poplevel, set_block, + insert_block, getdecls, global_bindings_p): New. + + 2002-03-20 Nathan Sidwell + + PR c++/4361 + * mangle.c (struct globals) Add internal_mangling_p member. + (write_template_param): Do internal mangling, if needed. + (mangle_conv_op_name_for_type): Request internal mangling. + + 2002-03-20 Jason Merrill + + PR c++/2136 + * init.c (build_delete): Check access for a member op delete here. + * decl2.c (delete_sanity): Not here. + + 2002-03-19 Jason Merrill + + PR c++/5118 + * class.c (get_vfield_name): Use the constructor_name. + + 2002-03-20 Neil Booth + + * cp-lang.c (LANG_HOOKS_DECL_PRINTABLE_NAME): Redefine. + * cp-tree.h (lang_printable_name): Rename. + * error.c (lang_decl_name): Use new hook. + * lex.c (cxx_init): Remove old hook. + * pt.c (tsubst_decl): Use new hook. + * tree.c (lang_printable_name): Rename. + + 2002-03-18 Eric Botcazou + + PR c++/3882 + * pt.c (tsubst_decl): Move __PRETTY_FUNCTION__ handling... + (tsubst_expr) [DECL_STMT]: ...here. And substitute the initializer + only after recording the declaration. + + 2002-03-18 Jason Merrill + + PR c++/2039 + * init.c (resolve_offset_ref): Hand off to build_component_ref. + + PR c++/4222, c++/5995 + * call.c (build_over_call): Fix empty class logic. + + PR c++/3870 + * cp-tree.h (struct saved_scope): Add last_parms field. + * decl.c (maybe_push_to_top_level): Save last_function_parms. + (pop_from_top_level): Restore it. + + PR c++/4377 + * mangle.c (write_expression): Strip NOP_EXPRs sooner. Also strip + NON_LVALUE_EXPRs. + + PR c++/4003 + * pt.c (tsubst_friend_function): Use decl_namespace_context. + + PR c++/3948 -- C++ ABI change, followup to 2001-12-18 patch. + * class.c (finish_struct_bits): Also set TREE_ADDRESSABLE for a + type with a nontrivial destructor. + + 2002-03-17 Jason Merrill + + PR c++/4460 + * class.c (build_base_path): Virtual base layout is fixed in + in-charge [cd]tors. + + 2002-03-17 Neil Booth + + * cp-lang.c (LANG_HOOKS_PARSE_FILE): Redefine. + * parse.y (yyparse): Remove macro. + + 2002-03-17 Jason Merrill + + PR c++/5757 + * init.c (build_new_1): Pass the right pointer to op delete. + + 2002-03-16 Nathan Sidwell + + PR c++/4361 + * cp-tree.h (CLASSTYPE_METHOD_VEC): Document where templated + conversion operators go. + (struct lang_decl_flags): Add template_conv_p and unused + bitfields. + (DECL_TEMPLATE_CONV_FN_P): New macro. + * call.c (build_user_type_conversion_1): Don't check second type + conversion of overload set first. + * class.c (add_method): Make sure templated conversion operators + all end up on slot 2. + * lex.c (do_identifier): A conversion operator token might be + satisfied by a templated conversion operator. + * pt.c (check_explicit_specialization): Use + CLASSTYPE_FIRST_CONVERSION_SLOT. + (template_parm_this_level_p): New function. + (push_template_decl_real): Determine DECL_TEMPLATE_CONV_FN_P. + * search.c (lookup_fnfields_1): Template conversions will be on + the first slot. + * typeck.c (build_component_ref): Preserve the type of an + conversion operator name on the overload type. + (build_x_function_call): Retrieve the conversion operator name. + + 2002-03-15 Richard Henderson + + * init.c (build_new_1): Use size_binop instead of cp_build_binary_op. + + 2002-03-15 Mark Mitchell + + * cp-tree.h (CLEANUP_DECL): Remove. + (CLEANUP_EXPR): Likewise. + * decl.c (destroy_local_var): Simplify. + (maybe_build_cleanup): Tidy. + * dump.c (cp_dump_tree): Remove handling of CLEANUP_STMT. + * semantics.c (cp_expand_stmt): Likewise. + * cp/tree.c (cp_statement_code_p): Likewise. + + 2002-03-15 Jason Merrill + + PR c++/5857 + * decl.c (duplicate_decls): Use merge_types instead of common_type. + * typeck.c (common_type): Just hand off to + type_after_usual_arithmetic_conversions and + composite_pointer_type. + (merge_types): New fn. + (commonparms): Use it instead of common_type. + (type_after_usual_arithmetic_conversions): Also handle COMPLEX_TYPE. + (composite_pointer_type): Also handle attributes. + * cp-tree.h: Declare merge_types. + + * decl.c (make_rtl_for_nonlocal_decl): Also defer COMDAT + variables. + * decl2.c (maybe_make_one_only): Also mark the decl as needed. + + 2002-03-14 Richard Henderson + + * decl.c: Include c-pragma.h. + (start_decl, start_function): Invoke maybe_apply_pragma_weak. + * Make-lang.in: Update dependencies. + + 2002-03-14 Jakub Jelinek + + PR c++/5908 + * call.c (build_over_call): Set TREE_NO_UNUSED_WARNING too. + * cvt.c (convert_to_void): Preserve TREE_NO_UNUSED_WARNING. + + 2002-03-12 Richard Sandiford + + * mangle.c (write_builtin_type): Handle 128-bit integers even if + they are not a standard integer type. + + 2002-03-12 Richard Sandiford + + * cp-tree.h (init_init_processing): Remove declaration. + * init.c (BI_header_type, init_init_processing): Remove old ABI stuff. + * decl.c (cxx_init_decl_processing): Don't call init_init_processing. + + 2002-03-12 Kaveh R. Ghazi + + * cp-lang.c (tree_code_type, tree_code_length, tree_code_name): + Define. + * decl.c (duplicate_decls): Use TREE_CODE_LENGTH, not + tree_code_length. + * lex.c (cplus_tree_code_type, cplus_tree_code_length, + cplus_tree_code_name): Delete. + (cxx_init): Don't call add_c_tree_codes, instead set + lang_unsafe_for_reeval. Don't try to copy into the various + tree_code arrays. + + 2002-03-12 Nathan Sidwell + + PR c++/5659 + * decl.c (xref_tag): Don't set CLASSTYPE_DECLARED_CLASS here. + * decl2.c (handle_class_head): Set CLASSTYPE_DECLARED_CLASS for + definitions. + + 2002-03-11 Nathan Sidwell + + Revert 2001-03-26 Nathan Sidwell , + DR209 is now not a defect. + * cp-tree.h (skip_type_access_control): Remove. + * decl.c (grokdeclarator): Do type access control for friend + declarations. + * semantics.c (decl_type_access_control): Don't reset + current_type_lookups. + (save_type_access_control): Always save the lookups. + (skip_type_access_control): Remove. + (finish_class_definition): Don't change type_lookups. + + 2002-03-11 Nathan Sidwell + + Revert 2000-12-01 Nathan Sidwell , + It is incorrect. + * typeck.c (build_static_cast): Compare non-qualified types + with pointer to member conversions. + + 2002-03-11 Dan Nicolaescu + Daniel Berlin + + * cp-lang.c (ok_to_generate_alias_set_for_type): New function. + (cxx_get_alias_set): Use it. + + 2002-03-10 Kaveh R. Ghazi + + * cp-tree.h (stabilize_expr): Prototype. + + 2002-03-08 Craig Rodrigues + + * cp-tree.h (CLEAR_BINFO_MARKED): Make both parts of + conditional return void. + + 2002-03-08 Neil Booth + + * cp-lang.c (LANG_HOOKS_UNSAVE): Redefine. + * cp-tree.h (cxx_unsave): New. + * tree.c (cp_unsave): Rename cxx_unsave, update prototype. + (init_tree): Update. + + 2002-03-03 Kaveh R. Ghazi + + * decl.c (cxx_init_decl_processing): Use ARRAY_SIZE in lieu of + explicit sizeof/sizeof. + * decl2.c (cxx_decode_option): Likewise. + * lex.c (init_reswords, REDUCE_LENGTH, TOKEN_LENGTH): Likewise. + + 2002-03-02 Nathan Sidwell + + PR c++/775 + * decl.c (lookup_tag): Only reject enum/class mismatch, not + class/union mismatch. + * parse.y (check_class_key): New function. + (structsp): Call it. + + 2002-03-01 Michael Matz + + * typeck.c (cp_pointer_int_sum): Complete inner type which is + used later by size_in_bytes(). + + 2002-03-01 Phil Edwards + + * cp-tree.h: Require __GNUC__ to be #defined. + (build_init): Add missing prototype. + + 2002-03-01 Jason Merrill + + * except.c: Don't include decl.h or obstack.h. Do include + tree-inline.h. + (build_throw): Destroy temporaries from the thrown + expression before calling __cxa_throw. Construct a thrown + temporary directly into the exception object. + (stabilize_throw_expr): New function. + (wrap_cleanups_r): New function. + * tree.c (stabilize_expr): New function. + * init.c (build_init): New function. + * Make-lang.in (cp/except.o): Adjust .h deps. + + 2002-02-28 Jason Merrill + + * search.c (lookup_base_r): Don't clear is_non_public just because + we found a friendly scope. + + * decl.c (finish_function): Only warn about missing return + statement with -Wreturn-type. + + 2002-02-28 Neil Booth + + * class.c (build_clone): Update. + * cp-lang.c (LANG_HOOKS_DUP_LANG_SPECIFIC_DECL): Redefine. + * cp-tree.h (cxx_dup_lang_specific_decl): New. + * lex.c (copy_lang_decl): Rename cxx_dup_lang_specific_decl. + (copy_decl): Update. + * method.c (make_thunk): Update. + + 2002-02-27 Zack Weinberg + + * decl2.c: Delete traditional-mode-related code copied from + the C front end but not used, or used only to permit the + compiler to link. + + 2002-02-24 Craig Rodrigues + + PR c++/4093 + * cp-tree.h (SET_BINFO_MARKED): Cast false part of condition + to void. + + 2002-02-22 Jakub Jelinek + + PR other/5746 + * semantics.c (finish_switch_cond): Don't call get_unwidened + if error_mark_node. + + 2002-02-22 Nathan Sidwell + + PR c++/2645, DR 295 + * cp-tree.h (tsubst_flags_t): Add tf_ignore_bad_quals, + tf_keep_type_decl. + (make_typename_type): Use tsubst_flags_t. + * decl.c (make_typename_type): Adjust. Return non-artificial + TYPE_DECLs, if required. + (grokdeclarator): Simplify CVR qualification handling. Allow bad + qualifiers on typedef types. + * decl2.c (handle_class_head): Adjust make_typename_type call. + * parse.y (nested_name_specifier): Likewise. + (typename_sub0): Likewise. + (typename_sub1): Likewise. + * pt.c (convert_template_argument): Adjust make_typename_type + return value. + (tsubst): Adjust cp_build_qualified_type_real calls. + (check_cv_quals_for_unify): Cope with allowing bad qualifications + on template type parms. + (instantiate_decl): Recheck substitutions to give warnings on bad + qualifications. + * tree.c (cp_build_qualified_type_real): Use tf_allow_bad_quals. + + 2002-02-21 Aldy Hernandez + + * cp/decl.c (duplicate_decls): Merge always_inline attribute. + + * cp/tree.c (cp_cannot_inline_tree_fn): Do not inline at -O0 + unless DECL_ALWAYS_INLINE. + + 2002-02-20 Jakub Jelinek + + * typeck.c (cp_pointer_int_sum): Renamed from + pointer_int_sum, call pointer_int_sum. + + 2002-02-20 Jakub Jelinek + + * decl.c (duplicate_decls): Return 0 if issued error about + redeclaration. + + 2002-02-19 Jason Merrill + + ABI change: Mangle `void (A::*)() const' as + M1AKFvvE, not MK1AFvvE. + * mangle.c (write_function_type): Write cv-quals for member + function type here. + (write_pointer_to_member_type): Not here. + + 2002-02-18 Jason Merrill + + * pt.c (do_type_instantiation): Don't pedwarn if in_system_header. + (do_decl_instantiation): Likewise. + + 2002-02-17 Craig Rodrigues + + PR c++/5685 + * decl.c (duplicate_decls): Make warning unconditional + if duplicate default argument declarations are present. + + 2002-02-17 Jakub Jelinek + + * typeck.c (build_binary_op) [BIT_XOR_EXPR]: Remove explicit + shortening. + + 2002-02-15 Nathan Sidwell + + * decl.c (grokdeclarator): Set typedef_decl for all TYPE_DECLs, + remove incorrect comment. Move #if 0'd code to common path. Use + IMPLICIT_TYPENAME_P. Simplify & reformat ARRAY_TYPE duplication. + + 2002-02-13 Jason Merrill + + * decl.c (builtin_function): Set TREE_THIS_VOLATILE on return fns. + (finish_function): Don't warn if current_function_returns_null. + + * typeck2.c (digest_init): Do handle values of vector type. + + * typeck2.c (digest_init, process_init_constructor): Treat vectors + like arrays. + + 2002-02-11 Jason Merrill + + * parse.y (reserved_declspecs): Don't handle attributes. + (reserved_typespecquals): Handle them here. + * Make-lang.in (parse.c): Adjust expected conflicts. + + 2002-02-08 Jakub Jelinek + + * parse.y (primary, primary_no_id): Use compstmt_or_stmtexpr + instead of compstmt. + (compstmt_or_stmtexpr): Renamed from compstmt. + (compstmt): In addition to compstmt_or_stmtexpr clear last_expr_type. + + 2002-02-07 Nathan Sidwell + + Rename instantiate_type_flags to tsubst_flags_t & expand use. + * cp-tree.h (instantiate_type_flags): Rename to ... + (tsubst_flags_t): ... here. Rename itf_complain to tf_error, + add tf_warning flag. + (instantiate_type): Adjust prototype. + (tsubst, tsubst_expr, tsubst_copy, lookup_template_class, + do_type_instantiation, cp_build_qualified_type_real): Likewise. + cp_build_qualified_type: Adjust. + * class.c (instantiate_type): Adjust parameter. Rename itf_* to + tf_*. + * call.c (standard_conversion): Rename itf_* to tf_*. + (reference_binding): Likewise. + (convert_like_real): Likewise. + * cvt.c (cp_convert_to_pointer): Likewise. + (convert_to_reference): Likewise. + * decl.c (lookup_namespace_name): Use tf_* flags. + (make_typename_type): Likewise. + (grokdeclarator): Likewise. + * pt.c (convert_nontype_argument): Adjust COMPLAIN usage. + (coerce_template_template_parms, convert_template_argument, + coerce_template_parms, maybe_get_template_decl_from_type_decl, + lookup_template_class, tsubst_friend_function, tsubst_friend_class, + instantiate_class_template, tsubst_template_arg_vector, + tsubst_template_parms, tsubst_aggr_type, tsubst_default_argument, + tsubst_decl, tsubst_arg_types, tsubst_function_type, + tsubst_call_declarator_parms, tsubst, tsubst_copy, tsubst_expr, + instantiate_template, fn_type_unification, + resolve_overloaded_unification, verify_class_unification, + unify, get_bindings_real, do_type_instantiation, + regenerate_decl_from_template, instantiate_decl, + tsubst_initializer_list, tsubst_enum, + get_mostly_instantiated_function_type, + invalid_nontype_parm_type_p): Likewise. + * tree.c (cp_build_qualified_type_real): Likewise. + * typeck.c (build_binary_op): Rename itf_* to tf_*. + (build_ptrmemfunc): Likewise. + (convert_for_assignment): Likewise. + + 2002-02-07 Nathan Sidwell + + PR c++/109 + * decl.c (grokdeclarator): Allow friend declarations from + dependent types. + * decl2.c (handle_class_head): Don't push into template parm contexts. + * pt.c (push_template_decl_real): Template parm contexts are never + being defined. + + 2002-02-05 Alexandre Oliva + + * class.c: Include target.h. + (check_bitfield_decl): Disregard EMPTY_FIELD_BOUNDARY, + BITFIELDS_NBYTES_LIMITED and PCC_BITFIELD_TYPE_MATTERS for MS + bit-field layout. + * Make-lang.in: Adjust deps. + + 2002-02-05 Jason Merrill + + * error.c (dump_type): Be more helpful about VECTOR_TYPE. + + 2002-02-04 Jakub Jelinek + + * semantics.c (begin_switch_stmt): Clear SWITCH_TYPE. + (finish_switch_cond): Set SWITCH_TYPE. + + 2002-02-04 Richard Henderson + + * method.c (use_thunk): Always initialize the block tree. Reindent. + * semantics.c (expand_body): Emit thunks after function, not before. + + 2002-02-04 Jason Merrill + + * decl.c (start_function): Call cplus_decl_attributes immediately + after grokdeclarator. + + * decl.c (start_function): Combine DECL_RESULT handling code. + + 2002-02-03 Jason Merrill + + * xref.c: Remove. + * Make-lang.in (CXX_OBJS): Remove cp/xref.o + (cp/xref.o): Remove dependencies. + * class.c (finish_struct_1, check_methods): Don't call xref fns. + (finish_struct_1): Likewise. + * friend.c (make_friend_class): Likewise. + * lex.c (cxx_init, cxx_finish, extract_interface_info): Likewise. + * spew.c (read_process_identifier): Likewise. + + 2002-02-01 Jason Merrill + + PR c++/4872 + * decl.c (finish_function): Warn about a non-void function with + no return statement and no abnormal exit. + * cp-tree.h (struct cp_language_function): Add returns_abnormally. + (current_function_returns_abnormally): New macro. + * call.c (build_call): Set it. + + * typeck.c (build_component_ref): Always complain about offsetof + constructs on non-PODs. Only make it an error for members of + virtual bases. + + * error.c (dump_scope): Don't add TFF_DECL_SPECIFIERS. + (dump_function_decl): Always dump parms. + + * decl2.c (finish_static_data_member_decl): Complain about a local + class with a static data member. + + PR c++/4286 + * search.c (lookup_field_1): Don't xref a static data member + just because we looked it up. + + 2002-01-31 Jason Merrill + + * Make-lang.in (parse.c): Handle .output file. + + PR c++/3395 + * decl.c (xref_tag): Remember early attributes in TYPE_ATTRIBUTES, + not TREE_TYPE. + * semantics.c (finish_class_definition): Adjust. + + Allow attributes in parms and casts. + * parse.y (named_parm): Don't strip attrs. + (declmods): Remove 'attributes' production. + (nonempty_cv_qualifiers): Accept attributes. + (ATTRIBUTE): Give precedence. + * decl.c (groktypename): Handle attributes. + (grokparms): Likewise. + + 2002-01-29 Jakub Jelinek + + * decl2.c (cxx_decode_option): Pass 0 as last argument to + cpp_handle_option. + * lang-specs.h: Use cpp_unique_options instead of cpp_options + when used together with cc1_options. + + 2002-01-29 Nathan Sidwell + + PR c++/5132 + * typeck2.c (digest_init): Make sure non-array core type is + instantiated. + * decl2.c (reparse_absdcl_as_casts): Just store the type in the + constructor, rather than build a new one. + (build_expr_from_tree, CONSTRUCTOR case): Be careful with the + PURPOSE of constructor elts. + + 2002-01-23 Zack Weinberg + + * Make-lang.in (parse.c): Adjust expected number of + shift-reduce conflicts. + (decl.o): Depend on diagnostic.h. + * decl.c: Include diagnostic.h. + (grokdeclarator): Check for null pointer. + (finish_function): Don't abort when + current_binding_level->parm_flag != 1, if errors have + occurred; throw away the statement tree and extra binding + levels, and continue. + * lex.c (note_list_got_semicolon): Check for null pointer. + * method.c (hack_identifier): Just return error_mark_node if + value is error_mark_node. + * parse.y (primary: TYPEID(type_id)): No need to use + TYPE_MAIN_VARIANT here. + (handler_seq): Accept an empty list of catch clauses and + generate a fake handler block to avoid later crashes. + (ansi_raise_identifier): Accept the error token too. + * semantics.c (begin_class_definition, + finish_class_definition): Check for error_mark_node. + + 2002-01-23 Zack Weinberg + + * typeck2.c (friendly_abort): Delete definition. + * cp-tree.h (friendly_abort): Don't prototype. + (my_friendly_assert): Use fancy_abort. + + 2002-01-23 Craig Rodrigues + + * cp-tree.h (my_friendly_abort): Remove. + + 2002-01-23 Jakub Jelinek + + * spew.c (pending_inlines, pending_inlines_tail, + processing_these_inlines): Make static. + (mark_pending_inlines): Remove static. + (begin_parsing_inclass_inline): If in function, save pi + for GC to cp_function_chain->unparsed_inlines instead. + (process_next_inline): Likewise. + * cp-tree.h (struct cp_language_function): Add unparsed_inlines. + (mark_pending_inlines): Add prototype. + * decl.c (spew_debug): Remove unused extern. + (mark_lang_function): Call mark_pending_inlines. + + 2002-01-23 Craig Rodrigues + + * call.c, class.c, decl.c, decl2.c, error.c, expr.c, friend.c, + init.c, lex.c, mangle.c, method.c, pt.c, repo.c, rtti.c, search.c, + semantics.c, spew.c, tree.c, typeck.c, typeck2.c, xref.c: + Change my_fancy_abort() to abort(). + + 2002-01-23 Jason Merrill + + PR c++/5453 + * class.c (fixed_type_or_null): Fix thinko. + + PR c++/3331 + * init.c (resolve_offset_ref): Use build_indirect_ref. + + * decl2.c (grokclassfn): Don't set DECL_REGISTER on 'this'. + + 2002-01-22 Jason Merrill + + * parse.y (function_body): Suppress the block for the outermost + curly braces. + * decl.c (pushdecl): Don't try to skip it. + (begin_function_body): Keep the block we create, not the next one. + * init.c (emit_base_init): Don't mess with keep_next_level. + + * class.c (build_base_path): Tweak formatting. + + 2002-01-19 Nathan Sidwell + + Fix regression introduced with patch for c++/775 + * parse.y (class_head_defn): Check for template specializations + with a different class-key. + + 2002-01-17 Jason Merrill + + * decl.c (begin_constructor_body, begin_destructor_body): New fns. + (begin_function_body): Call them and keep_next_level. + * init.c (emit_base_init): Call keep_next_level. + * semantics.c (setup_vtbl_ptr): Lose. + * cp-tree.h (struct cp_language_function): Remove vtbls_set_up_p. + (vtbls_set_up_p): Lose. + * pt.c (tsubst_expr, CTOR_INITIALIZER): Call emit_base_init. + * method.c (do_build_copy_constructor): Likewise. + (synthesize_method): Call finish_mem_initializers. + * parse.y (nodecls): Likewise. + + * error.c (dump_type_suffix): Print the exception specs before + recursing. + (dump_function_decl): Here, too. + + * cp-tree.h (TMPL_PARMS_DEPTH): Cast to signed HOST_WIDE_INT. + + 2002-01-10 Ira Ruben + + PR c++/907 + * decl.c (start_method): Handle attrlist. + + 2002-01-10 Jakub Jelinek + + * decl2.c (max_tinst_depth): Increase default limit to 500. + + 2002-01-10 Graham Stott + + * spew.c (YYCHAR): Uppercase macro parameter and add + parenthesis. + (YYCODE): Likewise. + (NAME): Uppercase macro parameter. + + 2002-01-09 Graham Stott + + * decl.h (grokdeclarator): Wrap long line. + + * semantics.c (FINISH_COND): Uppercase macro paramaters and + add parenthesis. + + 2002-01-08 Graham Stott + + * xref.c (FILE_NAME_ABSOLUTE_P): Add parenthesis. + (PALLOC): Uppercase macro parameter and whitespace. + (SALLOC): Uppercase macro parameter. + (SFREE): Uppercase macros parameter, add parenthese and + whitespace. + (STREQL): Uppercase macro parameter and whitespace. + (STRNEQ): Likewise. + (STRLSS): Likewise. + (STRLEQ): Likewise. + (STRGTR): Likewise. + (STRGEQ): Likewise. + + * call.c (convert_like): Add parenthesis and wrap. + (convert_like_with_context): Likewise. + (ICS_RANK): Whitespace. + (NEED_TEMPORARY_P): Remove parenthesis. + + * class.c (VTT_TOP_LEVEL_P): Uppercase macro parameter and + whitespace. + (VTT_MARKED_BINFO_P): Likewise. + + * decl.c (BINDING_LEVEL): Add parenthesis. + (DEF_OPERATOR): Likewise. + + * mangle.c (MANGLE_TRACE): Add parenthesis. + (MANGLE_TRACE_TREE): Likewise. + (write_signed_number): Likewise. + (write_unsigned_number): Likewise. + + * pt.c (ccat): Uppercase macro parameter. + (cat): Likewise + + * search.c (SET_BINFO_ACCESS): Add parenthesis. + + 2002-01-07 Jason Merrill + + * decl2.c (coerce_new_type): Downgrade error for size_t mismatch + to pedwarn. + + PR c++/3536 + * method.c (make_thunk): If !flag_weak, give the thunk the + function's linkage. + (use_thunk): Here, too. + + 2002-01-07 Graham Stott + + * error.c: Update copyright date. + (print_scope_operator): Add parenthesis. + (print_left_paren): Likewise. + (print_right_paren): Likewise. + (print_left_bracket): Likewise. + (print_right_bracket): Likewise. + (print_template_argument_list_start): Likewise. + (print_template_argument_list_end): Likewise. + (print_non_consecutive_character): Likewise. + (print_tree_identifier): Likewise. + (print_identifier): Likewise. + (NEXT_CODE): Uppercase macro parameter. + (ident_fndecl): Delete unused. + (GLOBAL_THING): Likewise. + + 2002-01-06 Graham Stott + + * cp-tree.h (VAR_OR_FUNCTION_DECL_CHECK): Add parenthesis. + (VAR_FUNCTION_OR_PARM_DECL_CHECK): Likewise. + (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK) Likewise. + (RECORD_OR_UNION_TYPE_CHECK): Likewise. + (BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK): Likewise. + (C_IS_RESERVED_WORD): Uppercase macro parameter. + (C_RID_YYCODE) Likewise. + (ptrmem_cst): Use rtx. + (LOCAL_BINDING_P): Add whitespace. + (INHERITED_VALUE_BINDING_P): Likewise. + (BINDING_SCOPE): Wrap long line. + (BINDING_HAS_LEVEL_P): Remove parenthesis. + (BINDING_VALUE): Wrap long line. + (BINDING_TYPE): Whitespace. + (IDENTIFIER_GLOBAL_VALUE): Add parenthesis. + (SET_IDENTIFIER_GLOBAL_VALUE): Likewise. + (IDENTIFIER_NAMESPACE_VALUE): Likewise. + (SET_IDENTIFIER_NAMESPACE_VALUE: Likewise. + (same_type_p): Uppercase macro parameters. + (same_type_ignoring_top_level_qualifiers_p): Likewise. + (OVL_FUNCTION): Wrap long line. + (OVL_CHAIN): Whitespace. + (OVL_CURRENT): Add parenthesis and whitespace. + (OVL_NEXT): Whitespace. + (OVL_USED): Likewise. + (IDENTIFIER_TYPE_VALUE): Likewise. + (REAL_IDENTIFIER_TYPE_VALUE): Remove parenthesis. + (SET_IDENTIFIER_TYPE_VALUE): Add parenthesis and whitespace. + (LANG_ID_FIELD): Whitespace. + (SET_LANG_ID(NODE,VALUE,NAME): Likewise. + (IDENTIFIER_LABEL_VALUE): Whitespace and wrap. + (SET_IDENTIFIER_LABEL_VALUE): Whitespace. + (IDENTIFIER_IMPLICIT_DECL): Whitespace and wrap. + (SET_IDENTIFIER_IMPLICIT_DECL); Whitespace. + (IDENTIFIER_ERROR_LOCUS): Whitespace and wrap. + (SET_IDENTIFIER_ERROR_LOCUS); Whitespace. + (IDENTIFIER_VIRTUAL_P): Likewise. + (IDENTIFIER_OPNAME_P): Likewise. + (IDENTIFIER_TYPENAME_P): Remove parenthesis. + (C_TYPE_FIELDS_READONLY): Uppercase macro parameters. + (C_SET_EXP_ORIGINAL_CODE): Likewise. + (TYPE_ASSEMBLER_NAME_STRING): Wrap long line. + (TYPE_ASSEMBLER_NAME_LENGTH): Likewise. + (IS_AGGR_TYPE): Uppercase macro parameter. + (CLASS_TYPE_P): Likewise. + (IS_AGGR_TYPE_CODE): Uppercase macro parameter and parenthesis. + (IS_AGGR_TYPE_2): Whitespace. + (TAGGED_TYPE_P): Uppercase macro parameter. + (TYPE_BUILT_IN): Whitespace. + (TYPE_FOR_JAVA): Likewise. + (FUNCTION_ARG_CHAIN): Remove parenthesis. + (FUNCTION_FIRST_USER_PARMTYPE): Add parenthesis. + (FUNCTION_FIRST_USER_PARAM): Likewise. + (PROMOTES_TO_AGGR_TYPE): Whitespace. + (DERIVED_FROM_P): Add parenthesis and wrap. + (UNIQUELY_DERIVED_FROM_P): Likewise. + (ACCESSIBLY_UNIQUELY_DERIVED_P): Likewise. + (PUBLICLY_UNIQUELY_DERIVED_P): Likewise. + (CLASSTYPE_USE_TEMPLATE): Whitespace. + (CLASSTYPE_INLINE_FRIENDS): Remove parenthesis. + (TYPE_GETS_DELETE): Add parenthesis. + (TYPE_HAS_CONVERSION): Add parenthesis and wrap. + (TYPE_HAS_ASSIGN_REF): Likewise, + (TYPE_HAS_CONST_ASSIGN_REF): Likewise. + (TYPE_HAS_INIT_REF): Likewise. + (TYPE_HAS_CONST_INIT_REF): Likewise. + (TYPE_BEING_DEFINED): Likewise. + (TYPE_LANG_SPECIFIC): Likewise. + (CLASSTYPE_RTTI): Likewise. + (TYPE_OVERLOADS_CALL_EXPR): Likewise. + (TYPE_OVERLOADS_ARRAY_REF): Likewise. + (TYPE_OVERLOADS_ARROW): Likewise. + (TYPE_USES_MULTIPLE_INHERITANCE): Likewise. + (TYPE_USES_VIRTUAL_BASECLASSES): Add parenthesis. + (CLASSTYPE_METHOD_VEC): Likewise. + (CLASSTYPE_MARKED_N): Likewise. + (CLASSTYPE_MARKED): Likewise. + (CLASSTYPE_MARKED2): Likewise. + (CLASSTYPE_MARKED3): Likewise. + (CLASSTYPE_MARKED4): Likewise. + (CLASSTYPE_MARKED5): Likewise. + (CLASSTYPE_MARKED6): Likewise. + (SET_CLASSTYPE_MARKED): Whitespace. + (CLEAR_CLASSTYPE_MARKED): Likewise. + (SET_CLASSTYPE_MARKED2): Likewise. + (CLEAR_CLASSTYPE_MARKED2): Likewise. + (SET_CLASSTYPE_MARKED3): Likewise. + (CLEAR_CLASSTYPE_MARKED3): Likewise. + (SET_CLASSTYPE_MARKED4): Likewise. + (CLEAR_CLASSTYPE_MARKED4): Likewise. + (SET_CLASSTYPE_MARKED5): Likewise. + (CLEAR_CLASSTYPE_MARKED5): Likewise. + (SET_CLASSTYPE_MARKED6): Likewise. + (CLEAR_CLASSTYPE_MARKED6): Likewise. + (CLASSTYPE_TAGS): Likewise. + (CLASSTYPE_VSIZE): Likewise. + (CLASSTYPE_VBASECLASSES): Likewise. + (CANONICAL_BINFO): Add parenthesis. + (CLASSTYPE_SIZE(NODE): Likewise. + (CLASSTYPE_SIZE_UNIT): Likewise. + (CLASSTYPE_ALIGN(NODE): Likewise. + (CLASSTYPE_USER_ALIGN): Likewise. + (TYPE_JAVA_INTERFACE): Likewise. + (CLASSTYPE_PURE_VIRTUALS): Likewise. + (CLASSTYPE_NEEDS_VIRTUAL_REINIT): Whitespace and wrap. + (TYPE_HAS_DEFAULT_CONSTRUCTOR): Likewise. + (CLASSTYPE_HAS_MUTABLE): Likewise. + (CLASSTYPE_FRIEND_CLASSES): Likewise. Likewise. + (CLASSTYPE_DECLARED_CLASS): Whitespace and wrap. + (CLASSTYPE_READONLY_FIELDS_NEED_INIT): Likewise. + (CLASSTYPE_REF_FIELDS_NEED_INIT): Likewise. + (CLASSTYPE_INTERFACE_ONLY): Likewise. + (CLASSTYPE_INTERFACE_KNOWN): Likewise. + (CLASSTYPE_INTERFACE_UNKNOWN): Likewise. + (SET_CLASSTYPE_INTERFACE_UNKNOWN_X): Likewise. + (SET_CLASSTYPE_INTERFACE_UNKNOWN): Likewise. + (SET_CLASSTYPE_INTERFACE_KNOWN): Likewise. + (CLASSTYPE_DEBUG_REQUESTED): Whitespace and wrap. + (BINFO_UNSHARED_MARKED): Whitespace. + (BINFO_MARKED): Whitespace and wrap. + (SET_BINFO_MARKED): Likewise. + (CLEAR_BINFO_MARKED): Likewise. + (BINFO_VTABLE_PATH_MARKED): Likewise. + (SET_BINFO_VTABLE_PATH_MARKED): Likewise. + (CLEAR_BINFO_VTABLE_PATH_MARKED): Likewise. + (BINFO_SUBVTT_INDEX): Remove parenthesis. + (BINFO_VPTR_INDEX): Likewise. + (BINFO_PRIMARY_BASE_OF): Likewise, + (CLASSTYPE_VFIELDS): Whitespace. + (VF_DERIVED_VALUE): Wrap long line. + (NAMESPACE_LEVEL): Whitespace. + (CAN_HAVE_FULL_LANG_DECL_P): Remove parenthesis. + (DEFARG_POINTER): Whitespace. + (DECL_NEEDED_P): Remove parenthesis. + (DECL_LANGUAGE): Whitespace. + (SET_DECL_LANGUAGE): Add parenthesis. + (DECL_CONSTRUCTOR_P): Whitespace and wrap. + (DECL_OVERLOADED_OPERATOR_P): Remove parenthesis. + (DECL_IN_AGGR_P): Whitespace. + (DECL_FRIEND_P): Likewise. + (DECL_BEFRIENDING_CLASSES): Likewise. + (DECL_STATIC_FUNCTION_P): Whitespace and wrap. + (DECL_NONCONVERTING_P): Whitespace. + (DECL_PURE_VIRTUAL_P): Likewise. + (DECL_NEEDS_FINAL_OVERRIDER_P): Likewise. + (DECL_PENDING_INLINE_INFO): Whitespace. + (DECL_SORTED_FIELDS): Likewise. + (DECL_DEFERRED_FN): Likewise. + (DECL_TEMPLATE_INFO): Likewise. + (CLASSTYPE_TEMPLATE_INFO): Whitespace and wrap. + (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO); Likewise. + (SET_TYPE_TEMPLATE_INFO): Add parenthesis. + (TMPL_ARGS_LEVEL): Likewise. + (SET_TMPL_ARGS_LEVEL): Likewise. + (INNERMOST_TEMPLATE_PARMS): Whitespace. + (C_TYPEDEF_EXPLICITLY_SIGNED): Uppercase macro parameter. + (INTEGRAL_CODE_P(CODE): Add parenthesis. + (CP_INTEGRAL_TYPE_P): Remove parenthesis. + (TYPE_HAS_CONSTRUCTOR): Whitespace. + (TREE_HAS_CONSTRUCTOR): Likewise. + (TYPE_HAS_DESTRUCTOR): Likewise. + (TYPE_HAS_REAL_ASSIGN_REF): Likewise. + (TYPE_HAS_COMPLEX_ASSIGN_REF): Likewise. + (TYPE_HAS_ABSTRACT_ASSIGN_REF): Likewise. + (TYPE_HAS_COMPLEX_INIT_REF): Likewise. + (TYPE_HAS_NONTRIVIAL_DESTRUCTOR): Likewise. + (TYPE_PTRMEMFUNC_P): Likewise. + (TYPE_PTRMEMFUNC_FLAG): Likewise. + (TYPE_GET_PTRMEMFUNC_TYPE): Likewise. + (TYPE_SET_PTRMEMFUNC_TYPE): Likewise. + (TYPE_PTRMEM_CLASS_TYPE): Remove parenthesis. + (TYPE_PTRMEM_POINTED_TO_TYPE): Likewise. + (DECL_ACCESS): Whitespace. + (DECL_GLOBAL_CTOR_P): Remove parenthesis. + (DECL_GLOBAL_DTOR_P): Likewise. + (GLOBAL_INIT_PRIORITY): Likewise. + (DECL_TEMPLATE_PARMS): Likewise. + (DECL_TEMPLATE_RESULT): Likewise. + (DECL_TEMPLATE_INSTANTIATIONS): Likewise. + (DECL_TEMPLATE_SPECIALIZATIONS): Likewise. + (DECL_IMPLICIT_TYPEDEF_P): Remove parenthesis. + (SET_DECL_IMPLICIT_TYPEDEF_P): Likewise. + (PRIMARY_TEMPLATE_P): Add parenthesis. + (DECL_USE_TEMPLATE): Whitespace. + (CLASSTYPE_IMPLICIT_INSTANTIATION): Likewise. + (SET_CLASSTYPE_IMPLICIT_INSTANTIATION): Likewise. + (CLASSTYPE_EXPLICIT_INSTANTIATION): Likewise. + (SET_CLASSTYPE_EXPLICIT_INSTANTIATION): Likewise. + (CALL_DECLARATOR_PARMS): Remove parenthesis. + (CALL_DECLARATOR_QUALS): Likewise. + (CALL_DECLARATOR_EXCEPTION_SPEC): Likewise. + (TEMP_NAME_P): Wrap. + (VFIELD_NAME_P): Likewise. + (B_SET): Uppercase macro parameters and add parenthesis. + (B_CLR): Likewise. + (B_TST): Likewise. + (LOOKUP_NAMESPACES_ONLY): Uppercase macro parameters. + (LOOKUP_TYPES_ONLY): Uppercase macro parameters. + (LOOKUP_QUALIFIERS_ONLY): Uppercase macro parameters. + (same_or_base_type_p): Likewise. + (cp_deprecated): Likewise. + + 2002-01-05 Richard Henderson + + * semantics.c (expand_body): Revert last change. + + 2002-01-04 Jason Merrill + + PR c++/4122 + * class.c (update_vtable_entry_for_fn): Set delta to zero for a + lost primary. + + * class.c (build_vtbl_initializer): Check for a lost primary + before calculating the vtable entry to throw away. + + 2002-01-02 Jason Merrill + + * semantics.c (expand_body): Call outlining_inline_function when + emitting an inline function out of line. + + 2002-01-02 Nathan Sidwell + + PR c++/5116, c++/764 reversion + * call.c (build_new_op): Revert the instantiations. They are + incorrect. + + 2002-01-02 Nathan Sidwell + + PR c++/5089 + * decl2.c (reparse_absdcl_as_casts): Don't warn about casts to void. + + 2002-01-02 Nathan Sidwell + + PR c++/3716 + * pt.c (tsubst_aggr_type): Move pmf handling into tsubst. + (tsubst, case POINTER_TYPE): Handle pmfs here. + (tsubst, case OFFSET_TYPE): Check it is not an offset to + reference. If it is offset to FUNCTION_TYPE, create a METHOD_TYPE. + + 2002-01-02 Nathan Sidwell + + PR c++/35 + * cp-tree.h (DECL_LANG_FLAG_0): Used for PARM_DECL too. + (DECL_TEMPLATE_PARM_P): A PARM_DECL might be one too. + * pt.c (process_template_parm): SET_DECL_TEMPLATE_PARM_P on the + PARM_DECL. + (tsubst_template_parms): Break up loop statements. + (tsubst_decl, case PARM_DECL): Copy DECL_TEMPLATE_PARM_P. Template + parm PARM_DECLs don't get promoted. + + 2002-01-02 Nathan Sidwell + + PR c++/5123 + * typeck.c (build_component_ref): Cope with a TEMPLATE_ID_EXPR. + (build_x_function_call): Cope with a COMPONENT_REF containing a + TEMPLATE_ID_EXPR. + + 2002-01-02 Nathan Sidwell + + PR c++/5213 + * pt.c (convert_template_argument): Be more careful determining + when RECORD_TYPE templates are or are not templates. + + 2002-01-02 Nathan Sidwell + + PR c++/775 + * cp-tree.h (handle_class_head): Adjust prototype. + * decl2.c (handle_class_head): Add DEFN_P and NEW_TYPE_P + parameters. Use for all class heads. + * parse.y (named_class_head_sans_basetype, named_class_head, + named_complex_class_head_sans_basetype, + named_class_head_sans_basetype_defn, + unnamed_class_head): Remove. + (class_head, class_head_apparent_template): Recognize class heads + (class_head_decl, class_head_defn): New reductions. Process class + heads. + (structsp): Adjust class definition and class declaration + reductions. + (maybe_base_class_list): Give diagnostic on empty list. + + 2002-01-02 Nathan Sidwell + + PR c++/4379 + * typeck.c (build_x_unary_op): Don't destroy the OFFSET_REF on a + single non-static member. + (unary_complex_lvalue): If it cannot be a pointer to member, don't + make it so. Check it is not pointer to reference. + + 2002-01-02 Nathan Sidwell + + PR c++/5132 + * decl2.c (reparse_absdcl_as_casts): Don't digest_init if we + are processing a template decl. + + 2002-01-02 Nathan Sidwell + + PR c++/5116, c++/764 + * call.c (build_new_op): Make sure template class operands are + instantiated. Simplify arglist construction. + + 2001-12-29 Nathan Sidwell + + * call.c (build_user_type_conversion_1): Use my_friendly_assert + rather than if ... abort. + * cvt.c (convert_to_reference): Likewise. + * semantics.c (setup_vtbl_ptr): Likewise. + * pt.c (lookup_template_class): Comment typo. + + 2001-12-29 Nathan Sidwell + + PR c++/5125 + * pt.c (push_template_decl_real): Make sure DECL has + DECL_LANG_SPECIFIC. + + 2001-12-29 Nathan Sidwell + + PR c++/335 + * init.c (resolve_offset_ref): Copy cv qualifiers of this pointer + for non-reference fields. + * typeck.c (require_complete_type): Use resolve_offset_ref). + + 2001-12-26 Nathan Sidwell + + PR c++/196 + * parse.y (bad_parm): Better diagnostic when given a SCOPE_REF. + + 2001-12-24 Nathan Sidwell + + PR c++/160 + * typeck.c (build_modify_expr): Remove old unreachable code & tidy + up. Don't stabilize_references when initializing a reference. + + 2001-12-23 Kaveh R. Ghazi + + * decl2.c (lang_f_options): Const-ify. + + 2001-12-20 Joseph S. Myers + + * config-lang.in (diff_excludes): Remove. + + 2001-12-19 Nathan Sidwell + + PR c++/90 + * typeck.c (build_function_call_real): Use original function + expression for errors. + + 2001-12-18 Jason Merrill + + PR c++/3242 + * class.c (add_method): Do compare 'this' quals when trying to match a + used function. Don't defer to another used function. + + 2001-12-18 Nathan Sidwell + + * pt.c (instantiate_clone): Remove, fold into ... + (instantiate_template): ... here. Simplify by removing mutual + recursion. + * typeck2.c (build_m_component_ref): Don't cv qualify the function + pointed to by a pointer to function. + * class.c (delete_duplicate_fields_1): Typo. + + 2001-12-18 Jason Merrill + + C++ ABI change: destroy value arguments in caller. + * semantics.c (genrtl_start_function, genrtl_finish_function): Don't + create an extra binding level for the parameters. + * decl.c (store_parm_decls): Don't do parameter cleanups. + + 2001-12-18 Nathan Sidwell + + * call.c (build_new_method_call): Use '%#V'. + * error.c (cv_to_string): Use V parameter to determine padding. + + 2001-12-18 Joseph S. Myers + + * call.c, decl2.c, init.c: Use "built-in" and "bit-field" + spellings in messages. + + 2001-12-17 Zack Weinberg + + * cp-tree.h: Delete #defines for cp_error, cp_warning, + cp_pedwarn, and cp_compiler_error. + * call.c, class.c, cp-tree.h, cvt.c, decl.c, decl2.c, error.c, + except.c, friend.c, init.c, lex.c, method.c, parse.y, pt.c, + rtti.c, search.c, semantics.c, spew.c, tree.c, typeck.c, + typeck2.c: Change calls to the above macros to use their + language-independent equivalents: error, warning, pedwarn, and + internal_error respectively. + + 2001-12-16 Neil Booth + + * decl2.c (finish_file): Remove back_end_hook. + + 2001-12-16 Joseph S. Myers + + * ChangeLog.1, ChangeLog.2, ChangeLog, NEWS, call.c, class.c, + cp-tree.h, decl.c, decl2.c, except.c, operators.def, optimize.c, + pt.c, rtti.c, semantics.c, typeck.c: Fix spelling errors. + + 2001-12-15 Joseph S. Myers + + * lang-options.h: Use American spelling in messages. + + 2001-12-13 Jason Merrill + + * Make-lang.in (parse.h): Separate rule, just depend on parse.c. + + Use cleanups to run base and member destructors. + * init.c (push_base_cleanups): New function, split out from... + (build_delete): ...here. Lose !TYPE_HAS_DESTRUCTOR code. + * decl.c (finish_destructor_body): Move vbase destruction code to + push_base_cleanups. + (begin_function_body, finish_function_body): New fns. + (finish_function): Move [cd]tor handling and call_poplevel to + finish_function_body. + (pushdecl): Skip the new level. + * semantics.c (genrtl_try_block): Don't call end_protect_partials. + (setup_vtbl_ptr): Call push_base_cleanups. + * method.c (synthesize_method): Call {begin,end}_function_body. + * pt.c (tsubst_expr): Handle COMPOUND_STMT_BODY_BLOCK. + * cp-tree.h: Declare new fns. + * parse.y (function_body, .begin_function_body): New nonterminals. + (fndef, pending_inline, function_try_block): Use function_body. + (ctor_initializer_opt, function_try_block): No longer has a value. + (base_init): Remove .set_base_init token. + (.set_base_init, compstmt_or_error): Remove. + * Make-lang.in (parse.c): Expect two fewer s/r conflicts. + + * optimize.c (maybe_clone_body): Fix parameter updating. + + 2001-12-12 Jason Merrill + + * decl.c (store_parm_decls): Remove parms_have_cleanups cruft. + * semantics.c (genrtl_start_function): Don't pass + parms_have_cleanups or push an extra binding level. + (genrtl_finish_function): Lose cleanup_label cruft. + + * cp-tree.h (struct cp_language_function): Remove x_ctor_label. + (ctor_label): Remove. + * semantics.c (finish_return_stmt): Lose ctor_label support. + * decl.c (finish_constructor_body, mark_lang_function): Likewise. + * typeck.c (check_return_expr): Check DECL_DESTRUCTOR_P, not + dtor_label. + + * call.c (build_new_method_call): Let resolves_to_fixed_type_p + check for [cd]tors. + * class.c (fixed_type_or_null, case INDIRECT_REF): Fix. + + * decl.c (finish_function): Check VMS_TARGET, not VMS. + + * decl.c (start_cleanup_fn): Remove redundant pushlevel. + (end_cleanup_fn): And poplevel. + + * semantics.c (setup_vtbl_ptr): Always build a CTOR_INITIALIZER + if we're in a template. + + 2001-12-12 Jakub Jelinek + + * cp-tree.h (DESTRUCTOR_DECL_PREFIX, DESTRUCTOR_NAME_P, + ANON_PARMNAME_FORMAT, ANON_PARMNAME_P, DESTRUCTOR_NAME_FORMAT, + THIS_NAME_P): Delete. + * spew.c (read_process_identifier): Remove DESTRUCTOR_NAME_P, + THIS_NAME_P and ANON_PARMNAME_P tests from warning about clash + with internal naming scheme. + * error.c (dump_decl): Remove DESTRUCTOR_NAME_P use. + + 2001-12-12 Nathan Sidwell + + * decl.c (grokdeclarator): Deprecated implicit typename use. + + 2001-12-11 Nathan Sidwell + + PR g++/51 + * parse.y (frob_specs): Indicate it is a language linkage which + contained the extern. + * decl.c (grokdeclarator): Allow extern language linkage with + other specifiers. + + 2001-12-10 Nathan Sidwell + + PR g++/72 + * decl.c (add_binding): Don't reject duplicate typedefs involving + template parameters. + + 2001-12-10 Neil Booth + + * parse.y, semantics.c: Similarly. + + 2001-12-09 Nathan Sidwell + + PR g++/87 + * cp-tree.h (DECL_COPY_CONSTRUCTOR_P): Use copy_fn_p. + (copy_args_p): Rename to ... + (copy_fn_p): ... here. + (grok_special_member_properties): New function. + (grok_op_properties): Lose VIRTUALP parameter. + (copy_assignment_arg_p): Remove. + * call.c (build_over_call): Use copy_fn_p. + * decl.c (grokfndecl): Reformat. Adjust call to + grok_op_properties. + (copy_args_p): Rename to ... + (copy_fn_p): ... here. Reject template functions. Check for pass + by value. + (grok_special_member_properties): Remember special functions. + (grok_ctor_properties): Don't remember them here, just check. + (grok_op_properties): Likewise. + (start_method): Call grok_special_member_properties. + * decl2.c (grokfield): Likewise. + (copy_assignment_arg_p): Remove. + (grok_function_init): Don't remember abstract assignment here. + * pt.c (instantiate_class_template): Call + grok_special_member_properties. + (tsubst_decl): Adjust grok_op_properties call. + + 2001-12-08 Aldy Hernandez + + * lex.c (rid_to_yy): Add RID_CHOOSE_EXPR and + RID_TYPES_COMPATIBLE_P. + + 2001-12-08 John David Anglin + + * semantics.c (simplify_aggr_init_exprs_r): Add DIRECT_BIND flag in + call to build_aggr_init. + * cp-tree.h (DIRECT_BIND): Document new use of DIRECT_BIND. + + 2001-12-08 Neil Booth + + * parse.y: Replace uses of the string non-terminal with STRING. + Don't perform string concatentaion here. + (string): Remove non-terminal. + * semantics.c (finish_asm_stmt): Don't concatenate strings here. + + 2001-12-05 Jason Merrill + + * cp-lang.c (LANG_HOOKS_TREE_INLINING_START_INLINING): Define. + (LANG_HOOKS_TREE_INLINING_END_INLINING): Define. + * tree.c (cp_start_inlining, cp_end_inlining): New fns. + * pt.c (push_tinst_level): No longer static. + * cp-tree.h: Declare them. + + * init.c (resolve_offset_ref): Don't check access for the base + conversion to access a FIELD_DECL. + + * cp-tree.h (TYPE_REFFN_P): New macro. + * decl.c (bad_specifiers): Check it, too. + + * rtti.c (create_pseudo_type_info): Set CLASSTYPE_INTERFACE_ONLY + on the __*_type_info type if we haven't seen a definition. + + 2001-12-05 Neil Booth + + * decl.c: Include c-common.h. + (shadow_warning): Move to c-common.c. + + 2001-12-05 Richard Kenner + + * decl.c (duplicate_decls): Don't copy DECL_NO_CHECK_MEMORY_USAGE. + + 2001-12-04 Nathan Sidwell + + * pt.c (end_template_parm_list): Clear TREE_CHAIN of each parm. + + 2001-12-04 Nathan Sidwell + + PR g++/164 + * init.c (sort_base_init): Allow binfos to be directly specified. + * method.c (do_build_copy_constructor): Explicitly convert to the + base instance. + (do_build_assign_ref): Likewise. + + 2001-12-03 Hans-Peter Nilsson + + * decl.c (xref_basetypes): Don't use C99 construct in tag_code + declaration and initialization. + + 2001-12-03 Neil Booth + + * typeck2.c: Remove leading capital from diagnostic messages, as + per GNU coding standards. + + 2001-12-03 Mumit Khan + + PR c++/3394 + * decl.c (xref_basetypes): Handle attributes between + 'class' and name. + + 2001-12-03 Nathan Sidwell + + PR g++/3381 + * parse.y (named_complex_class_head_sans_basetype): Add new + reduction. + * Make-lang.in (parse.c): Adjust expected conflict count. + + 2001-12-03 Jason Merrill + + * class.c (finish_vtbls): Fill in BINFO_VPTR_FIELD in the + immediate binfos for our virtual bases. + + 2001-12-02 Neil Booth + + * call.c (build_java_interface_fn_ref): Similarly. + * except.c (is_admissible_throw_operand): Similarly. + * init.c (build_java_class_ref): Similarly. + * xref.c (open_xref_file): Similarly. + + 2001-12-01 Neil Booth + + * class.c (finish_struct): Remove trailing periods from messages. + * decl.c (check_tag_decl): Similarly. + * lex.c (cxx_set_yydebug): Similarly. + * typeck2.c (friendly_abort): Similarly. + + 2001-11-29 Mark Mitchell + + PR c++/3048 + * cp-tree.h (ovl_member): Remove. + * decl2.c (merge_functions): Handle extern "C" functions + specially. + * tree.c (ovl_member): Remove. + + 2001-11-29 Mark Mitchell + + PR c++/4842 + * class.c (get_basefndecls): Take an IDENTIFIER_NODE, not a + FUNCTION_DECL, as input. + (mark_overriders): Remove. + (warn_hidden): Rework for the new ABI. + + 2001-11-29 Mark Mitchell + + PR c++/3471 + * call.c (convert_like_real): Do not build additional temporaries + for rvalues of class type. + + 2001-11-28 Nathan Sidwell + + * cp-tree.h (UNIQUELY_DERIVED_FROM_P): Use lookup base. + (ACCESSIBLY_UNIQUELY_DERIVED_FROM_P): Likewise. + (PUBLICLY_UNIQUELY_DERIVED_FROM_P: Likewise. + (DERIVED_FROM_P): Likewise. + (enum base_access): Renumber, add ba_quiet bit mask. + (get_binfo): Remove. + (get_base_distance): Remove. + (binfo_value): Remove. + (ACCESSIBLY_DERIVED_FROM_P): Remove. + * call.c (standard_conversion): Use lookup_base. + * class.c (strictly_overrides): Likewise. + (layout_virtual_bases): Likewise. + (warn_about_ambiguous_direct_bases): Likewise. + (is_base_of_enclosing_class): Likewise. + (add_vcall_offset_vtbl_entries_1): Likewise. + * cvt.c (build_up_reference): Adjust comment. + * init.c (build_member_call): Reformat. + * search.c (get_binfo): Remove. + (get_base_distance_recursive): Remove. + (get_base_distance): Remove. + (lookup_base_r): Tweak. + (lookup_base): Add ba_quiet control. Complete the types here. + (covariant_return_p): Use lookup_base. + * tree.c (binfo_value): Remove. + (maybe_dummy_object): Use lookup_base. + * typeck.c (build_static_cast): Use lookup_base. + (get_delta_difference): Likewise. + * typeck2.c (binfo_or_else): Use lookup_base. + (build_scoped_ref): Add back error_mark_check. + (build_m_component_ref): Use lookup_base. + + 2001-11-29 Joseph S. Myers + + * Make-lang.in (c++.generated-manpages): New dummy target. + + 2001-11-27 Richard Kenner + + * Make-lang.in (cp-lang.o): Depends on c-common.h. + * cp-lang.c (c-common.h): Include. + (LANG_HOOKS_EXPAND_CONSTANT, LANG_HOOKS_SAFE_FROM_P): New hooks. + * decl.c (cxx_init_decl_processing): Don't set lang_safe_from_p. + * expr.c (init_cplus_expand): Don't set lang_expand_constant. + + 2001-11-26 Neil Booth + + * decl2.c (c_language): Move to c-common.c. + * lex.c (cxx_post_options, cxx_init_options): Use c-common.c + functions. + (cxx_init): Update. + + 2001-11-26 Jason Merrill + + * call.c (joust): Remove COND_EXPR hack. + + 2001-11-25 Aldy Hernandez + + * search.c (lookup_base_r): Declare bk in variable declaration + space. + + 2001-11-25 Nathan Sidwell + + PR g++/3145 + * class.c (build_vbase_pointer): Remove. + (build_vbase_path): Remove. + (build_base_path): New function. + * cp-tree.h (base_access, base_kind): New enumerations. + (build_base_path): Declare. + (convert_pointer_to_real): Remove. + (convert_pointer_to): Remove. + (lookup_base): Declare. + (convert_pointer_to_vbase): Remove. + * call.c (build_scoped_method_call): Use lookup_base & + build_base_path instead of convert_pointer_to_real, + get_base_distance & get_binfo. + (build_over_call): Likewise. + * cvt.c (cp_convert_to_pointer): Likewise. + (convert_to_pointer_force): Likewise. + (build_up_reference): Likewise. + (convert_pointer_to_real): Remove. + (convert_pointer_to): Remove. + * init.c (dfs_initialize_vtbl_ptrs): Use build_base_path + instead of convert_pointer_to_vbase & build_vbase_path. + (emit_base_init): Use build_base_path instead of + convert_pointer_to_real. + (expand_virtual_init): Lose unrequired conversions. + (resolve_offset_ref): Use lookup_base and build_base_path + instead of convert_pointer_to. + * rtti.c (build_dynamic_cast_1): Use lookup_base & + build_base_path instead of get_base_distance & build_vbase_path. + * search.c (get_vbase_1): Remove. + (get_vbase): Remove. + (convert_pointer_to_vbase): Remove. + (lookup_base_r): New function. + (lookup_base): New function. + * typeck.c (require_complete_type): Use lookup_base & + build_base_path instead of convert_pointer_to. + (build_component_ref): Likewise. + (build_x_function_call): Likewise. + (get_member_function_from_ptrfunc): Likewise. + (build_component_addr): Likewise. + * typeck2.c (build_scoped_ref): Likewise. + + 2001-11-22 Bryce McKinlay + + * cp-tree.h (CP_TYPE_QUALS): Removed. + * decl.c (cxx_init_decl_processing): Don't set lang_dump_tree. + * cp-lang.c: Set LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN and + LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN. + * dump.c (cp_dump_tree): Use void* dump_info argument to match + lang-hooks prototype. + * call.c, cp-tree.h, cvt.c, decl.c, init.c, mangle.c, method.c, pt.c, + rtti.c, semantics.c, tree.c, typeck.c, typeck2.c: All references to + CP_TYPE_QUALS changed to cp_type_quals. + * Make-lang.in: References to c-dump.h changed to tree-dump.h. + (CXX_C_OBJS): Remove c-dump.o. + + 2001-11-21 Mark Mitchell + + PR c++/3637 + * pt.c (lookup_template_class): Ensure that all specializations + are registered on the list corresponding to the most general + template. + + 2001-11-20 Mark Mitchell + + * call.c (non_reference): Add documentation. + (convert_class_to_reference): Do not strip reference types + from conversion operators. + (maybe_handle_ref_bind): Simplify. + (compare_ics): Correct handling of references. + + 2001-11-19 John Wilkinson + + * dump.c (dump_op): New function. + (cp_dump_tree): Dump CLASSTYPE_TEMPLATE_SPECIALIZATION. Use + dump_op. Dump DECL_MUTABLE, access and staticness for VAR_DECLs. + DECL_PURE_VIRTUAL_P, DECL_VIRTUAL_P, + + 2001-11-19 Mark Mitchell + + PR4629 + * semantics.c (finish_sizeof): Make sure that expression created + while processing a template do not have a type. + (finish_alignof): Likewise. + * typeck.c (c_sizeof): Likewise. + (expr_sizeof): Likewise. + + 2001-11-18 Neil Booth + + * lex.c (cxx_finish): Call c_common_finish. + (finish_parse): Remove. + + 2001-11-17 Kriang Lerdsuwanakij + + * decl.c (create_array_type_for_decl): Check if NAME is NULL_TREE + when displaying error message about missing array bounds. + + 2001-11-17 Kriang Lerdsuwanakij + + * mangle.c (write_expression): Handle CAST_EXPR, STATIC_CAST_EXPR, + CONST_CAST_EXPR. + * operators.def: Add CAST_EXPR, STATIC_CAST_EXPR, CONST_CAST_EXPR. + + 2001-11-16 Neil Booth + + * cp-tree.h (print_class_statistics): Restore. + + 2001-11-15 Jason Merrill + + * method.c (use_thunk): Don't emit debugging information for thunks. + + * parse.y: Add ... IDENTIFIER SCOPE and ... PTYPENAME SCOPE expansions. + * decl.c (make_typename_type): Handle getting a class template. + * search.c (lookup_field_r): A class template is good enough for + want_type. + + * call.c (convert_like_real): Only use cp_convert for the bad part. + (standard_conversion): Also allow bad int->enum. + * typeck.c (ptr_reasonably_similar): Also allow functions to + interconvert. Pointers to same-size integers are reasonably + similar. + + * cvt.c (convert_to_void): If we build a new COND_EXPR, always + give it void type. + + 2001-11-15 Nathan Sidwell + + PR g++/3154 + * init.c (sort_base_init): Remove unreachable code. + (expand_member_init): Adjust comment to reflect reality. Simplify + and remove unreachable code. + + 2001-11-15 Neil Booth + + * cp-tree.h (init_reswords, cxx_init_decl_processing): New. + (cxx_init): Update prototype. + * decl.c (init_decl_processing): Rename. Move null node init + to its creation time. + * lex.c (cxx_init_options): Update. + (cxx_init): Combine with old init_parse; also call + cxx_init_decl_processing. + + 2001-11-14 Richard Sandiford + + * decl.c (check_initializer): Try to complete the type of an + array element before checking whether it's complete. Don't + complain about arrays with complete element types but an + unknown size. + (cp_finish_decl): Build the hierarchical constructor before + calling maybe_deduce_size_from_array_init. + + 2001-11-14 Joseph S. Myers + + * Make-lang.in: Change all uses of $(manext) to $(man1ext). + + 2001-11-13 Nathan Sidwell + + PR g++/4206 + * parse.y (already_scoped_stmt): Remove. + (simple_stmt, WHILE & FOR): Use implicitly_scoped_stmt. + + 2001-11-12 H.J. Lu + + * cvt.c (ocp_convert): Don't warn the address of a weak + function is always `true'. + + 2001-11-09 Neil Booth + + * cp-lang.c (LANG_HOOKS_PRINT_DECL, LANG_HOOKS_PRINT_TYPE, + LANG_HOOKS_PRINT_STATISTICS, LANG_HOOKS_PRINT_XNODE, + LANG_HOOKS_PRINT_IDENTIFIER, LANG_HOOKS_SET_YYDEBUG): Override. + * cp-tree.h (print_class_statistics): Remove. + (cxx_print_statistics, cxx_print_xnode, cxx_print_decl, cxx_print_type, + cxx_print_identifier, cxx_set_yydebug): New. + * lex.c (set_yydebug): Rename c_set_yydebug. + * ptree.c (print_lang_decl, print_lang_type, print_lang_identifier, + lang_print_xnode): Rename. + * tree.c (print_lang_statistics): Rename. + + 2001-11-09 Kaveh R. Ghazi + + * class.c (dump_array): Fix format specifier warning. + + 2001-11-09 Neil Booth + + * cp-lang.c (LANG_HOOKS_NAME): Override. + (struct lang_hooks): Constify. + * lex.c (cxx_init_options): Update. + (lang_identify): Remove. + * parse.y (language_string): Remove. + + 2001-11-08 Andreas Franck + + * Make-lang.in (CXX_INSTALL_NAME, GXX_CROSS_NAME, + DEMANGLER_CROSS_NAME): Handle program_transform_name the way + suggested by autoconf. + (GXX_TARGET_INSTALL_NAME, CXX_TARGET_INSTALL_NAME): Define. + (c++.install-common): Use the transformed target alias names. + + 2001-11-06 Neil Booth + + * Make-lang.in: Update. + * cp-lang.c: Include langhooks-def.h. + + 2001-11-04 Kriang Lerdsuwanakij + + * pt.c (tsubst_copy): Call tsubst for TYPEOF_EXPR. + + 2001-11-03 Kaveh R. Ghazi + + * lex.c (copy_lang_type): Add static prototype. + + 2001-11-02 Kriang Lerdsuwanakij + + * pt.c (unify): Handle SCOPE_REF. + + 2001-11-01 Jakub Jelinek + + * tree.c (cp_copy_res_decl_for_inlining): Adjust + DECL_ABSTRACT_ORIGIN for the return variable. + + 2001-10-31 Zack Weinberg + + * Make-lang.in: Replace $(INTL_TARGETS) with po-generated. + + 2001-10-28 Joseph S. Myers + + * ChangeLog.1, ChangeLog.2, ChangeLog, class.c, decl2.c, search.c, + semantics.c, spew.c: Fix spelling errors. + + 2001-10-27 Kriang Lerdsuwanakij + + * decl2.c (validate_nonmember_using_decl): Handle NAMESPACE_DECL. + + 2001-10-25 Zack Weinberg + + * cp-lang.c: Redefine LANG_HOOKS_CLEAR_BINDING_STACK to + pop_everything. + + 2001-10-23 Richard Kenner + + * cp-lang.c (cxx_get_alias_set): New function. + Point LANG_HOOKS_GET_ALIAS_SET to it. + + 2001-10-23 Kriang Lerdsuwanakij + + * cp-tree.def (UNBOUND_CLASS_TEMPLATE): New tree node. + * cp-tree.h (make_unbound_class_template): Prototype new function. + * decl.c (make_unbound_class_template): New function. + * decl2.c (arg_assoc_template_arg): Handle UNBOUND_CLASS_TEMPLATE. + * error.c (dump_type): Likewise. + * mangle.c (write_type): Likewise. + * parse.y (template_parm): Likewise. + (template_argument): Use make_unbound_class_template. + * pt.c (convert_template_argument): Handle UNBOUND_CLASS_TEMPLATE. + (tsubst): Likewise. + (tsubst_copy): Likewise. + (unify): Likewise. + * tree.c (walk_tree): Likewise. + * typeck.c (comptypes): Likewise. + + 2001-10-21 Kaveh R. Ghazi + + * xref.c (GNU_xref_member): Use safe-ctype macros and/or fold + extra calls into fewer ones. + + 2001-10-18 Alexandre Oliva + + * decl.c (duplicate_decls): Propagate DECL_UNINLINABLE. + Warn when merging inline with attribute noinline. + (start_decl, start_function): Warn if inline and attribute + noinline appear in the same declaration. + + 2001-10-16 H.J. Lu + + * cp-tree.h (BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK): Defined + for tree checking disabled. + + 2001-10-16 Hans-Peter Nilsson + + * cp-tree.h (VFIELD_NAME_FORMAT) [NO_DOLLAR_IN_LABEL && + NO_DOT_IN_LABEL]: Adjust to match VFIELD_NAME. + + 2001-10-15 Richard Sandiford + + * pt.c (UNIFY_ALLOW_MAX_CORRECTION): Define. + (unify): Only handle MINUS_EXPR specially if the above flag is set + and the subtracted constant is 1. Clear the flag on recursive calls. + Set it when unifying the maximum value in an INTEGER_TYPE's range. + + 2001-10-15 Richard Sandiford + + * decl.c (bad_specifiers): Don't allow exception specifications + on any typedefs. + + 2001-10-14 Neil Booth + + * cp/lex.c (init_cp_pragma): Similarly. + + 2001-10-13 Kriang Lerdsuwanakij + + * pt.c (lookup_template_class): Build complete template arguments + for BOUND_TEMPLATE_TEMPLATE_PARM. + + 2001-10-12 Kriang Lerdsuwanakij + + * cp-tree.h (TYPE_BINFO): Update comment. + (BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK): New macro. + (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO): Use template_info. + (TYPENAME_TYPE_FULLNAME): Use TYPE_FIELDS. + (copy_type): Prototype new function. + * lex.c (copy_lang_decl): Gather tree node statistics. + (copy_lang_type): New function. + (copy_type): Likewise. + (cp_make_lang_type): Create lang_type for + BOUND_TEMPLATE_TEMPLATE_PARM. Set TYPE_BINFO for TYPENAME_TYPE + and BOUND_TEMPLATE_TEMPLATE_PARM. + * pt.c (tsubst): Use copy_type instead of copy_node. + * search.c (lookup_field_1): Ignore TYPENAME_TYPE. + + 2001-10-12 Kriang Lerdsuwanakij + + * pt.c (determine_specialization): Ignore functions without + DECL_TEMPLATE_INFO. + + 2001-10-12 Nathan Sidwell + + PR g++/4476 + * typeck2.c (abstract_virtuals_error): Ignore incomplete classes. + + 2001-10-11 Jason Merrill + + * typeck2.c (store_init_value): Don't re-digest a bracketed + initializer. + + * class.c (finish_struct_anon): Use TYPE_ANONYMOUS_P instead of + ANON_AGGR_TYPE_P. + + 2001-10-11 Richard Henderson + + * class.c (build_vtable_entry_ref): Create a VTABLE_REF instead + of an asm statement. + (build_vtbl_ref_1): Split out from build_vtbl_ref. + (build_vfn_ref): Use it to handle vtable descriptors before + calling build_vtable_entry_ref. + * decl2.c (output_vtable_inherit): Use assemble_vtable_inherit. + + 2001-10-10 Richard Henderson + + * parse.y (asm_operand): Allow named operands. + * semantics.c (finish_asm_stmt): Tweek for changed location + of the operand constraint. + + 2001-10-09 Jason Merrill + + * call.c (standard_conversion): Add bad conversion between + integers and pointers. + (convert_like_real): Don't use convert_for_initialization for bad + conversions; complain here and use cp_convert. + (build_over_call): Don't handle bad conversions specially. + (perform_implicit_conversion): Allow bad conversions. + (can_convert_arg_bad): New fn. + * cp-tree.h: Declare it. + * typeck.c (convert_for_assignment): Use it. + (ptr_reasonably_similar): Any target type is similar to void. + + 2001-10-08 Alexandre Oliva + + * Make-lang.in (CXX_OBJS): Added cp-lang.o. + (cp/cp-lang.o): New rule. + * cp-tree.h: Declare hooks. + * tree.c: Make hooks non-static. + (init_tree): Don't initialize hooks here. + * lex.c: Likewise. Move definition of lang_hooks to... + * cp-lang.c: ... new file. + + 2001-10-08 Richard Henderson + + * cp-tree.h (struct lang_decl_flags): Remove declared_inline. + (DECL_DECLARED_INLINE_P): Use the bit in struct c_lang_decl. + + 2001-10-07 Kaveh R. Ghazi + + * class.c (build_vtable_entry_ref): Const-ify. + * decl.c (predefined_identifier, + initialize_predefined_identifiers): Likewise. + * init.c (build_new_1): Likewise. + * lex.c (cplus_tree_code_type, cplus_tree_code_length, resword): + Likewise. + + 2001-10-05 Alexandre Oliva + + * optimize.c (struct inline_data): Moved to ../tree-inline.c. + (INSNS_PER_STMT): Likewise. + (remap_decl, remap_block, copy_scopy_stmt, copy_body_r): Likewise. + (copy_body, initialize_inlined_parameters): Likewise. + (declare_return_variable, inlinable_function_p): Likewise. + (expand_call_inline, expand_calls_inline): Likewise. + (optimize_inline_calls, clone_body): Likewise. + * tree.c (walk_tree): Moved to ../tree-inline.c. + (walk_tree_without_duplicates): Likewise. + (copy_tree_r, remap_save_expr): Likewise. + + 2001-10-04 Alexandre Oliva + + * Make-lang.in (cp/decl.o, cp/tree.o): Depend on tree-inline.h. + (cp/pt.o, cp/semantics.o, cp/optimize.o): Likewise. + * cp-tree.h (lang_decl): Moved inlined_fns to tree_decl. + (TREE_READONLY_DECL_P, DECL_INLINED_FNS): Moved to ../tree.h. + (flag_inline_trees): Moved declaration to ../tree-inline.h. + (walk_tree): Moved declaration to ../tree-inline.h. + (walk_tree_without_duplicates, copy_tree_r): Likewise. + (remap_save_expr): Likewise. + * decl.c: Include tree-inline.h. + (lang_mark_tree): Don't mark inlined_fns. + * decl2.c (flag_inline_trees): Moved defn to ../tree-inline.c. + * optimize.c: Include tree-inline.h. + (optimize_inline_calls): Move declaration to ../tree.h, as + non-static. + (remap_decl): Use language-independent constructs and hooks. + (remap_block, copy_body_r, declare_return_variable): Likewise. + (inlinable_function_p): Likewise. Don't test for + DECL_LANG_SPECIFIC before DECL_INLINED_FNS as inlined_fns is + no longer language-specific. + (optimize_inline_calls): Likewise. Make it non-static. Moved + call of dump_function to... + (optimize_function): Here... + (clone_body): New function, extracted from... + (maybe_clone_body): ... here. Build decl_map locally and pass + it on to clone_body. + * pt.c, semantics.c: Include tree-inline.h. + * tree.c: Likewise. + (cp_walk_subtrees): New language-specific hook for tree inlining. + (cp_cannot_inline_tree_fn, cp_add_pending_fn_decls, + cp_is_overload_p, cp_auto_var_in_fn_p, + cp_copy_res_decl_for_inlining): Likewise. + (walk_tree): Move language-specific constructs into... + (cp_walk_subtrees): this new function. + (copy_tree_r): Use language-independent constructs and hooks. + (init_tree): Initialize tree inlining hooks. + (remap_save_expr): Adjust prototype so that the declaration + does not require the definition of splay_tree. + + 2001-10-03 John David Anglin + + * rtti.c (get_tinfo_decl): Call typeinfo_in_lib_p with the type used + to build the declaration instead of the declaration itself. + + 2001-10-02 Jason Merrill + + * decl2.c (cxx_decode_option): Add 'else'. + + * spew.c (end_input): No longer static. + * cp-tree.h: Declare it. + * parse.y (datadef): Add "error END_OF_SAVED_INPUT" expansion. + + 2001-10-02 Joseph S. Myers + + * call.c (build_over_call), typeck.c (build_function_call_real): + Pass type attributes to check_function_format rather than name or + assembler name. Don't require there to be a name or assembler + name to check formats. + + 2001-10-02 Joseph S. Myers + + * decl.c (init_decl_processing): Don't call + init_function_format_info. Initialize lang_attribute_table + earlier. + (builtin_function): Call decl_attributes. + (insert_default_attributes): New. + + 2001-10-01 Jason Merrill + + * decl.c (grokdeclarator): Copy array typedef handling from C + frontend. + + * decl.c (grokdeclarator): Copy too-large array handling from C + frontend. + + 2001-09-29 Alexandre Oliva + + * config-lang.in (target_libs): Added target-gperf, so that we + don't try to build it if C++ is disabled. + + 2001-09-23 Zack Weinberg + + * Make-lang.in (CXX_OBJS): Take out cp/errfn.o. + (cp/errfn.o): Delete rule. + (cp/error.o): Depend on flags.h. + * errfn.c: Delete file. + * cp-tree.h: Declare warn_deprecated. Remove definitions of + TFF_NAMESPACE_SCOPE, TFF_CLASS_SCOPE, TFF_CHASE_NAMESPACE_ALIAS, + and TFF_TEMPLATE_DEFAULT_ARGUMENTS. #define cp_error, cp_warning, + cp_pedwarn, and cp_compiler_error to error, warning, pedwarn, and + internal_error respectively. Make cp_deprecated into a macro. + Don't define cp_printer typedef or declare cp_printers. + * error.c: Include flags.h. + Delete: struct tree_formatting_info, print_function_argument_list, + print_declaration, print_expression, print_function_declaration, + print_function_parameter, print_type_id, print_cv_qualifier_seq, + print_type_specifier_seq, print_simple_type_specifier, + print_elaborated_type_specifier, print_rest_of_abstract_declarator, + print_parameter_declaration_clause, print_exception_specification, + print_nested_name_specifier, and definition of cp_printers. + (locate_error): New function. + (cp_error_at, cp_warning_at, cp_pedwarn_at): Moved here and + rewritten in terms of locate_error and diagnostic.c. + (cp_tree_printer): Rename cp_printer; wire up to *_to_string + instead of deleted print_* routines. Handle %C, %L, %O, %Q also. + (init_error): Adjust to match. + + 2001-09-22 Richard Kenner + + * Make-lang.in (CXX_C_OBJS): Add attribs.o. + + 2001-09-21 Richard Henderson + + * class.c (set_vindex): Mind TARGET_VTABLE_USES_DESCRIPTORS. + (build_vtbl_initializer): Likewise. + (build_vfn_ref): New. + * cp-tree.h: Declare it. + * call.c (build_over_call): Use it. + * decl2.c (mark_vtable_entries): Mark FDESC_EXPR. + * typeck.c (get_member_function_from_ptrfunc): Mind descriptors. + + 2001-09-21 J"orn Rennecke + + * decl.c (grokdeclarator): Use C syntax for attr_flags declaration. + + 2001-09-21 Joseph S. Myers + + Table-driven attributes. + * decl.c: Rename DECL_MACHINE_ATTRIBUTES to DECL_ATTRIBUTES. + * decl2.c (cplus_decl_attributes): Only take one attributes + parameter. + * cp-tree.c (cplus_decl_attributes): Update prototype. + * class.c (finish_struct), decl.c (start_decl, start_function), + decl2.c (grokfield), friend.c (do_friend), parse.y + (parse_bitfield): Update calls to cplus_decl_attributes. + * decl.c (grokdeclarator): Take a pointer to a single ordinary + attribute list. + * decl.h (grokdeclarator): Update prototype. + * decl2.c (grokfield): Take a single ordinary attribute list. + * friend.c (do_friend): Likewise. + * decl.c (shadow_tag, groktypename, start_decl, + start_handler_parms, grokdeclarator, grokparms, start_function, + start_method), decl2.c (grokfield, grokbitfield, grokoptypename), + parse.y (parse_field, parse_bitfield, component_decl_1), pt.c + (process_template_parm, do_decl_instantiation): Pass single + ordinary attribute lists around. + * decl.c (grokdeclarator): Correct handling of nested attributes. + Revert the patch + 1998-10-18 Jason Merrill + * decl.c (grokdeclarator): Embedded attrs bind to the right, + not the left. + . + * cp-tree.h (cp_valid_lang_attribute): Remove declaration + (cp_attribute_table): Declare. + * decl.c (valid_lang_attribute): Don't define. + (lang_attribute_table): Define. + (init_decl_processing): Initialize lang_attribute_table instead of + valid_lang_attribute. + * tree.c (cp_valid_lang_attribute): Remove. + (handle_java_interface_attribute, handle_com_interface_attribute, + handle_init_priority_attribute): New functions. + (cp_attribute_table): New array. + * decl2.c (import_export_class): Don't use + targetm.valid_type_attribute. + + 2001-09-15 Gabriel Dos Reis + + * Make-lang.in (cp/error.o): Depend on real.h + * error.c: #include "real.h" + + 2001-09-15 Kaveh R. Ghazi + + * mangle.c (mangle_conv_op_name_for_type): Use concat in lieu of + xmalloc/strcpy/strcat. + + 2001-09-13 Kaveh R. Ghazi + + * decl.c (warn_extern_redeclared_static, cp_make_fname_decl): + Const-ification. + * pt.c (tsubst_decl): Likewise. + + 2001-09-12 Kaveh R. Ghazi + + * decl2.c (lang_f_options): Const-ification. + * lex.c (cplus_tree_code_name): Likewise. + * spew.c (yyerror): Likewise. + + 2001-09-06 Nathan Sidwell + + PR c++/3986 + * class.c (force_canonical_binfo_r): Check & move an indirect + primary base first. + (force_canonical_binfo): Check that it's not already + canonical. + (mark_primary_virtual_base): Remove BINFO parameter. + (mark_primary_bases): Adjust, set BINFO_LOST_PRIMARY_P here. + + 2001-09-06 Nathan Sidwell + + Remove TYPE_NONCOPIED_PARTS. + * cp-tree.h (CLASSTYPE_INLINE_FRIENDS): Map onto + CLASSTYPE_PURE_VIRTUALS. + (TYPE_RAISES_EXCEPTIONS): Map onto TYPE_BINFO. + * class.c (duplicate_tag_error): Remove TYPE_NONCOPIED_PARTS. + (layout_class_type): Don't call fixup_inline_methods here ... + (finish_struct_1): ... call it here. + + 2001-09-04 Mark Mitchell + + * decl.c (duplicate_decls): Remove code deadling with + DECL_SAVED_INSNS. + * decl2.c (finish_file): Likewise. + * pt.c (instantiate_decl): Likewise. + * semantics.c (expand_body): Don't defer local functions if + they wouldn't be deferred for some other reason. Don't + generate RTL for functions that will not be emitted. + (genrtl_start_function): Remove code deadling with + DECL_SAVED_INSNS. + (genrtl_finish_function): Likewise. + + 2001-09-04 Nathan Sidwell + + PR c++/4203 + * call.c (build_over_call): Do not optimize any empty base + construction. + + 2001-08-31 Kriang Lerdsuwanakij + + * error.c (dump_template_decl): Output template parameters + together with their specifiers. + Output `class' prefix for template template parameter. + (dump_decl): Fix formatting. + + 2001-08-30 Kurt Garloff + + * optimize.c (inlinable_function_p): Allow only smaller single + functions. Halve inline limit after reaching recursive limit. + + 2001-08-30 Joern Rennecke + Jason Merrill + + * class.c (build_vtable_entry_ref): Subtract in char*, not + ptrdiff_t. + + 2001-08-23 Jason Merrill + + * tree.c (cp_build_qualified_type_real): Use get_qualified_type. + (build_cplus_array_type): Use cp_build_qualified_type, not + TYPE_MAIN_VARIANT, to get an unqualified version. + + * decl2.c (grok_alignof): Lose. + (build_expr_from_tree): Use expr_sizeof and c_alignof_expr. + * typeck.c (c_alignof): Lose. + * semantics.c (finish_sizeof, finish_alignof): New. + * parse.y: Use them. + * cp-tree.h: Declare them. + + 2001-08-22 Jason Merrill + + * pt.c (tsubst_expr): Hand off to the TREE_CHAIN of a statement. + Don't loop in COMPOUND_STMT, FOR_STMT or TRY_BLOCK. + * tree.c (cp_statement_code_p): A TAG_DEFN is a statement. + + 2001-08-19 Jakub Jelinek + + * typeck2.c (add_exception_specifier): Only require complete type if + not in processing template declaration. + + 2001-08-18 Kaveh R. Ghazi + + * decl.c: Cast argument to size_t, not HOST_WIDE_INT, in calls to + GNU_xref_start_scope and GNU_xref_end_scope. + + * tree.c (TYPE_HASH): Moved to ../tree.h. + + 2001-08-16 Mark Mitchell + + * cvt.c (convert_to_void): Preserve TREE_SIDE_EFFECTS + on COMPOUND_EXPRs. + + 2001-08-14 Richard Henderson + + * class.c, cp-tree.h (build_vfn_ref): Remove. + * call.c, rtti.c: Replace all refernces with build_vtbl_ref. + + 2001-08-13 Mark Mitchell + + * call.c (build_over_call): Mark COMPOUND_EXPRs generated for + empty class assignment as having side-effects to avoid + spurious warnings. + + 2001-08-13 Zack Weinberg + + * Make-lang.in (cp/except.o): Add libfuncs.h to dependencies. + * except.c: Include libfuncs.h. + + 2001-08-11 Gabriel Dos Reis + + * decl.c (grokdeclarator): Clarify diagnostic message. + + 2001-08-13 Kriang Lerdsuwanakij + + * decl2.c (do_nonmember_using_decl): Replace using directive + with using declaration in the error message. + + 2001-08-11 Kriang Lerdsuwanakij + + * pt.c (maybe_fold_nontype_arg): Use TREE_TYPE of ARG as the + criterion to avoid rebuilding expression tree instead of + processing_template_decl. + + 2001-08-07 Jason Merrill + + Support named return value optimization for inlines, too. + * decl.c (finish_function): Nullify returns here. + * semantics.c (genrtl_start_function): Not here. + (cp_expand_stmt): Don't mess with CLEANUP_STMTs. + (nullify_returns_r): No longer static. Just clear RETURN_EXPR. + Also nullify the CLEANUP_STMT for the nrv. + * cp-tree.h: Declare it. + * optimize.c (declare_return_variable): Replace the nrv with the + return variable. + * typeck.c (check_return_expr): Be more flexible on alignment check. + Ignore cv-quals when checking for a matching type. + + 2001-08-09 Richard Henderson + + * decl2.c (finish_objects): Use target hooks instead of + assemble_constructor and assemble_destructor. + + 2001-08-08 John David Anglin + + * g++spec.c (lang_specific_driver): Quote argument after `-Xlinker'. + + 2001-08-07 Nathan Sidwell + + PR c++/3820 + Stop using TYPE_NONCOPIED_PARTS. + * call.c (build_over_call): Be careful when copy constructing + or assigning to an empty class. + * class.c (check_bases_and_members): It has a + COMPLEX_ASSIGN_REF if it has a vptr. + (layout_class_type): Don't add empty class padding to + TYPE_NONCOPIED_PARTS. + (finish_struct_1): Don't add the VFIELD either. + * cp-tree.h (TYPE_HAS_TRIVIAL_INIT_REF): Mention _copy_ + initialization. + + 2001-08-07 Jason Merrill + + * tree.c (walk_tree): Walk siblings even if !walk_subtrees. + + 2001-08-06 Richard Henderson + + * decl2.c (finish_objects): Pass a symbol_ref and priority to + assemble_{constructor,destructor}. Remove priority handling. + + 2001-08-05 Gabriel Dos Reis + + Don't allow template-id in using-declaration. + * decl2.c (validate_nonmember_using_decl): Handle template-ids. + (do_class_using_decl): Likewise. + + 2001-08-04 Neil Booth + + * cp/spew.c (read_token): No need to pop buffers. + + 2001-08-02 Stan Shebs + + * cp-tree.h (FNADDR_FROM_VTABLE_ENTRY): Remove, no longer used. + (fnaddr_from_vtable_entry): Remove decl. + * method.c (use_thunk): Update comment. + + 2001-08-01 Andrew Cagney + + * repo.c (get_base_filename): Change return value to const char + pointer. + + 2001-08-02 Nathan Sidwell + + Kill -fhonor-std. + * NEWS: Document. + * cp-tree.h (flag_honor_std): Remove. + (CPTI_FAKE_STD): Remove. + (std_node): Remove comment about it being NULL. + (fake_std_node): Remove. + * decl.c (in_fake_std): Remove. + (walk_namespaces_r): Remove fake_std_node check. + (push_namespace): Remove in_fake_std code. + (pop_namespace): Likewise. + (lookup_name_real): Remove fake_std_node check. + (init_decl_processing): Always create std_node. Always add + std:: things there. + (builtin_function): Always put non '_' fns in std. + * decl2.c (flag_honor_std): Remove. + (lang_f_options): Remove honor-std. + (unsupported_options): Add honor-std. + (set_decl_namespace): Remove fake_std_node check. + (validate_nonmember_using_decl): Likewise. + (do_using_directive): Likewise. + (handle_class_head): Likewise. + * dump.c (cp_dump_tree): Likewise. + * except.c (init_exception_processing): Adjust. + * init.c (build_member_call): Remove fake_std_node check. + (build_offset_ref): Likewise. + * lang-options.h: Remove -fhonor-std, -fno-honor-std. + * rtti.c (init_rtti_processing): Adjust. + + 2001-07-31 Alexandre Petit-Bianco + + * tree.c (cp_tree_equal): WITH_CLEANUP_EXPR node to use its second + operand while calling cp_tree_equal. + + 2001-07-31 Nathan Sidwell + + The 3.0 ABI no longer has vbase pointer fields. + * cp-tree.h (VBASE_NAME, VBASE_NAME_FORMAT, VBASE_NAME_P, + FORMAT_VBASE_NAME): Remove. + * method.c (do_build_copy_constructor): Adjust. + (do_build_assign_ref): Adjust. + * search.c (lookup_field_r): Adjust. + * typeck.c (build_component_ref): Adjust. + + The 3.0 ABI always has a vtable pointer at the start of every + polymorphic class. + * rtti.c (build_headof_sub): Remove. + (build_headof): Adjust. + (get_tinfo_decl_dynamic): No need to check flag_rtti + here. Adjust. + (create_real_tinfo_var): Explain why we need a hidden name. + + 2001-07-31 Nathan Sidwell + + PR c++/3631 + * class.c (update_vtable_entry_for_fn): The fixed adjustment + of a virtual thunk should be from declaring base. + + 2001-07-31 Nathan Sidwell + + * class.c (dfs_ctor_vtable_bases_queue_p): Always walk into + the shared virtual base, so preserving inheritance graph order. + + 2001-07-30 Andreas Jaeger + + * decl2.c: Remove unused var global_temp_name_counter. + + 2001-07-28 Richard Henderson + + * method.c (pending_inlines): Remove. + + 2001-07-27 Nathan Sidwell + + * class.c (mark_primary_virtual_base): Don't adjust base + offsets here. + (dfs_unshared_virtual_bases): Adjust them here. + (mark_primary_bases): Explain why we adjust at the end. + + 2001-07-27 Nathan Sidwell + + * class.c (finish_struct_1): When copying the primary base's + VFIELD, make sure we find it is at offset zero. + + 2001-07-26 Kriang Lerdsuwanakij + + * pt.c (tsubst_template_parms): Call maybe_fold_nontype_arg and + tsubst_expr for default template arguments. + + 2001-07-26 Nathan Sidwell + + PR c++/3621 + * spew.c (yylex): Only copy the token's lineno, if it is + nonzero. + + 2001-07-26 Nathan Sidwell + + PR c++/3624 + * call.c (resolve_args): Simplify, call + convert_from_reference. + (build_new_op): Resolve and convert from reference ARG1 + earlier. Adjust ARG2 & ARG3 resolve and conversion. + + 2001-07-26 Nathan Sidwell + + * decl.c (last_function_parm_tags): Remove. + (current_function_parm_tags): Remove. + (init_decl_processing): Adjust. + (start_function): Adjust. + (store_parm_decls): Adjust. + + PR c++/3152 + * decl.c (grokdeclarator): Detect when a function typedef is + declaring a function, and create last_function_parms correctly. + + 2001-07-25 Jason Merrill + + * call.c (joust): Only prefer a non-builtin candidate to a builtin + one if they have the same signature. + + * cvt.c (build_up_reference): Take DECL parm. Check TREE_STATIC on + it rather than toplevel_bindings_p. Give it a mangled name if static. + (convert_to_reference): Adjust. + * decl2.c (get_temp_name): Lose. + * mangle.c (mangle_ref_init_variable): New fn. + (mangle_guard_variable): Strip the ref-init header. + * cp-tree.h: Adjust. + * decl.c (cp_finish_decl): Add the DECL_STMT after processing the + initializer. + (grok_reference_init): Always use DECL_INITIAL. + + 2001-07-25 Nathan Sidwell + + PR c++/3416 + * call.c (build_conditional_expr): Recheck args after + conversions. + * cp-tree.h (build_conditional_expr): Move to correct file. + * typeck.c (decay_conversion): Diagnose any unknown types + reaching here. + (build_binary_op): Don't do initial decay or default + conversions on overloaded functions. + (build_static_cast): Don't do a decay conversion here. + + 2001-07-25 Nathan Sidwell + + PR c++/3543 + * typeck.c (condition_conversion): Resolve an OFFSET_REF. + * expr.c (cplus_expand_expr): An OFFSET_REF should never get here. + + 2001-07-25 Nathan Sidwell + + * class.c (build_vtbl_or_vbase_field): Remove, move into ... + (create_vtbl_ptr): ... here. + + 2001-07-25 Nathan Sidwell + + * class.c (build_vbase_offset_vbtl_entries): Look for + non-primary base of which we are a sub vtable. + + 2001-07-24 Phil Edwards + + * semantics.c (finish_this_expr): Remove unused code. + + 2001-07-24 Nathan Sidwell + + Simplify rtti, now we've only one ABI. + * cp-tree.h (cp_tree_index): Remove CPTI_TINFO_DECL_ID, + CPTI_TINFO_VAR_ID. + (tinfo_decl_id, tinfo_var_id): Remove. + (get_typeid_1): Remove. + * rtti.c + (init_rtti_processing): Remove tinfo_decl_id & tinfo_var_id. + (typeid_ok_p): New function. + (build_type_id): Call typeid_ok_p. Don't call tinfo_from_decl. + (get_tinfo_decl): Remove old abi documentation. + (tinfo_from_decl): Remove. + (get_type_id): Call typeid_ok_p. Absorb get_typeid_1. + (get_typeid_1): Remove. + (get_base_offset): Remove. + (synthesize_tinfo_var): Absorb get_base_offset. + (create_real_tinfo_var): Don't use tinfo_decl_id. + + 2001-07-23 Graham Stott + + * cp/class.c (type_requires_array_cookie): Fix use of uninitialized + variable has_two_argument_delete_p. + + 2001-07-21 Nathan Sidwell + + Remove flag_vtable_thunk. It is always on for the 3.0 ABI. + * cp-tree.h (CPTI_DELTA2_IDENTIFIER): Remove. + (CPTI_INDEX_IDENTIFIER): Remove. + (CPT_PFN_OR_DELTA2_IDENTIFIER): Remove. + (delta2_identifier): Remove. + (index_identifier): Remove. + (pfn_or_delta2_identifier): Remove. + (flag_vtable_thunks): Remove. + (VTABLE_DELTA2_NAME): Remove. + (VTABLE_INDEX_NAME): Remove. + (FNADDR_FROM_VTABLE_ENTRY): Adjust. + (vfunc_ptr_type_node): Adjust. + (VTABLE_NAME_PREFIX): Adjust. + (build_vfn_ref): Lose first parameter. + (fixup_all_virtual_upcast_offsets): Remove. + * decl.c (initialize_predefined_identifiers): Remove + delta2_identifier, index_identifier, pfn_or_delta2_identifier. + (init_decl_processing): Remove no-vtable-thunk code. + * decl2.c (flag_vtable_thunks): Remove. + (mark_vtable_entries): Remove no-vtable-thunk code. + * error.c (dump_decl): Remove no-vtable-thunk code. + (dump_expr): Adjust ptr to member function code. + * init.c (initialize_vtable_ptrs): Remove no-vtable-thunk + code. + * rtti.c (build_headof): Remove no-vtable-thunk code. + (get_tinfo_decl_dynamic): Adjust build_vfn_ref call. + * search.c (get_base_distance): Remove expand_upcast_fixups case. + (virtual_context) Remove. + (expand_upcast_fixups): Remove. + (fixup_virtual_upcast_offsets): Remove. + (fixup_all_virtual_upcast_offsets): Remove. + * typeck.c (get_member_function_from_ptrfunc): Remove + no-vtable-thunk code. + * call.c (build_over_call): Adjust call to build_vfn_ref. + * class.c (build_vfn_ref): Lose first parameter. Remove + no-vtable-thunk code. + (build_rtti_vtbl_entries): Remove no-vtable-thunk code. + (build_vtable_entry): Remove no-vtable-thunk code. + + 2001-07-20 Nathan Sidwell + + Remove old-abi remnants. Remove comments about old abi + behavior. Remove references to 'new-abi' in comments. + * cp-tree.h: Adjust comments. + (vbase_offsets_in_vtable_p): Delete. + (vcall_offsets_in_vtable_p): Delete. + (vptrs_present_everywhere_p): Delete. + (all_overridden_vfuns_in_vtables_p): Delete. + (merge_primary_and_secondary_vtables_p): Delete. + (TYPE_CONTAINS_VPTR_P): Adjust. + (VTT_NAME_PREFIX): Remove. + (CTOR_VTBL_NAME_PREFIX): Remove. + (init_vbase_pointers): Remove. + * class.c: Adjust coments. + (build_vbase_pointer_fields): Delete. + (build_vbase_pointer): Remove old-abi code. + (build_secondary_vtable): Likewise. + (modify_all_vtables): Likewise. + (create_vtable_ptr): Likewise. + (layout_class_type): Likewise. + (finish_struct_1): Likewise. + (finish_vtbls): Likewise. + (dfs_finish_vtbls): Delete. + (build_vbase_offset_vtbl_entries): Remove old-abi code. + * cvt.c: Adjust comments. + * decl.c: Adjust comments. + * decl2.c: Adjust comments. + * init.c: Adjust comments. + (construct_virtual_bases): Remove old-abi code. + * lang-specs.h: Remove -fno-new-abi. + * mangle.c: Adjust comments. + * rtti.c: Adjust comments. + (get_base_offset): Remove old-abi-code. + * search.c: Adjust comments. + (dfs_init_vbase_pointers): Remove. + (dfs_vtable_path_unmark): Remove. + (init_vbase_pointers): Remove. + * semantics.c: Adjust comments. + (emit_associated_thunks): Remove old-abi code. + * typeck.c: Adjust comments. + + 2001-07-20 Daniel Berlin + + * Make-lang.in (cp/optimize.o): Depend on $(PARAMS_H), not + params.h. + + 2001-07-19 Mark Mitchell + + * class.c (finish_struct_anon): Forbid nested classes. + + 2001-07-19 Neil Booth + + * decl2.c: Don't include dwarfout.h and dwarf2out.h. + * optimize.c: Include debug.h. + (maybe_clone_body): Use debug hook. + * semantics.c: Include debug.h. + (expand_body): Use debug hook. + + 2001-07-19 Neil Booth + + * spew.c (read_token, yyerror): Remove CPP_INT, CPP_FLOAT cases. + + 2001-07-18 Mark Mitchell + + * class.c (type_requires_array_cookie): New function. + (check_methods): Don't try to figure out whether the type needs a + cookie here. + (check_bases_and_members): Set TYPE_VEC_NEW_USES_COOKIE here. + * cp-tree.h (TYPE_VEC_DELETE_TAKES_SIZE): Remove. + (TYPE_VEC_NEW_USES_COOKIE): Reimplement. + * pt.c (instantiate_class_template): Don't set + TYPE_VEC_DELETE_TAKES_SIZE. + * NEWS: Document ABI changes from GCC 3.0. + + 2001-07-18 Xavier Delacour , + Gerald Pfeifer + + * NEWS (Changes in GCC 3.0): Fix typo. + + 2001-07-13 Joseph S. Myers + + * decl2.c (cplus_decl_attributes): Take a pointer to the node to + which attributes are to be attached, and a flags argument. Update + call to decl_attributes. + (grokfield): Update call to decl_attributes. + * class.c (finish_struct): Update call to cplus_decl_attributes. + * cp-tree.h (cplus_decl_attributes): Update prototype. + * decl.c (start_decl, grokdeclarator, start_function): Update + calls to decl_attributes and cplus_decl_attributes. + * friend.c (do_friend): Update call to cplus_decl_attributes. + * parse.y (parse_bitfield): Update call to cplus_decl_attributes. + + 2001-07-12 Mark Mitchell + + * decl.c (make_rtl_for_nonlocal_decl): Set DECL_C_HARD_REGISTER + for `register' variables with an asm-specification. + + 2001-07-11 Mark Mitchell + + * semantics.c (finish_asm_stmt): Mark the output operands + to an asm addressable, if necessary. + + 2001-07-11 Ben Elliston + + * Revert this change -- there is a subtle bug. + + PR c++/80 + * decl.c (finish_enum): New "attributes" argument; pass it to + cplus_decl_attributes. Use a narrower type if the enum is packed. + * cp-tree.h (finish_enum): Adjust prototype. + * parse.y (enum_head): New non-terminal. + (structsp): Use it. Enums now may be preceded or followed by + optional attributes -- pass their chained tree to finish_enum(). + * pt.c (tsubst_enum): Pass NULL_TREE for the new argument. + + 2001-07-10 Mark Mitchell + + * pt.c (tsubst_decl): Set DECL_CONTEXT for namespace-scope + variables. + + 2001-07-10 Jason Merrill + + * semantics.c (cp_expand_stmt): Fix for null + current_function_return_value. + + 2001-07-10 Jan van Male + + * call.c (build_op_delete_call): Initialize fn. + (convert_like_real): Delete conditional. + (joust): Initialize *w and *l. + * class.c: Add prototype for binfo_ctor_vtable. + (get_primary_binfo): Initialize result. + * init.c (build_java_class_ref): Initialize name. + + 2001-07-09 Erik Rozendaal + + * typeck.c (unary_complex_lvalue): Do not duplicate the + argument to modify, pre-, or post-increment when used as an + lvalue and when the argument has side-effects. + + 2001-07-08 Joseph S. Myers + + * decl.c (start_decl): Don't call SET_DEFAULT_DECL_ATTRIBUTES. + (start_function): Don't call SET_DEFAULT_DECL_ATTRIBUTES. Call + cplus_decl_attributes even if attrs is NULL. + * friend.c (do_friend): Don't call SET_DEFAULT_DECL_ATTRIBUTES. + + 2001-07-08 Joseph S. Myers + + * decl.c (grokdeclarator), decl2.c (cplus_decl_attributes): Update + calls to decl_attributes. + + 2001-07-06 Ira Ruben + + * cp-tree.def (TEMPLATE_DECL): Update comment. DECL_RESULT should + be DECL_TEMPLATE_RESULT. + + 2001-07-05 Kriang Lerdsuwanakij + + * cp-tree.h (copy_template_template_parm): Rename to ... + (bind_template_template_parm): ... here. + * tree.c (copy_template_template_parm): Rename to ... + (bind_template_template_parm): ... here. Remove the case when + NEWARGS is NULL_TREE. + (copy_tree_r): Don't copy TEMPLATE_TEMPLATE_PARM and + BOUND_TEMPLATE_TEMPLATE_PARM. + * pt.c (lookup_template_class): Adjust. + + 2001-07-05 Jason Merrill + + * cvt.c (convert_lvalue): New fn. + * cp-tree.h: Declare it. + * method.c (do_build_assign_ref): Use it. + (do_build_copy_constructor): Convert parm to base types + before calling base constructors. + + * typeck.c (check_return_expr): Check DECL_ALIGN instead of + DECL_USER_ALIGN. Check flag_elide_constructors instead of + optimize. + * semantics.c (cp_expand_stmt): Don't destroy the named return value. + + 2001-07-02 Nathan Sidwell + + * optimize.c (optimize_inline_calls): New function, broken out + of ... + (optimize_function): ... here. Call it. Don't inline if it is + a thunk. + (dump_function): Print name of dump flag causing this dump. + * semantics.c (expand_body): Move thunk inline check to + optimize_function. + + 2001-06-29 Joseph S. Myers + + * typeck.c (COMP_TYPE_ATTRIBUTES): Don't define. + (comptypes): Use target.comp_type_attributes. + + 2001-06-29 Nathan Sidwell + + * cp-tree.h (flag_dump_class_layout): Remove unneeded declaration. + + 2001-06-28 Gabriel Dos Reis + + * error.c (lang_print_error_function): Add a `diagnostic_context *' + parameter. Tweak. + + 2001-06-27 Neil Booth + + * decl2.c (import_export_class): Update. + + 2001-06-26 Gabriel Dos Reis + + * error.c (init_error): Adjust settings. + + 2001-06-26 Gabriel Dos Reis + + * error.c (init_error): Adjust settings. + + 2001-06-19 Richard Sandiford + + * except.c (initialize_handler_parm): Expect __cxa_begin_catch to + return pointers to data members by reference rather than by value. + + 2001-06-18 Jason Merrill + + Implement the Named Return Value optimization. + * cp-tree.h (struct cp_language_function): Add x_return_value. + (current_function_return_value): Now a macro. + * decl.c: Don't define it. + (define_label, finish_case_label): Don't clear it. + (init_decl_processing): Don't register it with GC. + * semantics.c (genrtl_finish_function): Don't check it for + no_return_label. Copy the RTL from the return value to + current_function_return_value and walk, calling... + (nullify_returns_r): ...this new fn. + * typeck.c (check_return_expr): Set current_function_return_value. + + 2001-06-15 Jason Merrill + + * class.c (dfs_accumulate_vtbl_inits): Just point to the base we're + sharing a ctor vtable with. Merge code for cases 1 and 2. + (binfo_ctor_vtable): New fn. + (build_vtt_inits, dfs_build_secondary_vptr_vtt_inits): Use it. + + 2001-06-14 Jason Merrill + + * class.c (dfs_find_final_overrider): Fix logic. + + * class.c (update_vtable_entry_for_fn): Uncomment optimization to use + virtual thunk instead of non-virtual. + (get_matching_virtual): Uncomment. + + * pt.c (unify): Don't recurse between the POINTER_TYPE and the + OFFSET_TYPE. If we're adding cv-quals, the extra ones would be on + PARM, not ARG. + + 2001-06-14 Nathan Sidwell + + * class.c (dfs_accumulate_vtbl_inits): For case 2 & 3, make sure + we've not emerged from the hierarchy of RTTI_BINFO on reaching + a non-virtual base. + + 2001-06-13 Mark Mitchell + + * NEWS: Update release number. + + 2001-06-12 Nathan Sidwell + + PR c++/3130, c++/3131, c++/3132 + * cp-tree.h (BINFO_UNSHARED_MARKED): New #define. + * class.c (force_canonical_binfo_r): Move + BINFO_UNSHARED_MARKED, BINFO_LOST_PRIMARY_P. Don't move + virtual bases unless they're primary and what they're primary + too has been moved. + (dfs_unshared_virtual_bases): Use BINFO_UNSHARED_MARKED. Cope + with morally virtual bases. Duplicate BINFO_LOST_PRIMARY_P and + BINFO_PRIMARY_BASE_OF. Clear BINFO_VTABLE for all but the most + derived binfo. + (mark_primary_bases): Use BINFO_UNSHARED_MARKED. + (layout_nonempty_base_or_field): Add most derived type + parameter. Adjust. + (layout_empty_base): Likewise. + (build_base_field): Likewise. + (build_base_fields): Likewise. + (propagate_binfo_offsets): Add most derived type + parameter. Skip non canonical virtual bases too. + (dfs_set_offset_for_unshared_vbases): Don't skip primary + bases. Do skip canonical bases. + (layout_virtual_bases): Adjust. + (layout_class_type): Adjust. + (dfs_get_primary_binfo): Build list of virtual primary base + candidates. + (get_primary_binfo): Check that the shared virtual primary + base candidate was found first. + (accumulate_vtbl_inits): Don't do anything for non-vptr + containing binfos. For case 1 primary virtual bases, keep + checking that we've not emerged from the hierarchy of RTTI_BINFO. + + 2001-06-12 Nathan Sidwell + + PR c++/3089 + * class.c (dfs_accumulate_vtbl_inits): Always walk down the + hierarchy looking for primary bases for a ctor + vtable. Recursively call oneself, if we meet our primary via + this route and haven't met it yet via inheritance graph order. + + 2001-06-11 Mark Mitchell + + * lang-options.h: Emit documentation for -fno-honor-std, not + -fhonor-std. + + 2001-06-10 Alexandre Oliva + + * typeck.c (get_member_function_from_ptrfunc) [vbit_in_delta]: + Don't clobber delta. + (expand_ptrmemfunc_cst) [ptrmemfunc_vbit_in_delta]: Adjust pfn. + + 2001-06-10 Mark Mitchell + Gabriel Dos Reis + + * Make-lang.in (cp/call.o): Depend on diagnostic.h + (cp/typeck.o): Depend on diagnostic.h + (cp/typeck2.o): Depend on diagnostic.h + (cp/repo.o): Depend on dignostic.h + * typeck.c: #include diagnostic.h + (convert_for_initialization): Remove extern declaration for + warningcount and errorcount. + + * call.c: #include diagnostic.h + (convert_like_real): Remove extern declaration for warnincount and + errorcount. + + * repo.c: #include diagnostic.h + * typeck2.c: #include diagnostic.h + + 2001-06-08 Nathan Sidwell + + * decl.c (duplicate_decls): Fix DECL_TEMPLATE_RESULT thinko + in previous change. + + 2001-06-08 Nathan Sidwell + + PR c++/2929 + * friend.c (do_friend): Use push_decl_namespace for classes at + namespace scope. + + 2001-06-08 Nathan Sidwell + Jason Merrill + + PR c++/3061 + * class.c (build_secondary_vtable): Use assert, rather than an error + message. + (dfs_fixup_binfo_vtbls): BINFO_VTABLE might be NULL. + (dfs_accumulate_vtbl_inits): A lost primary virtual base may + be between ORIG_BINFO and RTTI_BINFO, but neither of them. + Don't set BINFO_VTABLE for a primary virtual base. + + 2001-06-07 Mark Mitchell + + * decl.c (duplicate_decls): Update source position information + when a template function is defined. + + 2001-06-07 Phil Edwards + + * lang-specs.h: Move -D_GNU_SOURCE to config/linux.h. + + 2001-06-07 Nathan Sidwell + + PR c++/2914 + * decl.c (pushtag): Don't push into a complete type's scope. + + 2001-06-06 Jason Merrill + + * cp-tree.h (THUNK_GENERATE_WITH_VTABLE_P): Lose. + (struct lang_decl_flags): Lose generate_with_vtable_p. + (BV_GENERATE_THUNK_WITH_VTABLE_P): Lose. + * class.c (copy_virtuals): Adjust. + * decl2.c (mark_vtable_entries): Adjust. + * method.c (make_thunk, build_vtable_entry): Adjust. + * class.c (update_vtable_entry_for_fn): Only look as far as the + first defining class. + (build_vtbl_initializer): Put nothing in the slot for a function only + defined in a lost primary virtual base. + (add_vcall_offset_vtbl_entries_1): Use the same code for + the lost primary case and the normal case. + (dfs_unshared_virtual_bases): Don't lose a non-virtual primary base. + (get_vfield_offset, get_derived_offset): Lose. + (dfs_find_final_overrider): Use look_for_overrides_here. + (get_matching_virtual): New fn. + * semantics.c (emit_associated_thunks): Check BV_USE_VCALL_INDEX_P, + not BV_VCALL_INDEX. + * search.c (look_for_overrides_here): Split out from... + (look_for_overrides_r): Here. + + * class.c (find_final_overrider): Return error_mark_node on error. + + * decl2.c (key_method): #if 0 accidental change. + + 2001-06-06 John David Anglin + + * call.c (convert_default_arg): Use INTEGRAL_TYPE_P. + (build_over_call): Likewise. + * decl.c (grokparms): Likewise. + * pt.c (tsubst_decl): Likewise. + * typeck.c (convert_arguments): Likewise. + + 2001-06-05 Mark Mitchell + + * semantics.c (begin_class_definition): Robustify. + + * pt.c (instantiate_decl): Tell the repository code about the + clones, not the cloned functions. + * repo.c (repo_template_used): Explicitly instantiate the cloned + function, not the clones. + + 2001-06-05 Nathan Sidwell + + * call.c (build_user_type_conversion_1): Set ICS_USER_FLAG and + ICS_BAD_FLAG on created conversion. + (compare_ics): Break out rank. + + 2001-06-05 Nathan Sidwell + + * decl.c (xref_tag): Remove extraneous %s on dependent name + lookup warning. + + 2001-06-05 Nathan Sidwell + + * class.c (layout_vtable_decl): Fix off by one error on + build_index_type. + (build_vtt): Likewise. + (build_ctor_vtbl_group): Likewise. + + 2001-06-05 Nathan Sidwell + + * class.c (maybe_indent_hierarchy): New function. + (dump_class_hierarchy_r): Add flags. Dump extra binfo + information, if enabled. Use maybe_indent_hierarchy. Adjust + output format. + (dump_class_hierarchy): Adjust prototype. Adjust output format. + (dump_array, dump_vtable, dump_vtt): New functions. + (finish_struct_1): Adjust hierarchy dumping. + (initialize_vtable): Call dump_vtable. + (build_vtt): Call dump_vtt. + (build_ctor_vtbl_group): Call dump_vtable. + * decl2.c (flag_dump_class_layout): Remove. + (cxx_decode_option): Remove dump translation unit + and dump class hierarchy check. Call dump_switch_p. + (finish_file): Adjust dumping. + (dump.c): Only dump base classes if not TDF_SLIM. + Only dump namespace members if not TDF_SLIM. + * optimize.c (dump_function): New function. + (optimize_function): Call dump_function. + * semantics.c (expand_body): Use dump_enabled_p. + + 2001-06-01 Nathan Sidwell + + PR g++/2936 + Part missed from first commit + * decl2.c (finish_anon_union): Copy context. + + 2001-05-30 Nathan Sidwell + + PR g++/2936 + * optimize.c (remap_decl): Remap anonymous aggregate members too. + + 2001-05-26 Nathan Sidwell + + PR g++/2823 + * semantics.c (expand_body): Don't optimize thunks. + + 2001-05-25 Sam TH + + * cp-tree.h lex.h: Fix header include guards. + + 2001-05-25 Mark Mitchell + + * decl.c (init_decl_processing): Tweak. + + 2001-05-24 Mark Mitchell + + * decl.c (duplicate_decls): Tidy. + (init_decl_processing): Always set flag_no_builtin. + + 2001-05-24 Nathan Sidwell + + PR c++/2184 + * decl2.c (do_local_using_decl): Push the decls, even in a + template. + + 2001-05-22 Mark Mitchell + + * optimize.c (initialize_inlined_parameters): Don't set + TREE_READONLY for a VAR_DECL taking the place of an inlined + PARM_DECL. + + 2001-05-22 Jason Merrill + + * class.c, cp-tree.h, rtti.c: Remove com_interface attribute support. + * tree.c (cp_valid_lang_attribute): Warn about use of com_interface + attribute. + + 2001-05-22 Joseph S. Myers + + * parse.y: Refer to compound literals as such, not as + constructor-expressions. + + 2001-05-21 Mark Mitchell + + * call.c (build_op_delete_call): Ignore exception-specifications + when looking for matching delete operators. + * init.c (build_new_1): Compute whether or not the allocation + function used is a placement allocation function or not, and + communicate this information to build_op_delete_call. + + 2001-05-21 Jason Merrill + + * class.c (build_vtable_entry_ref): Lose vtbl parm. Fix for new abi. + (build_vtbl_ref): Adjust. + (dfs_accumulate_vtbl_inits): Set TREE_CONSTANT on the vtable address. + * decl2.c (lang_f_options): Remove huge-objects, vtable-thunks. + Re-add vtable-gc. + (unsupported_options): Correspondingly. + + * decl2.c (maybe_make_one_only): Check flag_weak, not + supports_one_only(). + + * cp-tree.def (START_CATCH_STMT): Lose. + * dump.c (cp_dump_tree): Don't dump it. Do dump HANDLER_PARMS. + * tree.c (cp_statement_code_p): Don't case it. + * semantics.c (cp_expand_stmt): Likewise. + * cp-tree.h (START_CATCH_TYPE): Lose. + (HANDLER_TYPE): New. + * except.c (expand_start_catch_block): Don't start any blocks. + Return the type. + (expand_end_catch_block): Don't end any blocks. + * parse.y (handler): Don't pass anything from finish_handler_parms + to finish_handler. + * pt.c (tsubst_expr): Likewise. + * semantics.c (begin_handler): Call note_level_for_catch here. + (finish_handler_parms): Don't return anything. + (genrtl_catch_block, begin_catch_block): Lose. + (genrtl_handler): Call expand_start_catch here. + + 2001-05-18 Jason Merrill + + * class.c (build_vtable): Set DECL_ASSEMBLER_NAME for vtables here. + (get_vtable_decl, build_vtt): Not here. + + 2001-05-20 Nathan Sidwell + + PR c++/2781 + * optimize.c (update_cloned_parm): Copy addressability and other + flags. + + 2001-05-20 Kriang Lerdsuwanakij + + * pt.c (determine_specialization): Ignore artificial functions. + + 2001-05-20 Neil Booth + + * cp-tree.h (struct lang_identifier, C_RID_YYCODE): Update. + (C_RID_CODE): Remove. + * lex.c (cxx_init_options): Call set_identifier_size. Update. + (init_parse): Don't do it here. + + 2001-05-18 Diego Novillo + + * decl2.c (finish_objects): Use the original SYMBOL_REF from the + function declaration to avoid stripping the symbol's attributes. + + 2001-05-18 Nathan Sidwell + + * decl.c (pushdecl): Adjust error string. + (xref_tag): Adjust friend class injection warning. Remove the + inherited name from the class shadowed scope. + + 2001-05-17 Mark Mitchell + + * except.c (cp_protect_cleanup_actions): New function. + (init_exception_processing): Don't set protect_cleanup_actions + here. Do set lang_protect_cleanup_actions. + + 2001-05-16 Nathan Sidwell + + * spew.c (read_token): Call yyerror on all unexpected tokens. + + 2001-05-16 Nathan Sidwell + + * init.c (member_init_ok_or_else): Take a tree rather than + string for name. + (expand_member_init): Adjust. + + 2001-05-14 Nick Clifton + + * decl.c (duplicate_decls): Suppress warning about duplicate + decls if the first decl is a friend. + + 2001-05-12 Zack Weinberg + + * except.c (choose_personality_routine): Export. Add + explanatory comment. Take an enum languages, not a boolean. + (initialize_handler_parm): Adjust to match. + * cp-tree.h: Prototype choose_personality_routine. + * lex.c (handle_pragma_java_exceptions): New function. + (init_cp_pragma): Register #pragma GCC java_exceptions. + + 2001-05-12 Neil Booth + + * method.c (build_mangled_C99_name): Remove unused prototype. + + 2001-05-12 Alexandre Oliva + + * cp-tree.h (ptrmemfunc_vbit_where_t): Declare type. + * typeck.c (get_member_function_from_ptrfunc, + build_ptrmemfunc, expand_ptrmemfunc_cst): Take + TARGET_PTRMEMFUNC_VBIT_LOCATION into account. + + Reverted Geoff Keating's 2001-05-03's patch. + + 2001-05-11 Ira Ruben + + * cp/cp-tree.h (C_EXP_ORIGINAL_CODE): Delete; declared in c-common.h. + + 2001-05-11 Neil Booth + + * cp-tree.h (finish_label_expr, lookup_label): Delete. + * parse.y: Update for '&&'; don't issue warning here. + * semantics.c (finish_label_expr): Delete. + + 2001-05-07 Mark Mitchell + + * splay-tree.h (splay_tree_max): New function. + (splay_tree_min): Likewise. + + 2001-05-03 Geoffrey Keating + + * cp-tree.h (enum cp_tree_index): Add CPTI_PFN_VFLAG_IDENTIFIER. + (pfn_vflag_identifier): Define. + Update comment about layout of pointer functions. + (build_ptrmemfunc1): Update prototype. + (expand_ptrmemfunc_cst): Update prototype. + * decl.c (initialize_predefined_identifiers): Initialize + pfn_vflag_identifier. + (build_ptrmemfunc_type): When FUNCTION_BOUNDARY < 16, add + an extra field to the type. + * expr.c (cplus_expand_constant): Pass 'flag' between + expand_ptrmemfunc_cst and build_ptrmemfunc1. + * typeck.c (get_member_function_from_ptrfunc): When + FUNCTION_BOUNDARY < 16, look at additional field to determine + if a pointer-to-member is a real pointer or a vtable offset. + (build_ptrmemfunc1): Add new parameter to contain extra field. + (build_ptrmemfunc): Pass the extra field around. + (expand_ptrmemfunc_cst): Add new parameter to return extra field. + (pfn_from_ptrmemfunc): Ignore the extra field. + + 2001-05-03 Mark Mitchell + + * cp-tree.h (flag_inline_trees): Update documentation. + * decl.c (init_decl_processing): Adjust handling of + flag_inline_functions and flag_inline_trees to support -O3. + (grokfndecl): Set DECL_INLINE on all functions if that's what + the user requested. + (save_function_data): Clear DECL_INLINE in + current_function_cannot_inline is non-NULL. + * decl2.c (flag_inline_trees): Update documentation. + + 2001-05-03 Nathan Sidwell + + * dump.c (cp_dump_tree, USING_STMT case): New case. + * tree.c (cp_statement_code_p): Add USING_STMT. + * decl2.c (do_using_directive): Add the using directive statement. + + * tree.c (walk_tree): Reformat an if block. + + 2001-05-02 Mark Mitchell + + * decl.c (compute_array_index_type): Don't try to do anything with + the indices when processing a template. + + 2001-05-02 Kaveh R. Ghazi + + * call.c: NULL_PTR -> NULL. + * class.c: Likewise. + * cvt.c: Likewise. + * decl.c: Likewise. + * decl2.c: Likewise. + * except.c: Likewise. + * init.c: Likewise. + * rtti.c: Likewise. + * search.c: Likewise. + * tree.c: Likewise. + * typeck.c: Likewise. + * typeck2.c: Likewise. + + 2001-05-02 Mark Mitchell + + * decl2.c (do_using_directive): Revert previous patch. + + 2001-05-01 Nathan Sidwell + + * cp-tree.def (USING_STMT): New statement node. + * cp-tree.h (USING_STMT_NAMESPACE): New macro. + * decl2.c (do_using_directive): Add USING_STMT to statement + tree. Don't emit errors when processing template decl. + * pt.c (tsubst_expr, USING_STMT case): New case. + * semantics.c (cp_expand_stmt, USING_STMT case): New case. + + 2001-05-01 Nathan Sidwell + + * call.c (build_new_op): Convert args from reference here. + (build_conditional_expr): Don't convert here. + + 2001-05-01 Nathan Sidwell + + * spew.c (last_token_id): New static variable. + (read_token): Set it here. + (yyerror): Use it here. + + 2001-04-30 Richard Henderson + + * cvt.c: Downcase C_PROMOTING_INTEGER_TYPE_P invocations. + * decl.c: Likewise. + + 2001-04-30 Mark Mitchell + + * gxxint.texi: Remove. + * Make-lang.in: Remove all traces of gxxint.texi. + + 2001-04-30 Mark P Mitchell + + * decl2.c (start_static_initialization_or_destruction): Correct + logic to handle the -fno-use-cxa-atexit case. + + 2001-04-30 Mark Mitchell + + * optimize.c (update_cloned_parm): New function. + (maybe_clone_body): Use it. Update the `this' parameter too. + + 2001-04-29 Joseph S. Myers + + * decl2.c (unsupported_options): Add new-abi. + * lang-options.h: Remove no longer supported options. + + 2001-04-27 Nathan Sidwell + + * except.c (can_convert_eh): Don't check template parms, + typename types etc. + + 2001-04-27 Nathan Sidwell + + * optimize.c (maybe_clone_body): Copy parameter names and locations. + + 2001-04-27 Nathan Sidwell + + * cp-tree.h (adjust_clone_args): Prototype new function. + * class.c (adjust_clone_args): New function. + * decl.c (start_function): Call it for in charge ctors. + + 2001-04-26 Mark Mitchell + + * method.c (use_thunk): Make sure that thunks really are emitted + when requested. + + 2001-04-26 Nathan Sidwell + + * mangle.c (write_chars): New macro. + (hwint_to_ascii): New function + (write_number): Use it. + (write_integer_cst): Deal with really big numbers. + + 2001-04-25 Mark Mitchell + + * optimize.c (maybe_clone_body): Copy TREE_PUBLIC before emitting + the clone. + + 2001-04-25 Nathan Sidwell + + * decl.c (grokdeclarator): Set context of namespace scope + TYPE_DECLS. + + 2001-04-24 Zack Weinberg + + * cp/optimize.c: Include hashtab.h. + (struct inline_data): Add tree_pruner. + (expand_call_inline, expand_calls_inline): Use it when calling + walk_tree. + (optimize_function): Initialize and free tree_pruner. + + 2001-04-24 Nathan Sidwell + + Lazy __FUNCTION__ generation. + * cp-tree.def (FUNCTION_NAME): Remove. + * cp-tree.h (function_name_declared_p): Remove. + (cp_fname_init): Prototype. + * decl.c (init_decl_processing): Don't generate __FUNCTION__ et al ids, + don't call declare_function_name. Call start_fname_decls. + (cp_make_fname_decl): Adjust parameters. Generate the name. Don't + clobber the line number. + (cp_fname_init): New function. + (start_function): Call start_fname_decls. + (finish_function): Call finish_fname_decls. + * lex.c (reswords): Add slots for __FUNCTION__ et al. + (rid_to_yy): Add mappings for __FUNCTION__ et al. + * optimize.c (maybe_clone_body): Remove function_name_declared_p. + * parse.y (VAR_FUNC_NAME): New token. + (primary): Add VAR_FUNC_NAME. + * pt.c (tsubst_decl): Adjust a DECL_PRETTY_FUNCTION_P's + generation. + (tsubst, FUNCTION_NAME case): Remove. + (tsubst_copy, FUNCTION_NAME case): Remove. + (tsubst_expr, DECL_STMT case): Be careful with a + DECL_PRETTY_FUNCTION_P. + (instantiate_decl): Remove function_name_declared_p. + * semantics.c (begin_compound_statement): Don't call + declare_function_name here. + (setup_vtbl_ptr). Don't save & restore function_name_declared_p. + (finish_translation_unit): Call finish_fname_decls. + (expand_body): Remove function_name_declared_p. + * typeck2.c (digest_init): Allow any ERROR_MARK. + + 2001-04-24 Nathan Sidwell + + * pt.c (tsubst_decl): Use VOID_TYPE_P. + * semantics.c: Fix some typos. + + 2001-04-23 Phil Edwards + + * cp/decl2.c (flag_honor_std): Always initialize to 1. + + 2001-04-22 Kaveh R. Ghazi + + * xref.c (GNU_xref_file): Use concat in lieu of xmalloc/sprintf. + + 2001-04-23 Jason Merrill + + * except.c (build_throw): Wrap the initialization of the exception + object in a MUST_NOT_THROW_EXPR. + (do_free_exception): #if 0. + + 2001-04-20 Mark Mitchell + + * cp-tree.h (finish_enum): Change prototype. + * decl.c (finish_enum): Reorganize. + * parse.y (structsp): Adjust calls to finish_enum. + + 2001-04-20 Nathan Sidwell + + * tree.c (cp_tree_equal): Adjust final switch formatting. Add + 't' case. + + 2001-04-20 Nathan Sidwell + + * class.c (dfs_unshared_virtual_bases): Add ATTRIBUTE_UNUSED. + (layout_empty_base): Return at end flag. + (build_base_field): Likewise. + (build_base_fields): Likewise. + (layout_virtual_bases): Don't add 1 to eoc value. + (end_of_class): Use full size for empty bases. + (layout_class_type): Clear CLASSNEARLY_EMPTY_P if we appended + empty bases. Don't add 1 to eoc value. Only add trailing padding + if we're an empty class with no empty bases. + (dump_class_hierarchy): Dump size and alignment. + + 2001-04-20 Jakub Jelinek + + * call.c (maybe_handle_ref_bind): Copy ICS_USER_FLAG and + ICS_BAD_FLAG. + + 2001-04-20 Jakub Jelinek + + * search.c (lookup_field_r): If looking for type and non-TYPE_DECL + is found, look first if name does not match the structure name. + + 2001-04-19 Mark Mitchell + + * cp-tree.h (DECL_LANGUAGE): Don't assume DECL_LANG_SPECIFIC is + set. + (SET_DECL_LANGUAGE): New macro. + * decl.c (duplicate_decls): Use SET_DECL_LANGUAGE. + (pushdecl): Likewise. + (build_library_fn_1): Likewise. + (build_cp_library_fn): Likewise. + (grokfndecl): Likewise. + (grokvardecl): Mark `extern "C"' variables as having C linkage. + * decl2.c (grokclassfn): Use SET_DECL_LANGUAGE. + * lex.c (retrofit_lang_decl): Likewise. + * mangle.c (mangle_decl_string): Don't mangle the names of + variables declared with C language linkage. + * semantics.c (finish_member_declaration): Use SET_DECL_LANGUAGE. + + 2001-04-18 John David Anglin + + * semantics.c (simplify_aggr_init_exprs_r): Don't restore + flag_access_control from uninitialized storage. + + 2001-04-15 Mark Mitchell + + * cp-tree.h (TYPE_PTRMEM_CLASS_TYPE): Improve documentation. + * mangle.c (write_pointer_to_member_type): Fix mangling of + pointers to cv-qualified member function types. + + * init.c (build_delete): Create a SAVE_EXPR for the address if + we're going to use it more than once. + + 2001-04-13 Mark Mitchell + + * cp-tree.h (DELTA2_FROM_PTRMEMFUNC): Remove. + (expand_ptremfunc_cst): Change prototype. + (delta2_from_ptrmemfunc): Remove. + * expr.c (cplus_expand_constant): Adjust call to + expand_ptrmemfunc_cst. + * typeck.c (build_ptrmemfunc1): Simplify. + (build_ptrmemfunc): Make sure that casting a PTRMEM_CST still + results in a constant. + (expand_ptrmemfunc_cst): Remove idx and delta2 parameters. + (delta2_from_ptrmemfunc): Remove. + (pfn_from_ptrmemfunc): Adjust call to expand_ptrmemfunc_cst. + + 2001-04-12 Jason Merrill + + * cp-tree.h (decl_namespace_list): New macro. + (struct saved_scope): Add decl_ns_list. + * decl.c (mark_saved_scope): Mark it. + * decl2.c: Lose static decl_namespace_list. + (init_decl2): Don't save it. + + 2001-04-12 Kaveh R. Ghazi + + * cp-tree.h (warn_return_type, yylex): Delete redundant + declarations. + + * decl.c (current_class_depth, global_namespace): Likewise. + + * decl2.c (current_class_depth, flag_gnu_xref): Likewise + + * repo.c (flag_use_repository): Likewise. + + 2001-04-12 Kaveh R. Ghazi + + * cp-tree.h (pedantic, convert, global_bindings_p, insert_block, + set_block, pushdecl, getdecls, gettags, init_decl_processing, + maybe_build_cleanup, copy_lang_decl, prep_stmt, lvalue_p, + lvalue_or_else, print_lang_statistics, comp_target_types, + unsigned_type, signed_type, signed_or_unsigned_type, + build_function_call, mark_addressable, incomplete_type_error): + Delete redundant declarations. + + 2001-04-11 Jason Merrill + + * cp-tree.h (TYPE_LINKAGE_IDENTIFIER): New macro. + (TYPE_ANONYMOUS_P): New macro. + (TAGGED_TYPE_P): New macro. + * decl.c (check_tag_decl): Use TYPE_ANONYMOUS_P. + (grokfndecl, grokvardecl, grokdeclarator): Likewise. + * tree.c (no_linkage_helper): Likewise. + * semantics.c (begin_class_definition): Likewise. + * pt.c (convert_template_argument): Likewise. + * lex.c (check_for_missing_semicolon): Likewise. + + 2001-04-12 Nathan Sidwell + + * class.c (dfs_unshared_virtual_bases): New function. + (mark_primary_bases): Call it. + (check_bases): Ignore virtual bases when determining + nearly-emptiness. + + 2001-04-12 Nathan Sidwell + + * method.c (make_thunk): Clear DECL_CLONED_FUNCTION. + + 2001-04-11 Mark Mitchell + + * optimize.c (maybe_clone_body): Copy DECL_NUM_STMTS from the + cloned function to the clone. + + 2001-04-11 Kaveh R. Ghazi + + * Make-lang.in (cp/semantics.o): Depend on $(EXPR_H). + + * semantics.c: Include expr.h. + + 2001-04-11 Nathan Sidwell + + * method.c (implicitly_declare_fn): Commonize code for copy ctor + and assignment op. Set TREE_USED for parameter. + + 2001-04-10 Mark Mitchell + + * class.c (find_final_overrider_data): Add `candidates'. + (dfs_find_final_overrider): Don't issue error messages + prematurely. + (find_final_overrider): Issue error messages here. + (build_base_field): Don't warn about amgibuous direct bases here. + (warn_about_ambiguous_direct_bases): New function. + (layout_class_type): Use it. + + 2001-04-10 Richard Henderson + + * typeck.c (build_array_ref): Push the array reference inside + COMPOUND_EXPR and COND_EXPR. + + 2001-04-05 Mark Mitchell + + * cp-tree.h (DECL_THIS_INLINE): Rename to DECL_DECLARED_INLINE_P. + * decl.c (duplicate_decls): Adjust accordingly. + (maybe_commonize_var): Likewise. + (grokfndecl): Likewise. + (start_function): Likewise. + (start_method): Likewise. + * decl2.c (key_method): Likewise. + (import_export_decl): Likewise. + * method.c (implicitly_declare_fn): Likewise. + * optimize.c (maybe_clone_body): Likewise. + + 2001-04-05 Benjamin Kosnik + + * lang-specs.h: Add __DEPRECATED. + + 2001-04-05 J"orn Rennecke + + * search.c (get_dynamic_cast_base_type): When building a new + constant, set its type to ssizetype. + + 2001-04-04 Jakub Jelinek + + * optimize.c (expand_call_inline): Only add newly inlined statements + into inlined_stmts. + + 2001-04-03 Mark Mitchell + + * cp-tree.h (OPERATOR_ASSIGN_FORMAT): Remove. + (OPERATOR_FORMAT): Likewise. + (OPERATOR_TYPENAME_FORMAT): Likewise. + * operators.def: Remove old name-mangling information. + * decl.c (grok_op_properties): Adjust accordingly. + * lex.c (init_operators): Likewise. + * rtti.c (get_tinfo_decl): Issue error messages about types that + have variable size. + + 2001-04-03 Mark Mitchell + + * decl2.c (import_export_decl): Don't call import_export_class + when processing an inline member function. + * semantics.c (expand_body): Call import_export_decl before + emitting inline functions. + + 2001-03-28 Richard Henderson + + IA-64 ABI Exception Handling: + * cp-tree.def (EH_SPEC_BLOCK): New. + (MUST_NOT_THROW_EXPR): New. + * cp-tree.h: Update changed function declarations. + (CPTI_PUSH_EXCEPTION_IDENTIFIER): Remove. + (CPTI_CALL_UNEXPECTED): New. + (struct cp_language_function): Rename x_eh_spec_try_block + to x_eh_spec_block. + (EH_SPEC_STMTS, EH_SPEC_RAISES): New. + * decl.c (current_binding_level): If no current function + bindings, revert to scope_chain. + (initialize_predefined_identifiers): Remove __cp_push_exception. + (store_parm_decls): Use begin_eh_spec_block. + (finish_function): Use finish_eh_spec_block. + (mark_lang_function): Update for name changes. + * decl2.c (finish_file): No mark_all_runtime_matches. + * dump.c (cp_dump_tree): Handle new tree codes. + * error.c (dump_expr) [BIND_EXPR]: Fix typo. + * except.c (catch_language_init, catch_language): Remove. + (init_exception_processing): Don't set language code. + Initialize call_unexpected_node, protect_cleanup_actions, + eh_personality_libfunc, lang_eh_runtime_type. + (call_eh_info, push_eh_info, get_eh_info, get_eh_value): Remove. + (get_eh_type, get_eh_caught, get_eh_handlers): Remove. + (prepare_eh_type): Split out type canonicalizations ... + (build_eh_type_type): ... from here. + (build_eh_type_type_ref): Remove. + (mark_all_runtime_matches): Remove. + (build_exc_ptr): New. + (do_begin_catch, do_end_catch): New. + (do_pop_exception): Remove. + (build_terminate_handler): Remove. + (choose_personality_routine): Split out language choice from ... + (initialize_handler_parm): ... here. + Use MUST_NOT_THROW_EXPR. + (expand_start_catch_block): Use do_begin_catch. Simplify Java + exception object handling. + (expand_start_eh_spec, expand_end_eh_spec): Remove. + (expand_exception_blocks, alloc_eh_object): Remove. + (begin_eh_spec_block, finish_eh_spec_block): New. + (do_allocate_exception, do_free_exception): New. + (expand_throw): Merge into ... + (build_throw): ... here. Update for abi. + * expr.c (cplus_expand_expr): No expand_internal_throw. + Handle MUST_NOT_THROW_EXPR. + * pt.c (tsubst_expr): Handle EH_SPEC_BLOCK. + * semantics.c (*) Update for except.h name changes. + (genrtl_try_block): No protect_with_terminate. + (genrtl_eh_spec_block): New. + (genrtl_handler): Don't emit the goto here. + (cp_expand_stmt): Handle EH_SPEC_BLOCK. + (genrtl_finish_function): Don't expand_exception_blocks. + * tree.c (cp_statement_code_p): Handle EH_SPEC_BLOCK. + + 2001-03-28 Richard Henderson + + * decl.c (struct named_label_list): Rename eh_region to + in_try_scope, add in_catch_scope. + (struct binding_level): Rename eh_region to is_try_scope, + add is_catch_scope. + (note_level_for_try): Rename from note_level_for_eh. + (note_level_for_catch): New. + (poplevel): Copy both is_try_scope and is_catch_scope to + the named_label_list struct. + (check_previous_goto_1): Don't check for catch block via + DECL_ARTIFICIAL; use in_try_scope instead. + (check_goto): Likewise. + * cp-tree.h (note_level_for_try, note_level_for_catch): Declare. + * except.c (expand_start_catch_block): Call note_level_for_catch. + * semantics.c (begin_compound_stmt): Update for note_level_for_try. + + 2001-03-27 Richard Henderson + + * except.c: Use USING_SJLJ_EXCEPTIONS instead of + exceptions_via_longjmp. + + 2001-03-27 Phil Edwards + + * pt.c (check_default_tmpl_args): Make error messages clearer. + + 2001-03-26 Phil Edwards + + * error.c: Also undefine 'A' macro used for cp_printers definition. + + 2001-03-27 Kaveh R. Ghazi + + * Make-lang.in: Depend on $(SYSTEM_H), not system.h. + + 2001-03-26 Mike Yang + Mark Mitchell + + * dump.c (dump_access): New function. + (cp_dump_tree): Use it. Dump basetype information for class + types. + + 2001-03-26 Mark Mitchell + + * Makefile.in (optimize.o): Depend on params.h. + (duplicate_decls): Copy DECL_NUM_STMTS, not DECL_FRAME_SIZE. + (init_decl_processing): Set flag_no_inline when doing + inlining-on-trees. + * optimize.c: Include params.h. + (struct inline_data): Improve documentation of FNS. Add + FIRST_INLINED_FN, INLINED_STMTS, and CLONING_P. + (INSNS_PER_STMT): New macro. + (remap_block): Use CLONING_P. + (inlinable_function_p): Don't inline big functions. + (expand_call_inline): Keep track of how much inlining we've done. + (optimize_function): Set FIRST_INLINED_FN. + (maybe_clone_body): Set CLONING_P. + * semantics.c (simplify_aggr_init_exprs_r): Fix typing problems in + tree nodes. + (genrtl_finish_function): Clear DECL_DEFER_OUTPUT before calling + rest_of_compilation. Clear DECL_RTL for local variables + afterwards. + (clear_decl_rtl): New function. + + 2001-03-26 Nathan Sidwell + + Implement DR 209 + * cp-tree.h (skip_type_access_control, + reset_type_access_control): Prototype. + * decl.c (grokdeclarator): Access of friends is not checked. + * parse.y (component_decl_list): Reset type access control. + * semantics.c (decl_type_access_control): Clear + current_type_lookups. + (save_type_access_control): Don't save if not deferring. + (skip_type_access_control, reset_type_access_control): New + functions. + (begin_class_definition): Do type access control for basetypes. + Start deferred access control. + (finish_class_definition): Resume immediate access control if + this is a local class. + + 2001-03-25 Kaveh R. Ghazi + + * class.c (add_method): Use memcpy/memmove, not bcopy. + + * decl.c (duplicate_decls): Likewise. + + 2001-03-23 Jakub Jelinek + + * mangle.c (write_discriminator): Use `_0' for discriminator 1, + not `_'. + + 2001-03-23 Jakub Jelinek + + * decl.c (local_names): Define. + (push_local_name): New. + (grok_reference_init): Return init if initializing static reference + variable with non-constant instead of emitting it. + Move expand_static_init call to cp_finish_decl. + (layout_var_decl): Call push_local_name. + (maybe_commonize_var): Allow inlining functions even if they have + static local variables, use comdat_linkage for them if flag_weak. + (check_initializer): Call obscure_complex_init if + grok_reference_init returned nonzero. + (save_function_data): Clear x_local_names. + (pop_cp_function_context): Free x_local_names. + (mark_inlined_fns): Remove. + (mark_lang_function): Mark x_local_names. + (lang_mark_tree): Don't mark DECL_ACCESS for DECL_DISCRIMINATOR_P. + Mark inlined_fns as tree, remove call to mark_inlined_fns. + * class.c (alter_access): Ensure DECL_ACCESS is never set if + DECL_DISCRIMINATOR_P. + * cp-tree.h (cp_language_function): Add x_local_names. + (lang_decl_flags): Add discriminator into u2. + (lang_decl_inlined_fns): Remove. + (lang_decl): inlined_fns is now a TREE_VEC. + (DECL_DISCRIMINATOR_P, DECL_DISCRIMINATOR): Define. + * optimize.c (inlinable_function_p): DECL_INLINED_FNS is now a + TREE_VEC, not a custom structure. + (optimize_function): Likewise. + * mangle.c (discriminator_for_local_entity): Discriminate among + VAR_DECL local entities. + * search.c (dfs_access_in_type): If DECL_DISCRIMINATOR_P, DECL_ACCESS + is not valid. + + 2001-03-22 Bryce McKinlay + + Add support for Java interface method calls. + * cp-tree.h (struct lang_type): Add java_interface flag. + (TYPE_JAVA_INTERFACE): New macro. + * tree.c (cp_valid_lang_attribute): Handle "java_interface" attribute + by setting TYPE_JAVA_INTERFACE. + * call.c (java_iface_lookup_fn): New static. + (build_over_call): If calling a method declared in a + TYPE_JAVA_INTERFACE, call build_java_interface_fn_ref to generate the + expression which resolves the function address. + (build_java_interface_fn_ref): New function. + + 2001-03-22 Richard Henderson + + * Make-lang.in (cp/except.o): Don't depend on insn-flags.h. + * except.c: Don't include it. + + 2001-03-22 Gerald Pfeifer + based on an idea from Joe Buck + + * parse.y (bad_decl, template_arg_list_ignore, arg_list_ignore): + New nonterminals. + (data_def, component_decl): Add reductions to bad_decl. + + 2001-03-22 Jakub Jelinek + + * method.c (do_build_assign_ref): Don't use build_modify_expr for + anonymous aggregates, since they don't have assignment operator + method. + * decl.c (fixup_anonymous_aggr): Disallow ctors, dtors and copy + assignment operators for anonymous structure fields. + + 2001-03-21 Jason Merrill + + * pt.c (instantiate_decl): Abort if we see a member constant + instantiation that doesn't already have its initializer. + Downgrade explicit instantiation without definition to pedwarn. + + * cp-tree.h (DECL_TINFO_FN_P, SET_DECL_TINFO_FN_P): Remove. + * class.c (build_vtable_entry): Don't check DECL_TINFO_FN_P. + (import_export_decl): Check tinfo_decl_p, not DECL_TINFO_FN_P. + + * cp-tree.h (CLASSTYPE_VTABLE_NEEDS_WRITING): Remove. + (pending_vtables): Remove. + * decl2.c (pending_vtables): Remove. + (import_export_vtable): Use CLASSTYPE_INTERFACE_ONLY, not + CLASSTYPE_VTABLE_NEEDS_WRITING. + (import_export_class): Likewise. + (init_decl2): Don't mark pending_vtables. + * lex.c (handle_pragma_vtable): Just sorry. + * pt.c (instantiate_class_template): Don't mess with + CLASSTYPE_VTABLE_NEEDS_WRITING. + (mark_class_instantiated): Likewise. + * ptree.c (print_lang_type): Don't print it. + * semantics.c (begin_class_definition): Don't set it. + + * pt.c (template_tail): Replace with last_pending_template. + (maybe_templates, maybe_template_tail): Remove. + (add_pending_template): Adjust. + (instantiate_pending_templates): Adjust. + + * cp-tree.h (struct saved_scope): Remove lang_stack field. + (current_lang_stack): Remove. + * decl.c (maybe_push_to_top_level): Don't initialize it. + (duplicate_decls): Use current_lang_depth. + (xref_basetypes): Likewise. + * class.c (current_lang_depth): New fn. + (push_lang_context): Use more varray functionality. + (pop_lang_context): Likewise. + + * error.c (GLOBAL_THING): Always use '__'. + + 2001-03-21 Mark Mitchell + + * class.c (build_clone): Clear DECL_ASSEMBLER_NAME. + + * mangle.c (mangle_decl_string): Mangle the names of overloaded + operators, even when they have `extern "C"' linkage. + + 2001-03-19 Mark Mitchell + + * class.c (get_vtable_decl): Use SET_DECL_ASSEMBLER_NAME, + COPY_DECL_ASSEMBLER_NAME, etc. Don't set DECL_ASSEMBLER_NAME + where it's not necessary. + (add_method): Remove optimization involving comparison of + DECL_ASSEMBLER_NAME. + (build_vtbl_or_vbase_field): Use SET_DECL_ASSEMBLER_NAME, + COPY_DECL_ASSEMBLER_NAME, etc. Don't set DECL_ASSEMBLER_NAME + where it's not necessary. + (check_methods): Likewise. + (build_clone): Likewise. + (built_vtt): Likewise. + * cp-tree.h (DECL_NEEDED_P): Likewise. + * decl.c (pushtag): Likewise. + (duplicate_decls): Likewise. + (pushdecl): Likewise. + (builtin_function): Likewise. + (build_library_fn_1): Set DECL_LANGUAGE for library functions. + (build_cp_library_fn): Likewise. + (maybe_commonize_var): Use SET_DECL_ASSEMBLER_NAME, + COPY_DECL_ASSEMBLER_NAME, etc. Don't set DECL_ASSEMBLER_NAME + where it's not necessary. + (make_rtl_for_nonlocal_decl): Likewise. + (cp_finish_decl): Likewise. + (grokfndecl): Likewise. + (grokvardecl): Likewise. + (grokdeclarator): Likewise. + (start_function): Likewise. + (cp_missing_return_ok_p): Likewise. + * decl2.c (grokclassfn): Likewise. + (check_classfn): Likewise. + (finish_static_data_member_decl): Likewise. + (grokfield): Likewise. + * error.c (GLOBAL_IORD_P): Remove. + (dump_global_iord): Improve output. + (dump_decl): Avoid using DECL_ASSEMBLER_NAME. + * except.c (nothrow_libfn_p): Summarily reject any function not in + namespace-scope. + * init.c (build_java_class_ref): Don't explicitly set + DECL_ASSEMBLER_NAME after calling mangle_decl. + * mangle.c (mangle_decl_string): Handle extern "C" functions. + (mangle_decl): Set the DECL_ASSEMBLER_NAME for the decl. + * method.c (set_mangled_name_for_decl): Don't explicitly set + DECL_ASSEMBLER_NAME after calling mangle_decl. + (make_thunk): Explicitly set the DECL_ASSEMBLER_NAME and + IDENTIFIER_GLOBAL_VALUE for the thunk. + * pt.c (set_mangled_name_for_template_decl): Remove. + (check_explicit_specialization): Don't use it. + (looup_template_class): Don't set DECL_ASSEMBLER_NAME. + (tsubst_friend_function): Likewise. + (tsubst_decl): Likewise. + (regenerate_decl_from_template): Use COPY_DECL_ASSEMBLER_NAME. + * rtti.c (get_tinfo_decl): Use SET_DECL_ASSEMBLER_NAME, + COPY_DECL_ASSEMBLER_NAME, etc. Don't set DECL_ASSEMBLER_NAME + where it's not necessary. + (tinfo_base_init): Likewise. + (create_real_tinfo_var): Likewise. + * search.c (looup_field_1): Likewise. + * semantics.c (finish_named_return_value): Likewise. + * tree.c (init_tree): Set lang_set_decl_assembler_name. + + 2001-03-15 Gabriel Dos Reis + + Correct semantics restrictions checking in throw-expression. + * except.c (is_admissible_throw_operand): New function. + (build_throw): Use it. + + 2001-03-14 Mark Mitchell + + * decl.c (cp_make_fnname_decl): Set DECL_IGNORED_P on __FUNCTION__ + and its ilk. + + 2001-03-14 Mark Mitchell + + * class.c (build_clone): Use COPY_DECL_RTL, DECL_RTL_SET_P, etc. + * cp-tree.h (DECL_IN_MEMORY_P): Likewise. + * decl.c (duplicate_decls): Likewise. + (builtin_function): Likewise. + (build_library_fn): Likewise. + (build_cp_library_fn): Likewise. + (check_initializer): Likewise. + (cp_finish_decl): Likewise. + * decl2.c (grokfield): Likewise. + (grok_function_init): Remove #if 0'd code. + (finish_anon_union): Use COPY_DECL_RTL, DECL_RTL_SET_P, etc. + * friend.c (do_friend): Likewise. + * init.c (get_temp_regvar): Likewise. + * method.c (make_thunk): Likewise. + * pt.c (tsubst_friend_function): Likewise. + (tsubst_decl): Likewise. + (regenerate_decl_from_template): Likewise. + * semantics.c (genrtl_named_return_value): Likewise. + (expand_body): Likewise. + (genrtl_finish_function): Likewise. + * tree.c (cp_tree_equal): Likewise. + + 2001-03-12 Nathan Sidwell + + * call.c (convert_like_real): Add extra semantics to INNER + parameter. Don't convert to temporary if a user conversion + gives us an lvalue that we're about to bind to a reference. + Set INNER to indicate pending reference binding on recursive + calls. + + 2001-03-10 Neil Booth + + * cp/lex.c: Delete duplicate pending_lang_change. + + 2001-03-10 Neil Booth + + * cp/lex.c (handle_pragma_interface, handle_pragma_implementation): + Similarly. + * cp/repo.c (get_base_filename, open_repo_file): Similarly. + * cp/cp-tree.h: Remove file_name_nondirectory prototype. + + 2001-03-09 Zack Weinberg + + * Make-lang.in: Add dependencies on $(TM_P_H) as appropriate. + + 2001-03-08 Stan Shebs + + * cp-tree.h (set_identifier_local_value): Remove unused decl. + + 2001-03-06 Zack Weinberg + + * spew.c: Remove references to CPP_OSTRING. + + 2001-03-06 Andrew Haley + + * typeck.c (convert_arguments): Check that we have an fndecl. + + 2001-03-05 Andrew Haley + + * typeck.c (convert_arguments): Don't do ellipsis conversion for + __built_in_constant_p. + + 2001-03-02 Nathan Sidwell + + * typeck.c (build_static_cast): Allow enum to enum conversions + as per DR 128. + + 2001-03-02 Nathan Sidwell + + * class.c (check_field_decls): Pointers to member do not a + non-pod struct make, as per DR 148. + + 2001-03-02 Nathan Sidwell + + * call.c (joust): cp_pedwarn when using gnu extension concerning + worst conversion sequences. + + 2001-03-01 Zack Weinberg + + * decl.c: Replace all uses of 'boolean' with 'bool'. + + 2001-03-01 Zack Weinberg + + * lang-specs.h: Add zero initializer for cpp_spec field to + all array elements that need one. Don't put an #ifdef inside + the initializer list; set a default for CPLUSPLUS_CPP_SPEC and + use it. + + 2001-03-01 Nathan Sidwell + + Implement using decls inside template functions. + * decl2.c (validate_nonmember_using_decl): Don't special case + fake_std_node in the global namespace. Don't reject early when + processing a template. + (do_local_using_decl): Add to statement tree. Don't do further + processing when building a template. + * pt.c (tsubst_expr, DECL_STMT case): Deal with USING_DECLs. + + 2001-03-01 Nathan Sidwell + + * decl2.c (do_nonmember_using_decl): Don't complain if we find + same function. Do complain about ambiguating extern "C" + declarations. + + 2001-02-28 Nathan Sidwell + + Remove floating point and complex type template constant parms. + * pt.c (convert_nontype_argument): Remove REAL_TYPE and + COMPLEX_TYPE extensions. + (invalid_nontype_parm_type_p): Likewise. + + 2001-02-27 Jeffrey Oldham + + * except.c (call_eh_info): Revert "match_function"'s type. + + 2001-02-27 Nathan Sidwell + + Fix ctor vtable vcall offsets. + * class.c (struct vtbl_init_data_s): Add rtti_binfo member. + (build_rtt_vtbl_entries): Lose RTTI_BINFO parameter. + (get_matching_base): Remove. + (get_original_base): New function. + (build_vtbl_initializer): Initialize vid.rtti_binfo. + Use a virtual thunk for a ctor vtable with an index + (add_vcall_offset_vtbl_entries_1): Check if binfo has lost a + primary base within a constructor vtable. Only set + BV_VCALL_INDEX when not a constructor vtable. Adjust vcall offset + when primary base has been lost. + * cp-tree.h (BINFO_VIRTUALS): Remove ambiguity from comment. + + 2001-02-26 Jeffrey Oldham + + * call.c (joust): Ensure more_specialized()'s argument length + parameter has correct value for constructors. + + 2001-02-26 Nathan Sidwell + + * except.c (call_eh_info): Cleanup generation of cp_eh_info struct. + + * decl.c (mark_inlined_fns): Prototype. + + 2001-02-22 Mark Mitchell + + * spew.c (yylex): Correct handling of friends. + + 2001-02-22 Mark Mitchell + + * mangle.c (write_encoding): Pass write_function_type the + FUNCTION_DECL for the function being encoded. + (write_function_type): Pass it along to write_bare_function_type. + (write_bare_function_type): Pass it along to write_method_parms. + (write_method_parms): Don't mangle the compiler-generated + parameters to a constructor or destructor. + + 2001-02-22 Andreas Jaeger + + * optimize.c: Include toplev.h for + note_deferral_of_defined_inline_function prototype. + + 2001-02-22 Jakub Jelinek + + * cp-tree.h (struct lang_decl_inlined_fns): New. + (struct lang_decls): Add inlined_fns. + (DECL_INLINED_FNS): New macro. + * optimize.c (struct inline_data): Add inlined_fns. + (declare_return_variable): Use VARRAY_ACTIVE_SIZE macro. + (inlinable_function_p): Likewise, fix typo in comment, + function is not inlinable if it already inlined function currently + being optimized. + (expand_call_inline): Add fn to inlined_fns if necessary. + (optimize_function): Initialize inlined_fns. + Save inlined_fns into DECL_INLINED_FNS after expanding inlines. + * decl.c (mark_inlined_fns): New function. + (lang_mark_tree): Call it. + + 2001-02-21 Jason Merrill + + * cp-tree.h (struct lang_decl_flags): Remove uninlinable flag. + (DECL_UNINLINABLE): Move to middle-end. + + * class.c (clone_function_decl): Set DECL_ABSTRACT on original fn. + * decl.c (duplicate_decls): Preserve DECL_ABSTRACT. + * class.c (build_clone): Set DECL_ABSTRACT_ORIGIN for the clone. + * optimize.c (maybe_clone_body): Set DECL_ABSTRACT_ORIGIN for the + parms and outer BLOCK. note_deferral_of_defined_inline_function. + + * method.c (implicitly_declare_fn): Don't set DECL_ARTIFICIAL on + second parm of op=. + + 2001-02-19 Mark Mitchell + + * decl2.c (set_decl_namespace): Allow explicit instantiations in + any namespace. + + 2001-02-18 Kriang Lerdsuwanakij + + * optimize.c (expand_call_inline): Don't walk subtrees of type + nodes. + + 2001-02-18 Mark Mitchell + + * class.c (add_vcall_offset_vtbl_entries_1): Only add one entry + for a destructor. + + 2001-02-18 Jason Merrill + + Do put the VTT parameter in DECL_ARGUMENTS. + * cp-tree.h (struct cp_language_function): Add x_vtt_parm. + (current_vtt_parm): New macro. + (struct lang_decl_flags): Add has_vtt_parm_p, remove vtt_parm. + (DECL_HAS_VTT_PARM_P): New macro. + (DECL_VTT_PARM): Remove. + (FUNCTION_FIRST_USER_PARMTYPE, FUNCTION_FIRST_USER_PARM): New macros. + * decl.c (duplicate_decls): Only copy the operator code if + appropriate. + (start_function): Set current_vtt_parm. + (lang_mark_tree): Don't mark vtt_parm. + * decl2.c (maybe_retrofit_in_chrg): Do add the VTT parm to + DECL_ARGUMENTS. Set DECL_HAS_VTT_PARM_P. + * class.c (build_clone): Maybe remove the VTT parm. + * optimize.c (maybe_clone_body): Set up the VTT parm. + * pt.c (copy_default_args_to_explicit_spec): Preserve the VTT parm. + * call.c (build_over_call): Just allow the VTT arg. + * method.c (make_thunk): Don't set DECL_VTT_PARM. + (do_build_copy_constructor): Use FUNCTION_FIRST_USER_PARM. + (synthesize_method): Use FUNCTION_FIRST_USER_PARMTYPE. + * decl.c (grokdeclarator, copy_args_p, grok_ctor_properties): Likewise. + * error.c (dump_function_decl): Likewise. + * call.c (build_user_type_conversion_1, convert_like_real): Abort + if we try to call a constructor with in-charge or VTT parms. + * method.c (skip_artificial_parms_for): New fn. + * call.c (add_function_candidate, build_over_call): Call it. + * call.c (build_new_method_call): Use current_vtt_parm. + * init.c (expand_virtual_init): Likewise. + * class.c (same_signature_p): No longer static. + * cp-tree.h: Declare it. + * search.c (look_for_overrides_r): Use it. + + 2001-02-17 Mark Mitchell + + * cp-tree.h (new_abi_rtti_p): Remove. + (name_mangling_version): Likewise. + (flag_do_squangling): Likewise. + * class.c (build_rtti_vtbl_entries): Remove old ABI support. + * decl.c (grokfndecl): Likewise. + * decl2.c (name_mangling_version): Remove. + (flag_do_squangling): Likewise. + (lang_f_options): Remove `squangle'. + (unsupported_options): Add `squangle'. + (cxx_decode_option): Issue a warning about uses of + -fname-mangling-version. + (finish_file): Remove old ABI support. + * pt.c (check_explicit_specialization): Likewise. + (tsubst_decl): Likewise. + * rtti.c (init_rtti_processing): Likewise. + (build_headof): Likewise. + (get_tinfo_decl_dynamic): Likewise. + (tinfo_from_decl): Likewise. + (build_dynamic_cast_1): Likewise. + (synthesize_tinfo_var): Likewise. + * init.c (build_new): Allow enumeration types for the array-bounds + in a direct-new-declarator. + + * semantics.c (finish_typeof): Resolve OFFSET_REFs. + + * pt.c (check_explicit_specialization): Copy TREE_PRIVATE and + TREE_PROTECTED from the template being specialized. + + 2001-02-17 Jason Merrill + + * decl2.c (build_artificial_parm): Set TREE_READONLY. + + * decl.c (bad_specifiers): Allow throw specs on things with + pointer-to-function or -member-function type. + * init.c (build_default_init): Don't use a CONSTRUCTOR to initialize + a pmf. + + 2001-02-17 Mark Mitchell + + * call.c (check_dtor_name): Handle template names correctly. + + 2001-02-16 Jason Merrill + + * cp-tree.h (DECL_USE_VTT_PARM): Remove. + * decl2.c (maybe_retrofit_in_chrg): Don't create it. + * optimize.c (maybe_clone_body): Don't substitute it. + * call.c (build_new_method_call): Check in_chrg instead. + * init.c (expand_virtual_init): Likewise. + + 2001-02-16 Gabriel Dos Reis + + * decl.c (check_tag_decl): Make sure a typedef for an anonymous + class-type introduces at least a type-name. + + 2001-02-16 Jakub Jelinek + + * call.c (convert_like_real): Create a temporary for non-lvalue. + + 2001-02-16 Jeffrey Oldham + + * cp-tree.h: Fix typos in comments. + + 2001-02-16 Jason Merrill + + * optimize.c (remap_block): If we're compiling a clone, pass the + new block to insert_block. + + 2001-02-16 Mark Mitchell + + * semantics.c (finish_asm_stmt): Robustify. + + 2001-02-15 Mark Mitchell + + * pt.c (push_template_decl_real): Don't remangle the name of a + class template. + + 2001-02-15 Jim Meyering + + * Make-lang.in (c++.install-common): Depend on installdirs. + (c++.install-info): Likewise. + (c++.install-man): Likewise. + + 2001-02-15 Mark Mitchell + + * typeck2.c (build_m_component_ref): Robustify. + + 2001-02-15 Alexandre Oliva + + * friend.c (do_friend): Don't take the nested [template] class + into account when deciding whether to warn about the friend + function not referring to a template function. + + 2001-02-14 Jakub Jelinek + + * typeck.c (build_unary_op): Clarify error message. + + 2001-02-08 Aldy Hernandez + + * parse.y (component_constructor_declarator): allow optional + parentheses around constructor class name. + + 2001-02-14 Nathan Sidwell + + * cp-tree.h (setup_vtbl_ptr): Move prototype to semantics.c + section. + * init.c (emit_base_init): Remove incorrect comment about + virtual bases. + * method.c (make_thunk): Fix comment alignment. + + 2001-02-14 Nathan Sidwell + + Kill remnants of this is variable. + * cp-tree.h (flag_this_is_variable): Remove. + * decl2.c (flag_this_is_variable): Remove. + * class.c (fixed_type_or_null): Add cdtor parm. Adjust. + (build_vbase_path): The path is non-static, even in a cdtor. + (resolves_to_fixed_type_p): Add additional return value. + * search.c (init_vbase_pointers): Adjust. + * tree.c (lvalue_p_1): Adjust. + * typeck.c (mark_addressable): Adjust. + + 2001-02-14 Nathan Sidwell + + * pt.c (unify): Don't check cv quals of array types. + + 2001-02-14 Nathan Sidwell + + * tree.c (cp_build_qualified_type_real): Use CP_TYPE_QUALS to + check whether we already have the type. + + 2001-02-13 Mark Mitchell + + * cp-tree.h (CLASSTYPE_DESTRUCTORS): Fix typo in comment. + * call.c (build_op_delete_call): Simplify to remove duplicate + code. + * class.c (clone_function_decl): Don't build the deleting variant + of a non-virtual destructor. + * decl.c (finish_destructor_body): Don't call delete if this is a + non-virtual destructor. + * init.c (build_delete): Explicitly call `operator delete' when + deleting an object with a non-virtual destructor. + + 2001-02-13 Jason Merrill + + * lang-specs.h: Add more __EXCEPTIONS. + + 2001-02-12 Nathan Sidwell + + * typeck2.c (process_init_constructor): Check + TREE_HAS_CONSTRUCTOR before issuing missing init warning. + + 2001-02-12 Nathan Sidwell + + * pt.c (maybe_adjust_types_for_deduction, DEDUCE_ORDER case): + Remove spurious information in comment. Allow further + adjustments of REFERENCE_TYPE args. + + 2001-02-12 Nathan Sidwell + + * errfn.c (cp_deprecated): Tweak diagnostic text. + * parse.y (new_initializer): Deprecate initializer lists + extension. + + 2001-02-12 Mark Mitchell + + Remove old ABI support. + + 2001-02-11 Mark Mitchell + + * decl2.c (flag_vtable_thunks): Always set it to 1. + (flag_new_abi): Likewise. + * lang-specs.h: Remove conditional on ENABLE_NEW_GXX_ABI. + + * Makefile.in (g++spec.o): Fix typo. + + 2001-02-09 Jason Merrill + + * lang-specs.h: Restore definition of __EXCEPTIONS. + + 2001-02-08 Jason Merrill + + * search.c (shared_member_p): New function. + (lookup_field_r): Use it. + * cp-tree.h (SHARED_MEMBER_P): Remove. + + * method.c (process_overload_item): Handle template-dependent array + bounds. + * pt.c (type_unification_real): If we end up with undeduced nontype + parms, try again. + + * decl.c (lookup_name_real): Tweak warning to refer to decls, not + types. + + * typeck2.c (friendly_abort): Don't say anything if we have + earlier errors or sorries. + + * decl.c (check_tag_decl): Notice attempts to redefine bool and + wchar_t. Ignore if in_system_header. + + * decl.c (maybe_push_cleanup_level): New fn... + (start_decl_1): ...split out from here. + * cvt.c (build_up_reference): Use it. + * cp-tree.h: Declare it. + + 2001-02-07 Mark Mitchell + + * lang-specs.h: Use CPLUSPLUS_CPP_SPEC for the preprocessor + spec. + + 2001-02-06 Nathan Sidwell + + * pt.c (lookup_template_class): Make sure it's a primary + template or template_template_parm when called from the parser. + (instantiate_template_class): Add assertion. + + 2001-02-05 Alexandre Oliva + + * method.c (build_mangled_name) [old abi]: Protect flush_repeats() + from error_mark_node. + + 2001-02-05 Nathan Sidwell + + Fix specification and implementation bugs in V3 ABI + construction vtables. + * cp-tree.h (flag_dump_class_layout): New flag. + (BINFO_OVERRIDE_ALONG_VIRTUAL_PATH_P): Remove. + (BINFO_LOST_PRIMARY_P): New flag. + (SET_BINFO_NEW_VTABLE_MARKED): Adjust asserts. + (BINFO_PRIMARY_MARKED_P): Rename to ... + (BINFO_PRIMARY_P): ... here. + (binfo_via_virtual): New prototype. + * decl2.c (flag_dump_class_layout): New flag. + (cxx_decode_option): Set it. Adjust -fdump-translation-unit to + use `=' as a file name separator. + * init.c (dfs_initialize_vtbl_ptrs): Walk into virtual primary + bases. + (build_vtbl_address): If this is a virtual primary base, then + get the vtbl of what it is ultimately primary for. + * search.c (dfs_skip_nonprimary_vbases_unmarkedp): Adjust + for BINFO_PRIMARY_P. + (dfs_skip_nonprimary_vbases_markedp): Likewise. + (get_shared_vbase_if_not_primary): Likewise. + (dfs_get_pure_virtuals): Likewise. + (expand_upcast_fixups): Likewise. + (fixup_virtual_upcast_offsets): Likewise. + (dfs_find_vbase_instance): Likewise. + (find_vbase_instance): Likewise. + (binfo_from_vbase): Adjust comment to reflect reality. + (binfo_via_virtual): New function. + * class.c (VTT_TOP_LEVEL_P, VTT_MARKED_BINFO_P): New macros + for binfo walking during VTT construction. + (dfs_mark_primary_bases): Remove. + (force_canonical_binfo_r): New function. + (force_canonical_binfo): New function. + (mark_primary_virtual_base): New function. + (mark_primary_bases): Walk in inheritance graph order, use + mark_primary_virtual_base. + (determine_primary_base): Use some more intermediate variables. + (dfs_find_final_overrider): Don't check for overriding along a + virtual path. + (dfs_modify_vtables): Walk into primary virtual bases too. + (walk_subobject_offsets): Adjust for BINFO_PRIMARY_P. + (build_base_fields): Likewise. + (dfs_set_offset_for_unshared_vbases): Likewise. + (layout_virtual_bases): Likewise. + (end_of_class): Likewise. + (finish_struct_1): Call dump_class_hierarchy, if requested. + (dfs_get_primary_binfo): Use BINFO_TYPE for binfos. + (dump_class_hierarchy_r): Add stream parameter. Emit more information. + (dump_class_hierarchy): Add file parameter. Append to file, if + required. + (finish_vtbls): Adjust accumulate_vtbl_inits call. + Use canonical base for virtual bases. + (build_vtt): Add more comments. Adjust build_vtt_inits call. + (build_vtt_inits): Remove VIRTUAL_VTTS_P parm. + Only set BINFO_VPTR_INDEX on top level. Use VTT_TOP_LEVEL_P, + VTT_MARKED_BINFO_P for binfo walking. Use canonical vbase for + virtual VTTs. + (dfs_build_secondary_vptr_vtt_inits): Extract VTT_TOP_LEVEL_P + from DATA. We want virtual primary bases and all bases via virtual. + Only set BINFO_VPTR_INDEX for top level. Look up from a primary + virtual base when not a construction vtable. + (dfs_ctor_vtable_bases_queue_p): New DFS predicate. + (build_ctor_vtbl_group): Adjust accumulate_vtbl_inits call. + Use canonical bases when processing virtual bases. + (accumulate_vtbl_inits): We're interested in any base via a + virtual path. + (dfs_accumulate_vtbl_inits): If this is a primary virtual base + within a construction vtable, determine what is being overridden. + (build_vtbl_initializer): Add more comments + (add_vcall_offset_vtbl_entries_1): Adjust comment. + (build_rtti_vtbl_entries): Check if the base has lost its + primary. + + 2001-02-05 Mark Mitchell + + * Makefile.in (g++spec.o): Adjust use of DRIVER_DEFINES. + + 2001-02-04 Richard Kenner + + * decl.c (pushdecl): Call abort instead of fatal. + * except.c (decl_is_java_type): Call fatal_error instead of fatal. + * init.c (build_new_1): Likewise. + (build_java_class_ref): Call internal_error and fatal_error, not fatal. + * decl.c (build_typename_type): hash_table_init now returns void. + decl.c (init_decl_processing): Make an error non-fatal. + + 2001-02-04 Mark Mitchell + + * cp-tree.h (CLASSTYPE_INTERFACE_UNKNOWN): Fix formatting. + Document. + (CLASSTYPE_INTERFACE_KNOWN): Likewise. + (SET_CLASSTYPE_INTERFACE_UNKNOWN_X): Likewise. + (SET_CLASSTYPE_INTERFACE_UNKNOWN): Likewise. + (SET_CLASSTYPE_INTERFACE_KNOWN): Likewise. + * decl.c (maybe_commonize_var): Use the new name-mangling where + appropriate. + * decl2.c (comdat_linkage): Enhance comments. Make all + compiler-generated things static, if COMDAT is not available. + (get_tinfo_decl): Do not make typeinfo objects that belong in the + library COMDAT. + (tinfo_base_init): Use the correct mangled name for typeinfo + strings, and push them into the global scope. + (typeinfo_in_lib_p): New function. + (synthesize_tinfo_var): Use it. + (create_real_tinfo_var): Likewise. + + 2001-02-03 Jakub Jelinek + + * decl.c (push_class_binding): Use context_for_name_lookup instead + of CP_DECL_CONTEXT. + * search.c (context_for_name_lookup): Remove static. Check for NULL + context in the loop. + * cp-tree.h (context_for_name_lookup): Add prototype. + + 2001-02-02 Jakub Jelinek + + * cp-tree.h (build_expr_ptr_wrapper, can_free): Remove. + * tree.c (build_expr_ptr_wrapper, can_free, permanent_obstack): + Remove. + * call.c (convert_class_to_reference, build_user_type_conversion_1, + add_warning): Change build_expr_ptr_wrapper to build_ptr_wrapper. + + 2001-02-02 Mark Mitchell + + * Make-lang.in (g++spec.o): Add DRIVER_DEFINES to the list + of macros used when compiling g++spec.c. + * g++spec.c (lang_specific_driver): Link with the shared + libgcc by default. + + 2001-01-29 Joseph S. Myers + + * decl2.c (build_expr_from_tree), lex.c (make_pointer_declarator, + make_reference_declarator, make_call_declarator), method.c + (implicitly_declare_fn), parse.y (namespace_using_decl, + notype_unqualified_id, expr_or_declarator, new_type_id, + after_type_declarator, direct_after_type_declarator, + notype_declarator, complex_notype_declarator, + complex_direct_notype_declarator, qualified_id, + notype_qualified_id, overqualified_id, direct_new_declarator, + absdcl, direct_abstract_declarator, conversion_declarator), pt.c + (tsubst), semantics.c (begin_constructor_declarator): Use build_nt + instead of build_parse_node. + + 2001-01-28 Kaveh R. Ghazi + + * cp-tree.h (cp_tree_index): Delete CPTI_MINUS_ONE. + (minus_one_node): Moved to top level gcc directory. Renamed + to integer_minus_one_node. + + * init.c (init_init_processing): Don't set minus_one_node. + (build_vec_init): Use integer_minus_one_node. + + * rtti.c (get_tinfo_decl_dynamic): Likewise. + + 2001-01-28 Jakub Jelinek + + * optimize.c (copy_body_r): If MODIFY_EXPR has both arguments + identical and they would be replaced with constant, remove + MODIFY_EXPR from the tree. + + 2001-01-27 Kaveh R. Ghazi + + * Make-lang.in: Remove all dependencies on defaults.h. + * call.c: Don't include defaults.h. + * decl.c: Likewise. + * decl2.c: Likewise. + * except.c: Likewise. + * pt.c: Likewise. + * rtti.c: Likewise. + * tree.c: Likewise. + * typeck.c: Likewise. + + 2001-01-25 Jakub Jelinek + + * mangle.c (write_mangled_name, write_encoding): Mangle overloaded + operators even in "C" linkage. + * method.c (set_mangled_name_for_decl): Likewise. + * decl.c (grokfndecl): Call set_mangled_name_for_decl even for + overloaded operators in "C" linkage. + + 2001-01-24 Nathan Sidwell + + * pt.c (tsubst_decl): Remove IN_DECL parameter. + (tsubst_arg_types): Check parameter is not void. + (tsubst): Adjust tsubst_decl call. + + 2001-01-24 Nathan Sidwell + + * call.c (add_builtin_candidate): Quote std properly, from + previous change. + + 2001-01-23 Kriang Lerdsuwanakij + + * pt.c (check_explicit_specialization): Clone constructors and + destructors. + + 2001-01-23 Nathan Sidwell + + * decl.c (grokdeclarator): Don't presume DECL_LANG_SPECIFIC + indicates anything special about template depth. Make sure we + only count the user visible template classes. + + 2001-01-23 Nathan Sidwell + + * call.c (build_conv): Typo in comment. + (add_builtin_candidate): Add more explanation. + Remove extra test for ENUMERAL_TYPE in {PRE,POST}INCREMENT_EXPR. + Allow ENUMERAL_TYPEs for relops and eqops. Add both candidates + when we have enumeral types. + (add_builtin_candidates): Add more explanation. Add ENUMERAL_TYPE + candidates for relops and eqops. + (joust): Simplify control flow. Allow a non-template user + function to hide a builtin. + + 2001-01-22 Nathan Sidwell + + * cp-tree.h (unification_kind_t): Add DEDUCE_ORDER. + (more_specialized): Add deduction parameter. + * call.c (joust): Adjust more_specialized call. + * pt.c (UNIFY_ALLOW_OUTER_MORE_CV_QUAL, + UNIFY_ALLOW_OUTER_LESS_CV_QUAL): New unify flags. + (get_bindings_order): Remove. + (get_bindings_real): Add DEDUCE parameter. + (maybe_adjust_types_for_deduction): Return extra unify flags. Do + REFERENCE_TYPE jig for DEDUCE_ORDER. + (type_unification_real): Deal with DEDUCE_ORDER. Use result of + maybe_adjust_types_for_deduction. + (more_specialized): Add DEDUCE parameter. Call get_bindings_real + directly. + (try_one_overload): Use result of maybe_adjust_types_for_deduction. + (check_cv_quals_for_unify): Use new unify qualifier flags. + (unify): Clear new unify qualifier flags. + (get_bindings_real): Add DEDUCE parameter. + (get_bindings): Adjust call to get_bindings_real. + (get_bindings_overload): Likewise. + (most_specialized_instantiation): Adjust call to + more_specialized. + + 2001-01-19 Jason Merrill + + * decl2.c (flag_vtable_thunks): Also depend on ENABLE_NEW_GXX_ABI. + + * decl.c (init_decl_processing): Just force -fvtable-thunks on if + -fnew-abi. + + 2001-01-19 Ute Pelkmann + + * decl2.c (arg_assoc_class): Fix double iteration logic. + + 2001-01-19 Jason Merrill + + * init.c (build_delete): Always call convert_force to strip cv-quals. + + * decl2.c (flag_new_abi): Depend on ENABLE_NEW_GXX_ABI. + * lang-specs.h: Default ABI depends on ENABLE_NEW_GXX_ABI. + * g++spec.c: Don't look at ENABLE_NEW_GXX_ABI. + + 2001-01-19 Nathan Sidwell + + * search.c (get_vbase_1): Count only virtual bases. + + 2001-01-19 Nathan Sidwell + + * class.c (duplicate_tag_error): Robustify flag clearing. + + 2001-01-19 Nathan Sidwell + + * cp-tree.h (lookup_template_class): Add complain parm. + * decl.c (lookup_namespace_name): Adjust call to + lookup_template_class. + (make_typename_type): Likewise. + * semantics.c (finish_template_type): Likewise. + * pt.c (lookup_template_class): Add complain parm. Adjust. + (tsubst_aggr_type): Pass COMPLAIN down to lookup_template_class. + (tsubst): Likewise. + + 2001-01-19 Nathan Sidwell + + * pt.c (copy_default_args_to_explicit_spec): Preserve + object's CV quals. Reorganize. + + 2001-01-18 Nathan Sidwell + + * typeck.c (build_modify_expr): Say `initialization' for + INIT_EXPRs. + * init.c (build_default_init): Convert to enumeral type, if + needed. + + 2001-01-18 Jakub Jelinek + + * parse.y (nomods_initdcl0): Properly set things up for + initdcl0_innards. + + 2001-01-18 Nathan Sidwell + + * pt.c (UNIFY_ALLOW_OUTER_LEVEL): New unify flag. + (type_unification_real): Set it. + (unify): Use it. + + 2001-01-18 Nathan Sidwell + + * decl.c (finish_destructor_body): Convert to vbase pointer here. + + 2001-01-18 Nathan Sidwell + + * semantics.c (begin_class_definition): Check we're not inside a + template parm list. + + 2001-01-18 Nathan Sidwell + + * tree.c (walk_tree, TREE_LIST): Don't walk the TREE_PURPOSE of + BASELINK_P. + + 2001-01-16 Kriang Lerdsuwanakij + + * typeck.c (build_function_call_real): Call fold on the CALL_EXPR. + * call.c (build_over_call): Add comment. + + 2001-01-16 Daniel Berlin + + * cvt.c (ocp_convert): Handle vector type conversion + * typeck2.c (digest_init): Handle vector type initializations + + 2001-01-16 Phil Edwards + + * g++spec.c: Don't add libraries needlessly if -fsyntax-only + was given. + + 2001-01-15 Nathan Sidwell + + * pt.c (check_nontype_parm): Rename to ... + (invalid_nontype_parm_type_p): ... here. + (process_template_parm): Adjust. + (convert_template_argument): Adjust. + + 2001-01-15 Nathan Sidwell + + * pt.c (check_nontype_parm): New function. + (process_template_parm): Use it. + (convert_template_argument): Use it. + (convert_nontype_argument, RECORD_TYPE): Assert it's a ptr to + member. + + 2001-01-14 Jeffrey Oldham + + * tree.c: Add defaults.h + (cp_valid_lang_attribute): Incorporate SUPPORTS_INIT_PRIORITY. + * Make-lang.in (cp/tree.o): Add defaults.h. + + 2001-01-13 Joseph S. Myers + + * Make-lang.in (CXX_C_OBJS): Add c-format.o. + + 2001-01-13 Joseph S. Myers + + * g++.1: Change to be ".so man1/gcc.1". + + 2001-01-13 Joseph S. Myers + + * Make-lang.in (c++.info, c++.install-info): Build and install g++ + internals info. + (c++.uninstall, c++.maintainer-clean): Remove g++ internals info. + ($(srcdir)/cp/g++int.info): New target. + * gxxint.texi: Add info directory entry. Use @@ in email address. + * .cvsignore: Update. + + 2001-01-12 Nathan Sidwell + + * typeck.c (build_c_cast): Do template processing earlier. + Always pedwarn on array casts. + + 2001-01-12 Nathan Sidwell + + * friend.c (make_friend_class): Make sure a templated class is + actually a template. + + 2001-01-11 Nathan Sidwell + + * decl2.c (get_guard): Set linkage from guarded decl. + + 2001-01-11 Nathan Sidwell + + * call.c (convert_default_arg): Check for unprocessed + DEFAULT_ARG. + * cp-tree.h (replace_defarg): Move to spew.c. + (maybe_snarf_defarg, add_defarg_fn, do_pending_defargs): Move to + spew.c, which is where they really are. + (done_pending_defargs): Declare. + (unprocessed_defarg_fn): Declare. + * decl.c (replace_defarg): Move to spew.c + * parse.y (structsp): Call done_pending_defargs. + * spew.c (defarg_fns): Rearrange list structure. + (defarg_fnsdone): New static variable. + (defarg_depfns): New static variable. + (init_spew): Adjust. + (add_defarg_fn): Store the type in TREE_TYPE. + (do_pending_defargs): Detect and deal with ordering constraints + and circularity. + (done_pending_defargs): New function. + (unprocessed_defarg_fn): New function. + (replace_defarg): Moved from decl.c. Robustify. Don't save + if circularity detected. + + 2001-01-11 Nathan Sidwell + + * pt.c (unify): Check array has a domain, before checking + whether it is variable sized. + + 2001-01-11 Nathan Sidwell + + * decl.c (grokparms): Unobfuscate and get correct diagnostic for + parameters with pointers to arrays of unknown bound. + + 2001-01-11 Nathan Sidwell + + * parse.y (template_parm_header, template_spec_header): New + reductions. Split out from ... + (template_header): ... here. Use them. + (template_template_parm): Use template_parm_header. + * semantics.c (finish_template_template_parm): Add assert. + + 2001-01-10 Mark Mitchell + + * mangle.c (write_builtin_type): Fix thinko. + + * pt.c (copy_default_args_to_explicit_spec_1): New function. + (copy_default_args_to_explicit_spec): Likewise. + (check_explicit_specialization): Use it. + + * class.c (finish_struct_1): Remove last argument in call to + make_decl_rtl; use make_function_rtl instead of make_decl_rtl. + * decl.c (builtin_function): Likewise. + (build_cp_library_fn): Likewise. + (check_initializer): Likewise. + (make_rtl_for_nonlocal_decl): Likewise. + (cp_finish_decl): Likewise. + (start_function): Likewise. + * decl2.c (finish_anon_union): Likewise. + * friend.c (do_friend): Likewise. + * init.c (build_java_class_ref): Likewise. + * method.c (make_thunk): Likewise. + * pt.c (tsubst_friend_function): Likewise. + * semantics.c (expand_body): Likewise. + + 2001-01-10 Mark Mitchell + + * cp-tree.h (DECL_CLONED_FUNCTION_P): Avoid wild reads by not + looking at DECL_CLONED_FUNCTION for non-functions. + + 2001-01-10 Nathan Sidwell + + * error.c (dump_template_parameter): Use parm to determine how + to print default value. + + 2001-01-10 Nathan Sidwell + + * class.c (duplicate_tag_error): Clear more flags. + + 2001-01-10 Nathan Sidwell + + * call.c (build_new_method_call): Use binfo_for_vbase. + + 2001-01-10 Joseph S. Myers + + * cp-tree.h (flag_cond_mismatch): Don't declare. + * decl2.c (flag_cond_mismatch): Don't define. + (lang_f_options): Remove cond-mismatch. + (unsupported_options): Add cond-mismatch. + + 2001-01-09 Nathan Sidwell + + * class.c (handle_using_decl): Reject using of constructor name + of sourcing class. Allow injecting of a method with same name as + nested class. Fixup error messages. + + 2001-01-09 Joseph S. Myers + + * decl2.c (lang_decode_option): Handle -Wformat=2. + + 2001-01-08 Nathan Sidwell + + * cp-tree.h (lang_decl_flags): Rename defined_in_class to + initialized_in_class. + (DECL_DEFINED_IN_CLASS_P): Rename to ... + (DECL_INITIALIZED_IN_CLASS_P): ... here, to reflect true meaning. + * decl.c (duplicate_decls): Preseve DECL_INITIALIZED_IN_CLASS_P. + (cp_finish_decl): Adjust for DECL_INITIALIZED_IN_CLASS_P. + * pt.c (check_default_tmpl_args): Adjust for + DECL_INITIALIZED_IN_CLASS_P. + (instantiate_class_template): Likewise. + (instantiate_decl): Check DECL_INITIALIZED_IN_CLASS_P. + + * class.c (finish_struct): Constify saved_filename. + + 2001-01-08 Nathan Sidwell + + * class.c (duplicate_tag_error): Adjust diagnostic. + (finish_struct): Locally set location to start of struct. + * decl.c (fixup_anonymous_aggr): Use cp_error_at. + + 2001-01-08 Nathan Sidwell + + * decl.c (struct binding_level): Adjust class_shadowed comments + to reflect reality. + (push_class_level_binding): Adjust comments to reflect reality. + Set IDENTIFIER_CLASS_VALUE when replacing an existing binding. + Don't set TREE_VALUE on the class_shadowed list. + + 2001-01-07 Alexandre Petit-Bianco + + * decl2.c (acceptable_java_type): Allow references too. + * init.c (build_java_class_ref): When using the new ABI, search + `class$' and have it mangled with `mangle_decl.' + * mangle.c (write_java_integer_type_codes): New function. + (write_builtin_type): Detect and mangle Java integer and real + types. + + 2001-01-07 Mark Mitchell + + * decl2.c (grokfield): Don't accept `asm' specifiers for + non-static data members. + + 2001-01-07 Kaveh R. Ghazi + + * expr.c (cplus_expand_expr): Don't reset `target'. + + 2001-01-07 Neil Booth + + * cp/decl2.c (cxx_post_options): Call cpp_post_options. + + 2001-01-05 Nathan Sidwell + + * parse.y (template_datadef): Check for error_mark_node. + + 2001-01-05 Nathan Sidwell + + * cp-tree.def (DEFAULT_ARG): Make `x' class. + + 2001-01-04 Joseph S. Myers + + * decl.c (SIZE_TYPE, PTRDIFF_TYPE, WCHAR_TYPE): Don't define. + (record_builtin_type): Make non-static. + (flag_short_double): Don't declare. + (init_decl_processing): Remove the creation of many tree nodes now + in c_common_nodes_and_builtins. + (build_void_list_node): New function. + * decl2.c (flag_short_double, flag_short_wchar): Don't define. + * cp-tree.h (flag_short_wchar): Don't declare. + + 2001-01-04 Mark Mitchell + + * call.c (build_conv): Don't use build1 for USER_CONV. + * pt.c (tsubst_copy): Or for PREINCREMENT_EXPR and similar nodes. + + 2001-01-03 Joseph S. Myers + + * lex.c (lang_init): Call c_common_lang_init. + + 2001-01-03 Nathan Sidwell + + * search.c (lookup_fnfields_here): Remove. + (look_for_overrides_r): Use lookup_fnfields_1. + Ignore functions from using declarations. + + 2001-01-03 Nathan Sidwell + + Implement exceptions specifiers for implicit member functions. + * cp-tree.h (merge_exceptions_specifiers): Declare new function. + * method.c (synthesize_exception_spec): New function. + (locate_dtor, locate_ctor, locate_copy): New functions. + (implicitly_declare_fn): Generate the exception spec too. + * search.c (check_final_overrider): Check artificial functions + too. + * typeck2.c (merge_exception_specifiers): New function. + + 2001-01-03 Jason Merrill + + * init.c (build_default_init): New fn. + (perform_member_init): Split out from here. + (build_new_1): Use it. Simplify initialization logic. + (build_vec_init): Take an array, rather than a pointer and maxindex. + Speed up simple initializations. Don't clean up if we're assigning. + * cp-tree.h: Adjust. + * decl2.c (do_static_initialization): Remove TREE_VEC case. + * parse.y (new_initializer): Return void_zero_node for (). + * typeck.c (build_modify_expr): Handle getting a CONSTRUCTOR. + * typeck2.c (digest_init): Only complain about user-written + CONSTRUCTORs. + + 2000-12-22 Mike Stump + + * decl2.c: (max_tinst_depth): Increase to 50. + + 2001-01-02 Mark Mitchell + + * class.c (invalidate_class_lookup_cache): Zero the + previous_class_values. + * cp-tree.h (TMPL_PARMS_DEPTH): Use TREE_INT_CST_LOW, not + TREE_INT_CST_HIGH. + (CLASSTYPE_TEMPLATE_LEVEL): Likewise. + * decl.c (free_bindings): New variable. + (push_binding): Don't create a new binding if we have one on the + free list. + (pop_binding): Put old bindings on the free list. + (init_decl_processing): Use size_int, not build_int_2. + Register free_bindings as a GC root. + (cp_make_fname_decl): Use size_int, not build_int_2. + (push_inline_template_parms_recursive): Likewise. + (end_template_parm_list): Likewise. + (for_each_template_parm): Do not use walk_tree_without_duplicates. + (tsubst_template_parms): Use size_int, not build_int_2. + (tsubst): Likewise. + * rtti.c (get_vmi_pseudo_type_info): Likewise. + + 2001-01-02 Richard Henderson + + * parse.y (asm): Set ASM_INPUT_P. + + 2001-01-02 Jason Merrill + + * tree.c (cp_valid_lang_attribute): Don't set CLASSTYPE_COM_INTERFACE + for v3 ABI. + + * typeck.c (cp_truthvalue_conversion): New fn. + * cvt.c (ocp_convert): Use it. + + * cp-tree.h: Lose c-common.c decls. + + * typeck.c (build_unary_op): Restore old &a.f diagnostic code. + * cvt.c (convert_to_void): Use type_unknown_p. + + * typeck.c (strip_all_pointer_quals): Also strip quals from + pointer-to-member types. + + * Make-lang.in (cp/TAGS): Use --no-globals. Ignore parse.c, and treat + parse.y as C. + + * call.c (build_new_method_call): Do evaluate the object parameter + when accessing a static member. + * typeck.c (build_component_ref): Likewise. + + 2001-01-02 Andreas Jaeger + + * decl.c (cp_missing_noreturn_ok_p): New. + (init_decl_processing): Set lang_missing_noreturn_ok_p. + + 2000-12-29 Jakub Jelinek + + * decl.c (init_decl_processing): Fix sign of wchar_type_node. + + 2000-12-29 Mark Mitchell + + * class.c (pushclass): Remove #if 0'd code. + * cp-tree.h (overload_template_name): Remove. + * decl.c (store_bindings): Simplify. + (pop_from_top_level): Likewise. + * pt.c (overload_template_name): Remove. + (instantiate_decl): Don't call push_to_top_level if it's not + needed. + + 2000-12-28 Mark Mitchell + + * pt.c (register_local_specialization): Don't return a value. + (lookup_template_class): Use move-to-front heuristic when looking + up template instantiations. + (instantiate_decl): Only push_to_top_level when we're actually + going to instantiate the template. + + 2000-12-29 Hans-Peter Nilsson + + * search.c (binfo_for_vtable): Return least derived class, not + most. Handle secondary vtables. + + 2000-12-22 Jason Merrill + + * pt.c (more_specialized): Don't optimize len==0. + (fn_type_unification): If we're adding the return type, increase len. + + * typeck.c (build_binary_op): Fix pmf comparison logic. + + * call.c (joust): Use DECL_NONSTATIC_MEMBER_FUNCTION_P, not + DECL_STATIC_FUNCTION_P. + + * semantics.c (genrtl_finish_function): Don't try to jump to + return_label unless it exists. + + In partial ordering for a call, ignore parms for which we don't have + a real argument. + * call.c (joust): Pass len to more_specialized. + (add_template_candidate_real): Strip 'this', pass len. + * pt.c (more_specialized): Pass len down. Lose explicit_args parm. + (get_bindings_order): New fn. Pass len down. + (get_bindings_real): Strip 'this', pass len. + (fn_type_unification): Likewise. + (type_unification_real): Succeed after checking 'len' args. + (most_specialized_instantiation): Lose explicit_args parm. + * class.c (resolve_address_of_overloaded_function): Strip 'this', + pass len. + + 2000-12-21 Jason Merrill + + * pt.c (tsubst_decl): A FUNCTION_DECL has DECL_RESULT, not + DECL_TEMPLATE_RESULT. + + * search.c (lookup_field_r): Call lookup_fnfields_1, not + lookup_fnfields_here. + + * parse.y (typename_sub2): Return the TYPE_DECL, not the type. + + * call.c (build_object_call): Also allow conversions that return + reference to pointer to function. + (add_conv_candidate): Handle totype being ref to ptr to fn. + (build_field_call): Also allow members of type reference to function. + Lose support for calling pointer to METHOD_TYPE fields. + + * error.c (dump_expr): Handle *_CAST_EXPR. + + * typeck2.c (build_scoped_ref): Always convert to the naming class. + + * tree.c (break_out_cleanups): Lose. + * cp-tree.h: Remove prototype. + * typeck.c (build_component_ref): Don't break_out_cleanups. + (build_compound_expr): Likewise. + * semantics.c (finish_expr_stmt): Likewise. + + 2000-12-20 Richard Henderson + + * cp-tree.h: Update declarations. + * decl.c (finish_case_label): Return the new stmt node. + * semantics.c (finish_goto_stmt): Likewise. + (finish_expr_stmt, finish_return_stmt): Likewise. + (finish_break_stmt, finish_continue_stmt): Likewise. + (finish_asm_stmt): Likewise. + * parse.y (already_scoped_stmt): Set STMT_LINENO. + (compstmt, implicitly_scoped_stmt, stmt): Likewise. + (simple_if, simple_stmt): Return the new stmt node. + (save_lineno): New. + + 2000-12-18 Joseph S. Myers + + * cp-tree.h: Don't declare warn_long_long. + + 2000-12-15 Kriang Lerdsuwanakij + + * tree.c (no_linkage_helper): Use CLASS_TYPE_P instead of + IS_AGGR_TYPE. + + 2000-12-15 Kriang Lerdsuwanakij + + * pt.c (unify): Handle when both ARG and PARM are + BOUND_TEMPLATE_TEMPLATE_PARM. + + 2000-12-15 Kriang Lerdsuwanakij + + * pt.c (reduce_template_parm_level): Set DECL_ARTIFICIAL and + DECL_TEMPLATE_PARM_P. + + 2000-12-15 Jason Merrill + + * init.c (build_new_1): Reorganize. Now with 100% fewer SAVE_EXPRs! + + * init.c (build_new_1): Don't strip quals from type. + + * decl.c (pushdecl): Don't check for linkage on a non-decl. + + * call.c (build_op_delete_call): See through ARRAY_TYPEs. + + * call.c (build_new_function_call): Lose space before paren in + error message. + (build_new_method_call): Likewise. + + * typeck2.c (build_m_component_ref): Propagate quals from datum. + + 2000-12-14 Kriang Lerdsuwanakij + + * pt.c (check_explicit_specialization): Propagate default + function arguments to explicit specializations. + + 2000-12-13 DJ Delorie + + * typeck.c (build_binary_op): Do signed/unsigned warnings for >? + and + + * error.c (dump_function_name): Don't let the user see __comp_ctor. + + Clean up copy-initialization in overloading code. + * call.c (build_user_type_conversion_1): Die if we are asked to + convert to the same or a base type. + (implicit_conversion): Avoid doing so. Lose reference binding code. + (convert_like_real): Treat BASE_CONV and RVALUE_CONV as implicit + direct-initialization. Also do direct-init part of copy-init. + (build_user_type_conversion): Don't provide context to convert_like. + * cvt.c (ocp_convert): build_user_type_conversion will now provide + the constructor call for copy-init. + + * pt.c (tsubst_decl): Call clone_function_decl here if this is an + instantiation of a member template. + (do_decl_instantiation): Not here. + + 2000-12-07 Nathan Sidwell + + * class.c (check_field_decls): Don't special case anonymous + fields in error messages. + (note_name_declared_in_class): Use %D on diagnostic. + + * tree.c (pod_type_p): Use strip_array_types. + (cp_valid_lang_attribute): Likewise. + * typeck.c (cp_type_quals): Strip arrays separately, to avoid + multiple evaluations. + (cp_has_mutable_p): Use strip_array_types. + + 2000-12-07 Nathan Sidwell + + * cp-tree.h (sufficient_parms_p): Declare new function. + * call.c (sufficient_parms_p): New function, broken out of ... + (add_function_candidate): ... here. Use it. + (add_conv_candidate): Use it. + * decl.c (grok_ctor_properties): Use it. + + 2000-12-07 Jakub Jelinek + + * optimize.c (copy_body_r): Set STMT_IS_FULL_EXPR_P on EXPR_STMT. + + 2000-12-07 Joseph S. Myers + + * decl2.c (lang_decode_option): Handle -Wformat-security. + + 2000-12-06 Kriang Lerdsuwanakij + + * pt.c (verify_class_unification): New function. + (get_class_bindings): Use it. + (try_class_unification): Tidy. + (unify): Handle when argument of a template-id is not + template parameter dependent. + (template_args_equal): Handle when TREE_CODE's do not match. + + 2000-12-06 Alexandre Oliva + + * lang-specs.h (c++): When invoking the stand-alone preprocessor + for -save-temps, pass all relevant -Defines to it, and then don't + pass them to cc1plus. + + 2000-12-05 Will Cohen + + * decl.c (finish_case_label): Cleared + more_cleanups_ok in surrounding function scopes. + (define_label): Likewise. + + 2000-12-05 Nathan Sidwell + + * cp-tree.h (IDENTIFIER_VIRTUAL_P): Document. + (get_matching_virtual): Remove. + (look_for_overrides): Declare new function. + * decl.c (grokfndecl): Don't set IDENTIFIER_VIRTUAL_P or + DECL_VINDEX here. + * class.c (check_for_override): Move base class iteration code + to look_for_overrides. + * search.c (next_baselink): Remove. + (get_virtuals_named_this): Remove. + (get_virtual_destructor): Remove. + (tree_has_any_destructors_p): Remove. + (struct gvnt_info): Remove. + (check_final_overrider): Remove `virtual' from error messages. + (get_matching_virtuals): Remove. Move functionality to ... + (look_for_overrides): ... here, and ... + (look_for_overrides_r): ... here. Set DECL_VIRTUAL_P, if found + to be overriding. + + 2000-12-05 Nathan Sidwell + + * typeck.c (get_delta_difference): If via a virtual base, + return zero. + * cvt.c (cp_convert_to_pointer): If via a virtual base, do no + adjustment. + + 2000-12-04 Richard Henderson + + * error.c (dump_tree): Use output_add_string not OB_PUTS. + + 2000-12-04 Jason Merrill + + * mangle.c (write_type): Mangle VECTOR_TYPE with "U8__vector". + (write_builtin_type): Pass intSI_type_node and the like through + type_for_mode. + * method.c (process_overload_item): Mangle VECTOR_TYPEs with 'o'. + Pass intSI_type_node and the like through type_for_mode. + * decl2.c (arg_assoc_type): Handle VECTOR_TYPE like COMPLEX_TYPE. + * pt.c (tsubst, unify): Likewise. + * tree.c (walk_tree): Likewise. + * error.c (dump_type): Likewise. + (dump_type_prefix, dump_type_suffix): Don't bother with VECTOR_TYPE. + + * Make-lang.in: Tweak top comment for emacs. + (cp/TAGS): Restore. + + * except.c (expand_throw): Use push_throw_library_fn for _Jv_Throw. + + * class.c (clone_function_decl): Robustify. + + 2000-12-04 Michael Matz + + * decl.c (store_bindings): Only search in the non modified + old_bindings for duplicates. + + 2000-12-04 Nathan Sidwell + + * error.c (dump_function_decl): Use DECL_VIRTUAL_P, not + TYPE_POLYMORPHIC_P. + + * typeck.c (build_static_cast): Remove unused variable. + + 2000-12-01 Kriang Lerdsuwanakij + + * pt.c: Fix typo in comment. + + 2000-12-01 Joseph S. Myers + + * decl2.c (warn_format): Remove definition. + (lang_decode_option): Handle -Wformat-nonliteral, + -Wno-format-extra-args and -Wno-format-y2k. Use set_Wformat. + + 2000-12-01 Joseph S. Myers + + * decl.c (WINT_TYPE, INTMAX_TYPE, UINTMAX_TYPE): Don't define. + (init_decl_processing): Don't create string_type_node, + const_string_type_node, wint_type_node, intmax_type_node, + uintmax_type_node, default_function_type, ptrdiff_type_node and + unsigned_ptrdiff_type_node. Adjust position of call to + c_common_nodes_and_builtins. + (identifier_global_value): New function. + + 2000-12-01 Nathan Sidwell + + * call.c (standard_conversion): Reject pointer to member + conversions from ambiguous, inaccessible or virtual bases. + * typeck.c (build_static_cast): Don't check pointers to members + specially. + + 2000-11-30 Nathan Sidwell + + * method.c (do_build_copy_constructor): Preserve cv + qualifications when accessing source object members. + (do_build_assign_ref): Likewise. Remove separate diagnostics for + unnamed fields. + + 2000-11-30 Nathan Sidwell + + * method.c (do_build_assign_ref): Construct appropriately + CV-qualified base reference. Don't allow const casts in base + conversion. + + 2000-11-30 Nathan Sidwell + + * call.c (build_over_call): Use VOID_TYPE_P. Don't die on + incomplete return type. + + 2000-11-28 Nathan Sidwell + + * parse.y (base_class.1): Produce a _TYPE not a _DECL. + * semantics.c (finish_base_specifier): Accept a _TYPE not a + _DECL. + + 2000-11-28 Nathan Sidwell + + * spew.c (yyerror): Cope if yylval.ttype is NULL. + + 2000-11-28 Nathan Sidwell + + * decl.c (grokdeclarator): Diagnose undefined template contexts. + + 2000-11-28 Nathan Sidwell + + * decl.c (grokdeclarator): Do type access control on friend + class. + + 2000-11-27 Nathan Sidwell + + * decl.c (grokfndecl): Undo COMPONENT_REF damage caused by + bison parser ickiness. + * pt.c (tsubst_friend_function): Enter namespace scope when + tsubsting the function name. + * cp-tree.h (DECL_TI_TEMPLATE): Update comment to reflect reality. + + 2000-11-27 Nathan Sidwell + + * cp-tree.h (binfo_from_vbase): Return the virtual base's binfo. + * cvt.c (cp_convert_to_pointer): Add force parameter. + Allow conversions via virtual base if forced. + (convert_to_pointer_force): Adjust call to cp_convert_to_pointer. + (ocp_convert): Likewise. + * search.c (binfo_from_vbase): Return the virtual base's binfo. + * typeck.c (get_delta_difference): Adjust handling of virtual + bases. + + 2000-11-26 Mark Mitchell + + * tree.c (struct list_hash): Remove. + (list_hash_table): Make it be an htab. + (struct list_proxy): New type. + (list_hash_eq): New function. + (list_hash_pieces): Renamed from ... + (list_hash): ... this. + (list_hash_lookup): Remove. + (list_hash_add): Remove. + (hash_tree_cons): Use the generic hashtable. + (mark_list_hash): Remove. + (init_tree): Create the hashtable. + + 2000-11-25 Joseph S. Myers + + * method.c (build_mangled_C9x_name): Rename to + build_mangled_C99_name. Change C9X references in comments to + refer to C99. + + 2000-11-24 Nathan Sidwell + + * parse.y (unary_expr): Move VA_ARG from here ... + (primary): ... to here. + + 2000-11-24 Nathan Sidwell + + * semantics.c (finish_id_expr): If type is error_mark, return + error_mark. + + 2000-11-23 Nathan Sidwell + + * pt.c (lookup_template_class): Simplify loop exit constructs. + Cope when there is no partial instantiation of a template + template member. + + 2000-11-23 J"orn Rennecke + + * Make-lang.in (g++spec.o, cxxmain.o): Depend on $(CONFIG_H). + + 2000-11-22 Mark Mitchell + + * mangle.c (mangle_conv_op_name_for_type): Don't use `__op' + prefix. + + * pt.c (do_decl_instantiate): Explicitly clone constructors and + destructors that haven't already been cloned. + + 2000-11-20 Richard Henderson + + * parse.y (yyparse_1): Rename the parser entry point. + + 2000-11-20 Alex Samuel + + * mangle.c (write_name): Use for names directly in + function scope. + (write_unscoped_name): Accept names directly in function scope. + + 2000-11-20 Nathan Sidwell + + * lex.c (rid_to_yy, RID_EXPORT): Make unique keyword. + * parse.y (extdef): Add EXPORT reduction. + * spew.c (yylex): Don't skip export here. + + 2000-11-19 Mark Mitchell + + * decl.c (init_decl_processing): Correct name of pure virtual + function under the new ABI. + * rtti.c (throw_bad_cast): Likewise, for bad cast function. + (throw_bad_typeid): Likewise for bad typeid function. + + 2000-11-18 Mark Mitchell + + * decl.c (grokparms): Don't even function types of `void' type, + either. + * mangle.c (write_type): Don't crash when confronted with the + error_mark_node. + + * decl.c (grokparms): Don't create parameters of `void' type. + + 2000-11-17 Zack Weinberg + + * lex.c (mark_impl_file_chain): Delete. + (init_parse): Remove call to ggc_add_string_root. No need to + ggc_strdup a string constant. Do not add impl_file_chain to GC + roots. + (handle_pragma_implementation): No need to ggc_strdup main_filename. + + 2000-11-17 Nathan Sidwell + + * pt.c (tsubst_expr, DECL_STMT): Instantiate decl's type. + + 2000-11-17 Nathan Sidwell + + * cp-tree.h (PARMLIST_ELLIPSIS_P): New macro. + * decl.c (grokdeclarator): Don't reject void parms here. + (require_complete_types_for_parms): Simplify, use + complete_type_or_else. + (grokparms): Remove bitrot. Remove funcdef parm. + Deal with ellipsis parm lists here. + * semantics.c (finish_parmlist): Don't append void_list_node + here. Set PARMLIST_ELLIPSIS_P. + + 2000-11-17 Nathan Sidwell + + * typeck2.c (incomplete_type_error): Reorganize to avoid + excessive diagnostics. + + 2000-11-16 Zack Weinberg + + * lex.c (struct impl_files, internal_filename): Constify a char *. + + 2000-11-16 Mark Mitchell + + * mangle.c (write_special_name_constructor): Don't generate + assembler junk when confronted with an old-style constructor. + (write_special_name_destructor): Likewise. + (mangle_decl_string): Do it here instead. + + 2000-11-16 Nathan Sidwell + + * call.c (op_error): Make error messages clearer. + + 2000-11-15 Mark Mitchell + + * decl.c (wrapup_globals_for_namespace): Don't mark things + TREE_ASM_WRITTEN when they're not. + + 2000-11-15 Jason Merrill + + * typeck2.c (friendly_abort): Uncount the error before handing + off to fancy_abort. + + 2000-11-15 Nathan Sidwell + + * typeck.c (lookup_anon_field): Cope with qv qualifiers. + + 2000-11-14 Mark Mitchell + + * class.c (build_vtbl_initializer): Fix typo in comment. + * typeck.c (expr_sizeof): Don't crash on errors. + + 2000-11-14 Jim Wilson + + * lang-specs.h: Add %2 after %(cc1_options). + + 2000-11-14 Richard Henderson + + * typeck.c (c_sizeof): Be strict about casting result value + back to c_size_type_node. + (expr_sizeof, c_sizeof_nowarn, c_alignof): Likewise. + + 2000-11-13 Joseph S. Myers + + * typeck.c (build_unary_op): Use boolean_increment from + c-common.c, moving the relevant code there. + + 2000-11-11 Jason Merrill + + * typeck.c (mark_addressable): Don't call put_var_into_stack. + + * decl.c (maybe_commonize_var): Set DECL_UNINLINABLE for statics + in inlines. + + 2000-11-10 Kaveh R. Ghazi + + * decl.c (grokdeclarator, save_function_data): Use memcpy, not bcopy. + * lex.c (copy_lang_decl): Likewise. + + 2000-11-09 Mark Mitchell + + * dump.c (cp_dump_tree): Don't dump function bodies here. + + * Make-lang.in (CXX_C_OBJS): Add c-dump.o. + (dump.o): Update dependency list. + * cp-tree.h (DECL_MAYBE_TEMPLATE): Remove. + (flag_dump_translation_unit): Likewise. + (CP_TYPE_QUALS): Adjust definition. + (DECL_C_BIT_FIELD): Remove. + (SET_DECL_C_BIT_FIELD): Likewise. + (CLEAR_DECL_C_BIT_FIELD): Likewise. + (add_maybe_template): Likewise. + (strip_array_types): Likewise. + (dump_node_to_file): Likewise. + (cp_dump_tree): New function. + * decl.c (init_decl_processing): Set lang_dump_tree. + * decl2.c (flag_dump_translation_unit): Remove. + * dump.c: Move most of it to ../c-dump.c. + (cp_dump_tree): New function. + * pt.c (add_maybe_template): Remove. + * typeck.c (strip_array_types): Likewise. + + 2000-11-07 Eric Christopher + + * decl.c (init_decl_processing): Change definition of + __wchar_t to wchar_t. Remove artificial declaration of + wchar_t. + * lex.c: Change instances of __wchar_t to wchar_t. + + 2000-11-09 Nathan Sidwell + + * lex.c (do_identifier): Don't lookup_name for operators. + * parse.y (operator): Save looking_for_typename. + (unoperator): Restore it. + * spew.c (frob_opname): Use nth_token for lookahead. + + 2000-11-08 Nathan Sidwell + + * decl.c (grok_op_properties): Always use coerce_new_type and + coerce_delete_type. + * decl2.c (coerce_new_type): Use c_size_type_node. Preserve + exception specification. Tidy up. + (coerce_delete_type): Preserve exception specification. Tidy up. + + 2000-11-07 Joseph S. Myers + + * class.c (duplicate_tag_error, build_vtbl_initializer), decl.c + (push_binding_level), error.c (cp_tree_printer), pt.c + (process_partial_specialization, tsubst_template_arg_vector), + search.c (lookup_member): Use memset () instead of bzero (). + + 2000-11-07 Nathan Sidwell + + * decl.c (build_ptrmemfunc_type): Allow error_mark_node. + + 2000-11-05 Joseph S. Myers + + * Make-lang.in (c++.distdir): Remove. + + 2000-11-04 Mark Mitchell + + * decl2.c (do_nonmember_using_decl): Allow `extern "C"' + declarations from different namespaces to be combined. + + 2000-11-03 Zack Weinberg + + * decl.c: Include tm_p.h. + + 2000-11-03 Joseph S. Myers + + * tree.c (cp_tree_equal): Use memcmp () instead of bcmp (). + + 2000-11-02 Joseph S. Myers + + * dump.c (dequeue_and_dump), lex.c (interface_strcmp), method.c + (build_overload_value), repo.c (open_repo_file), xref.c + (open_xref_file): Use strchr () and strrchr () instead of index () + and rindex (). + + 2000-11-01 Bernd Schmidt + + * call.c (build_over_call): Call fold on the CALL_EXPR. + + 2000-11-01 Gabriel Dos Reis + + * error.c (dump_template_decl): Separate template hearders with + space not comma. + + 2000-10-31 Gabriel Dos Reis + + * error.c: Move TFF_ macros into cp-tree.h. Throughout, replace + TS_* flags with corresponding TFF_*. Adjust prototypes of + functions (which used to take a tree_string_flags) to take an int. + + * cp-tree.h (enum tree_string_flags): Remove + (TFF_PLAIN_IDENTIFIER, TFF_NAMESPACE_SCOPE, TFF_CLASS_SCOPE, + TFF_CHASE_NAMESPACE_ALIAS, TFF_CHASE_TYPEDEF, TFF_DECL_SPECIFIERS, + TFF_CLASS_KEY_OR_ENUM, TFF_RETURN_TYPE, + TFF_FUNCTION_DEFAULT_ARGUMENTS, TFF_EXCEPTION_SPECIFICATION, + TFF_TEMPLATE_HEADER, TFF_TEMPLATE_DEFAULT_ARGUMENTS, + TFF_TEMPLATE_NAME, TFF_EXPR_IN_PARENS, TFF_SCOPE): New macros. + (type_as_string, decl_as_string, expr_as_string, + context_as_string): Adjust prototype. + + * class.c (dump_class_hierarchy_r): Use TFF_PLAIN_IDENTIFIER + instead of TS_PLAIN. + + * pt.c (mangle_class_name_for_template): Use TFF_CHASE_TYPEDEF + instead of TF_CHASE_TYPEDEFS. Use TFF_PLAIN_IDENTIFIER instead of + plain `0'. + + 2000-10-30 Mark Mitchell + + * cp-tree.h (DECL_EXTERNAL_LINKAGE_P): New macro. + (linkage_kind): New enumeration. + (decl_linkage): New function. + * decl2.c (comdat_linkage): Extend comment. + * error.c (dump_function_decl): Print the arguments used to + instantiate a template, even when not printing the type of the + function. + * pt.c (convert_nontype_argument): Use DECL_EXTERNAL_LINKAGE_P, + not TREE_PUBLIC, to test for external linkage. + * tree.c (decl_linkage): New function. + + 2000-10-28 Mark Mitchell + + * pt.c (instantiate_decl): Always instantiate static data members + initialized in-class. + + 2000-10-27 Zack Weinberg + + * Make-lang.in: Move all build rules here from Makefile.in, + adapt to new context. Wrap all rules that change the current + directory in parentheses. Expunge all references to $(P). + When one command depends on another and they're run all at + once, use && to separate them, not ;. Add OUTPUT_OPTION to + all object-file generation rules. Delete obsolete variables. + + * Makefile.in: Delete. + * config-lang.in: Delete outputs= line. + + 2000-10-26 Gabriel Dos Reis + + * error.c (dump_function_decl): Print no space between + `ptr-operator' the `type-specifier' of the return type. + (dump_type_prefix): Make sure we put space at the appropriate + place. + + 2000-10-23 Jason Merrill + + * call.c (equal_functions): Also call decls_match for extern "C" fns. + + 2000-10-22 Jason Merrill + + * call.c (build_conditional_expr): Use ocp_convert to force + rvalue conversion. + + 2000-10-22 Mark Mitchell + + * call.c (standard_conversion): Use RVALUE_CONVs for all + expressions that satisfy lvalue_p, not just those that satisfy + real_lvalue_p. + + * optimize.c (copy_body_r): Don't treat CALL_EXPRs specially. + + * typeck.c (c_sizeof): Return an expression of `size_t' type, + not one with TYPE_IS_SIZETYPE set. + (dubious_conversion_warnings): Remove special-case code. + + 2000-10-21 Geoffrey Keating + + * decl2.c (arg_assoc_type): Handle VECTOR_TYPE. + * error.c (dump_type): Handle VECTOR_TYPE like POINTER_TYPE. + (dump_type_prefix): Print vector-of-int as 'int vector'. + (dump_type_suffix): Handle VECTOR_TYPE like POINTER_TYPE. + * tree.c (walk_tree): Handle VECTOR_TYPE. + + * decl.c (init_decl_processing): Call MD_INIT_BUILTINS. + + 2000-10-21 Jason Merrill + + * parse.y (operator): Set got_object from got_scope. + Set looking_for_typename. + * decl.c (lookup_name_real): Clear val after setting from_obj. + Reorganize diagnostic. + + 2000-10-20 Jason Merrill + + * tree.c (walk_tree): Don't walk into default args. + + * error.c (dump_expr): Use host_integerp. + + 2000-10-20 David Edelsohn + + * typeck2.c (abstract_virtuals_error): Use "because" instead of + "since" in error message. + + 2000-10-20 Richard Kenner + + * typeck.c (dubious_conversion_warning): Suppress if TYPE_IS_SIZETYPE. + + 2000-10-20 Jeffrey Oldham + + * decl.c (revert_static_member_fn): Fixed typo. + + 2000-10-19 Mark Mitchell + + * class.c (subobject_offset_fn): New type. + (dfs_record_base_offsets): Remove. + (record_base_offsets): Likewise. + (dfs_search_base_offsets): Likewise. + (record_subobject_offset): New function. + (check_subobject_offset): Likewise. + (walk_subobject_offsets): Likewise. + (record_subobject_offsets): Likewise. + (layout_conflict_p): Reimplement. + (layout_nonempty_base_or_field): Correct handling of type + conflicts during layout. + (layout_empty_base): Likewise. + (build_base_field): Adjust to handle new representation of empty + base offset table. + (build_base_fields): Likewise. + (layout_virtual_bases): Likewise. + (splay_tree_compare_integer_csts): New function. + (layout_class_type): Use a splay_tree, rather than a varray, to + represent the offsets of empty bases. + + * cp-tree.h (DECL_ANTICIPATED): Don't require a FUNCTION_DECL. + * decl.c (select_decl): Don't return declarations that are + DECL_ANTICIPATED. + + 2000-10-18 Mark Mitchell + + * cp-tree.h (cp_tree_index): Add CPTI_FAKE_STD. + (fake_std_node): New macro. + * decl.c (in_std): Rename to ... + (in_fake_std): ... this. + (flag_no_builtin): Remove. + (flag_no_nonansi_builtin): Likewise. + (walk_namespaces_r): Use fake_std_node. + (push_namespace): Use std_identifier. + (pop_namespace): Use in_fake_std. + (lookup_name_real): Use fake_std_node. + (init_decl_processing): When -fhonor-std, create the `std' + namespace. Don't create a dummy fake_std_node in that case. + Adjust call to c_common_nodes_and_builtins. Use std_identifier. + (builtin_function): Put builtins whose names don't begin + with `_' in the std namespace. + * decl2.c (flag_no_builtin): Remove. + (flag_no_nonansi_builtin): Likewise. + (set_decl_namespace): Use fake_std_node. + (validate_nonmember_using_decl): Likewise. + (do_using_directive): Likewise. + (handle_class_head): Likewise. + * dump.c (dequeue_and_dump): Likewise. + * except.c (init_exception_processing): Use std_identifier. + * init.c (build_member_call): Use fake_std_node. + * rtti.c (init_rtti_processing): Use std_identifier. + + 2000-10-17 Mark Mitchell + + * cp-tree.h (back_end_hook): Remove declaration. + * decl2.c (back_end_hook): Remove definition. + + * dump.c (dequeue_and_dump): Dump TREE_USED. + + 2000-10-17 Brad Lucier + + * spew.c (snarf_defarg): Cast 2nd arg to obstack_blank to (int). + + 2000-10-17 Joseph S. Myers + + * decl.c (WINT_TYPE): Define. + (init_decl_processing): Create types unsigned_ptrdiff_type_node, + c_size_type_node, signed_size_type_node and wint_type_node. + + 2000-10-17 Joseph S. Myers + + * decl2.c (warn_missing_format_attribute): New variable. + (lang_decode_option): Decode -Wmissing-format-attribute. + + 2000-10-16 Mark Mitchell + + * typeck.c (qualify_type): Remove. + (composite_pointer_type): Fix handling of conversions to `cv void*'. + + 2000-10-14 Kaveh R. Ghazi + + * Makefile.in (parse.c, parse.h): Fix think-o in last patch. + + 2000-10-13 Kaveh R. Ghazi + + * Makefile.in (parse.c, parse.h): Create atomically. + + 2000-10-12 Mark Mitchell + + * class.c (current_obstack): Remove. + * decl.c (ggc_p): Remove. + (start_decl): Don't use decl_tree_cons. + (grokdeclarator): Don't use build_decl_list. + (start_function): Don't use decl_tree_cons. + (finish_function): Don't mess with obstacks. + * decl2.c (grok_x_components): Don't use build_decl_list. + * lex.c (make_call_declarator): Don't call decl_tree_cons. + (implicitly_declare_fn): Don't call build_decl_list. + * parse.y (frob_specs): Don't call build_decl_list or + decl_tree_cons. + (expr_or_declarator_intern): Don't call decl_tree_cons. + (primary): Don't call build_decl_list. + (fcast_or_absdcl): Likewise. + (typed_declspecs): Don't call decl_tree_cons. + (reserved_declspecs): Don't call build_decl_list. + (declmods): Likewise. + (reserved_typespecquals): Likewise. + (aggr): Likewise. + (new_type_id): Likewise. + (cv_qualifiers): Likewise. + (after_type_declarator_intern): Likewise. + (notype_declarator_intern): Likewise. + (absdcl_intern): Likewise. + (named_parm): Likewise. + * pt.c (most_specialized_class): Likewise. + * repo.c (temporary_obstack): Make it a structure, not a pointer. + (init_repo): Initialize it. + * search.c (current_obstack): Remove. + * typeck2.c (add_exception_specifier): Don't call build_decl_list. + + 2000-10-09 Richard Henderson + + * Make-lang.in (CXX_EXTRA_HEADERS): Remove. + (c++ language support bits for libgcc): Remove. + (c++.clean): Remove cplib2.txt cleanup. + * config-lang.in (headers, lib2funcs): Remove. + + * exception.cc, new.cc, new1.cc, new2.cc: Remove files. + * tinfo.cc, tinfo.h, tinfo2.cc, vec.cc: Remove files. + * inc/cxxabi.h, inc/exception, inc/new: Remove files. + * inc/new.h, inc/typeinfo: Remove files. + + 2000-10-08 Joseph S. Myers + + * decl.c (INTMAX_TYPE, UINTMAX_TYPE): Define if not already + defined. + (init_decl_processing): Initialize intmax_type_node and + uintmax_type_node. + + 2000-10-06 Richard Henderson + + * cp-tree.h (struct cp_language_function): Remove x_result_rtx. + (original_result_rtx): Remove. + * decl.c (save_function_data): Don't clear x_result_rtx. + (mark_lang_function): Don't mark it either. + * expr.c (fixup_result_decl): Remove. + * semantics.c (genrtl_named_return_value): Frob the return decl + before calling emit_local_var. + (genrtl_finish_function): Don't call fixup_result_decl. + Always emit the jump to return_label. + + 2000-10-06 Nathan Sidwell + + * pt.c (lookup_template_class): Set current access for enum. + (tsubst_enum): Set file & line for enum decl. + + * spew.c (yylex): Remove unused variable. + + 2000-10-05 Richard Henderson + + * semantics.c (genrtl_finish_function): Don't init or check + can_reach_end; remove noreturn and return value checks. + + 2000-10-05 Tom Tromey + + * init.c (build_java_class_ref): Use `build_static_name' with a + suffix, not a prefix, to build the class object's name. + + 2000-10-05 Nathan Sidwell + + * cp-tree.h (access_kind): Fix comment typo. + * decl2.c (grokfield): Fix diagnostic typo. + * semantics.c (finish_template_type): Fix comment typo. + (finish_qualified_object_call_expr): Likewise. + + 2000-10-05 Nathan Sidwell + + * pt.c (tsubst_expr, DECL_STMT case): Don't process if + tsubsting fails. + + 2000-10-05 Nathan Sidwell + + * spew.c (frob_id): New static function. + (frob_opname): Use it. + (yylex): Use it. + + 2000-10-01 Mark Mitchell + + * decl.c (lang_mark_false_label_stack): Remove. + * lex.c (cp_mang_lang_type): Use ggc_alloc_cleared. + + 2000-09-30 Joseph S. Myers + + * gxxint.texi: Use @email for formatting email addresses. + + 2000-09-29 Gabriel Dos Reis + + * error.c: Remove direct obstack manipulation. Replace with + output_buffer-based formatting. Adjust calls to removed macros. + (obstack_chunk_alloc, obstack_chunk_free): Remove. + (OB_INIT, OB_PUTC, OB_PUTC2, OB_PUTS, OB_PUTID, OB_PUTCP, + OB_FINISH, OB_PUTI, OB_END_TEMPLATE): Likewise. + + 2000-09-24 Mark Mitchell + + * ir.texi: Move to ../c-tree.texi. + + 2000-09-20 Jason Merrill + + * decl2.c (get_guard): Check DECL_FUNCTION_SCOPE_P. + + 2000-09-21 Andreas Jaeger + + * errfn.c: Move declaration of cp_printer and cp_printers to ... + * cp-tree.h: ... here. + + * error.c: Remove declaration of cp_printer. + + 2000-09-20 Mark Mitchell + + * tree.c (mark_local_for_remap_r): Handle CASE_LABELs. + + 2000-09-20 Hans-Peter Nilsson + + * except.c: Delete #if 0:d EXCEPTION_SECTION_ASM_OP-default and + users. + + 2000-09-18 Mark Mitchell + + * decl.c (start_function): Robustify. + + 2000-09-18 Kaveh R. Ghazi + + * cp-tree.h (check_function_format): Accept a `status' parameter. + + * call.c, typeck.c: Updates calls to `check_function_format'. + + 2000-09-17 Geoffrey Keating + + * decl2.c (handle_class_head): Always push some scope even + in the error case. + + 2000-09-16 Mark Mitchell + + * cp-tree.h (struct cp_language_function): Remove + x_scope_stmt_stack and name_declared. + (current_scope_stmt_stack): Remove. + (function_name_declared_p): New macro. + (struct lang_decl_flags): Use c_lang_decl as a base class. + (context): Remove. + (struct lang_decl): Replace saved_tree with context. + (DECL_FRIEND_CONTEXT): Adjust accordingly. + (SET_DECL_FRIEND_CONTEXT): Likewise. + (DECL_VIRTUAL_CONTEXT): Likewise. + (DECL_SAVED_TREE): Remove. + (C_DECLARED_LABEL_FLAG): Likewise. + (cplus_expand_expr_stmt): Don't declare. + (add_decl_stmt): Likewise. + (add_scope_stmt): Likewise. + * decl.c (mark_stmt_tree): Remove. + (case_compare): Likewise. + (finish_case_label): Use c_add_case_label. + (init_decl_processing): Set more language-specific hooks. + (build_enumerator): Fix typo in comment. + (cplus_expand_expr_stmt): Remove. + (mark_lang_function): Use mark_c_language_function. + (lang_mark_tree): Use c_mark_lang_decl. + * decl2.c: Change order of inclusion. + * except.c: Likewise. + * expr.c (cplus_expand_expr): Remove handling of STMT_EXPR. Fall + back on c_expand_expr. + * friend.c: Include expr.h. + * init.c: Change order of inclusion. + * Makefile.in: Update dependencies. + * lex.h (free_lang_decl_chain): Remove. + * optimize.c (maybe_clone_body): Use function_name_declared_p. + * pt.c (build_template_decl): Don't copy DECL_VIRTUAL_CONTEXT if + it doesn't exist. + (instantiate_decl): Use function_name_declared_p. + * semantics.c (lang_expand_expr_stmt): Remove. + (set_current_function_name_declared): Likewise. + (current_function_name_declared): Likewise. + (begin_compound_stmt): Use function_name_declared_p. + (add_decl_stmt): Remove. + (setup_vtbl_ptr): Use function_name_declared_p. + (add_scope_stmt): Remove. + (current_scope_stmt_stack): New function. + (cp_expand_stmt): Don't handle SCOPE_STMTs. + (expand_body): Use function_name_declared_p. + * tree.c (cp_statement_code_p): Don't include SCOPE_STMT. + * typeck.c: Change order of includes. + (convert_sequence): Remove. + + 2000-09-14 Joseph S. Myers + + * lex.c (reswords): Add _Complex. + + 2000-09-14 Richard Kenner + + * Make-lang.in (cplib2.txt): Depend on cp/Makefile. + + 2000-09-13 J. David Anglin + + * init.c (begin_init_stmts): Don't use // comments. + + 2000-09-12 Jason Merrill + + * decl.c (maybe_deduce_size_from_array_init): Set do_default for + all non-extern arrays. + + * decl.c (grokdeclarator): Complain about 'friend T' for implicit + typenames, too. Downgrade complaint to pedwarn. + (xref_tag): Warn about surprising behavior of 'friend struct T'. + * decl2.c (handle_class_head): Generate a TYPENAME_TYPE for + 'class This::Inherited'. + + 2000-09-12 Mark Mitchell + + * decl.c (finish_case_label): Given the LABEL_DECL a + DECL_CONTEXT. + + 2000-09-12 Gabriel Dos Reis + + * error.c (TFF_PLAIN_IDENTIFIER, TFF_NAMESPACE_SCOPE, + TFF_CLASS_SCOPE, TFF_CHASE_NAMESPACE_ALIAS, TFF_CHASE_TYPDEF, + TFF_DECL_SPECIFIERS, TFF_CLASS_KEY_OR_ENUM, TFF_RETURN_TYPE, + TFF_FUNCTION_DEFAULT_ARGUMENTS, TFF_EXCEPTION_SPECIFICATION, + TFF_TEMPLATE_HEADER, TFF_TEMPLATE_DEFAULT_ARGUMENTS, TFF_SCOPE): + New macros. + (sorry_for_unsupported_tree, print_scope_operator, + print_left_paren, print_right_paren, print_left_bracket, + print_right_bracket, print_whitespace): Likewise. + (aggr_variety): Rename to class_key_or_enum. + (print_type): Rename to print_type_id. + (print_type_specifier_seq, print_simple_type_specifier, + print_elaborated_type_specifier, + print_rest_of_abstract_declarator, + print_parameter_declaration_clause, print_exception_specification, + print_nested_name_specifier, print_template_id, + typedef_original_name, print_template_argument_list_start, + print_template_argument_list_end): New functions. + + 2000-09-11 Gabriel Dos Reis + + * ir.texi: Add more documentation. + + 2000-09-11 Mark Mitchell + + * cp-tree.h (struct saved_scope): Remove x_function_parms. + (current_function_parms): Don't define. + (struct cp_language_function): Remove parms_stored. + (current_function_just_assigned_this): Don't define. + (current_function_parms_stored): Likewise. + (static_ctors): Declare. + (static_dtors): Likewise. + (SF_EXPAND): Don't define. + (expand_start_early_try_stmts): Remove declaration. + (store_parm_decls): Likewise. + * decl.c (static_ctors): Don't declare. + (static_dtors): Likewise. + (struct binding_level): Remove this_block. + (poplevel): Remove dead code. + (set_block): Likewise. + (mark_binding_level): Don't mark this_block. + (mark_saved_scope): Don't mark x_function_parms. + (init_decl_processing): Don't add current_function_parms as a GC + root. + (check_function_type): Change prototype. + (start_function): Remove RTL-generation code. + (expand_start_early_try_stmts): Remove. + (store_parm_decls): Give it internal linkage. Remove + RTL-generation code. + (finish_function): Remove RTL-generation code. + * decl2.c (static_ctors): Fix formatting. + (static_dtors): Likewise. + * method.c (use_thunk): Don't call store_parm_decls. + (synthesize_method): Likewise. + * optimize.c (maybe_clone_body): Likewise. + * parse.y (fn.def2): Likewise. + (.set_base_init): Likewise. + (nodecls): Likewise. + * pt.c (instantiate_decl): Likewise. + * rtti.c (synthesize_tinfo_fn): Likewise. + * semantics.c (genrtl_try_block): Simplify. + (expand_body): Use genrtl_start_function and + genrtl_finish_function. + (genrtl_start_function): New function. + (genrtl_finish_function): Likewise. + + 2000-09-11 Nathan Sidwell + + * error.c (cp_tree_printer, case 'P'): Append break. + + 2000-09-11 Nathan Sidwell + + * cp-tree.h (frob_opname): Declare. + * parse.y (saved_scopes): New static variable. + (cp_parse_init): Adjust. + (do_id): If lastiddecl is NULL, do do_identifier. + (operator): Save scope information. + (unoperator): New reduction. Restore scope information. + (operator_name): Append unoperator. Call frob_opname. + * spew.c (frob_opname): Define. + + 2000-09-10 Zack Weinberg + + * decl.c, rtti.c: Include defaults.h if not already included. + Don't define the *_TYPE_SIZE macros. + + 2000-09-09 Mark Mitchell + + * cp-tree.h (push_switch): Change prototype. + (check_cp_case_value): Remove declaration. + (decl_constant_value): Likewise. + * decl.c (struct cp_switch): Add switch_stmt and cases. + (case_compare): New function. + (push_switch): Set switch_stmt. Initialize cases. + (pop_switch): Clean up cases. + (define_case_label): Rename to ... + (finish_case_label): ... this. Do semantic analysis for case + labels here. + (start_function): Correct comment. + * decl2.c (check_cp_case_value): Remove. + * expr.c (do_case): Remove. + * pt.c (tsubst_expr): Adjust call to finish_case_label. + * semantics.c (genrtl_do_poplevel): Remove declaration. + (RECHAIN_STMTS): Remove. + (finish_break_stmt): Use build_break_stmt. + (finish_continue_stmt): Use build_continue_stmt. + (finish_switch_cond): Adjust condition here, rater than in + c_expand_start_case. + (finish_case_label): Remove. + * typeck.c (c_expand_return): Remove. + (c_expand_start_case): Likewise. + + 2000-09-07 Gabriel Dos Reis + + * ir.texi: Document type nodes. + + 2000-09-06 Mark Mitchell + + * cp-tree.h (init_cp_semantics): Declare. + (genrtl_try_block): Don't declare. + (genrtl_handler): Likewise. + (genrtl_catch_block): Likewise. + (genrtl_ctor_stmt): Likewise. + (genrtl_subobject): Likewise. + (genrtl_do_poplevel): Likewise. + (genrtl_named_return_value): Likewise. + * lex.c (init_parse): Call init_cp_semantics. + * semantics.c (genrtl_try_block): Give it internal linkage. + (genrtl_handler): Likewise. + (genrtl_catch_block): Likewise. + (genrtl_ctor_stmt): Likewise. + (genrtl_subobject): Likewise. + (genrtl_do_poplevel): Likewise. + (genrtl_named_return_value): Likewise. + (lang_expand_stmt): Rename to ... + (cp_expand_stmt): ... this. Only handle C++-specific nodes. + (init_cp_semantics): Define. + + * decl.c (initialize_local_var): Remove RTL-generating code. + * semantics.c (genrtl_try_block): Fix formatting. + + Move statement-tree facilities from C++ to C front-end. + * cp-tree.h (cp_tree_index): Remove CPTI_VOID_ZERO. + (void_zero_node): Remove. + (stmt_tree): Likewise. + (scope_chain): Adjust. + (language_function): Rename to cp_language_function. + (cp_function_chain): Adjust. + (current_stmt_tree): Remove. + (last_tree): Likewise. + (last_expr_type): Likewise. + (struct lang_decl): Adjust. + (STMT_IS_FULL_EXPR_P): Remove. + (add_tree): Remove. + (begin_stmt_tree): Likewise. + (finish_stmt_tree): Likewise. + (walk_tree_fn): Likewise. + (walk_stmt_tree): Likewise. + * class.c (finish_struct): Replace use of add_tree with add_stmt. + * decl.c (mark_stmt_tree): Adjust type. + (init_decl_processing): Don't build void_zero_node. + (initialize_local_var): Adjust usage of current_stmt_tree. + (finish_enum): Use add_stmt, not add_tree. + (save_function_data): Adjust use of language_function. + (finish_constructor_body): Use add_stmt, not add_tree. + (finish_destructor_body): Likewise. + (push_cp_function_context): Adjust use of language_function. + (pop_cp_function_context): Likewise. + (mark_lang_function): Likewise. + (mark_cp_function_context): Likewise. + * init.c (build_aggr_init): Adjust use of current_stmt_tree. + (build_vec_init): Likewise. + * semantics.c (SET_LAST_STMT): Remove. + (RECHAIN_STMTS): Don't use it. + (stmts_are_full_exprs_p): Adjust use of current_stmt_tree. + (current_stmt_tree): Define. + (add_tree): Remove. + (finish_goto_stmt): Use add_stmt, not add_tree. + (finish_expr_stmt): Likewise. + (begin_if_stmt): Likewise. + (finish_then_clause): Likewise. + (begin_while_stmt): Likewise. + (begin_do_stmt): Likewise. + (finish_return_stmt): Likewise. + (begin_for_stmt): Likewise. + (finish_break_stmt): Likewise. + (finish_continue_stmt): Likewise. + (begin_switch_stmt): Likewise. + (finish_case_label): Likewise. + (begin_try_block): Likewise. + (begin_function_try_block): Likewise. + (begin_handler): Likewise. + (begin_catch_block): Likewise. + (begin_compound_stmt): Likewise. + (begin_asm_stmt): Likewise. + (finish_asm_stmt): Likewise. + (finish_label_stmt): Likewise. + (add_decl_stmt): Likewise. + (finish_subobject): Likewise. + (finish_decl_cleanup): Likewise. + (finish_named_return_value): Likewise. + (setup_vtbl_ptr): Likewise. + (add_scope_stmt): Likewise. + (finish_stmt_expr): Likewise. + (prune_unused_decls): Remove. + (begin_stmt_tree): Likewise. + (finish_stmt_tree): Likewise. + (prep_stmt): Adjust use of current_stmt_tree. + (lang_expand_stmt): Likewise. + * tree.c (statement_code_p): Remove. + (cp_statement_code_p): New function. + (walk_stmt_tree): Remove. + (init_tree): Set lang_statement_code_p. + + 2000-09-06 Zack Weinberg + + Integrated preprocessor. + + * Make-lang.in, Makefile.in: Remove all references to input.c, + gxx.gperf, and hash.h. Add ../c-lex.o to C_OBJS. + * gxx.gperf, hash.h, input.c: Delete. + * lang-specs.h: Pass -lang-c++ to cc1plus so cpplib is + initialized properly. + + * class.c (fixup_pending_inline): Take a tree, not a + struct pending_inline *. All callers changed. + (init_class_processing): Set RID_PUBLIC, RID_PRIVATE, + RID_PROTECTED entries in ridpointers[] array here. + * decl.c (duplicate_decls): Do not refer to struct + pending_inline. + (record_builtin_type, init_decl_processing): Use RID_MAX not + CP_RID_MAX. + (grokdeclarator): Use C_IS_RESERVED_WORD. + * decl2.c (lang_decode_option): Ignore -lang-c++ for sake of + cpplib. + (grok_x_components): Do not inspect pending_inlines chain. + + * cp-tree.h (struct lang_identifier): Add rid_code entry. + (C_IS_RESERVED_WORD, C_RID_CODE, C_RID_YYCODE): New. + (flag_no_gnu_keywords, flag_operator_names, rid_to_yy): Declare. + (DEFARG_LENGTH, struct pending_inline, TIME_IDENTIFIER_TIME, + TIME_IDENTIFIER_FILEINFO): Kill. + Update prototypes. + * lex.h: Expunge cp_rid. Rewrite RIDBIT macros to use just a + single 32-bit word. + * parse.y: Call do_pending_inlines unconditionally. + reinit_parse_for_method is now snarf_method. fn.defpen is no + longer necessary. Remove unnecessary annotation on + SCOPE. Do not refer to end_of_file or struct pending_inline. + * semantics.c (begin_inline_definitions): Call + do_pending_inlines unconditionally. + + * lex.c: Remove all code now shared with C front end. + Initialize cpplib properly if USE_CPPLIB. Put reserved words + into the get_identifier table. Rewrite pragma handling to + work with the registry. Move code to save tokens for later + processing to spew.c. + + * spew.c: Rewrite everything in terms of token streams instead + of text. Move routines here from lex.c / input.c as + appropriate. GC-mark trees hanging off the pending inlines + chain. + + 2000-09-06 Mark Mitchell + + * NEWS: Mention that the named return value extension has been + deprecated. + * cp-tree.h (original_result_rtx): Define. + (TREE_REFERENCE_EXPR): Remove. + (DECL_VPARENT): Likewise. + (pushdecl_nonclass_level): Likewise. + (store_return_init): Likewise. + (reinit_lang_specific): Likewise. + (genrtl_named_return_value): Change prototype. + * decl.c (original_result_rtx): Remove. + (cp_finish_decl): Don't build DECL_STMTs for RESULT_DECLs. + Do not generate RTL for local variables here. + (store_return_init): Remove. + * semantics.c (genrtl_named_return_value): Simplify. Fold in + store_return_init. + (finish_named_return_value): Adjust accordingly. Warn that this + extension is deprecated. + (lang_expand_stmt): Adjust call to genrtl_named_return_value. + + 2000-09-06 Nathan Sidwell + + * pt.c (type_unification_real): Replace switch with if. + (unify): Tsubst non-type parms before comparing. + + 2000-09-06 Nathan Sidwell + + * error.c (dump_typename): New function, broken out of ... + (dump_type): ... here. Use it. + * typeck.c (same_type_p): Use cp_tree_equal for TYPENAME_TYPE. + + 2000-09-06 Nathan Sidwell + + * init.c (build_offset_ref): Deal with namespace scoped + TEMPLATE_ID_EXPRs. + + 2000-09-06 Nathan Sidwell + + * class.c (resolve_address_of_overloaded_function): Add + explanation message. + * decl.c (define_case_label): Reformat explanation. + * decl2.c (finish_static_data_member_decl): Likewise. + (grokfield): Likewise. + * friend.c (do_friend): Likewise. + + 2000-09-05 Zack Weinberg + + * tree.c (walk_tree): Expose tail recursion. + (walk_stmt_tree): New function. + * cp-tree.h: Prototype walk_stmt_tree. + * semantics.c (prune_unused_decls): Operate on SCOPE_STMTs not + the BLOCKs directly. If a BLOCK has no variables after + pruning, discard it. + (finish_stmt_tree): Use walk_stmt_tree. No need to save and + restore the line number. + + 2000-09-05 Mark Mitchell + + * Makefile.in (CXX_TREE_H): Add dependency on HTAB_H. + (pt.o): Remove dependency on HTAB_H. + * cp-tree.h: Include hashtab.h. + (walk_tree): Change prototype. + (walk_tree_without_duplicates): New function. + * decl.c (check_default_argument): Use it. + * optimize.c (remap_decl): Adjust calls to walk_tree. + (copy_body): Likewise. + (expand_calls_inline): Likewise. + (calls_setjmp_p): Use walk_tree_without_duplicates. + * pt.c: Don't include hashtab.h. + (for_each_template_parm): Use walk_tree_without_duplicates. + * semantics.c (finish-stmt_tree): Likewise. + (expand_body): Likewise. + * tree.c (walk_tree): Add additional parameter. + (walk_tree_without_duplicates): New function. + (count_trees): Use it. + (verify_stmt_tree): Adjust call to walk_tree. + (find_tree): Use walk_tree_without_duplicates. + (no_linkage_check): Likewise. + (break_out_target_exprs): Adjust call to walk_tree. + (cp_unsave): Likewise. + + 2000-09-04 Kriang Lerdsuwanakij + + * cp-tree.def (BOUND_TEMPLATE_TEMPLATE_PARM): New tree code. + (TEMPLATE_TEMPLATE_PARM): Adjust comment. + * cp-tree.h (TYPE_BINFO): Adjust comment. + (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO): Likewise. + (TEMPLATE_TYPE_PARM_INDEX): Likewise. + (IS_AGGR_TYPE): Use BOUND_TEMPLATE_TEMPLATE_PARM instead. + (TYPE_TEMPLATE_INFO): Likewise. + (TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL): Likewise. + * class.c (push_nested_class): Likewise. + * decl.c (lookup_name_real): Likewise. + (grokdeclarator): Likewise. + (grok_op_properties): Likewise. + (xref_tag): Likewise. + (xref_basetypes): Likewise. + * decl2.c (constructor_name_full): Likewise. + (arg_assoc_template_arg): Add TEMPLATE_TEMPLATE_PARM case. + (arg_assoc_type): Use BOUND_TEMPLATE_TEMPLATE_PARM instead. + * error.c (dump_type): Split TEMPLATE_TEMPLATE_PARM case. + (dump_type_prefix): Add BOUND_TEMPLATE_TEMPLATE_PARM. + (dump_type_suffix): Likewise. + * init.c (is_aggr_type): Use BOUND_TEMPLATE_TEMPLATE_PARM + instead. + (get_aggr_from_typedef): Likewise. + * mangle.c (write_type): Split TEMPLATE_TEMPLATE_PARM case. + (write_expression): Add BOUND_TEMPLATE_TEMPLATE_PARM. + (write_template_parm): Likewise. + (write_template_template_parm): Check tree code instead of + using TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO. + * method.c (build_overload_nested_name): Add + BOUND_TEMPLATE_TEMPLATE_PARM. + (process_overload_item): Split TEMPLATE_TEMPLATE_PARM case. + * parse.y (bad_parm): Add BOUND_TEMPLATE_TEMPLATE_PARM. + * pt.c (convert_template_argument): Check tree code instead of + using TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO. + (for_each_template_parm_r): Split TEMPLATE_TEMPLATE_PARM case. + (for_each_template_parm): Adjust comment. + (tsubst): Add BOUND_TEMPLATE_TEMPLATE_PARM. Reorganize. + (tsubst_copy): Add BOUND_TEMPLATE_TEMPLATE_PARM. + (unify): Add BOUND_TEMPLATE_TEMPLATE_PARM. Reorganize. Use + template_args_equal to compare template template parameter cases. + * ptree.c (print_lang_type): Add BOUND_TEMPLATE_TEMPLATE_PARM. + * search.c (lookup_field_1): Use BOUND_TEMPLATE_TEMPLATE_PARM + instead. + * tree.c (copy_template_template_parm): Decide whether to create + a TEMPLATE_TEMPLATE_PARM or BOUND_TEMPLATE_TEMPLATE_PARM node. + (walk_tree): Add BOUND_TEMPLATE_TEMPLATE_PARM. + (copy_tree_r): Likewise. + * typeck.c (comptypes): Likewise. Check tree code instead of + using TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO. + + 2000-09-04 Mark Elbrecht + + * decl.c (finish_function): Move the code for handling functions + marked with the constructor and destructor attributes inside the + expand_p block. + + 2000-09-04 Nathan Sidwell + + * init.c (resolve_offset_ref): Deal with TEMPLATE_ID_EXPR. + + 2000-09-04 Nathan Sidwell + + * pt.c (lookup_template_class): Remove abort. + * tree.c (get_type_decl): Allow error_mark_node. + + 2000-09-04 Nathan Sidwell + + * decl2.c (arg_assoc): Deal with COMPONENT_REFs inside + TEMPLATE_ID_EXPRs. + + 2000-09-03 Mark Mitchell + + * operators.def (ALIGNOF_EXPR, MAX_EXPR, MIN_EXPR): Change + new ABI mangling. + + 2000-09-01 Nathan Sidwell + + * parse.y (named_class_head): Check for TYPENAME_TYPE. Simplify + union tag mismatch error reporting. + + 2000-09-01 Nathan Sidwell + + * call.c (build_scoped_method_call): Check it is not a namespace. + + 2000-08-30 Jason Merrill + + * cp-tree.h (LOCAL_CLASS_P): Use decl_function_context. + + * tree.c (bot_manip): Check TREE_CONSTANT rather than + !TREE_SIDE_EFFECTS. Call break_out_target_exprs and + build_target_expr_with_type for the non-AGGR_INIT_EXPR case. + + * decl.c (start_function): Always call make_function_rtl. + + 2000-08-29 Zack Weinberg + + * semantics.c (prune_unused_decls): New function. + (finish_stmt_tree): Call it via walk_tree. + + 2000-08-29 Zack Weinberg + + * class.c (build_secondary_vtable): Constify a char *. + * decl.c (init_decl_processing): Initialize function_id_node, + pretty_function_id_node, and func_id_node. + * input.c (struct input_source): Constify 'str'. + (feed_input): Constify first argument. + * mangle.c (write_identifier): Constify argument. + * pt.c (mangle_class_name_for_template): Constify argument. + + 2000-08-29 Mark Mitchell + + * typeck.c (mark_addressable): Remove code that pokes around in + RTL. + + 2000-08-28 Jason Merrill + + * lex.c (file_name_nondirectory): Move to toplev.c. + + * cp-tree.h (LOCAL_CLASS_P): New macro. + * class.c (finish_struct_1): Use it. + + 2000-08-27 Alex Samuel + + * mangle.c (CLASSTYPE_TEMPLATE_ID_P): Remove unexplained voodoo. + (write_encoding): Pass another argument to write_name. + (write_name): Add ignore_local_scope parameter. Fix handling of + local names. + (write_nested_name): Use write_unqualified_name. + (write_prefix): Likewise. Skip out on FUNCTION_DECLs. + (write_template_prefix): Use write_unqualified_name. + (write_component): Remove. + (write_local_name): Add parameter. Use direct local entity to + discriminator calculation. + (write_class_enum_type): Pass another argument to write_name. + (write_template_template_arg): Likewise. + (make_guard_variable): Likewise. + + 2000-08-27 Jason Merrill + + * decl.c (pushdecl): Matching decls for local externs are found in + the current level. Propagate linkage information from previous + declarations. + + 2000-08-26 Gabriel Dos Reis + + * ir.texi (Expressions): Fix typo. + + 2000-08-25 Greg McGary + + * tree.c (init_tree): Use ARRAY_SIZE. + + 2000-08-25 Gabriel Dos Reis + + * error.c (cp_tree_printer): Rework. + + 2000-08-25 Mark Mitchell + + * Make-lang.in (CXX_LIB2FUNCS): Remove cp-demangle.o and + dyn-string.o. + (CXX_LIB2SRCS): Remove cp-demangle.c and dyn-string.c. + (cp-demangle.o): Remove target. + (dyn-string.o): Likewise. + + * decl.c (grokfndecl): Require that `main' return an `int'. + * mangle.c (write_encoding): Don't mangle return types for + conversion functions. + + 2000-08-25 Gabriel Dos Reis + + * error.c (tree_formatting_info): New data type. + (tree_being_formatted): New macro. + (tree_formatting_flags): Likewise. + (put_whitespace): Likewise. + (print_tree_identifier): Likewise. + (print_identifier): Likewise. + (cp_tree_printer, print_function_argument_list, print_declaration, + print_expression, print_function_declaration, + print_function_parameter, print_type, print_cv_qualifier): New + functions. + (init_error): Initialize lang_printer. + + 2000-08-24 Jason Merrill + + * typeck.c (build_ptrmemfunc): Just reinterpret if there's no + adjustment necessary. + + 2000-08-24 Greg McGary + + * cp-tree.h (MAIN_NAME_P): Remove macro. + + 2000-08-24 Gabriel Dos Reis + + * error.c (print_instantiation_context): Don't forget to flush the + buffer. + + 2000-08-23 Jason Merrill + + * typeck.c (build_ptrmemfunc): Save the input pmf. + + * method.c (process_modifiers): Use same_type_p. + + 2000-08-23 Mark Mitchell + + * cp-tree.h (DECL_CLONED_FUNCTION_P): Check DECL_LANG_SPECIFIC. + * mangle.c (write_function_type): Change prototype. + (write_encoding): Don't mangle return types for + constructors or destructors. + (write_type): Adjust call to write_function_type. + * pt.c (instantiate_template): Instantiate alternate entry points + when instantiating the main function. + + 2000-08-23 Gabriel Dos Reis + + * error.c (cp_print_error_function): Don't use embedded '\n' in + output_printf. + + 2000-08-23 Gabriel Dos Reis + + * decl.c (init_decl_processing): Remove bogus initialization. + * error.c (lang_print_error_function): Restore here. + (init_error): Initialize print_error_function. + + 2000-08-22 Theodore Papadopoulo + + * decl2.c (arg_assoc): Revert my 2000-08-11 change. + + 2000-08-22 Gabriel Dos Reis + + * Makefile.in (error.o): Depends on diagnostic.h + + * cp-tree.h (problematic_instantiation_changed, + record_last_problematic_instantiation, current_instantiation, + print_instantiation_context): Declare. + (maybe_print_template_context): Remove. + + * decl.c (init_decl_processing): Set print_error_function to NULL. + (lang_print_error_function): Remove, since we're using a new + machinery. + + * error.c: #include diagnostic.h + (function_category): New function. + (cp_diagnostic_starter): Likewise. + (cp_diagnostic_finalizer): Likewise. + (cp_print_error_function): Likewise. + (maybe_print_instantiation_context): Likewise. + (print_instantiation_full_context): Likewise. + (print_instantiation_partial_context): Likewise. + (print_instantiation_context): Define. + (init_error): Initialize diagnostic pager and finalizer. + + * pt.c (problematic_instantiation_changed): Define. + (record_last_problematic_instantiation): Likewise. + (current_instantiation): Likewise. + (maybe_print_template_context): Remove. + (print_template_context): Likewise. + (current_tinst_level): Make static to reflect Brendan Kehoe's + change of 1995-04-13. + (push_tinst_level): Call print_instantiation_context. + + 2000-08-21 Nix + + * lang-specs.h: Do not process -o or run the assembler if + -fsyntax-only. + + 2000-08-21 Joseph S. Myers + + * decl.c (flag_hosted, flag_noniso_default_format_attributes): New + variables. + * decl2.c (lang_decode_option): Disable gettext attributes for + -ansi. + + 2000-08-21 Gabriel Dos Reis + + * lex.c (lang_init_options): Default diagnostic message maximum + length to 80, when line-wrapping. + + 2000-08-20 Mark Mitchell + + * class.c (build_vtbl_initializer): Clear the entire + vtbl_init_data. Start keeping track of the functions for which we + have created vcall offsets here. + (dfs_build_vcall_offset_vtbl_entries): Remove. + (build_vcall_offset_vtbl_entries): Reimplement. + (add_vcall_offset_vtbl_entries_r): New function. + (add_vcall_offset_vtbl_entries_1): Likewise. Tweak logic for + computing when vcall offsets are necessary. + + 2000-08-18 Nathan Sidwell + + * decl.c (member_function_or_else): Use cp_error ... %T. + (grokdeclarator): Likewise. + (start_method): Likewise. + * friend.c (make_friend_class): Use cp_pedwarn ... %T. + + 2000-08-18 Nathan Sidwell + + * decl2.c (grokfield): Set CLASSTYPE_GOT_SEMICOLON on class + TYPE_DECLs. + + 2000-08-18 Nathan Sidwell + + * cp-tree.h (PTRMEM_OK_P): New macro. + (itf_ptrmem_ok): New enumeration value. + * class.c (resolve_address_of_overloaded_function): Add PTRMEM + argument. Diagnose implicit pointer to member. + (instantiate_type): Don't diagnose implicit pointer to member + here. Pass itf_ptrmem_ok if ok. Adjust calls to + resolve_address_of_overloaded_function. + * init.c (build_offset_ref): Set PTRMEM_OK_P. + (resolve_offset_ref): Don't diagnose implicit pointer to member here. + * semantics.c (finish_parenthesized_expr): Clear OFFSET_REFs here. + * typeck.c (build_x_unary_op): Calculate PTRMEM_OK_P. + (build_unary_op): Deal with single non-static member in + microsoft-land. + + 2000-08-18 Nathan Sidwell + + * decl2.c (arg_assoc_type): Cope with TYPENAME_TYPE. + + 2000-08-18 Nathan Sidwell + + * cp-tree.h (enum_name_string): Remove prototype. + (report_case_error): Remove prototype. + * cp/typeck2.c (enum_name_string): Remove. + (report_case_error): Remove. + * error.c (dump_expr): Deal with enum values directly. + Correctly negate integer constant. + + 2000-08-17 Nathan Sidwell + + * inc/cxxabi.h (__cxa_vec_new2, __cxa_vec_new3): Declare. + (__cxa_vec_delete2, __cxa_vec_delete3): Declare. + * vec.cc (__cxa_vec_new2, __cxa_vec_new3): Implement. + (__cxa_vec_delete2, __cxa_vec_delete3): Implement. + (__cxa_vec_new): Use __cxa_vec_new2. + (__cxa_vec_delete): Use __cxa_vec_delete2. + + 2000-08-17 Nathan Sidwell + + * vec.cc (__cxa_vec_new): Set "C" linkage. + (__cxa_vec_ctor): Likewise. + (__cxa_vec_cctor): Likewise. + (__cxa_vec_dtor): Likewise. + (__cxa_vec_delete): Likewise. + * inc/cxxabi.h (__cxa_vec_new): Set "C" linkage. + (__cxa_vec_ctor): Likewise. + (__cxa_vec_cctor): Likewise. + (__cxa_vec_dtor): Likewise. + (__cxa_vec_delete): Likewise. + + 2000-08-17 Nathan Sidwell + + * class.c (instantiate_type): Reinstate local variable + deleted in previous change. + + * cvt.c (cp_convert_to_pointer): Pass itf_complain, not + itf_no_attributes. + + 2000-08-17 Nathan Sidwell + + * cp-tree.h (instantiate_type_flags): New enumeration. + (instantiate_type): Change parameter. + * class.c (instantiate_type): Adjust prototype. Adjust. + * call.c (standard_conversion): Adjust instantiate_type call. + (reference_binding): Likewise. + (build_op_delete_call): Likewise. + (convert_like_real): Likewise. + * cvt.c (cp_convert_to_pointer): Likewise. + (convert_to_reference): Likewise. + * pt.c (convert_nontype_argument): Likewise. + * typeck.c (build_binary_op): Likewise. + (build_ptrmemfunc): Likewise. + (convert_for_assignment): Likewise. + + 2000-08-17 Nathan Sidwell + + * cp-tree.h (CPTR_AGGR_TAG): New global tree node. + (current_aggr): Define. + * decl.c (grokdeclarator): Make sure a friend class is an + elaborated type specifier. + * parse.y (current_aggr): Remove static definition. + (cp_parse_init): Adjust. + (structsp): Clear and restore current_aggr. + (component_decl_list): Clear current_aggr. + + * error.c (dump_type, case TYPENAME_TYPE): Don't emit the + aggregate tag on the typename's context. + + * pt.c (tsubst_friend_class): Return error_mark_node, if + parms becomes NULL. + (instantiate_class_template): Ignore error_mark_node friend types. + + 2000-08-14 Nathan Sidwell + + * cvt.c (warn_ref_binding): New static function, broken out of ... + (convert_to_reference): ... here. Use it. + + 2000-08-11 Kriang Lerdsuwanakij + + * parse.y (template_arg): Add rule for template qualified with + global scope. + + 2000-08-11 Theodore Papadopoulo + + * decl2.c (add_function): Reorganize. + (arg_assoc): Do not consider function template decls. + + 2000-08-11 Jason Merrill + + * decl.c (lookup_name_real): Don't forget the TYPENAME_TYPE we're + looking inside. + + 2000-08-11 Nathan Sidwell + + * cp-tree.h (resolve_scope_to_name): Remove unused prototype. + (lookup_nested_tag): Likewise. + + * decl2.c (grokfield): Fix comment to reflect many types of _DECLs + can be produced. + + 2000-08-11 Nathan Sidwell + + * parse.y (named_complex_class_head_sans_basetype): Remove + always true if. + + 2000-08-11 Nathan Sidwell + + * decl2.c (build_expr_from_tree, case METHOD_CALL_EXPR): Build + explicit TEMPLATE_ID_EXPR args. + (build_expr_from_tree, case CALL_EXPR): Likewise. + + 2000-08-11 Nathan Sidwell + + * decl.c (check_tag_decl): Diagnose typename's which don't + declare anything. + + 2000-08-10 Nathan Sidwell + + * init.c (build_aggr_init): Reject bogus array initializers + early. + + 2000-08-09 Nathan Sidwell + + * rtti.c (build_dynamic_cast_1): Set "C" linkage for new abi + runtime. + * cp/tinfo.cc (__dynamic_cast): Likewise. + * cp/inc/cxxabi.h (__dynamic_cast): Likewise. + + 2000-08-09 Nathan Sidwell + + * cvt.c (convert_to_pointer_force): Fix error message when + attempting to cast from ambiguous base. + + 2000-08-08 Jason Merrill + + * pt.c (tsubst_aggr_type): Bail if creating the argvec fails. + (tsubst_template_arg_vector): Likewise. + + * decl2.c (build_anon_union_vars): Choose the largest field; don't + assume that one will be as large as the union. + + 2000-08-07 Kazu Hirata + + * cp-tree.h (CLASSTYPE_HAS_PRIMARY_BASE_P): Fix a comment typo. + * decl.c (pop_labels): Likewise. + + 2000-08-04 Jeffrey Oldham + + * inc/cxxabi.h (__pbase_type_info): Changed member names to match + specifications. + (__pointer_to_member_type_info): Likewise. + (__base_class_info): Likewise. + (__class_type_info): Likewise. + (__si_class_type_info): Likewise. + (__vmi_class_type_info): Likewise. + * tinfo.cc (__si_class_type_info::__do_find_public_src): + Changed member names to match specifications. + (__vmi_class_type_info::__do_find_public_src): Likewise. + (__si_class_type_info::__do_dyncast): Likewise. + (__vmi_class_type_info::__do_dyncast): Likewise. + (__si_class_type_info::__do_upcast): Likewise. + (__vmi_class_type_info::__do_upcast): Likewise. + * tinfo2.cc (__pbase_type_info::__do_catch): Likewise. + (__pbase_type_info::__pointer_catch): Likewise. + (__pointer_type_info::__pointer_catch): Likewise. + (__pointer_to_member_type_info::__pointer_catch): Likewise. + + 2000-08-04 Zack Weinberg + + * Make-lang.in (cc1plus): Depend on $(BACKEND), not stamp-objlist. + * Makefile.in: Add C_OBJS, BACKEND; delete OBJS, OBJDEPS. + (cc1plus): Link with $(BACKEND) and $(C_OBJS). + + 2000-08-04 Mark Mitchell + + * cp-tree.h (add_method): Change prototype. + * class.c (add_method): Remove FIELDS parameter. Add ERROR_P. + Don't double the size of the method vector in the error case. + (handle_using_decl): Adjust call to add_method. + (add_implicitly_declared_members): Likewise. + (clone_function_decl): Likewise. + * decl2.c (check_classfn): Likewise. + * semantics.c (finish_member_declaration): Likewise. + + 2000-08-04 Joseph S. Myers + + * decl.c (flag_isoc94): New variable. + + 2000-08-02 Jason Merrill + + * pt.c (do_type_instantiation): Add complain parm; don't complain + if called recursively. + * cp-tree.h, parse.y: Adjust. + + 2000-08-02 Zack Weinberg + + * decl2.c: Silently ignore -Wstrict-prototypes; warn about + -Wno-strict-prototypes. + + * g++spec.c: Adjust type of second argument to + lang_specific_driver, and update code as necessary. + + * cp-tree.h: Don't prototype min_precision here. + (my_friendly_assert): Cast expression to void. + * semantics.c (do_poplevel): Initialize scope_stmts. + + 2000-08-02 Mark Mitchell + + * cp-tree.h (DECL_NEEDED_P): Tweak. + + 2000-07-28 Jason Merrill + + * lang-specs.h: Use %i in rule for .ii files. + + 2000-07-31 Zack Weinberg + + * lang-specs.h: Rename cpp to cpp0 and/or tradcpp to tradcpp0. + + 2000-07-30 Mark Mitchell + + Allow indirect primary bases. + * cp-tree.h (struct lang_type): Remove vfield_parent. Add + primary_base. + (CLASSTYPE_VFIELD_PARENT): Remove. + (CLASSTYPE_PRIMARY_BINFO): Reimplement. + (BINFO_PRIMARY_BINFO): Remove. + (CLASSTYPE_HAS_PRIMARY_BASE_P): Reimplement. + (BINFO_VBASE_PRIMARY_P): Likewise. + (BINFO_PRIMARY_BASE_OF): New macro. + (BINFO_INDIRECT_PRIMARY_P): Likewise. + (get_primary_binfo): New function. + * decl.c (lang_mark_tree): Make lang_type::primary_base. + * class.c (vcall_offset_data_s): Rename to ... + (vtbl_init_data_s): ... this. Rename primary_p to primary_vtbl_p, + and add ctor_vtbl_p. + (get_derived_offset): Use get_primary_binfo. + (dfs_mark_primary_bases): Adjust handling of virtual primary + bases. + (mark_primary_bases): Likewise. + (set_primary_base): Take a binfo, not an integer, as a + representation of the primary base. + (indirect_primary_base_p): Remove. + (determine_primary_base): Adjust for indirect primary bases. + (dfs_find_final_overrider): Fix typo in coment. + (update_vtable_entry_for_fn): Use get_primary_binfo. + (layout_nonempty_base_or_field): Tweak. + (build_base_fields): Adjust for new primary base semantics. + (dfs_propagate_binfo_offsets): Remove. + (propagate_binfo_offsets): Rewrite. + (dfs_set_offset_for_shared_vbases): Remove. + (layout_virtual_bases): Don't use it. + (layout_class_type): Set CLASSTYPE_SIZE correctly under the new + ABI. + (finish_struct_1): Set CLASSTYPE_PRIMARY_BINFO, not + CLASSTYPE_VFIELD_PARENT. + (dfs_get_primary_binfo): New function. + (get_primary_binfo): Likewise. + (dump_class_hierarchy_r): Tweak printing of primary bases. + (build_vtbl_initializer): Fix typo in comments. Use + vtbl_init_data. + (build_vcall_and_vbase_vtbl_entries): Likewise. + (build_vbaes_offset_vtbl_entries): Likewise. + (dfs_build_vcall_offset_vtbl_entries): Adjust setting of + BV_VCALL_INDEX to handle indirect primary bases. + (build_vcall_offset_vtbl_entries): Use vtbl_init_data. + (build_rtti_vtbl_entries): Likewise. + * search.c (get_shared_vbase_if_not_primary): Tweak. + (find_vbase_instance): Likewise. + (binfo_for_vtable): Simplify. + * tree.c (unshare_base_binfos): Clear BINFO_PRIMARY_BASE_OF. + (make_binfo): Make it have 11 entries. + + 2000-07-30 Alex Samuel + + * mangle.c (DECL_TEMPLATE_ID_P): Remove. + (CLASSTYEP_TEMPLATE_ID_P): Check template info, and context when + ascertaining primaryness. + (G): Remove template_args. + (decl_is_template_id): New function. + (write_encoding): Use decl_is_template_id. + (write_name): Likewise. Handle type_decls. Get main variant of + type decls. + (write_nested_name): Likewise. + (write_prefix): Likewise. + (write_template_prefix): Likewise. + (write_special_name_constructor): Remove defunct production from + comment. + (write_bare_function_type): Remove comment about absent parameter. + (write_template_template_arg): Add missing grammar production to + comment. + + 2000-07-27 Jason Merrill + + * decl.c (duplicate_decls): If common_type produces a non-typedef + type for a typedef, just use the old type. + + 2000-07-27 Mark Mitchell + + * cp-tree.h (function_depth): Declare. + (verify_stmt_tree): Likewise. + (find_tree): Likewise. + * decl.c (function_depth): Give it external linkage. + * optimize.c (optimize_function): Increment and decrement it. + * tree.c (verify_stmt_tree_r): New function. + (verify_stmt_tree): Likewise. + (find_tree_r): Likewise. + (find_tree): Likewise. + + 2000-07-27 Jason Merrill + + * pt.c (for_each_template_parm_r, case RECORD_TYPE): Use + TYPE_PTRMEMFUNC_P. + * cp-tree.h (TYPE_TEMPLATE_INFO): Check for TYPE_LANG_SPECIFIC. + + 2000-07-26 Mark Mitchell + + * decl.c (start_cleanup_fn): Mark the function as `inline'. + * decl2.c (get_guard): Call cp_finish_decl, not + rest_of_decl_compilation, for local guards. + * lex.c (do_identifier): Remove unused variable. + + 2000-07-26 Marc Espie + + * parse.y: Add missing ';'. + + 2000-07-26 Mark Mitchell + + * parse.y (empty_parms): Use `()', not `(...)', when in the scope + of `extern "C++"'. + + 2000-07-25 Nathan Sidwell + + Kill strict_prototype. Backwards compatibility only for + non NO_IMPLICIT_EXTERN_C systems. + * cp-tree.h (flag_strict_prototype): Remove. + (strict_prototype): Remove. + (strict_prototypes_lang_c, strict_prototypes_lang_cplusplus): Remove. + * decl.c (maybe_push_to_top_level): Adjust. + (pop_from_top_level): Adjust. + (decls_match): Only allow sloppy parm matching for ancient + system headers. + (init_decl_processing): Adjust. + (grokdeclarator): Adjust. + * decl2.c (flag_strict_prototype): Remove. + (strict_prototype): Remove. + (strict_prototypes_lang_c, strict_prototypes_lang_cplusplus): Remove. + (lang_f_options): Remove "strict-prototype". + (unsupported-options): Add "strict-prototype". + * lex.c (do_identifier): Adjust. + (do_scoped_id): Adjust. + * parse.y (empty_parms): Adjust. + * class.c (push_lang_context): Adjust. + (pop_lang_context): Adjust. + * typeck.c (comp_target_parms): Adjust. + + 2000-07-25 Nathan Sidwell + + * decl.c (poplevel): Deal with anonymous variables at for scope. + (maybe_inject_for_scope_var): Likewise. + + 2000-07-25 Zack Weinberg + + * decl.c: Remove all signal handling code, now done in toplev.c. + + 2000-07-23 Mark Mitchell + + * decl.c (make_rtl_for_nonlocal_decl): Rework. + + * pt.c (lookup_template_class): Ensure that TYPE_CONTEXT is set + correctly. + + 2000-07-20 Zack Weinberg + + * cp-tree.h: Use __FUNCTION__ not __PRETTY_FUNCTION__. + Define my_friendly_assert and my_friendly_abort as macros + which may call friendly_abort. Prototype friendly abort, not + my_friendly_abort or my_friendly_assert. + * decl.c (signal_catch): Report the signal caught in the error + message. Call fatal directly. + * typeck2.c (ack, my_friendly_assert): Delete. + (my_friendly_abort): Rename to friendly_abort. Expect file, + line, and function parameters. Report the abort code, then + call fancy_abort. Do not mask an abort if errors have + already occurred. + + 2000-07-18 Nathan Sidwell + + * typeck.c (comp_target_parms): Remove obsolete parameter. + (comp_target_types): Adjust. + + 2000-07-17 Jason Merrill + + * typeck.c (mark_addressable): Never set TREE_USED. + * call.c (build_call): Don't abort on calls to library functions + that have been declared normally. + + * typeck.c (build_binary_op): Fix grammar in warning. + + * exception.cc (__eh_free): Fix prototype. + + * decl2.c (finish_decl_parsing): Handle TEMPLATE_ID_EXPR. + + * decl.c (pushdecl): Handle seeing an OVERLOAD in + IDENTIFIER_NAMESPACE_VALUE. + + 2000-07-16 Mark Mitchell + + * cp-tree.h (THUNK_VCALL_OFFSET): Update documentation. + * method.c (use_thunk): Correct handling of vcall offsets. + + 2000-07-14 Zack Weinberg + + * .cvsignore: parse.h and parse.c have no cp- prefix. + + 2000-07-13 Mark Mitchell + + * .cvsignore: New file. + + 2000-07-13 Zack Weinberg + + * lang-specs.h: Use the new named specs. Remove unnecessary braces. + + 2000-07-12 Mark Mitchell + + * Makefile.in ($(PARSE_H)): Depend directly on parse.y. + * parse.c: Remove. + * parse.h: Likewise. + + 2000-07-11 Mark Mitchell + + * class.c (layout_class_type): Add pointers to virtual bases after + base classes under the old ABI. + + 2000-07-10 Benjamin Chelf + + * semantics.c (finish_for_stmt): Remove call to emit_line_note. + (finish_continue_stmt): Likewise. + (begin_for_stmt): Remove call to note_level_for_for. + (finish_goto_stmt): Change call from build_min_nt + to build_stmt. + (finish_expr_stmt): Likewise. + (begin_if_stmt): Likewise. + (begin_while_stmt): Likewise. + (finish_while_stmt): Likewise. + (finish_return_stmt): Likewise. + (begin_for_stmt): Likewise. + (finish_for_stmt): Likewise. + (finish_break_stmt): Likewise. + (begin_switch_stmt): Likewise. + (finish_case_label): Likewise. + (genrtl_try_block): Likewise. + (begin_try_block): Likewise. + (begin_handler): Likewise. + (begin_compound_stmt): Likewise. + (finish_asm_stmt): Likewise. + (finish_label_stmt): Likewise. + (add_decl_stmt): Likewise. + (finish_subobject): Likewise. + (finish_decl_cleanup): Likewise. + (finish_named_return_value): Likewise. + (setup_vtbl_ptr): Likewise. + (add_scope_stmt): Likewise. + * decl.c (finish_constructor_body): Likewise. + (finish_destructor_body): Likewise. + * optimize.c (copy_body_r): Likewise. + (initialize_inlined_parameters): Likewise. + (declare_return_variable): Likewise. + (expand_call_inline): Likewise. + + 2000-07-10 Jakub Jelinek + + * semantics.c (expand_body): Sync interface information + at the end of function body expansion. + + 2000-07-09 Jason Merrill + + * init.c (build_new_1): Bail early if the call to new fails. + + * decl.c (compute_array_index_type): Check specifically for + an INTEGER_CST, not just TREE_CONSTANT. + + * decl.c (duplicate_decls): Don't call duplicate_decls on + the DECL_TEMPLATE_RESULT. + (decls_match): Return 0 if the DECL_TEMPLATE_RESULTs have different + codes. + + * error.c (dump_template_bindings): Don't crash if we had an + invalid argument list. + + * typeck.c (c_expand_start_case): Do narrowing here. + * semantics.c (finish_switch_cond): Not here. + + 2000-07-09 Hidvegi Zoli + + * parse.y (asm_clobbers): Do string concatenation. + + 2000-07-09 Mark Mitchell + + * decl.c (pushtag): Don't put local classes in template functions + on the local_classes list. + + 2000-07-04 Scott Snyder + + * decl2.c (get_guard): Add missing return for old ABI local + variable case. + + 2000-07-09 Mark Mitchell + + * cp-tree.h (char_type_p): New function. + * decl.c (init_decl_processing): Don't initialize + signed_wchar_type_node or unsigned_wchar_type_node. + (complete_array_type): Handle brace-enclosed string-constants. + * rtti.c (emit_support_tinfos): Remove #if 0'd code. + * tree.c (char_type_p): New function. + * typeck2.c (digest_init): Use char_type_p. + + 2000-07-06 Nathan Sidwell + + * pt.c (tsubst): Don't layout type, if it's error_mark. + + 2000-07-06 Nathan Sidwell + + * pt.c (instantiate_pending_templates): Reset template level. + + 2000-07-05 Jason Merrill + + * call.c (joust): Don't complain about `operator char *()' beating + `operator const char *() const'. + + 2000-07-04 scott snyder + Jason Merrill + + * repo.c (repo_get_id): Handle the case where a class with virtual + bases has a null TYPE_BINFO_VTABLE. + + 2000-07-04 Kevin Buhr + Jason Merrill + + * parse.y (member_init): Just pass in the type. + * init.c (expand_member_init): Handle getting a type. + + 2000-07-04 Martin v. Löwis + Jason Merrill + + * decl.c (finish_function): Warn if a function has no return + statement. + Suggested by Andrew Koenig. + * typeck.c (check_return_expr): Do set current_function_returns_value + if we got an error_mark_node. + + 2000-07-03 Nathan Sidwell + + * decl2.c (push_decl_namespace): Push the original namespace. + + 2000-07-03 Nathan Sidwell + + * pt.c (instantiate_class_template): Set CLASSTYPE_VBASECLASSES. + * semantics.c (begin_class_definition): Clear it. + + 2000-07-02 Benjamin Chelf + + * cp-tree.h (genrtl_goto_stmt): Remove declaration. + (genrtl_expr_stmt): Likewise. + (genrtl_decl_stmt): Likewise. + (genrtl_if_stmt): Likewise. + (genrtl_while_stmt): Likewise. + (genrtl_do_stmt): Likewise. + (genrtl_return_stmt): Likewise. + (genrtl_for_stmt): Likewise. + (genrtl_break_stmt): Likewise. + (genrtl_continue_stmt): Likewise. + (genrtl_scope_stmt): Likewise. + (genrtl_switch_stmt): Likewise. + (genrtl_case_label): Likewise. + (genrtl_begin_compound_stmt): Likewise. + (genrtl_finish_compound_stmt): Likewise. + (genrtl_compound_stmt): Likewise. + (genrtl_asm_stmt): Likewise. + + * init.c (begin_init_stmts): Remove call to + genrtl_begin_compound_stmt. + (finish_init_stmts): Remove call to genrtl_finish_compound_stmt. + + * semantics.c (lang_expand_stmt): Changed call to + genrtl_compound_stmt to ignore return value. + + 2000-07-02 Mark Mitchell + + * mangle.c (canonicalize_for_substitution): Return the canonical + variant of a type. + + * decl.c (duplicate_decls): Preserve DECL_ORIGINAL_TYPE for a + TYPE_DECL. + * typeck.c (commonparms): Remove obstack manipulations. + + 2000-07-01 Benjamin Chelf + + * Make-lang.in (cc1plus$(exeext)): Added c-semantics.o. + + * Makefile.in (OBJS): Added ../c-semantics.o. + (OBJDEPS): Likewise. + + * cp-tree.h (TREE_LANG_FLAG_?): Moved common documentation to + ../c-common.h. + (struct stmt_tree): Added comment. + (current_function_name_declared): Removed. + (stmts_are_full_exprs_p): Likewise. + (genrtl_do_pushlevel): Likewise. + (genrtl_clear_out_block): Likewise. + (COMPOUND_STMT_NO_SCOPE): Moved to ../c-common.h. + (DECL_ANON_UNION_ELEMS): Likewise. + (emit_local_var): Likewise. + (make_rtl_for_local_static): Likewise. + (do_case): Likewise. + (expand_stmt): Likewise. + (genrtl_decl_cleanup): Likewise. + (c_expand_asm_operands): Likewise. + (c_expand_return): Likewise. + (c_expand_start_case): Likewise. + + * decl.c (make_rtl_for_local_static): Moved to c-semantics.c. + (emit_local_var): Likewise. + (initialize_local_var): Change reference to + stmts_are_full_exprs_p to call to stmts_are_full_exprs_p(). + Change reference to stmts_are_full_exprs_p to + current_stmt_tree->stmts_are_full_exprs_p. + (push_cp_function_context): Likewise. + + * expect.c (expand_throw): Change reference to + stmts_are_full_exprs_p. + + * init.c (build_aggr_init): Change reference to + stmts_are_full_exprs_p. + (build_vec_init): Likewise. + + * optimize.c (maybe_clone_body): Change reference to + current_function_name_declared to + cp_function_chain->name_declared. + + * pt.c (instantiate_decl): Change reference to + current_function_name_declared to + cp_function_chain->name_declared. + + * semantics.c (expand_cond): Moved declaration to c-common.h. + (genrtl_do_pushlevel): Moved to c-semantics.c. + (genrtl_clear_out_block): Likewise. + (genrtl_goto_stmt): Likewise. + (genrtl_expr_stmt): Likewise. + (genrtl_decl_stmt): Likewise. + (gerntl_if_stmt): Likewise. + (genrtl_while_stmt): Likewise. + (genrtl_do_stmt): Likewise. + (genrtl_return_stmt): Likewise. + (genrtl_for_stmt): Likewise. + (genrtl_break_stmt): Likewise. + (genrtl_continue_stmt): Likewise. + (genrtl_scope_stmt): Likewise. + (genrtl_switch_stmt): Likewise. + (genrtl_case_label): Likewise. + (genrtl_begin_compound_stmt): Likewise. + (genrtl_finish_compound_stmt): Likewise. + (genrtl_compound_stmt): Likewise. + (genrtl_asm_stmt): Likewise. + (genrtl_decl_cleanup): Likewise. + (expand_cond): Likewise. + (expand_stmt): Renamed to ... + (lang_expand_stmt): ... this. + (lang_expand_expr_stmt): Initialize. + (set_current_function_name_declared): Likewise. + (stmts_are_full_exprs_p): Likewise. + (current_function_name_declared): Likewise. + (anon_aggr_type_p): Likewise. + (do_poplevel): Change reference to + stmts_are_full_exprs_p to call to stmts_are_full_exprs_p(). + Change reference to stmts_are_full_exprs_p to + current_stmt_tree->stmts_are_full_exprs_p. + (add_tree): Likewise. + (finish_expr_stmt): Likewise. + (prep_stmt): Likewise. + (lang_expand_stmt): Likewise. + (begin_compound_stmt): Change reference to + current_function_name_declared to + cp_function_chain->name_declared and call to + current_function_name_declared(). + (setup_vtbl_ptr): Likewise. + (genrtl_do_poplevel): Removed. + + 2000-06-30 Jason Merrill + + * init.c (init_init_processing): Go back to aligning like + double_type_node for old ABI. + (get_cookie_size): Make cookie larger if we get a type that needs + more alignment. + (build_vec_delete): Call it. + + * typeck.c (qualify_type_recursive): New fn. + (composite_pointer_type): Use it. + (build_binary_op): Use composite_pointer_type. + + 2000-06-24 Carlos O'Ryan + Jason Merrill + + * typeck.c (check_return_expr): Don't complain about returning + NULL from operator new if -fcheck-new. + * cp-tree.h: Declare flag_check_new here. + * init.c: Not here. + + 2000-06-28 Alex Samuel + + * mangle.c (find_substitution): Use same_type_p. + (write_encoding): Don't check for substitutions. + + 2000-06-30 Nathan Sidwell + + * parse.y (expr_no_comma_rangle): New non-terminal. + (template_parm): Use it for default parameter case. + (template_arg): Use it. + (expr_no_commas): Remove commented out undefined extensions. + * Makefile.in (CONFLICTS): Adjust to 33 s/r & 48 r/r. + * parse.h, parse.c: Rebuilt. + + 2000-06-30 Mark Mitchell + + * semantics.c (genrtl_asm_stmt): Don't decay input operands here. + (finish_asm_stmt): Do it here, instead. + + * cp-tree.h (ridpointers): Don't declare. + * decl.c (record_builtin_type): Use CP_RID_MAX instead of RID_MAX. + (record_builtin_java_type): Likewise. + (init_decl_processing): Likewise. + * lex.c: Move inclusion of lex.h. + (ridpointers): Don't define. + (init_parse): Initialize ripdointers. Use CP_RID_MAX instead of + RID_MAX. + * lex.h (enum rid): Rename to ... + (enum cp_rid): ... this. + (ridpointers): Don't declare. + * parse.y: Move inclusion of lex.h. + * parse.c: Regenerated. + * spew.c: Move inclusion of lex.h. + + * cp-tree.h (struct language_function): Remove temp_name_counter. + (temp_name_counter): Remove. + (get_temp_name): Change prototype. + (get_guard): New function. + (get_guard_cond): Likewise. + (set_guard): Likewise. + * cvt.c (build_up_reference): Adjust call to get_temp_name. + * decl.c (expand_static_init): Use get_guard and friends to + implement guard variables. + * decl2.c (get_temp_name): Assume that the variables created are + always static. + (get_sentry): Rename to ... + (get_guard): ... this. Implement new ABI guard variables. + (get_guard_bits): New function. + (get_guard_cond): Likewise. + (set_guard): Likewise. + (start_static_initialization_or_destruction): Use them. + (do_static_initialization): Replace sentry with guard throughout. + (do_static_destruction): Likewise. + * init.c (create_temporary_var): Add comment. + + 2000-06-28 Alex Samuel + + * mangle.c (find_substitution): Use same_type_p. + (write_encoding): Don't check for substitutions. + + 2000-06-30 Nathan Sidwell + + * parse.y (expr_no_comma_rangle): New non-terminal. + (template_parm): Use it for default parameter case. + (template_arg): Use it. + (expr_no_commas): Remove commented out undefined extensions. + * Makefile.in (CONFLICTS): Adjust to 33 s/r & 48 r/r. + * parse.h, parse.c: Rebuilt. + + 2000-06-29 Mark Mitchell + + * cp-tree.h (flag_const_strings): Remove. + (warn_parentheses): Likewise. + (warn_format): Likewise. + (common_type): Likewise. + (default_conversion): Likewise. + (build_binary_op): Likewise. + (cp_build_binary_op): New macro. + * call.c (build_new_op): Use cp_build_binary_op instead of + build_binary_op. + * class.c (build_vtable_entry_ref): Likewise. + * decl.c (expand_static_init): Likewise. + (compute_array_index_type): Likewise. + (build_enumerator): Likewise. + * decl2.c (delete_sanity): Likewise. + (start_static_initialization_or_destruction): Likewise. + * error.c (dump_type_suffix): Likewise. + * init.c (resolve_offset_ref): Likewise. + (build_new): Likewise. + (build_new_1): Likewise. + (build_vec_delete_1): Likewise. + (build_vec_init): Likewise. + (build_delete): Likewise. + * rtti.c (synthesize_tinfo_fn): Likewise. + (synthesize_tinfo_var): Likewise. + * search.c (expand_upcast_fixups): Likewise. + (fixup_all_virtual_upcast_offsets): Likewise. + * typeck.c (build_array_ref): Likewise. + (get_member_function_from_ptrfunc): Likewise. + (build_binary_op): Add parameter. + (pointer_int_sum): Use cp_build_binary_op. + (pointer_diff): Likewise. + (build_modify_expr): Likewise. + (get_delta_difference): Likewise. + (build_ptrmemfunc): Likewise. + + 2000-06-29 Nathan Sidwell + + * cp-tree.h (SET_DECL_ARTIFICIAL): Remove. + * decl.c (create_implicit_typedef): Adjust. + * decl2.c (build_artificial_parm): Adjust. + * method.c (implicitly_declare_fn): Adjust. + * pt.c (push_inline_template_parms_recursive): Adjust. + (process_template_parm): Adjust. + (overloaded_template_name): Adjust. + * semantics.c (finish_template_template_parm): Adjust. + + 2000-06-28 Mark Mitchell + + * cp-tree.h (CLEAR_BINFO_NEW_VTABLE_MARKED): Remove. + * class.c (update_vtable_entry_for_fn): Correct logic for deciding + where to emit thunks. + (build_vtt): Adjust call to build_vtt_inits. + (build_vtt_inits): Add parameter to indicate whether or not + sub-VTTs for virtual bases should be included. Adjust handling of + construction vtables. + (get_matching_base): New function. + (dfs_build_vtt_inits): Rename to ... + (dfs_build_secondary_vptr_vtt_inits): Adjust handling of + construction vtables. + (dfs_fixup_binfo_vtbls): Likewise. + (build_ctor_vtbl_groups): Build construction vtables for virtual + bases, too. + (accumulate_vtbl_inits): Tweak logic for deciding whether or not + to build construction vtbls. + (dfs_accumulate_vtbl_inits): Adjust handling of + construction vtables. + + * pt.c (tsubst, case TEMPLATE_TEMPLATE_PARM): Handle cv-qualified + types correctly. + + 2000-06-27 Mark Mitchell + + * decl.c (grokfndecl): Set DECL_CONTEXT for static functions too. + + 2000-06-26 Nathan Sidwell + + * search.c (hides): Remove. + (is_subobject_of_p): Add most_derived parameter. Use + CANONICAL_BINFO. + (lookup_field_queue_p): Adjust. + (lookup_field_r): Adjust. + + 2000-06-26 Nathan Sidwell + + * decl2.c (handle_class_head): Bash typedefs to the type's main + decl. + + 2000-06-25 Mark Mitchell + + * cp-tree.h (genrtl_begin_stmt_expr): Rename to ... + (begin_global_stmt_expr): ... this. + (genrtl_finish_stmt_expr): Rename to ... + (finish_global_stmt_expr): ... this. + * init.c (begin_init_stmts): Adjust calls. + (finish_init_stmts): Likewise. + * semantics.c (genrtl_begin_stmt_expr): Rename to ... + (begin_global_stmt_expr): ... this. + (genrtl_finish_stmt_expr): Rename to ... + (finish_global_stmt_expr): ... this. + + 2000-06-25 Theodore Papadopoulo + + * search.c (lookup_member): Fix typo in comment. + + 2000-06-24 Jason Merrill + + * decl.c (pushdecl): Don't set DECL_CONTEXT from current_namespace. + (push_namespace): Set DECL_CONTEXT for a new NAMESPACE_DECL. + + 2000-06-24 Martin v. Löwis + + * parse.y (complex_direct_notype_declarator): Support global_scope. + * Makefile.in: Adjust conflict count. + + 2000-06-23 Kriang Lerdsuwanakij + + * parse.y (template_arg): Convert TEMPLATE_DECL + that is a template template parameter to + TEMPLATE_TEMPLATE_PARM here. + + * cp-tree.def (TEMPLATE_TEMPLATE_PARM): Adjust comment. + * cp-tree.h (TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL): New macro. + (copy_template_template_parm): Adjust prototype. + * decl.c (grokdeclarator): Remove dead code. + * pt.c (process_template_parm): Tidy. + (lookup_template_class): Construct nodes in + copy_template_template_parm. + (tsubst): Pass TEMPLATE_DECL rather than IDENTIFIER_NODE to + lookup_template_class. Use TYPE_TI_TEMPLATE. + * tree.c (copy_template_template_parm): Add NEWARGS + parameter. + (mapcar): Adjust call to copy_template_template_parm. + * typeck.c (comptypes): Use TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL. + * method.c (build_template_template_parm_names): Change error + code to avoid compilation warning. + + * gxxint.texi: Document template template parameter + name mangling. + + 2000-06-21 Alex Samuel + + * Make-lang.in (CXX_LIB2FUNCS): Add cp-demangle.o and dyn-string.o. + (CXX_LIB2SRCS): Add cp-demangle.c and dyn-string.c. + (cp-demangle.o): New rule. + (dyn-string.o): Likewise. + * inc/cxxabi.h (__cxa_demangle): New declaration. + + 2000-06-22 Mark Mitchell + + * cp-tree.h (BV_USE_VCALL_INDEX_P): New macro. + (BV_GENERATE_THUNK_WITH_VTABLE_P): Likewise. + (lang_decl_flags): Add generate_with_vtable_p. Make vcall_offset + a tree, not an int. + (THUNK_GENERATE_WITH_VTABLE_P): New macro. + (make_thunk): Change prototype. + (emit_thunk): Rename to use_thunk. + (mangle_thunk): Change prototype. + * class.c (get_derived_offset): Simplify. + (copy_virtuals): Clear BV_USE_VCALL_INDEX_P and + BV_GENERATE_THUNK_WITH_VTABLE_P. + (build_primary_vtable): Simplify. + (add_virtual_function): Use BV_FN, rather than TREE_VALUE. + (dfs_find_base): Remove. + (update_vtable_entry_for_fn): Correct bug in finding the base + where a virtual function was first declared. Figure out whether + or not to emit a vcall-thunk with the vtables in which it appears. + Correct logic for deciding whether to use an ordinary thunk, or a + vcall thunk. + (finish_struct_1): Remove unnecssary code. + (build_vtbl_initializer): Use ssize_int for the running counter of + negative indices. + (build_vtbl_initializer): Only use vcall thunks where necessary. + Mark thunks as needing to be emitted with their vtables, or not. + (build_vbase_offset_vtbl_entries): Adjust for use of ssize_int in + indices. Use size_binop. + (dfs_build_vcall_offset_vtbl_entries): Don't rely on + BINFO_PRIMARY_MARKED_P here. Use BV_FN consistently. Use + size_binop. + (build_rtti_vtbl_entries): Adjust call to build_vtable_entry. + (build_vtable_entry): Mark thunks as needing to be emitted with + their vtables, or not. + * decl.c (lang_mark_tree): Mark the vcall_offset in a thunk. + * decl2.c (mark_vtable_entries): Use use_thunk instead of + emit_thunk. + * dump.c (dequeue_and_dump): Remove dead code. Dump new thunk + information. + * error.c (dump_expr): Use BV_FN. + * mangle.c (mangle_thunk): Adjust now that vcall_offset is a tree, + not an int. + * method.c (make_thunk): Likewise. + (emit_thunk): Rename to use_thunk. Allow callers to decide + whether or not to actually emit the thunk. Adjust for changes in + representation of vcall offsets. + * search.c (dfs_get_pure_virtuals): Use BV_FN. + * semantics.c (emit_associated_thunks): New function. + (expand_body): Use it. + * ir.texi: Adjust descriptions of thunks. + + 2000-06-22 Jason Merrill + + * pt.c (tsubst_decl, case FUNCTION_DECL): Clear DECL_SAVED_TREE. + (tsubst_friend_function): Copy it here. + + * decl.c (grok_op_properties): Fix typo. + + * decl2.c (delete_sanity): Clarify warning, avoid failure on + deleting void*. + + * pt.c (check_explicit_specialization): Clarify error. + + * decl.c (pushdecl): Also pull out one of the FUNCTION_DECLs from + an old OVERLOAD when we're declaring a non-function. + (pushdecl, destroy_local_var): Check for error_mark_node. + (warn_extern_redeclared_static): Also bail early if + we're a CONST_DECL. + (push_overloaded_decl): Ignore an old error_mark_node. + + 2000-06-22 Nathan Sidwell + + * call.c (build_x_va_arg): Check if in a template decl. + * pt.c (tsubst_copy, case VA_ARG_EXPR): Use build_x_va_arg. + + 2000-06-20 Alexandre Petit-Bianco + + * class.c (push_lang_context): TYPE_NAME gets you to the Java + types DECLs. + * decl.c (check_goto): Computed gotos assumed OK. + + 2000-06-20 Jason Merrill + + * pt.c (tsubst_decl, case TYPE_DECL): Fix test for TYPE_DECLs + for which we don't need to look for instantiations. + + 2000-06-21 Nathan Sidwell + + * parse.y (program): Always call finish_translation_unit. + * parse.c, parse.h: Rebuilt. + + 2000-06-20 Zack Weinberg + + * method.c: Don't include hard-reg-set.h. + + 2000-06-20 Nathan Sidwell + + * rtti.c (get_base_offset): Cope when vbase field is in a base. + + 2000-06-20 Nathan Sidwell + + * call.c (build_conditional_expr): Use VOID_TYPE_P. + * cvt.c (cp_convert_to_pointer): Likewise. + (convert_to_void): Likewise. + * error.c (dump_expr): Likewise. + * except.c (complete_ptr_ref_or_void_ptr_p): Likewise. + * init.c (build_delete): Likewise. + * method.c (emit_thunk): Likewise. + * optmize.c (declare_return_variable): Likewise. + * rtti.c (get_tinfo_decl_dynamic): Likewise. + (get_typeid): Likewise. + (build_dynamic_cast_1): Likewise. + * typeck.c (composite_pointer_type): Likewise. + (common_type): Likewise. + (build_indirect_ref): Likewise. + (build_binary_op): Likewise. + (build_x_compound_expr): Likewise. + (check_return_expr): Likewise. + * typeck2.c (add_exception_specifier): Likewise. + + * mangle.c (write_method_parms): Use direct comparison for end + of parmlist. + + 2000-06-19 Benjamin Chelf + + * cp-tree.h (genrtl_try_block): Declare function. + (genrtl_handler): Likewise. + (genrtl_catch_block): Likewise. + (genrtl_ctor_stmt): Likewise. + (genrtl_subobject): Likewise. + (genrtl_decl_cleanup): Likewise. + (genrtl_do_poplevel): Likewise. + (genrtl_do_pushlevel): Likewise. + (genrtl_clear_out_block): Likewise. + (genrtl_goto_stmt): Likewise. + (genrtl_expr_stmt): Likewise. + (genrtl_decl_stmt): Likewise. + (genrtl_if_stmt): Likewise. + (genrtl_while_stmt): Likewise. + (genrtl_do_stmt): Likewise. + (genrtl_return_stmt): Likewise. + (genrtl_for_stmt): Likewise. + (genrtl_break_stmt): Likewise. + (genrtl_continue_stmt): Likewise. + (genrtl_scope_stmt): Likewise. + (genrtl_switch_stmt): Likewise. + (genrtl_case_label): Likewise. + (genrtl_begin_compound_stmt): Likewise. + (genrtl_finish_compound_stmt): Likewise. + (genrtl_compound_stmt): Likewise. + (genrtl_asm_stmt): Likewise. + (genrtl_named_return_value): Likewise. + (genrtl_begin_stmt_expr): Likewise. + (genrtl_finish_stmt_expr): Likewise. + (finish_for_stmt): Removed first argument. + (finish_switch_stmt): Likewise. + + * semantics.c (genrtl_try_block): Define function. + (genrtl_handler): Likewise. + (genrtl_catch_block): Likewise. + (genrtl_ctor_stmt): Likewise. + (genrtl_subobject): Likewise. + (genrtl_decl_cleanup): Likewise. + (genrtl_do_poplevel): Likewise. + (genrtl_do_pushlevel): Likewise. + (genrtl_clear_out_block): Likewise. + (genrtl_goto_stmt): Likewise. + (genrtl_expr_stmt): Likewise. + (genrtl_decl_stmt): Likewise. + (genrtl_if_stmt): Likewise. + (genrtl_while_stmt): Likewise. + (genrtl_do_stmt): Likewise. + (genrtl_return_stmt): Likewise. + (genrtl_for_stmt): Likewise. + (genrtl_break_stmt): Likewise. + (genrtl_continue_stmt): Likewise. + (genrtl_scope_stmt): Likewise. + (genrtl_switch_stmt): Likewise. + (genrtl_case_label): Likewise. + (genrtl_begin_compound_stmt): Likewise. + (genrtl_finish_compound_stmt): Likewise. + (genrtl_compound_stmt): Likewise. + (genrtl_asm_stmt): Likewise. + (genrtl_named_return_value): Likewise. + (genrtl_begin_stmt_expr): Likewise. + (genrtl_finish_stmt_expr): Likewise. + (finish_for_stmt): Removed first argument and generate rtl + specific code. + (finish_switch_stmt): Likewise. + (do_poplevel): Removed generate rtl specific code. + (do_pushlevel): Likewise. + (add_tree): Likewise. + (finish_goto_stmt): Likewise. + (finish_expr_stmt): Likewise. + (begin_if_stmt): Likewise. + (finish_if_stmt_cond): Likewise. + (finish_then_clause): Likewise. + (begin_else_clause): Likewise. + (finish_else_clause): Likewise. + (finish_if_stmt): Likewise. + (clear_out_block): Likewise. + (begin_while_stmt): Likewise. + (finish_while_stmt_cond): Likewise. + (finish_while_stmt): Likewise. + (begin_do_stmt): Likewise. + (finish_do_body): Likewise. + (finish_do_stmt): Likewise. + (finish_return_stmt): Likewise. + (begin_for_stmt): Likewise. + (finish_for_init_stmt): Likewise. + (finish_for_cond): Likewise. + (finish_for_expr): Likewise. + (finish_break_stmt): Likewise. + (finish_continue_stmt): Likewise. + (begin_switch_stmt): Likewise. + (finish_switch_cond): Likewise. + (finish_case_label): Likewise. + (begin_try_block): Likewise. + (begin_function_try_block): Likewise. + (finish_try_block): Likewise. + (finish_cleanup_try_block): Likewise. + (finish_cleanup): Likewise. + (finish_function_try_block): Likewise. + (finish_handler_sequence): Likewise. + (finish_function_handler_sequence): Likewise. + (begin_handler): Likewise. + (finish_handler_parms): Likewise. + (begin_catch_block): Likewise. + (finish_handler): Likewise. + (begin_compound_stmt): Likewise. + (finish_compound_stmt): Likewise. + (finish_asm_stmt): Likewise. + (finish_label_stmt): Likewise. + (finish_label_decl): Likewise. + (finish_subobject): Likewise. + (finish_decl_cleanup): Likewise. + (finish_named_return_value): Likewise. + (begin_stmt_expr): Likewise. + (finish_stmt_expr): Likewise. + + * decl.c (initialize_local_var): Changed call to finish_expr_stmt + to call genrtl_expr_stmt when appropriate. + + * init.c (begin_init_stmts): Changed calls to begin_stmt_expr and + begin_compound_expr to call genrtl_begin_stmt_expr and + genrtl_begin_compound_expr when appropriate. + (finish_init_stmts): Changed calls to finish_compound_expr and + finish_stmt_expr to call genrtl_finish_compound_expr and + genrtl_finish_stmt_expr when appropriate. + (expand_default_init): Changed call to finish_expr_stmt to call + genrtl_expr_stmt when appropriate. + (build_vec_init): Likewise. + + * parse.y (simple_stmt): Removed first argument from call to + finish_for_stmt. Removed first argument from call to + finish_switch_stmt. + + * parse.c: Regenerated. + + * pt.c (tsubst_expr): Removed first argument from call to + finish_for_stmt. Removed first argument from call to + finish_switch_stmt. + + 2000-06-16 Benjamin Chelf + + * cp-tree.h (enum cplus_tree_code): Changed __DUMMY to + CP_DUMMY_TREE_CODE. Remove #include "c-common.def". + + * lex.c (cplus_tree_code_type[]): Removed #include "c-common.def". + (cplus_tree_code_length[]): Likewise. + (cplus_tree_code_name[]): Likewise. + (init_parse): Added call to add_c_tree_codes. Changed + LAST_AND_UNUSED_TREE_CODE to LAST_C_TREE_CODE. + + 2000-06-16 Mark Mitchell + + * cp-tree.h (finish_mem_initializers): Declare. + (count_trees): Likewise. + * parse.y (base_init): Use finish_mem_initializers. + * semantics.c (finish_mem_initializers): New function. + + * tree.c (count_trees_r): Prototype. Use DATA parameter to store + the number of trees. + (n_trees): Remove. + (count_trees): Don't use it. + + 2000-06-15 Jason Merrill + + * tree.c (count_trees): New debugging function. + + * typeck.c (build_x_function_call): Use DECL_FUNCTION_TEMPLATE_P. + * init.c (build_member_call): Pull out the name of a DECL. + + * Makefile.in (semantics.o, pt.o): Depend on TIMEVAR_H. + * semantics.c (expand_body): Push to TV_INTEGRATION here. + * optimize.c (optimize_function): Not here. + * pt.c (instantiate_decl): Push to TV_PARSE. + + 2000-06-15 Mark Mitchell + + * cp-tree.h (struct language_function): Remove x_base_init_list + and x_member_init_list. + (current_base_init_list): Remove. + (current_member_init_list): Likewise. + (setup_vtbl_ptr): Change prototype. + (emit_base_init): Likewise. + (expand_member_init): Likewise. + (reinit_parse_for_function): Remove. + * decl.c (save_function_data): Don't clear x_base_init_list and + x_member_init_list. + (mark_language_function): Don't mark them. + * init.c (perform_member_init): Tweak comment. + (sort_member_init): Take the list of initializers as an argument. + (sort_base_init): Likewise. + (emit_base_init): Likewise. + (expand_member_init): Return the initializer. Don't use global + variables. + * lex.c (reinit_parse_for_function): Remove. + * method.c (build_template_parm_names): Correct substitution. + (do_build_copy_constructor): Don't use current_member_init_list + and current_base_init_list. + (synthesize_method): Likewise. + * parse.y (base_init): Split mem-initializers into + base-initializers and field-initializers. + (member_init_list): Build up the list here. + (member_init): Return the initializer. + (fn.depfn): Don't use reinit_parse_for_function. + * parse.c: Regenerated. + * pt.c (convert_nontype_argument): Don't make an ADDR_EXPR of the + ERROR_MARK. + (tsubst_expr): Don't use current_member_init_list + and current_base_init_list. + (tsubst_expr_values): Rename to ... + (tsubst_initializer_list): ... this. Use convert_from_reference. + * semantics.c (setup_vtbl_ptr): Don't use current_member_init_list + and current_base_init_list. + (begin_function_definition): Don't call reinit_parse_for_function. + + * dump.c (dequeue_and_dump): Use TREE_VEC_LENGTH with vectors. + + * error.c (dump_expr): Handle ADDR_EXPRs with REFERENCE_TYPE + correctly. + + * cp-tree.h (DECL_PENDING_INLINE_P): Relax checking. + + 2000-06-14 Benjamin Chelf + + * cp-tree.h (IF_COND): Move to c-common.h. + (THEN_CLAUSE): Likewise. + (ELSE_CLAUSE): Likewise. + (WHILE_COND): Likewise. + (WHILE_BODY): Likewise. + (DO_COND): Likewise. + (DO_BODY): Likewise. + (RETURN_EXPR): Likewise. + (EXPR_STMT_EXPR): Likewise. + (FOR_INIT_STMT): Likewise. + (FOR_COND): Likewise. + (FOR_EXPR): Likewise. + (FOR_BODY): Likewise. + (SWITCH_COND): Likewise. + (SWITCH_BODY): Likewise. + (CASE_LOW): Likewise. + (CASE_HIGH): Likewise. + (GOTO_DESTINATION): Likewise. + (COMPOUND_BODY): Likewise. + (ASM_CV_QUAL): Likewise. + (ASM_STRING): Likewise. + (ASM_OUTPUTS): Likewise. + (ASM_INPUTS): Likewise. + (ASM_CLOBBERS): Likewise. + (DECL_STMT_DECL): Likewise. + (STMT_EXPR_STMT): Likewise. + (LABEL_STMT_LABEL): Likewise. + (SCOPE_BEGIN_P): Likewise. + (SCOPE_END_P): Likewise. + (SCOPE_STMT_BLOCK): Likewise. + (SCOPE_NULLIFIED_P): Likewise. + (SCOPE_NO_CLEANUPS_P): Likewise. + (SCOPE_PARTIAL_P): Likewise. + (ASM_VOLATILE_P): Likewise. + (STMT_LINENO): Likewise. + (STMT_LINENO_FOR_FN_P): Likewise. + + * cp-tree.def: Removed SRCLOC, SIZEOF_EXPR, ARROW_EXPR, + ALIGNOF_EXPR, EXPR_STMT, COMPOUND_STMT, DECL_STMT, IF_STMT, + FOR_STMT, WHILE_STMT, DO_STMT, RETURN_STMT, BREAK_STMT, + CONTINUE_STMT, SWITCH_STMT, GOTO_STMT, LABEL_STMT, ASM_STMT, + SCOPE_STMT, CASE_LABEL, STMT_EXPR. + + * Makefile.in (CXX_TREE_H): Added $(srcdir)/../c-common.def. + + * Make-lang.in (CXX_SRCS): Added $(srcdir)/c-common.def. + (cc1plus$(exeext)): Added $(srcdir)/c-common.def. + + * lex.c (cplus_tree_code_type[]): Added '#include "c-common.def"'. + (cplus_tree_code_length[]): Added '#include "c-common.def"'. + (cplus_tree_code_name[]): Added '#include "c-common.def"'. + + 2000-06-14 Mark Mitchell + + * cp-tree.h (BINFO_OVERRIDE_ALONG_VIRTUAL_PATH): New macro. + * class.c (dfs_find_final_overrider): Set it appropriately. + (dfs_built_vtt_inits): Check BINFO_OVERRIDE_ALONG_VIRTUAL_PATH to + avoid unneeded secondary vptrs. + + 2000-06-13 Jakub Jelinek + + * class.c (build_secondary_vtable): Set DECL_USER_ALIGN. + (check_bitfield_decl, check_field_decl): Likewise. + (build_vtbl_or_vbase_field, build_base_field): Likewise. + (layout_class_type): Set DECL_USER_ALIGN resp. CLASSTYPE_USER_ALIGN. + * decl.c (record_unknown_type): Set TYPE_USER_ALIGN. + (xfer_tag, finish_enum): Likewise. + * decl2.c (finish_builtin_type): Likewise. + * init.c (init_init_processing): Likewise. + * pt.c (instantiate_class_template): Likewise. + * rtti.c (get_tinfo_decl, synthesize_tinfo_fn): Set DECL_USER_ALIGN. + * cp-tree.h (struct lang_type): Add user_align member. + (CLASSTYPE_USER_ALIGN): Define. + + 2000-06-13 Maciej W. Rozycki + + * Make-lang.in (c++.install-common): Install g++-cross in + $(gcc_tooldir)/bin as g++ and c++; g++ in $(bindir) as + $(target_alias)-g++ and $(target_alias)-c++. + + 2000-06-12 Mark Mitchell + + * class.c (vcall_offset_data_s): Add last_init and fns. + (overrides): Rename to same_signature_p. + (dfs_find_final_overrider): Adjust accordingly. + (mark_overriders): Likewise. + (warn_hidden): Likewise. + (build_vtbl_initializer): Reorganize machinery for building things + at negative offsets. + (build_vcall_and_vbase_vtbl_entries): Likewise. + (build_vbase_offset_vtbl_entries): Likewise. + (dfs_build_vcall_offset_vtbl_entries): Correct order of vcall + offset entries. Do not create two entries for functions with the + same signature. + (build_vcall_offset_vtbl_entries): Initialize vod->fns. + (build_rtti_vtbl_entries): Reorganize machinery for building things + at negative offsets. + + * optimize.c (expand_call_inline): Don't recurse into the code + used to initialize the parameters more than once. + + 2000-06-11 Mark Mitchell + + * mangle.c (NESTED_TEMPLATE_MATCH): Fix typo in comment. + (is_std_substitution): Don't check CLASSTYPE_USE_TEMPLATE here. + (find_substitution): Only use the `Sa' substitution for + std::allocator, not instantiations of it. + (write_template_prefix): Move comment. Only use a TREE_LIST to + represent substitutions for a member template. + (write_array_type): Mangle array dimensions correctly. + * optimize.c (maybe_clone_body): Copy more information from the + cloned function. + * pt.c (regenerate_decl_from_template): Preserve DECL_USE_TEMPLATE + on the regenerated declaration. + + 2000-06-11 Chip Salzenberg + Mark Mitchell + + * class.c (build_vtable): Clarify comment. + (build_ctor_vtbl_group): Pass the most derived type to + build_vtable. + + 2000-06-11 Kaveh R. Ghazi + + * decl2.c (compare_options): Don't needlessly cast away const-ness. + + 2000-06-10 Mark Mitchell + + * decl.c (add_binding): Handle duplicate declarations of external + variables. + + 2000-06-09 Chip Salzenberg + Mark Mitchell + + * mangle.c (write_number): Take an unsigned HOST_WIDE_INT as an + argument. + (write_signed_number): New macro. + (write_unsigned_number): Likewise. + (write_source_name): Use them. + (write_number): Handle signed and unsigned values. + (write_integer_cst): Use tree_int_cst_sgn, and use + write_unsigned_number or write_signed_number as appropriate. + (write_discriminator): Use write_unsigned_number or + write_signed_number as appropriate. + (write_template_arg_literal): Likewise. + (write_array_type): Use tree_low_cst. + (write_template_parm): Use write_unsigned_number or + write_signed_number as appropriate. + (write_substitution): Adjust call to write_number. + (write_type): Get the TYPE_MAIN_VARIANT before mangling it. + (write_expression): Handle non-type template arguments of + reference type correctly. + (mangle_thunk): Use write_signed_number. + + 2000-06-09 Chip Salzenberg + + * mangle.c (find_substition): Don't mangle objects with typename + substitutions (e.g. "cin" as "Si"). + + 2000-06-09 Zack Weinberg + + * call.c (add_candidate): Use ggc_alloc_cleared. + * decl.c (lookup_label): Likewise. + * lex.c (retrofit_lang_decl): Likewise. + + 2000-06-09 Jason Merrill + + * semantics.c (expand_body): Push to TV_EXPAND. + * optimize.c (optimize_function): Push to TV_INTEGRATION. + * decl.c (start_function): Always call announce_function. + + * tinfo2.cc: Just declare abort. + + 2000-06-09 Gabriel Dos Reis + + * lex.c (DEF_OPERATOR): Say `operator@' -not- `operator @' + whenever @ is a symbolic name. + + 2000-06-08 Jakub Jelinek + + * method.c (make_thunk): Clear DECL_VTT_PARM in thunk. + + 2000-06-07 Mark Mitchell + + * decl.c (pushdecl): Look up functions by DECL_NAME, not + DECL_ASSEMBLER_NAME. + + 2000-06-06 Mark Mitchell + + * decl2.c (c_language): Define. + + 2000-06-06 Gabriel Dos Reis + + * lex.c (lang_init_options): Tweak. + + * decl2.c: Remove #inclusion of diagnostic.h + (lang_decode_option): Move diagnostic formatting options to + toplevel. + + * lang-options.h: Remove documentation for diagnostic options. + + * Makefile.in (lex.o): Depends upon diagnostic.h + + 2000-06-06 Mark Mitchell + + * decl.c (redeclaration_error_message): If two TEMPLATE_DECLs have + the same DECL_RESULT, it's not a redefinition. + * pt.c (tsubst_decl): Remove code to handle illegal + specializations. + + 2000-06-06 Nathan Sidwell + + * exception.cc: (__eh_alloc, __eh_free): Moved to libgcc2.c + + 2000-06-05 Jason Merrill + + * search.c (maybe_suppress_debug_info): Don't check + CLASSTYPE_INTERFACE_ONLY if CLASSTYPE_INTERFACE_KNOWN isn't set. + + * pt.c (mark_decl_instantiated): Do SET_DECL_EXPLICIT_INSTANTIATION + here if extern_p. + + Remember instantiation context in deferred instantiations. + * cp-tree.h (struct tinst_level): Remove. + (TINST_DECL, TINST_LINE, TINST_FILE): New macros. + * pt.c (current_tinst_level): Now a tree. + (print_template_context, push_tinst_level, pop_tinst_level, + tinst_for_decl): Adjust. + (reopen_tinst_level): New fn. + (init_pt): Register current_tinst_level as a root. + (add_pending_template): Put current_tinst_level in TREE_PURPOSE + of the pending templates list. + (instantiate_pending_templates): Adjust. Call reopen_tinst_level. + * lex.c (extract_interface_info): Adjust. + * decl2.c (warn_if_unknown_interface): Adjust. + + 2000-06-05 Mark Mitchell + + * class.c (indirect_primary_base_p): New function. + (determine_primary_base): Use it. + + 2000-06-05 Nathan Sidwell + + Update new-abi dynamic cast algorithm. + * tinfo.cc (__class_type_info::__dyncast_result): Add + whole_details. Adjust constructor. + (__vmi_class_type_info::__do_dyncast): Adjust for vmi_flags. + Avoid unnecessary searching. + (__dynamic_cast): Adjust for __dyncast_result::whole_details. + + 2000-06-05 Richard Kenner + + * decl.c (init_decl_processing): Don't call record_component_aliases. + * tree.c (build_cplus_array_type_1): Likewise. + + 2000-06-04 Mark Mitchell + + * ir.texi: Correct typo. + * mangle.c (write_expression): Handle non-type template arguments + with reference type. + * method.c (build_overload_value): Likewise. + * pt.c (convert_nontype_argument): Explicitly represent conversion + to a reference with an ADDR_EXPR. + (unify): Always unify arguments in left-to-right order. + + 2000-06-03 Alex Samuel + Mark Mitchell + + * Make-lang.in (CXX_SRCS): Add mangle.c. + * Makefile.in (CXX_OBJS): Add mangle.o. + (mangle.o): New rule. + + * class.c (local_classes): New variable. + * class.c (get_vtable_name): Use mangle_vtable_for_type for new ABI. + (get_vtt_name): Use mangle_vtt_name for new ABI. + (init_class_processing): Initialize local_classes. + (build_ctor_vtbl_group): Use mangle_ctor_vtbl_for_type for new ABI. + * cp-tree.h (cp_tree_index): Add CPTI_STD_IDENTIFIER. + (std_identifier): New macro. + (DECL_VOLATILE_MEMFUNC_P): New macro. + (DECL_NAMESPACE_STD_P): Likewise. + (local_classes): Declare. + (get_mostly_instantiated_function_type): Declare. + (init_mangle): Declare. + (mangle_decl): Likewise. + (mangle_type_string): Likewise. + (mangle_type): Likewise. + (mangle_typeinfo_for_type): Likewise. + (mangle_typeinfo_string_for_type): Likewise. + (mangle_vtbl_for_type): Likewise. + (mangle_vtt_for_type): Likewise. + (mangle_ctor_vtbl_for_type): Likewise. + (mangle_thunk): Likewise. + (mangle_conv_op_name_for_type): Likewise. + (mangle_guard_variable): Likewise. + * decl.c (pushtag): Keep track of local classes. + (initialize_predefined_identifiers): Initialize std_identifier. + (init_decl_processing): Use std_identifier. + (start_decl): Don't treat instantiations as specializations. + (grokdeclarator): Likewise. + (grokvardecl): Call mangle_decl for new ABI. Only set mangled + name for fully-instantiated templates. + * decl2.c (grokclassfn): Use set_mangled_name_for_decl for + destructors with the new ABI. + (finish_static_data_member_decl): Use mangle_decl under the new ABI. + (grokfield): Use mangle_type for new ABI. + (grokoptypename): Use mangle_conv_op_for_type for new ABI. + (get_sentry): Use mangle_guard_variable for new ABI. + (start_static_initialization_or_destruction): Likewise. + * expr.c (extract_aggr_init): Remove. + (extract_scalar_init): Likewise. + (extract_init): Remove #if 0'd code. + * mangle.c: New function. + * method.c (build_mangled_name): Assert not flag_new_abi. + (build_static_name): Likewise. + (build_decl_overload_real): Likewise. + (build_typename_overload): Likewise. + (build_overload_with_type): Likewise. + (build_overload_name): Likewise. + (get_ctor_vtbl_name): Likewise. + (start_squangling): Likewise. + (get_id_2): Likewise. + (set_mangled_name_for_decl): Call mangle_decl for new ABI. + (init_method): Call init_mangle for new ABI. + (make_thunk): Call mangle_thunk for new ABI. + * operators.def: Correct new ABI manglings for the `%' operator. + Add `::' operator. + * pt.c (build_template_decl): Copy DECL_OVERLOADED_OPERATOR_P and + DECL_ASSIGNMENT_OPERATOR_P to the TEMPLATE_DECL. + (lookup_template_class): Call mangle_decl for new ABI. + (get_mostly_instantiated_function_type): New function. + (set_mangled_name_for_template_decl): Use it. + (tsubst_decl): Use set_mangled_name_for_decl for destructors with + the new ABI. Use mangle_conv_op_name_for_type for instantiated + conversion op names. + * rtti.c (tinfo_name): Call mangle_type_string for new ABI. + (get_tinfo_decl): Call mangle_typeinfo_for_type for new ABI. + (tinfo_base_init): Likewise. Mangle typeinfo string name with + mangle_typeinfo_string_for_type. + + 2000-06-03 Mark Mitchell + + * cp-tree.h (TMPL_ARGS_LEVEL): Clarify comment. + (INNERMOST_TEMPLATE_ARGS): New macro. + (innermost_args): Remove. + (get_innermost_template_args): New function. + * decl2.c (arg_assoc_class): Use INNERMOST_TEMPLATE_ARGS. + * error.c (dump_function_decl): Be caution when using + most_general_template. + * method.c (build_template_parm_names): Use + INNERMOST_TEMPLATE_ARGS. + * pt.c (add_to_template_args): Tidy comment + (get_innermost_template_args): New function. + (check_explicit_specialization): Clear DECL_INITIAL for a new + specialization. + (process_partial_specialization): Use INNERMOST_TEMPLATE_ARGS. + Tidy. + (push_template_decl): Always register specializations of the most + general template. + (convert_template_argument): Use INNERMOST_TEMPLATE_ARGS. + (coerce_template_parms): Likewise. + (lookup_template_class): Likewise. + (innermost_args): Remove. + (tsubst_decl): Use INNERMOST_TEMPLATE_ARGS. + (tsubst_decl): Handle tricky specializations. Use + get_innermost_template_args. + (instantiate_template): Simplify handling of partial + instantiations. + (get_class_bindings): Use INNERMOST_TEMPLATE_ARGS. + (most_general_template): Reimplement, in a more straightforward + manner. + (regenerate_decl_from_template): Tweak formatting. Use + TMPL_ARGS_DEPTH for clarity. + (set_mangled_name_for_template_decl): Use INNERMOST_ARGS. + + * dump.c (dequeue_and_dump): Dump information about thunks. + + 2000-06-01 Richard Henderson + + * decl.c (init_decl_processing): Set lang_get_alias_set first thing. + + 2000-06-01 Richard Henderson + + * decl2.c (unsupported_options): Fix typo, make const. + (lang_decode_option): Fix bsearch argument order. + + 2000-06-01 Mark Mitchell + + * init.c (resolve_offset_ref): Remove check for TREE_ADDRESSABLE + on FIELD_DECLs. + + 2000-05-31 Richard Kenner + + * cp-tree.h (c_get_alias_set): Deleted. + * Makefile.in (decl.o): Include ../expr.h. + * decl.c (expr.h): Include. + (init_decl_processing): Call record_component_aliases for arrays. + (grokdeclarator): Likewise. + Set TREE_ADDRESSABLE for fields that aren't bitfields. + * tree.c (build_cplus_array_type_1): Call record_component_aliases. + + 2000-05-31 Mark Mitchell + + Remove guiding declaration support. + * cp/cp-tree.h (flag_dump_translation_unit): Make it const. + (flag_guiding_decls): Remove. + * call.c (build_user_type_conversion_1): Remove support for + guiding decls. + (build_new_function_call): Likewise. + (build_new_op): Likewise. + (build_new_method_call): Likewise. + * decl.c (start_function): Likewise. + * friend.c (is_friend): Likewise. + (do_friend): Likewise. + * decl2.c ((flag_dump_translation_unit): Make it const. + (flag_guiding_decls): Remove. + (unsupported_options): New variable + (compare_options): New function. + (lang_decode_option): Use them. + + * decl.c (build_cp_library_fn): Set DECL_CONTEXT. + + * method.c (mangle_expression): Adjust test for legal expression + operators. + + * pt.c (instantiate_decl): Save and restore the local + specializations list. + + 2000-05-30 Jason Merrill + + * decl.c (grok_reference_init): Pass LOOKUP_ONLYCONVERTING. + + 2000-05-30 Mark Mitchell + + * call.c (add_template_candidate_real): Handle member template + constructors for classes with virtual bases. + (build_user_type_conversion_1): Use in_charge_arg_for_name. + (build_new_method_call): Use DECL_NONSTATIC_MEMBER_FUNCTION_P. + + * ir.texi: Update thunk documentation. + + * call.c (joust): Fix handling of overloaded builtin operators. + + 2000-05-30 Zack Weinberg + + * cp-tree.h (DECL_ANTICIPATED): New macro. + Document new use of DECL_LANG_FLAG_7. + * decl.c (builtin_function): Set DECL_ANTICIPATED on builtins + in the user namespace. + * lex.c (do_identifier): If the identifier's declaration has + DECL_ANTICIPATED on, it has not yet been declared. But do not + replace it with an ordinary implicit declaration. + + * tinfo2.cc: Include stdlib.h. + + 2000-05-29 Mark Mitchell + + * cp-tree.h (CLASSTYPE_ALIGN_UNIT): New macro. + * class.c (layout_empty_base): Use CLASSTYPE_ALIGN_UNIT, not + CLASSTYPE_ALIGN. + + 2000-05-28 Gabriel Dos Reis + + * decl2.c (lang_decode_option): Use skip_leading_substring instead + of plain strncmp. + + 2000-05-28 Alexandre Oliva + + * operators.def (?): this. Fixed. + + 2000-05-27 Alex Samuel + Mark Mitchell + + * cp-tree.h (ansi_opname): Make it a macro. + (ansi_assopname): Likewise. + (struct lang_decl_flags): Add assignment_operator_p. + (struct lang_decl): Add operator_code. + (DECL_VTT_PARM): Adjust. + (DECL_OVERLOADED_OPERATOR_P): Return the operator_code for an + overloaded operator. + (SET_OVERLOADED_OPERATOR_CODE): New macro. + (DECL_ASSIGNMENT_OPERATOR_P): New macro. + (DECL_ARRAY_DELETE_OPERATOR_P): Adjust. + (opname_tab): Remove. + (assignop_tab): Likewise. + (operator_name_info_t): New type. + (operator_name_info): New variable. + (assignment_operator_name_info): Likewise. + (build_cp_library_fn): Remove declaration. + (push_cp_library_fn): Likewise. + (operator_name_string): Likewise. + (build_decl_overload): Likewise. + * call.c (print_z_candidates): Simplify. + (build_object_call): Adjust usage of ansi_opname. Use + DECL_OVERLOADED_OPERATOR_P. + (op_error): Adjust operator name lookup. + (build_conditional_expr): Adjust usage of ansi_opname. + (build_new_op): Likewise. + (build_op_delete_call): Likewise. + (build_over_call): Likewise. + (joust): Use DECL_OVERLOADED_OPERATOR_P. + * decl.c (duplicate_decls): Copy operator_code. + (init_decl_processing): Adjust parameters to push_cp_library_fn. + (builtin_function): Adjust parameters to build_library_fn_1. + (build_library_fn_1): Accept an overloaded operator code. + (build_library_fn): Pass ERROR_MARK. + (build_cp_library_fn): Accept an overloaded operator code. + (push_cp_library_fn): Likewise. + (grokfndecl): Tweak. + (grokdeclarator): Simplify code to compute names of overloaded + operators. Adjust use of ansi_opname. + (ambi_op_p): Work on tree_codes, not identifiers. + (unary_op_p): Likewise. + (grok_op_properties): Likewise. + (start_function): Use DECL_OVERLOADED_OPERATOR_P. + (lang_mark_tree): Don't try to mark the operator_code. + * decl2.c (grok_function_init): Use DECL_OVERLOADED_OPERATOR_P. + * error.c (dump_decl): Remove special handling for operator + names. + (dump_function_name): Likewise. + (dump_expr): Adjust name lookup of operators. + (op_to_string): Simplify. + (assop_to_string): Likewise. + * init.c (build_new_1): Adjust use of ansi_opname. + * lex.c (opname_tab): Remove. + (assignop_tab): Likewise. + (ansi_opname): Likewise. + (ansi_assopname): Likewise. + (operator_name_string): Likewise. + (reinit_lang_specific): Likewise. + (operator_name_info): New variable. + (assignment_operator_name_info): Likewise. + (init_operators): New function. + (init_parse): Use it. + (do_identifier): Adjust use of ansi_opname. + * method.c (mangle_expression): Don't use ansi_opname for + mangling. + (build_decl_overload_real): Use DECL_OVERLOADED_OPERATOR_P. + (build_decl_overload): Remove. + (build_typename_overload): Use OPERATOR_TYPENAME_FORMAT directly. + (do_build_assign_ref): Adjust use of ansi_opname. + (synthesize_method): Likewise. + (implicitly_declare_fn): Likewise. + * operators.def: New file. + * parse.y (operator): Adjust use of ansi_opname. + * pt.c (tsubst_decl): Use IDENTIFIER_OPNAME_P. + (set_mangled_name_for_template_decl): Don't play games with + current_namespace. + (special_function_p): Adjust use of ansi_opname. + * typeck.c (check_return_expr): Likewise. + * Make-lang.in (cc1plus): Depend on operators.def. + * Makefile.in (lex.o): Likewise. + (decl.o): Likewise. + + 2000-05-27 Zack Weinberg + + * Make-lang.in (cplib2.ready): Eradicate. + + 2000-05-27 Richard Kenner + + * method.c (mangle_expression): Use TREE_CODE_LENGTH. + * tree.c (break_out_calls, build_min_nt): Use TREE_CODE_LENGTH. + (built_min, cp_tree_equal): Likewise. + + 2000-05-26 Mark Mitchell + + * class.c (layout_nonempty_base_or_field): Replace + `record_layout_info' with `record_layout_info_s'. + + 2000-05-26 Jason Merrill + + Fix goto checking. + * cp-tree.h (struct language_function): x_named_labels is now + a struct named_label_list*. + * decl.c (struct named_label_use_list): Renamed from... + (struct named_label_list): ...this. New struct. + (push_binding_level): Don't set eh_region. + (note_level_for_eh): New fn. + (pop_label): Take label and old value directly. + (pop_labels): Adjust for new named_labels format. + (lookup_label): Likewise. + (poplevel): Note characteristics of a binding level containing a + named label. Mess with named label lists earlier. + (mark_named_label_lists): New fn. + (mark_lang_function): Call it. + (use_label): New fn, split out from... + (make_label_decl): ...here. Don't call it. + (decl_jump_unsafe, check_previous_goto, check_previous_goto_1, + check_previous_gotos): New fns, split out from... + (define_label): ...here. + (check_switch_goto): New fn. + (define_case_label): Call it. + (check_goto): New fn. + * semantics.c (finish_goto_stmt): Call it and use_label. + (begin_compound_stmt): If we're a try block, call note_level_for_eh. + (expand_stmt): Never pass 1 as DONT_JUMP_IN to expand_end_bindings. + + 2000-05-26 Mark Mitchell + + * class.c (build_vtable_entry_ref): Correct usage of + get_vtbl_decl_for_binfo. + + * decl2.c (grokclassfn): Set DECL_LANGUAGE here. + * method.c (implicitly_declare_fn): Not here. + + 2000-05-26 Nathan Sidwell + + * cp-tree.h (CPTI_PTMD_DESC_TYPE): Rename to ... + (CPTI_PTMD_DESC_TYPE): ... here. + (ptmd_desc_type_node): Rename to ... + (ptm_desc_type_node): ... here. + * decl.c: Likewise. + * rtti.c (ptmd_initializer): Rename to ... + (ptm_initializer): ... here. + (sythesize_tinfo_var): Adjust. Deal with pointer to member + function. + (create_tinfo_types): Adjust. + + 2000-05-25 Mark Mitchell + + Finish implementation of VTTs. + * cp-tree.h (cp_tree_index): Add CPTI_VTT_PARM_TYPE and + CPTI_VTT_PARM_IDENTIFIER. + (vtt_parm_identifier): New macro. + (vtt_parm_type): Likewise. + (BINFO_SUBVTT_INDEX): Likewise. + (BINFO_VPTR_INDEX): Likewise. + (struct lang_decl): Add vtt_parm. + (DECL_VTT_PARM): New macro. + (DECL_USE_VTT_PARM): Likewise. + (DECL_NEEDS_VTT_PARM_P): Likewise. + (get_vtt_name): Declare. + (build_artificial_parm): Likewise. + (fixup_all_virtual_upcast_offsets): Likewise. + (expand_indirect_vtbls_init): Remove. + * call.c (build_new_method_call): Pass the vtt to subobject + constructors and destructors. + * class.c (get_vtt_name): Give it external linkage. + (build_clone): Handle the magic VTT parameters for clones. + (clone_function_decl): Fix typo in comment. + (build_vtt): Keep track of the indices in the VTTs where various + entities are stored. + (build_vtt_inits): Likewise. + (dfs_build_vtt_inits): Likewise. + (build_ctor_vtbl_group): Tweak type of construction vtables. + (dfs_accumulate_vtbl_inits): Build vtables for all bases, even + primary bases, when building construction vtables. + * decl.c (duplicate_decls): Handle DECL_VTT_PARM. + (initialize_predefined_identifiers): Add vtt_parm_identifier. + (init_decl_processing): Initialize vtt_parm_type. + (grokfndecl): Use DECL_OVERLOADED_OPERATOR_P. + (lang_mark_tree): Make vtt_parm. + * decl2.c (build_artificial_parm): New function. + (maybe_retrofit_in_chrg): Use it. Add VTT parameters. + (grokclassfn): Use build_artificial_parm. + * init.c (initialize_vtbl_ptrs): Call + fixup_all_virtual_upcast_offsets directly. + (perform_member_init): Use the complete subobject destructor for + member cleanups. + (build_vtbl_address): New function. + (expand_virtual_init): Handle VTTs. + * optimize (maybe_clone_body): Likewise. + * search.c (fixup_all_virtual_upcast_offsets): Give it external + linkage. + (expand_indirect_vtbls_init): Remove. + * semantics.c (setup_vtbl_ptr): Fix typos in comment. + * tree.c (make_binfo): Make them bigger. + + 2000-05-25 Nathan Sidwell + + * inc/cxxabi.h (__pbase_type_info): Define, based on + __pointer_type_info. + (__pointer_type_info): Derive from __pbase_type_info. Adjust. + (__pointer_to_member_type_info): Likewise. + * tinfo2.cc (__pbase_type_info::~__pbase_type_info): Implement. + (__pointer_to_member_type_info::__is_pointer_p): Remove. + (__pointer_type_info::__do_catch): Rename to ... + (__pbase_type_info::__do_catch): ... here. Adjust. + (__pbase_type_info::__pointer_catch): Implement. + (__pointer_type_info::__pointer_catch): Adjust. + (__pointer_to_member_type_info::__pointer_catch): Adjust. + + 2000-05-25 Nathan Sidwell + + * tinfo.h (__user_type_info::contained_virtual_p): New + predicate. + * tinfo.cc (__user_type_info::do_upcast): Fix bug with diamond + shaped hierarchy. + (__vmi_class_type_info::__do_upcast): Fix bug with NULL pointer to + diamond shaped hierarchy. Add early out for mixed diamond and + duplicate shaped hierarchy. + + 2000-05-24 Mark Mitchell + + * cp-tree.h (build_delete): Change prototype. + (build_vec_delete): Likewise. + * call.c (build_scoped_method_call): Use special_function_kind + values to indicate the kind of destruction to be done. + (build_method_call): Likewise. + * decl.c (finish_destructor_body): Likewise. + (maybe_build_cleanup_1): Likewise. Rename to ... + (maybe_build_cleanup): ... this. + * decl2.c (delete_sanity): Use special_function_kind + values to indicate the kind of destruction to be done. + (build_cleanup): Likewise. + * init.c (perform_member_init): Likewise. + (build_vec_delete_1): Likewise. + (build_dtor_call): Simplify. + (build_delete): Use special_function_kind + values to indicate the kind of destruction to be done. + (build_vbase_delete): Likewise. + (build_vec_delete): Likewise. + + * init.c (sort_member_init): Fix typo in error message generation + code. + + 2000-05-15 Donald Lindsay + + * semantics.c (begin_class_definition): make the packed + attribute be sensitive to the "-fpack-struct" command line flag + + 2000-05-24 Nathan Sidwell + + Update new-abi upcast algorithm. + * inc/cxxabi.h (__class_type_info::__do_upcast): Change + prototype and meaning of return value. + (__si_class_type_info::__do_upcast): Likewise. + (__vmi_class_type_info::__do_upcast): Likewise. + * tinfo.cc (__class_type_info::__upcast_result): Replace + whole2dst with part2dst. Adjust ctor. + (__class_type_info::__do_upcast): Adjust call of worker function. + (__class_type_info::__do_upcast): Adjust. + (__si_class_type_info::__do_upcast): Adjust. Use parent's + __do_upcast. + (__vmi_class_type_info::__do_upcast): Likewise. Fix private + virtual base in diamond hierarchy bug. + + 2000-05-23 Mark Mitchell + + * cp-tree.h (lang_decl_flags): Rename mutable_flag to uninlinable + and bitfield to tinfo_fn_p. + (DECL_TINFO_FN_P): Adjust. + (SET_DECL_TINFO_FN_P): Likewise. + (DECL_MUTABLE_P): Likewise. + (DECL_C_BIT_FIELD): Likewise. + (SET_DECL_C_BIT_FIELD): Likewise. + (CLEAR_DECL_C_BIT_FIELD): Likewise. + (DECL_UNINLINABLE): Likewise. + * class.c (alter_access): Call retrofit_lang_decl if ncessary. + (handle_using_decl): Remove assertion. + (build_vtbl_or_vbase_field): Use build_decl, not build_lang_decl, + to build FIELD_DECLs. + (build_base_field): Likewise. + (layout_class_type): Likewise. + * decl.c (init_decl_processing): Likewise. + (build_ptrmemfunc_type): Likewise. + (grokdeclarator): Likewise. + * decl2.c (grok_x_components): Likewise. + * except.c (call_eh_info): Likewise. + * init.c (init_init_processing): Likewise. + * rtti.c (expand_class_desc): Likewise. + (create_pseudo_type_info): Likewise. + (get_vmi_pseudo_type_info): Likewise. + (create_tinfo_types): Likewise. + * ptree.c (print_lang_decl): Adjust. + * typeck.c (build_component_ref): Don't check DECL_LANG_SPECIFIC + before checking DECL_MUTABLE_P. + + * decl2.c (maybe_retrofit_in_chrg): Don't create in-charge + parameters for template functions. + * pt.c (tsubst_decl): Make sure we call maybe_retrofit_in_chrg for + destructors as well as constructors. + + 2000-05-22 Mark Mitchell + + * class.c (build_ctor_vtbl_group): Set inits. + * optimize.c (maybe_clone_body): Set DECL_INLINE and + DECL_THIS_INLINE appropriately for clones. + + * cp-tree.h (IDENTIFIER_TYPENAME_P): Use a flag, not strncmp. + (DECL_CONV_FN_P): Simplify. + (DECL_OPERATOR): Remove. + (language_to_string): Declare. + * decl.c (duplicate_decls): Fix typo in comment. + (grokdeclarator): Adjust use of IDENTIFIER_TYPENAME_P. + (grok_op_properties): Use DECL_CONV_FN_P instead of + IDENTIFIER_TYPENAME_P. + * dump.c (dequeue_and_dump): Dump the language linkage of + declarations. + * error.c (language_to_string): Give it external linkage. + * method.c (build_typename_overload): Set IDENTIFIER_TYPENAME_P. + (implicitly_declare_fn): Set DECL_LANGUAGE. + * pt.c (check_explicit_specialization): Use DECL_CONV_FN_P, not + IDENTIFIER_TYPENAME_P. + (tsubst_decl): Likewise. + (tsubst_copy): Adjust use of IDENTIFIER_TYPENAME_P. + * semantics.c (finish_member_declaration): Don't mark members of + classes declared in an extern "C" region as extern "C". + + 2000-05-22 Martin v. Löwis + + * decl2.c (qualified_lookup_using_namespace): Look through + namespace aliases. + + * decl.c (push_using_decl): Return the old decl on namespace level. + + 2000-05-21 Mark Mitchell + + * cp-tree.h (SET_BINFO_NEW_VTABLE_MARKED): Add sanity checks. + (VTT_NAME_PREFIX): New macro. + (CTOR_VTBL_NAME_PREFIX): Likewise. + (get_ctor_vtbl_name): New function. + * class.c (get_vtable_name): Simplify. + (get_vtt_name): New function. + (get_vtable_decl): Don't set IDENTIFIER_GLOBAL_VALUE. + (dfs_mark_primary_bases): Update the CLASSTYPE_VBASECLASSES list + when a virtual base becomes primary. + (finish_struct_1): Set CLASSTYPE_VFIELDS a little earlier. Build + VTTs. + (finish_vtbls): Adjust calls to accumulate_vtbl_inits to pass in + additional parameters. + (dfs_finish_vtbls): Don't clear BINFO_NEW_VTABLE_MARKED. + (initialize_array): New function. + (build_vtt): Likewise. + (build_vtt_inits): Likewise. + (dfs_build_vtt_inits): Likewise. + (dfs_fixup_binfo_vtbls): Likewise. + (build_ctor_vtbl_group): Likewise. + (initialize_vtable): Use initialize_array. + (accumulate_vtbl_inits): Reimplement to handle construction + vtables. + (dfs_accumulate_vtbl_inits): Likewise. + (bulid_vtbl_initializer): Adjust parameter name. + * method.c (build_typename_overload): Remove #if 0'd code. + (get_ctor_vtbl_name): New function. + * search.c (dfs_walk_real): Use BINFO_N_BASETYPES. + (init_vbase_pointers): Don't mess with the TREE_CHAIN of a binfo. + + * cp-tree.h (struct lang_type): Remove search_slot. + (CLASSTYPE_SEARCH_SLOT): Remove. + (emit_base_init): Change prototype. + (initialize_vtbl_ptrs): Likewise. + (expand_indirect_vtbls_init): Likewise. + (clear_search_slots): Remove. + * decl.c (lang_mark_tree): Don't mark search_slot. + * init.c (initialize_vtbl_ptrs): Simplify. + (emit_base_init): Likewise. + * search.c (struct vbase_info): Document decl_ptr. + (convert_pointer_to_single_level): Remove. + (dfs_find_vbases): Remove. + (dfs_init_base_pointers): Simplify. + (dfs_clear_vbase_slots): Remove. + (dfs_vtable_path_unmark): New function. + (init_vbase_pointers): Simplify. + (expand_upcast_fixups): Don't rely on CLASSTYPE_SEARCH_SLOT. + (expand_indirect_vtbls_init): Simplify. Don't call + mark_all_temps_used. + * semantics.c (setup_vtbl_ptr): Adjust calls to emit_base_init and + initialize_vtbl_ptrs. + + 2000-05-20 Zack Weinberg + + * except.c: Add static prototypes. + + 2000-05-20 H.J. Lu + + * Make-lang.in (cplib2.ready): Also depend on cc1plus$(exeext). + + 2000-05-19 Mark Mitchell + + Don't create a separate copy of virtual bases for the + CLASSTYPE_VBASECLASSES list. + * cp-tree.h (CLASSTYPE_VBASECLASSES): Change documentation. + (BINFO_FOR_VBASE): Remove. + (CANONICAL_BINFO): Adjust. + (binfo_for_vbase): New function. + * class.c (build_vbase_pointer_fields): Use binfo_for_vbase + instead of BINFO_FOR_VBASE. + (build_vbase_pointer): Likewise. + (build_secondary_vtable): Likewise. + (dfs_mark_primary_bases): Likewise. + (mark_primary_bases): Likewise. + (layout_nonempty_base_or_field): Likewise. + (dfs_set_offset_for_shared_vbases): Likewise. + (dfs_set_offset_for_unshared_vbases): Likewise. + (layout_virtual_bases): Likewise. Adjust for changes to the + CLASSTYPE_VBASECLASSES list. + (dump_class_hierarchy_r): Use binfo_for_vbase + instead of BINFO_FOR_VBASE. + (dump_class_hierarchy): Likewise. + (finish_vtbls): Likewise. + (build_vtbl_initializer): Adjust for changes to the + CLASSTYPE_VBASECLASSES list. + (build_vbase_offset_vtbl_entries): Use binfo_for_vbase. + * decl.c (finish_destructor_body): Adjust for changes to the + CLASSTYPE_VBASECLASSES list. + * init.c (sort_base_init): Use binfo_for_vbase. + (construct_virtual_bases): Adjust for changes to the + CLASSTYPE_VBASECLASSES list. + (expand_member_init): Use binfo_for_vbase. + (build_vbase_delete): Adjust for changes to the + CLASSTYPE_VBASECLASSES list. + * method.c (do_build_copy_constructor): Likewise. + * rtti.c (get_base_offset): Use binfo_for_vbase. + (expand_class_desc): Remove #if 0'd code. + * search.c (struct vbase_info): Remove vbase_types. + (get_base_distance): Use binfo_for_vbase. + (lookup_field_queue_p): Use CANONICAL_BINFO. + (get_shared_vbase_if_not_primary): Use binfo_for_vbase. + (get_pure_virtuals): Adjust for changes to the + CLASSTYPE_VBASECLASSES list. + (dfs_find_vbases): Use binfo_for_vbase. + (dfs_init_vbase_pointers): Likewise. + (init_vbase_pointers): Don't initialize vi.vbase_types. + (virtual_context): Use binfo_for_vbase. + (fixup_all_virtual_upcast_offsets): Adjust for changes to the + CLASSTYPE_VBASECLASSES list. + (expand_indirect_vtbls_init): Simplify. + (dfs_get_vbase_types): Don't replicate virtual bases. + (find_vbase_instance): Use binfo_for_vbase. + (binfo_for_vbase): New function. + * typeck.c (get_delta_difference): Use binfo_for_vbase. + + 2000-05-17 Mark Mitchell + + * decl2.c (finish_anon_union): Generalize error messages to handle + anonymous structures. + * init.c (perform_member_init): Remove `name' parameter. + (build_field_list): New function. + (sort_member_init): Handle anonymous union initialization order + correctly. Check for multiple initializations of the same union. + (emit_base_init): Don't look up fields by name here. + (expand_member_init): Record the result of name lookup for future + reference. + * typeck.c (build_component_ref): Fix formatting. + + 2000-05-17 Andrew Cagney + + * decl.c (pop_label): Replace warn_unused with warn_unused_label. + * typeck.c (build_x_compound_expr): Replace warn_unused with + warn_unused_value. + + * decl2.c (lang_decode_option): Update -Wall unused flags by + calling set_Wunused. + + 2000-05-16 Mark Mitchell + + * cp-treeh (BINFO_NEW_VTABLE_MARKED): Update documentation. + * init.c (dfs_vtable_path_unmark): Remove. + * search.c (marked_new_vtable_p): Likewise. + (unmarked_new_vtable_p): Likewise. + (dfs_search_slot_nonempty_p): Likewise. + (dfs_mark): Likewise. + (dfs_vtable_path_unmark): Likewise. + (dfs_find_vbases): Don't set BINFO_NEW_VTABLE_MARKED. + (dfs_int_vbase_pointers): Don't clear BINFO_VTABLE_PATH_MARKED. + (dfs_init_vbase_pointers): Remove special-case new ABI code. + (dfs_clear_vbase_slots): Don't clear BINFO_NEW_VTABLE_MARKED. + (init_vbase_pointers): Simplify. + (expand_indirect_vtbls_init): Likewise. + + * class.c (copy_virtuals): New function. + (build_primary_table): Use it. + (build_secondary_vtable): Likewise. + (modify_vtable_entry): Use NULL_TREE, not integer_zero_node, to + indicate that no vcall offset is required. + (add_virtual_function): Likewise. + (modify_all_vtables): Likewise. + (dfs_finish_vtbls): Adjust call to build_vtbl_initializer. + (dfs_accumulate_vtbl_inits): Likewise. + (build_vtbl_initializer): Make changes to handle construction + vtables. + (dfs_build_vcall_offset_vtbl_entries): Likewise. + (build_rtti_vtbl_entries): Likewise. + (build_vtable_entries): Handle a NULL vcall_index. + + 2000-05-15 Gabriel Dos Reis + + * decl2.c (lang_decode_option): Fix thinko. + + 2000-05-14 Jason Merrill + + * except.c (check_handlers): New fn. + * cp-tree.h: Declare it. + * semantics.c (finish_handler_sequence): Call it. + (finish_function_handler_sequence): Likewise. + (finish_handler_parms): Set TREE_TYPE on the handler. + * cp-tree.h (PUBLICLY_UNIQUELY_DERIVED_P): New macro. + * search.c (get_base_distance_recursive): If protect>1, ignore + special access. + (get_base_distance): Don't reduce watch_access. + + 2000-05-13 Gabriel Dos Reis + + * lex.c: #include diagnostic.h. + (lang_init_options): Set default prefixing rules. + + * lang-options.h: Add -fdiagnostics-show-location=. + + * decl2.c: #include diagnostic.h. + (lang_decode_option): Handle -fdiagnostics-show-location=. + + 2000-05-12 Nathan Sidwell + + * tinfo.cc: Revert my 2000-05-08 and 2000-05-07 changes. + * vec.cc: Revert my 2000-05-07 change. + + 2000-05-11 Jason Merrill + + * class.c (check_field_decls): Complain about non-static data + members with same name as class in class with constructor. + + 2000-05-10 Jason Merrill + + * decl.c (grokdeclarator): Allow non-static data members with + same name as class. + + 2000-05-09 Zack Weinberg + + * cp-tree.h: Constify tree_srcloc.filename, tinst_level.file, + and pending_inline.filename. Update prototypes. + * decl.c (define_label): Constify filename parameter. + * decl2.c (warn_if_unknown_interface): Constify local char *. + * input.c Constify input_source.filename. Don't declare + input_filename or lineno. Constify filename parameter to feed_input. + * lex.c (init_parse): Constify parameter and return value. + (cp_pragma_interface, cp_pragma_implementation): Constify + filename argument. + (reinit_parse_for_method, reinit_parse_for_block, + reinit_parse_for_expr, feed_defarg, handle_cp_pragma): + Constify local char *. + * pt.c: Don't declare lineno or input_filename. + (print_template_context, tsubst_friend_function, tsubst_decl, + tsubst, instantiate_decl): Constify local char *. + * semantics.c (expand_body): Constify local char *. + * tree.c (build_srcloc): Constify filename parameter. + * typeck.c (c_expand_asm_operands): Constify filename + parameter. + + 2000-05-08 Nathan Sidwell + + * tinfo.cc (__dynamic_cast): Use a reinterpret_cast. Fix + offsetof expansion. + + 2000-05-08 Branko Cibej + + * inc/cxxabi.h: Fix typos in comment. + (__base_class_info::__offset): Use a static_cast. + + 2000-05-07 Nathan Sidwell + + * inc/cxxabi.h: Use __SIZE_TYPE_ and __PTRDIFF_TYPE__ in place + of std::size_t and std::ptrdiff_t respectively. + * tinfo.cc: Likewise. + * vec.cc: Likewise. + + 2000-05-06 Richard Henderson + + * typeck.c (build_c_cast): Don't warn integer->pointer size + mismatch for constants. + + 2000-05-06 Nathan Sidwell + + * rtti.c (ptmd_initializer): Set non-public, if class is + incomplete. + + * inc/cxxabi.h (__dynamic_cast): Explicitly say extern "C++". + (__cxa_vec_new, __cxa_vec_ctor, __cxa_vec_dtor, + __cxa_vec_delete): Likewise. + * tinfo.cc (__dynamic_cast): Likewise. + * vec.cc (__cxa_vec_new, __cxa_vec_ctor, __cxa_vec_dtor, + __cxa_vec_delete): Likewise. + + 2000-05-04 Mark Mitchell + + * cp-tree.h (DELTA_FROM_VTABLE_ENTRY): Remove. + (SET_FNADDR_FROM_VTABLE_ENTRY): Likewise. + (lang_decl_flags): Add vcall_offset. + (THUNK_VCALL_OFFSET): Use it. + * decl.c (lang_mark_tree): Don't mark DECL_ACCESS for a thunk. + * method.c (make_thunk): Create the lang_decl here, not in + emit_thunk. + (emit_thunk): Make generic thunks into ordinary functions once + they have been fed to expand_body. + * semantics.c (expand_body): Set current_function_is_thunk here. + + 2000-05-04 Kaveh R. Ghazi + + * class.c (update_vtable_entry_for_fn): Prototype. + + * pt.c (tsubst_decl): Initialize variables `argvec', `gen_tmpl' + and `tmpl'. + + * search.c (dfs_build_inheritance_graph_order): Prototype. + + 2000-05-04 Mark Mitchell + + * cp-tree.h (special_function_kind): Add various kinds of + destructors. + (special_function_p): New function. + * class.c (overrides): Don't let one kind of destructor override + another. + * decl2.c (mark_used): Use DECL_NON_THUNK_FUNCTION_P when deciding + whether or not to instantiate a template. + * tree.c (special_function_p): Define. + + 2000-05-03 Mark Mitchell + + * cp-tree.def (THUNK_DECL): Remove. + * cp-tree.h (DECL_THUNK_P): New macro. + (DECL_NON_THUNK_FUNCTION_P): Likewise. + (DECL_EXTERN_C_FUNCTION_P): Likewise. + (SET_DECL_THUNK_P): Likewise. + (DELTA_FROM_VTABLE_ENTRY): Use DECL_THUNK_P. + (FNADDR_FROM_VTABLE_ENTRY): Likewise. + (DECL_MAIN_P): Use DECL_EXTERN_C_FUNCTION_P. + * decl.c (decls_match): Use DECL_EXTERN_C_P. + (duplicate_decls): Likewise. + (pushdecl): Likewise. Adjust thunk handling. + (grokfndecl): Use DECL_EXTERN_C_P. + * decl2.c (mark_vtable_entries): Use DECL_THUNK_P. + * dump.c (dequeue_and_dump): Remove THUNK_DECL handling. + * except.c (nothrow_libfn_p): Use DECL_EXTERN_C_P. + * expr.c (cplus_expand_expr): Remove THUNK_DECL handling. + * method.c (make_thunk): Use SET_DECL_THUNK_P. Set + DECL_NO_STATIC_CHAIN. + (emit_thunk): Don't play games with TREE_CODE on thunks. Don't + set DECL_DESTRUCTOR_P or DECL_CONSTRUCTOR_P on a thunk. + * search.c (covariant_return_p): Remove THUNK_DECL handling. + * ir.texi: Update. + + 2000-05-01 Jason Merrill + + * tree.c (walk_tree): Set lineno. + + 2000-05-01 Mark Mitchell + + * exception.cc: Update license notice. + * new.cc: Likewise. + * new1.cc: Likewise. + * new2.cc: Likewise. + * tinfo.cc: Likewise. + * tinfo2.cc: Likewise. + * vec.cc: Likewise. + * inc/cxxabi.h: Likewise. + * inc/exception: Likewise. + * inc/new: Likewise. + * inc/new.h: Likewise. + * inc/typeinfo: Likewise. + + 2000-05-01 Jason Merrill + + * tree.c (build_target_expr_with_type): If we already have a + TARGET_EXPR, just return it. + + * optimize.c (initialize_inlined_parameters): Don't generate an + EXPR_STMT if we can just use DECL_INITIAL. + * decl.c (emit_local_var): Only make the initialization a + full-expression if stmts_are_full_exprs_p. + + 2000-05-01 Mark Mitchell + + * cp-tree.h (same_type_ignoring_top_level_qualifiers_p): New + macro. + * call.c (standard_conversion): Use it. + (direct_reference_binding): Likewise. + (build_over_call): Likewise. + (is_properly_derived_from): Likewise. + (compare_ics): Likewise. + * class.c (resolves_to_fixed_type_p): Likewise. + * optimize.c (declare_return_variable): Likewise. + * pt.c (is_specialization_of): Likewise. + (unify): Likewise. + * typeck.c (comp_target_parms): Likeiwse. + (build_static_cast): Likewise. + (build_reinterpret_cast): Likewise. + (build_const_cast): Likewise. + (comp_ptr_ttypes_real): Likewise. + (comp_ptr_ttypes_const): Likewise. + * typeck2.c (process_init_constructor): Likewise. + + 2000-04-30 Scott Snyder + + * decl.c (finish_destructor_body): Use the base destructor when + destroying virtual bases. + + 2000-04-30 Mark Mitchell + + * expr.c (cplus_expand_expr): Preserve temporaries when expanding + STMT_EXPRs. + * optimize.c (struct inline_data): Add target_exprs field. + (declare_return_variable): When a function returns an aggregate, + use the variable declared in the TARGET_EXPR as the remapped + DECL_RESULT. + (expand_call_inline): Update the pending target_exprs stack. + (optimize_function): Initialize the stack. + + * decl2.c (finish_file): Fix typo in comment. + + * method.c (emit_thunk): Don't try to return a `void' value. + + * optimize.c (initialize_inlined_parameters): If the parameter is + addressable, we need to make a new VAR_DECL, even if the + initializer is constant. + + 2000-04-28 Cosmin Truta + + * decl.c (grok_op_properties): Add an extra check of argtypes. + + 2000-04-27 Mark Mitchell + + * optimize.c (copy_body_r): Use STRIP_TYPE_NOPS when copying + variables. + (initialize_inlined_parameters): Try to avoid creating new + VAR_DECLs. + + 2000-04-27 Alex Samuel + + * lex.c (my_get_run_time): Remove. + (init_filename_times): Use get_run_time instead of my_get_run_time. + (check_newline): Likewise. + (dump_time_statistics): Likewise. + * decl2.c (finish_file): Push and pop timevar TV_VARCONST instead + of computing elapsed time explicitly. + + 2000-04-26 Mark Mitchell + + * cp-tree.h (TREE_READONLY_DECL_P): Use DECL_P. + * init.c (decl_constant_value): Check TREE_READONLY_DECL_P. + * call.c (convert_like_real): Don't test TREE_READONLY_DECL_P + before calling decl_constant_value. + * class.c (check_bitfield_decl): Likewise. + * cvt.c (ocp_convert): Likewise. + (convert): Likewise. + * decl.c (compute_array_index_type): Likewise. + (build_enumerator): Likewise. + * decl2.c (check_cp_case_value): Likewise. + * pt.c (convert_nontype_argument): Likewise. + (tsubst): Likewise. + * typeck.c (decay_conversion): Likewise. + (build_compound_expr): Likewise. + (build_reinterpret_cast): Likewise. + (build_c_cast): Likewise. + (convert_for_assignment): Likewise. + + 2000-04-26 Jason Merrill + + * decl.c (finish_function): Don't play games with DECL_INLINE. + + 2000-04-25 Gabriel Dos Reis + + * ir.texi: Correct typo. + + 2000-04-25 Martin v. Löwis + + * decl.c (grokdeclarator): Reject VLAs as members. + + 2000-04-24 Gabriel Dos Reis + + * call.c (standard_conversion): Accept conversion between + COMPLEX_TYPEs. + + * cvt.c (ocp_convert): Handle conversion to COMPLEX_TYPE. + + 2000-04-24 Zack Weinberg + + * decl2.c (finish_file): Remove double setup for accounting + compile time. + + 2000-04-24 Robert Lipe + + * cp-tree.h (lang_type): Member `language' now ENUM_BITFIELD. + + 2000-04-23 Benjamin Kosnik + + * new.cc (set_new_handler): Needs to be in std::. + + 2000-04-23 Mark Mitchell + + * cp-tree.h (lang_decl): Remove pretty_function_p. + (DECL_PRETTY_FUNCTION_P): Use TREE_LANG_FLAG_0, not a bit in the + language-specific node. + * decl.c (cp_make_fname_decl): Use build_decl, not + build_lang_decl, to build the variables. + (grokvardecl): Don't call build_lang_decl for local variables in + templates. + (grokdeclarator): Don't call build_lang_decl for local type + declarations in templates. + * lex.c (retrofit_lang_decl): Use ggc_alloc_obj to allocated + zero'd memory, rather than calling memset. + * pt.c: Include hashtab.h. + (local_specializations): New variable. + (retrieve_local_specialization): Use it. + (register_local_specialization): Likewise. + (tsubst_decl): Don't assume local variables have + DECL_LANG_SPECIFIC. + (instantiate_decl): Set up local_specializations. + * Makefile.in (HTAB_H): New variable. + + 2000-04-23 Richard Henderson + + * typeck.c (c_expand_asm_operands): Restore the original + contents of the output list. + + 2000-04-22 Gabriel Dos Reis + + * ir.texi: Document complex number representation. + + 2000-04-20 Nathan Sidwell + + * rtti.c (init_rtti_processing): Set tinfo_var_id in new-abi. + (target_incomplete_p): New function. + (tinfo_base_init): Create comdat NTBS name variable. + (ptr_initializer): Add non_public parameter. Calculate it. + (ptmd_initializer): Likewise. + (synthesize_tinfo_var): Adjust. Emit incomplete class tinfo. + (create_real_tinfo_var): Add non_public parameter. Use it. + Push proxy into global namespace. + * inc/cxxabi.h (__pointer_type_info::incomplete_class_mask): + New enumeration. + * inc/typeinfo (type_info::before, type_info::operator==): + Compare __name addresses. + + * tinfo2.cc: Remove new-abi builtins comment. + + 2000-04-20 Jason Merrill + + * typeck.c (build_x_function_call): Resolve an OFFSET_REF. + + * call.c (joust): Exit early if we get the same function, too. + + * decl2.c (key_method): Return NULL_TREE for template classes. + (import_export_class): Don't need to check for template classes. + + 2000-04-18 Zack Weinberg + + * lex.c: Remove references to cccp.c. + + 2000-04-18 Mark Mitchell + + * cp-tree.h (lang_decl_flags): Remove const_memfunc and + volatile_memfunc. Add destructor_attr. Adjust dummy. + (DECL_DESTRUCTOR_P): Use destructor_attr. + (DECL_CONST_MEMFUNC_P): Reimplement. + (DECL_VOLATILE_MEMFUNC_P): Remove. + * class.c (finish_struct_methods): Use CLASSTYPE_DESTRUCTORS. + (overrides): Use DECL_DESTRUCTOR_P. + (check_for_override): Likewise. + * decl.c (start_function): Likewise. + * decl2.c (grokfclassfn): Likewise. + (check_classfn): Likewise. + (grok_function_init): Likewise. + + 2000-04-17 Mark Mitchell + + * decl2.c (grokfield): Issue error on illegal data member + declaration. + + 2000-04-17 Mark P Mitchell + + * method.c (make_thunk): Set DECL_CONTEXT for a THUNK_DECL. + + 2000-04-16 Mark Mitchell + + * class.c (build_vtable_entry): Don't build thunks for type-info + functions. + + 2000-04-16 Jason Merrill + + * decl.c (decls_match): Allow a redeclaration of a builtin to + specify args while the builtin did not. + + 2000-04-15 Mark Mitchell + + * cp-tree.def (THUNK_DECL): Add to documentation. + * cp-tree.h (flag_huge_objects): Declare. + * class.c (modify_vtable_entry): Tidy. + (update_vtable_entry_for_fn): Split out from dfs_modify_vtables. + Calculate delta appropriately for the new ABI. + (dfs_modify_vtables): Use it. + (modify_all_vtables): Fix thinko in code to add overriding copies + of functions to primary vtables. + (build_clone): Fix typo in comment. + (clone_function_decl): Correct order of destructors in vtable. + (build_vbase_offset_vtbl_entries): Adjust comment. + (dfs_vcall_offset_queue_p): Remove. + (dfs_build_vcall_offset_vtbl_entries): Update BV_VCALL_INDEX. + (build_vcall_offset_vtbl_entries): Juse use dfs_skip_vbases. + (build_vtable_entry): Correct check for pure virtual functions. + Don't declare flag_huge_objects. + * decl.c (flag_huge_objects): Remove declaration. + * method.c (make_thunk): Tweak mangling for vcall offset thunks. + Use int_size_in_bytes. + (emit_thunk): Handle vcall offset thunks. + + 2000-04-15 Richard Kenner + + * decl2.c (parse_time, varconst_time): Delete declarations. + (finish_file): Delete LINENO declaration. + START_TIME and THIS_TIME now long. + + 2000-04-13 Nathan Sidwell + + * class.c (build_base_field): Reformat comment. + + * inc/cxxabi.h (stddef.h): Comment inclusion. + (__base_class_info::__offset): Comment shift. + + 2000-04-12 Mark Mitchell + + * cp-tree.h (IDENTIFIER_CTOR_OR_DTOR_P): New macro. + (cp_tree_index): Add CPTI_PUSH_EXCEPTION_IDENTIFIER. + (cp_push_exception_identifier): New macro. + (DECL_COMPLETE_DESTRUCTOR_P): New macro. + (DECL_BASE_DESTRUCTOR_P): Likewise. + (DECL_DELETING_DESTRUCTOR_P): Likewise. + (get_vtbl_decl_for_binfo): Fix formatting. + (in_charge_arg_for_name): New macro. + (maybe_build_cleanup_and_delete): Remove declaration. + * call.c (build_field_call): Use IDENTIFIER_CTOR_OR_DTOR_P. + (in_charge_arg_for_name): New function. + (build_new_method_call): Use it. Handle cloned destructors. + (build_clone): Don't make the base constructor virtual. + Automatically defer generated functions. + (clone_function_decl): Handle destructors, too. + (clone_constructors_and_destructors): Likewise. + (create_vtable_ptr): Don't create a vtable entry for a cloned + function. + * decl.c (predefined_identifier): Add ctor_or_dtor_p. + (initialize_predefined_identifiers): Update appropriately. + (finish_destructor_body): Simplify. + (maybe_build_cleanup_and_delete): Remove. + * except.c (expand_throw): Handle new-ABI destructors. + * init.c (expand_cleanup_for_base): Use base_dtor_identifier. + (build_dtor_call): New function. + (build_delete): Use it. Simplify. + * optimize.c (maybe_clone_body): Handle destructors. + * search.c (lookup_field_queue_p): Use IDENTIFIER_CTOR_OR_DTOR_P. + + * exception.cc (cleanup_fn): New typedef. + (CALL_CLEANUP): New macro. + (cp_eh_info): Use them. + (__cp_push_exception): Likewise. + (__cp_pop_exception): Likewise. + + 2000-04-11 Mark Mitchell + + * cp-tree.h (cp_tree_index): Add CPTI_DTOR_IDENTIFIER. + (complete_dtor_identifier): New macro. + (CLASSTYPE_FIRST_CONVERSION): Remove. + (CLASSTYPE_CONSTRUCTOR_SLOT): New macro. + (CLASSTYPE_DESTRUCTOR_SLOT): Likewise. + (CLASSTYPE_FIRST_CONVERSION_SLOT): Likewise. + (CLASSTYPE_CONSTRUCTORS): Likewise. + (CLASSTYPE_DESTRUCTORS): Likewise. + (lang_decl): Add cloned_function. + (DECL_COMPLETE_CONSTRUCTOR_P): New macro. + (DECL_BASE_CONSTRUCTOR_P): Likewise. + (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P): Likewise. + (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P): Likewise. + (DECL_CLONED_FUNCTION_P): Likewise. + (DECL_CLONED_FUNCTION): Likewise. + (clone_function_decl): Declare. + (maybe_clone_body): Likewise. + * call.c (build_user_type_conversion_1): Call complete object + constructors in the new ABI. + (build_new_method_call): Don't add in-charge parameters under the + new ABI. + * class.c (add_method): Use DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P, + DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P, CLASSTYPE_CONSTRUCTOR_SLOT, and + CLASSTYPE_DESTRUCTOR_SLOT. + (build_clone): New function. + (clone_function_decl): Likewise. + (clone_constructors_and_destructors): Likewise. + (check_bases_and_members): Use it. + * decl.c (iniitialize_predefined_identifiers): Initialize + complete_dtor_identifier. + (finish_function): Don't add extra code to a clone. + (lang_mark_tree): Mark cloned_function. + * decl2.c (mark_used): Don't bother trying to instantiate things + we synthesized. + * dump.c (dequeue_and_dump): Don't dump CP_DECL_CONTEXT twice. + * method.c (set_mangled_name_for_decl): Don't treat clones as + constructors. + (synthesize_method): Sythesize cloned functions, not the clones. + * optimize.c (inline_data): Update comment on ret_label. + (remap_block): Don't assume DECL_INITIAL exists. + (copy_body_r): Allow ret_label to be NULL. + (maybe_clone_body): Define. + * pt.c (tsubst_decl): Handle clones. + (instantiate_clone): New function. + (instantiate_template): Use it. + (set_mangled_name_for_template_decl): Don't treat clones as + constructors. + * search.c (lookup_fnfields_1): Use CLASSTYPE_CONSTRUCTOR_SLOT, + CLASSTYPE_DESTRUCTOR_SLOT, and CLASSTYPE_FIRST_CONVERSION_SLOT. + * semantics.c (expand_body): Clone function bodies as necessary. + + * optimize.c (remap_decl): Avoid sharing structure for arrays + whose size is only known at run-time. + * tree.c (copy_tree_r): Don't copy PARM_DECLs. + + * cp-tree.h (lang_decl_flags): Rename constructor_for_vbase_attr + to has_in_charge_parm_p. + (DECL_CONSTRUCTOR_FOR_VBASE_P): Rename to ... + (DECL_HAS_IN_CHARGE_PARM_P): ... this. + (DECL_COPY_CONSTRUCTOR_P): New macro. + * call.c (add_function_candidate): Use DECL_HAS_IN_CHARGE_PARM_P. + (build_user_type_conversion_1): Likewise. + (convert_like_real): Likewise. + (build_over_call): Likeiwse. Use DECL_COPY_CONSTRUCTOR_P. + * decl.c (grokdeclarator): Use DECL_HAS_IN_CHARGE_PARM_P. + (copy_args_p): Likewise. + (grok_ctor_properties): Likewise. + (start_function): Likewise. + * decl2.c (maybe_retrofit_in_charge): Likewise. Set it. + * error.c (dump_function_decl): Use DECL_HAS_IN_CHARGE_PARM_P. + * init.c (emit_base_init): Use DECL_COPY_CONSTRUCTOR_P. + * method.c (do_build_copy_constructor): Use + DECL_HAS_IN_CHARGE_PARM_P. + (synthesize_method): Likewise. + * pt.c (instantiate_template): Remove goto. + * tree.c (build_cplus_method_type): Remove mention of obstacks in + comment. + + * cp-tre.h (finish_function): Change prototype. + * decl.c (end_cleanup_fn): Adjust caller. + (finish_function): Take only one parameter. + * decl2.c (finish_objects): Adjust caller. + (finish_static_storage_duration_function): Likewise. + * method.c (emit_thunk): Likewise. + * parse.y: Likewise. + * parse.c: Regenerated. + * pt.c (instantiate_decl): Likewise. + * rtti.c (synthesize_tinfo_fn): Likewise. + * semantics.c (expand_body): Likewise. + + * cp-tree.h (copy_decl): New function. + * class.c (finish_struct_1): Use it. + * lex.c (copy_decl): Define it. + * pt.c (tsubst_decl): Likewise. + * tree.c (copy_template_template_parm): Likewise. + + * cp-tree.h (lang_type): Remove has_nonpublic_ctor and + has_nonpublic_assign_ref. + (TYPE_HAS_NONPUBLIC_CTOR): Don't declare. + (TYPE_HAS_NONPUBLIC_ASSIGN_REF): Likewise. + * class.c (finish_struct_methods): Don't set + TYPE_HAS_NONPUBLIC_CTOR or TYPE_HAS_NONPUBLIC_ASSIGN_REF. + (interface_only): Don't declare. + (interface_unknown): Likewise. + + 2000-04-11 Martin v. Löwis + + * tree.h (HAVE_TEMPLATES): Remove definition. + * lang-options.h (-fthis-is-variable): Remove documentation. + + 2000-04-10 Jason Merrill + + * class.c (instantiate_type): Handle object-relative template-id. + + * semantics.c (finish_expr_stmt): Call convert_to_void here. + * decl.c (cplus_expand_expr_stmt): Not here. + + * rtti.c (build_dynamic_cast_1): Call non_lvalue. + Initialize exprtype earlier. + + * parse.y (fn.def1): Check for defining types in return types. + + * decl.c (check_tag_decl): Notice extra fundamental types. + Diagnose empty decls in classes, too. + + * decl.c (grokdeclarator): Don't override an anonymous name if no + declarator was given. + + * cvt.c (convert_to_void): Call resolve_offset_ref. + + * typeck.c (build_x_function_call): Abort if we get an OFFSET_REF. + + * decl2.c (decl_namespace): Handle getting a type. + + * typeck.c (build_c_cast): Re-enable warning for cast between + pointer and integer of different size. + + 2000-04-10 Nathan Sidwell + + * inc/cxxabi.h (__pointer_type_info): Add restrict and + incomplete flags. + (__pointer_type_info::__pointer_catch): New virtual function. + (__pointer_to_member_type_info): Derive from + __pointer_type_info. Adjust. + (__pointer_to_member_type_info::__do_catch): Remove. + (__pointer_to_member_type_info::__is_pointer_p): Declare. + (__pointer_to_member_type_info::__pointer_catch): Declare. + * rtti.c (qualifier_flags): Add restrict flag. + (ptmd_initializer): Reorder members. + (create_tinfo_types): Expand comments. Reorder + ptmd_desc_type_node members. + * tinfo2.cc (__pointer_to_member_type_info::__is_pointer_p): + Implement. + (__pointer_type_info::__do_catch): Move specific code into + __pointer_catch. Call it. + (__pointer_type_info::__pointer_catch): Non-pointer-to-member + specific catch checking. Fix void conversion check. + (__pointer_to_member_type_info::__do_catch): Remove. + (__pointer_to_member_type_info::__pointer_catch): Implement. + + 2000-04-10 Martin v. Löwis + + * lex.c (init_parse): Remove traces of classof and headof. + * decl2.c (flag_operator_names): Default to 1. + (lang_decode_option): Do not set it for -ansi. + + 2000-04-09 Mark Mitchell + + * cp-tree.h (struct lang_decl): Remove main_decl_variant. + (DECL_MAIN_VARIANT): Remove. + * decl.c (duplicate_decls): Don't set it. + (start_function): Likewise. + (lang_mark_tree): Don't mark it. + * decl2.c (defer_fn): Don't use it. + * lex.c (retrofit_lang_decl): Don't set it. + * pt.c (tsubst_decl): Likewise. + * ptree.c (print_lang_decl): Don't print it. + * typeck.c (mark_addressable): Don't use it. + + 2000-04-09 Nathan Sidwell + + * vec.cc: Include and . + (__cxa_vec_ctor): Use __cxa_vec_dtor for cleanup. + (__cxa_vec_dtor): Catch dtor exceptions, and rethrow or + terminate. + (__cxa_vec_delete): Catch dtor exceptions. + + 2000-04-09 Nathan Sidwell + + Prepend __ to implementation defined names. + * inc/typeinfo (type_info): Rename _name to __name. + (type_info::type_info): Rename parameter. + (type_info::operator==, type_info::operator!=, + type_info::before): Likewise. + (type_info::is_pointer_p, type_info::is_function_p, + type_info::do_catch, type_info::do_upcast): Prepend __. Rename + parameters. + * inc/cxxabi.h + (__fundamental_type_info::__fundamental_type_info) Rename parameters. + (__pointer_type_info::__pointer_type_info): Likewise. + (__pointer_type_info::is_pointer_p, + __pointer_type_info::do_catch): Prepend __. Rename parameters. + (__array_type_info::__array_type_info): Rename parameters. + (__function_type_info::__function_type_info): Likewise. + (__function_type_info::is_function_p): Prepend __. + (__enum_type_info::__enum_type_info): Rename parameters. + (__pointer_to_member_type_info::__pointer_to_member_type_info): + Likewise. + (__pointer_to_member_type_info::do_catch): Prepend __. Rename + parameters. + (__base_class_info::is_virtual_p, is_public_p, offset): Prepend __. + (__class_type_info::__class_type_info): Rename parameters. + (__class_type_info::sub_kind): Prepend __. Adjust member names. + (__class_type_info::upcast_result, + __class_type_info::dyncast_result): Prepend __. Move definition + into tinfo.cc. + (__class_type_info::do_upcast, __class_type_info::do_catch, + __class_type_info::find_public_src, + __class_type_info::do_dyncast, + __class_type_info::do_find_public_src): Prepend __. Rename + parameters. + (__si_class_type_info::__si_class_type_info): Rename parameters. + (__si_class_type_info::do_upcast, __si_class_type_info::do_dyncast, + __si_class_type_info::do_find_public_src): Prepent __. Rename + parameters. + (__vmi_class_type_info::__vmi_class_type_info): Rename parameters. + (__vmi_class_type_info::do_upcast, __vmi_class_type_info::do_dyncast, + __vmi_class_type_info::do_find_public_src): Prepent __. Rename + parameters. + (__dynamic_cast): Rename parameters. + * tinfo.cc (type_info::is_pointer_p, type_info::is_function_p, + type_info::do_catch, type_info::do_upcast): Prepend __. + (contained_p, public_p, virtual_p, contained_public_p, + contained_nonpublic_p, contained_nonvirtual_p): Adjust. + (__class_type_info::do_catch, + __class_type_info::do_upcast): Prepend __. Adjust. + (__class_type_info::__upcast_result, + __class_type_info::__dyncast_result): Move from inc/cxxabi.h. + Adjust. + (__class_type_info::find_public_src): Prepend __. Adjust. + (__class_type_info::do_find_public_src, + __si_class_type_info::do_find_public_src, + __vmi_class_type_info::do_find_public_src): Likewise. + (__class_type_info::do_dyncast, + __si_class_type_info::do_dyncast, + __vmi_class_type_info::do_dyncast): Likewise. + (__class_type_info::do_upcast, + __si_class_type_info::do_upcast, + __vmi_class_type_info::do_upcast): Likewise. + (__dynamic_cast): Adjust. + * tinfo2.cc (__pointer_type_info::is_pointer_p): Prepend __. + (__function_type_info::is_function_p): Likewise. + (__pointer_type_info::do_catch): Likewise. Adjust. + (__pointer_to_member_type_info::do_catch): Likewise. Adjust. + (__throw_type_match_rtti_2): Adjust. + (__is_pointer): Adjust. + + 2000-04-08 Mark Mitchell + + * cp-tree.h (cp_tree_index): Add CPTI_COMPLETE_CTOR_IDENTIFIER. + (complete_ctor_identifier): New macro. + (special_function_kind): Add sfk_copy_constructor and + sfk_assignment_operator. + (LOOKUP_HAS_IN_CHARGE): Remove. + (cons_up_default_function): Rename to ... + (implicitly_declare_fn): ... this. + * call.c (build_new_method_call): Add in-charge parameters for + constructors here. + * class.c (add_implicitly_declared_members): Change parameter name + from cant_have_assignment to cant_have_const_assignment. + Replace calls to cons_up_default_function to implicitly_declare_fn. + * cvt.c (ocp_convert): Use complete_ctor_identifier. + * decl.c (initialize_predefined_identifiers): Initialize it. + (start_function): Use DECL_CONSTRUCTOR_FOR_VBASE_P instead of + complex expression. + * init.c (expand_default_init): Don't calculate the in-charge + parameter here. + (build_new_1): Likewise. + * lex.c (cons_up_default_function): Move to method.c. + * method.c (synthesize_method): Use DECL_DESTRUCTOR_P. + (implicitly_declare_fn): New function. + * typeck.c (build_static_cast): Use complete_ctor_identifier. + (build_modify_expr): Likewise. + * typeck2.c (build_functional_cast): Likewise. + + Under the new ABI, constructors don't return `this'. + * cp-tree.h (warn_reorder): Declare. + (special_function_kind): New enum. + (global_base_init_list): Remove declaration. + (emit_base_init): Don't return a value. + (check_base_init): Don't declare. + (is_aggr_typedef): Likewise. + * decl.c (check_special_function_return_type): New function. + (return_types): Remove. + (grokdeclarator): Use check_special_function_return_type. + (start_function): Don't initialize ctor_label under the new ABI. + (finish_construtor_body): Don't create a corresponding LABEL_STMT. + * init.c (begin_init_stmts): Move to top of file. + (finish_init_stmts): Likewise. + (warn_reorder): Don't declare. + (emit_base_init): Don't create a STMT_EXPR here. Don't return a + value. + (check_base_init): Remove. + (is_aggr_typedef): Likewise. + (build_new_1): Don't use the return value of a constructor. + * semantics.c (setup_vtbl_ptr): Don't use the return value + of emit_base_init. + * typeck.c (check_return_expr): Don't magically convert return + statements into `return this' in constructors under the new ABI. + + * cp-tree.h (cp_tree_index): Add CPTI_BASE_CTOR_IDENTIFIER, + CPTI_BASE_DTOR_IDENTIFIER, and CPTI_DELETING_DTOR_IDENTIFIER. + (base_ctor_identifier): New macro. + (base_dtor_identifier): Likewise. + (deleting_dtor_identifier): Likewise. + * decl.c: Don't include obstack.h. + (obstack_chunk_alloc): Don't define. + (obstack_chunk_free): Likewise. + (struct predefined_identifier): New type. + (initialize_predefined_identifiers): New function. + (init_decl_processing): Use it. + (debug_temp_inits): Remove. + (start_method): Don't call preserve_data. + (hack_incomplete_structures): Update comment. + * init.c (init_init_processing): Don't initialize + nelts_identifier. + (build_offset_rf): Remove dead code. + (build_delete): Use CLASSTYPE_N_BASECLASSES. + * search.c (init_search_processing): Don't initialize + vptr_identifier. + + 2000-04-08 Kaveh R. Ghazi + + * typeck.c (build_binary_op): Call `tree_expr_nonnegative_p' to elide + some sign_compare warnings. + + 2000-04-07 Nathan Sidwell + + Rename abi::__vmi_class_type_info members. + * inc/cxxabi.h (__vmi_class_type_info): Rename details, n_bases, + base_list, detail_masks members to vmi_flags, vmi_base_count, + vmi_bases and vmi_flags_masks respectively. + (__vmi_class_type_info::vmi_flags_masks): Rename + details_unknown_mask to flags_unknown_mask. + * tinfo.cc (__class_type_info::do_upcast): Adjust. + (__vmi_class_type_info::do_find_public_src): Adjust. + (__vmi_class_type_info::do_dyncast): Adjust. + (__vmi_class_type_info::do_upcast): Adjust. + + 2000-04-07 Nathan Sidwell + + * tinfo.cc (convert_to_base): New function. + (get_vbase_offset): Remove. Move into convert_to_base. + (__vmi_class_type_info::do_find_public_src): Adjust. + (__vmi_class_type_info::do_dyncast): Adjust. + (__vmi_class_type_info::do_upcast): Adjust. + + 2000-04-06 Jason Merrill + + * tinfo.cc (operator=): Use __builtin_strcmp. + * tinfo2.cc (before): Likewise. + + 2000-04-06 Mark Mitchell + + * cp-tree.h (lang_decl_flags): Rename saved_inline to deferred. + (DECL_SAVED_INLINE): Rename to ... + (DECL_DEFERRED_FN): ... this. + (in_function_p): Remove declaration. + (mark_inline_for_output): Rename to ... + (defer_fn): ... this. + * decl.c (finish_function): Adjust call to mark_inline_for_output. + (in_function_p): Remove definition. + * decl2.c (saved_inlines): Rename to ... + (deferred_fns): ... this. + (saved_inlines_used): Rename to ... + (deferred_fns_used): ... this. + (mark_inline_for_output): Rename to ... + (defer_fn): ... this. + (finish_file): Adjust accordingly. + (init_decl2): Likewise. + * lex.c (cons_up_default_function): Likewise. + * pt.c (mark_decl_instantiated): Likewise. + (instantiate_decl): Don't set DECL_DEFER_OUTPUT under any + circumstances. + * rtti.c (get_tinfo_decl): Adjust call to mark_inline_for_output. + * semantics.c (expand_body): Defer more functions. + + 2000-04-06 Nathan Sidwell + + * vec.cc: New file. + * Make-lang.in (CXX_LIB2FUNCS): Add it. + (vec.o): Build it. + * inc/cxxabi.h (__cxa_vec_new, __cxa_vec_ctor, __cxa_vec_dtor, + __cxa_vec_delete): Declare. + + 2000-04-06 Nathan Sidwell + + * rtti.c (dfs_class_hint_mark): New static function. + (dfs_class_hint_unmark): New static function. + (class_hint_flags): Use them. + + 2000-04-05 Benjamin Kosnik + + * decl2.c: Make flag_honor_std dependent on ENABLE_STD_NAMESPACE. + + 2000-04-05 Mark Mitchell + + * cp-tree.h (instantiate_decl): Change prototype. + * decl2.c (mark_used): Adjust call. + * optimize.c (inlinable_function_p): Adjust handling of templates. + * pt.c (do_decl_instantiation): Adjust call to instantiate_decl. + (do_type_instantiation): Likewise. + (instantiate_decl): Defer more templates. + (instantiate_pending_templates): Adjust logic to handle inline + friend functions. + + * Makefile.in (GGC_H): New variable. Use it throughout in place + of ggc.h. + + * call.c: Don't include obstack.h. Include ggc.h. + (obstack_chunk_alloc): Don't define. + (obstack_chunk_free): Likewise. + (add_candidate): Allocate the z_candidate with ggc_alloc_obj. + * decl.c (push_switch): Use xmalloc to allocate the cp_switch. + (pop_switch): Free it. + + * decl2.c (grokclassfn): Set TREE_READONLY for PARM_DECLs. + + * dump.c (dequeue_and_dump): Don't try to print the bit_position + if we don't have a DECL_FIELD_OFFSET. + + Wed Apr 5 15:12:18 MET DST 2000 Jan Hubicka + + * optimize.c (calls_setjmp_r): Use setjmp_call_p instead of + special_function_p. + + 2000-04-04 Kaveh R. Ghazi + + * cfns.gperf (hash, libc_name_p): Prototype. + + * rtti.c (build_dynamic_cast_1): Constification. + + * search.c (dfs_debug_unmarkedp, dfs_debug_mark): Unhide prototypes. + + * semantics.c (deferred_type_access_control): Prototype. + + 2000-04-04 Mark Mitchell + + Correct many new ABI issues regarding vbase and vcall offset + layout. + * cp-tree.h (BINFO_VTABLE): Document. + (struct lang_type): Tweak formatting. + (BINFO_PRIMARY_BINFO): Add to documentation. + (CLASSTYPE_VSIZE): Fix typo in comment. + (CLASSTYPE_VBASECLASSES): Update documentation. + (BINFO_VBASE_MARKED): Remove. + (SET_BINFO_VBASE_MARKED): Likewise. + (CLEAR_BINFO_VBASE_MARKED): Likewise. + (BINFO_FIELDS_MARKED): Remove. + (SET_BINFO_FIELDS_MARKED): Likewise. + (CLEAR_BINFO_FIELDS_MARKED): Likewise. + (enum access_kind): New enumeration. + (num_extra_vtbl_entries): Remove declaration. + (size_extra_vtbl_entries): Likewise. + (get_vtbl_decl_for_binfo): New function. + (dfs_vbase_unmark): Remove declaration. + (mark_primary_bases): Likewise. + * class.c (SAME_FN): Remove. + (struct vcall_offset_data_s): Move definition. + (build_vbase_pointer): Use `build', not `build_binary_op', to + access the vbase pointer under the new ABI. + (build_vtable_entry_ref): Use get_vtbl_decl_for_binfo. + (build_primary_vtable): Likewise. + (dfs_mark_primary_bases): Move here from search.c. + (mark_primary_bases): Likewise. + (determine_primary_bases): Under the new ABI, don't make a base + class a primary base just because we don't yet have any virtual + functions. + (layout_vtable_decl): Use get_vtbl_decl_for_binfo. + (num_vfun_entries): Remove. + (dfs_count_virtuals): Likewise. + (num_extra_vtbl_entries): Likewise. + (size_extra_vtbl_entries): Likewise. + (layout_virtual_bases): Iterate in inheritance graph order under + the new ABI. + (finish_struct_1): Use TYPE_VFIELD, not CLASSTYPE_VSIZE, to + indicate that a vfield is present. + (init_class_processing): Initialize access_public_node, etc., from + ak_public, etc. + (get_vtbl_decl_for_binfo): New function. + (dump_class_hierarchy_r): Likewise. + (dump_class_hierarchy): Use it. + (finish_vtbls): Build the vtbls in inheritance graph order. + (dfs_finish_vtbls): Adjust call to build_vtbl_initializer. + (initialize_vtable): Use get_vtbl_decl_for_binfo. + (accumulate_vtbl_inits): Add comments explaining why a pre-order + walk is required. + (dfs_accumulate_vtbl_inits): Set BINFO_VTABLE to the location + where the vptr points, even for primary vtables. + (build_vtbl_initializer): Adjust handling of vbase and vcall + offsets. + (build_vcall_and_vbase_vtable_entries): New function. + (dfs_build_vbase_offset_vtbl_entries): Remove. + (build_vbase_offset_vtbl_entries): Reimplement. + (dfs_build_vcall_offset_vtbl_entries): Don't include virtuals that + were already handled in a primary base class vtable. + (build_vcall_offset_vtbl_entries): Adjust. + (build_rtti_vtbl_entries): Adjust. + * decl2.c (output_vtable_inherit): Use get_vtbl_decl_for_binfo. + * init.c (expand_virtual_init): Simplify. + * repo.c (repo_get_id): Use get_vtbl_decl_for_binfo. + * rtti.c (create_pseudo_type_info): Adjust calculation of vptr. + * search.c (BINFO_ACCESS): New macro. + (SET_BINFO_ACCESS): Likewise. + (dfs_access_in_type): Manipulate access_kinds, not access nodes. + (access_in_type): Likewise. + (dfs_accessible_p): Likewise. + (protected_accessible_p): Likewise. + (lookup_fnfields_1): Adjust documentation. + (dfs_mark_primary_bases): Move to class.c + (mark_primary_bases): Likewise. + (dfs_vbase_unmark): Remove. + (virtual_context): Use BINFO_FOR_VBASE. + (dfs_get_vbase_types): Simplify. + (dfs_build_inheritance_graph_order): New function. + (get_vbase_types): Use it. + * tree.c (debug_binfo): Use get_vtbl_decl_for_binfo. + + * tinfo.cc (get_vbase_offset): New function. + (__vmi_class_type_info::do_find_public_src): Use it. + (__vmi_class_type_info::do_dyncast): Likewise. + (__vmi_class_type_info::do_upcast): Likewise. + + 2000-04-03 Zack Weinberg + + * lang-specs.h: Pass -fno-show-column to the preprocessor. + + 2000-03-30 Nathan Sidwell + + * rtti.c (class_hint_flags): Rename flags. + (class_initializer): Remove flags. + (synthesize_tinfo_var): Combine offset and flags. Add flags + for __vmi_class_type_info. + (create_tinfo_types): Remove flags from __class_type_info and + __si_class_type_info. Merge flags and offset from + base_class_type_info. + * inc/cxxabi.h (__base_class_info): Merge offset and vmi_flags. + (__base_class_info::is_virtual_p): Adjust. + (__base_class_info::is_public_p): Adjust. + (__base_class_info::offset): New accessor. + (__class_type_info::details): Remove member. + (__class_type_info::__class_type_info): Lose details. + (__class_type_info::detail_masks): Remove. + (__si_class_type_info::__si_class_type_info): Lose details. + (__vmi_class_type_info::details): New member. + (__vmi_class_type_info::__vmi_class_type_info): Adjust. + (__vmi_class_type_info::detail_masks): New member. + * tinfo.cc (__class_type_info::do_upcast): Initialize result + with unknown_details_mask. + (__vmi_class_type_info::do_find_public_src): Adjust + (__vmi_class_type_info::do_dyncast): Adjust. + (__vmi_class_type_info::do_upcast): Set result details, if + needed. Adjust. + (__dynamic_cast): Temporarily #if out optimization. + + 2000-03-29 Nathan Sidwell + + * rtti.c (get_tinfo_decl): Mark used. + (emit_tinfo_decl): Don't optimize polymorphic type_info. Only + mark as dealt with, if we output it. + + 2000-03-28 Mark Mitchell + + * class.c: Reorganize to put virtual function table initialization + machinery at the end of the file. + + 2000-03-28 Jason Merrill + + * class.c (finish_struct): Use bitsize_zero_node. + * pt.c (instantiate_class_template): Likewise. + + 2000-03-28 Mark Mitchell + + Put RTTI entries at negative offsets in new ABI. + * class.c (dfs_build_vbase_offset_vtbl_entries): Put the first + vbase offset at index -3, not -1. + (build_vtabe_offset_vtbl_entries): Use unmarked_vtable_pathp, not + dfs_vtable_path_unmarked_real_bases_queue_p to walk bases. + (dfs_build_vcall_offset_vtbl_entries): Don't use skip_rtti_stuff. + (build_rtti_vtbl_entries): New function. + (set_rtti_entry): Remove. + (build_primary_vtable): Don't use it. + (build_secondary_vtable): Likewise. + (start_vtable): Remove. + (first_vfun_index): New function. + (set_vindex): Likewise. + (add_virtual_function): Don't call start_vtable. Do call + set_vindex. + (set_primary_base): Rename parameter. + (determine_primary_base): Likewise. + (num_vfun_entries): Don't use skip_rtti_stuff. + (num_extra_vtbl_entries): Include RTTI information. + (build_vtbl_initializer): Use build_rtti_vtbl_entries. + (skip_rtti_stuff): Remove. + (dfs_modify_vtables): Don't use it. + (modify_all_vtables): Don't use start_vtable. Do use set_vindex. + (layout_nonempty_base_or_field): Update size handling. + (create_vtable_ptr): Tweak. + (layout_class_type): Adjust parameter names. + (finish_struct_1): Simplify. + * cp-tree.h (CLASSTYPE_VSIZE): Tweak documentation. + (skip_rtti_stuff): Remove. + (first_vfun_index): New function. + (dfs_vtable_path_unmarked_real_bases_queue_p): Remove. + (dfs_vtable_path_marked_real_bases_queue_p): Remove. + (marked_vtable_pathp): Declare. + (unmarked_vtable_pathp): Likewise. + * error.c (dump_expr): Use first_vfun_index to calculate vtable + offsets. + * rtti.c (build_headof): Look for RTTI at negative offsets. + (get_tinfo_decl_dynamic): Likewise. + (tinfo_base_init): Don't take the address of the TINFO_VTABLE_DECL + here. + (create_pseudo_type_info): Do it here instead. Adjust so that + vptr points at first virtual function. + * search.c (marked_vtable_pathp): Make it global. + (unmarked_vtable_pathp): Likewise. + (dfs_vtable_path_unmarked_real_bases_queue_p): Remove. + (dfs_vtable_path_marked_real_bases_queue_p): Likewise. + (dfs_get_pure_virtuals): Don't use skip_rtti_stuff. + (get_pure_virtuals): Likewise. + (expand_upcast_fixups): Likewise. + * tree.c (debug_binfo): Likewise. + * tinfo.cc (__dynamic_cast): Look for vtable_prefix at appropriate + negative offset. + + 2000-03-26 Richard Kenner + + * class.c (check_field_decl): Fix typo. + (build_vtbl_or_vbase_field): Don't clear DECL_SAVED_INSNS. + (check_methods): Likewise. + (check_field_decls): Likewise. + Use DECL_CONTEXT, not DECL_FIELD_CONTEXT. + * cp-tree.h (DECL_SHADOWED_FOR_VAR, DECL_TEMPLATE_RESULT): + Use DECL_RESULT_FLD, not DECL_RESULT. + * decl.c (xref_tag): Use DECL_TEMPLATE_RESULT. + * lex.c (identifier_type): Likewise. + * pt.c (determine_specialization, lookup_template_class): Likewise. + (tsubst_friend_function, tsubst_decl, instantiate_template): Likewise. + (resolve_overloaded_unification, more_specialized): Likewise. + * semantics.c (finish_member_declaration): Likewise. + * typeck.c (build_x_function_call): Likewise. + + 2000-03-26 Mark Mitchell + + * class.c (layout_empty_base): Handle empty bases with non-byte + alignment. + (build_base_field): Likewise. + (layout_virtual_bases): Likewise. + + * class.c (finish_struct_1): Fix typo in this change: + + Sat Mar 25 09:12:10 2000 Richard Kenner + + 2000-03-25 Mark Mitchell + + * decl.c (grokdeclarator): Count partial specializations when + keeping track of how many template classes have been seen. + + * dump.c (dequeue_and_dump): Dump DECL_TEMPLATE_RESULT. + + 2000-03-25 Richard Kenner + + * class.c (build_vbase_pointer_fields): layout_field now place_field. + (get_vfield_offset): Use byte_position. + (set_rtti_entry): Set OFFSET to ssizetype zero. + (get_binfo_offset_as_int): Deleted. + (dfs_record_base_offsets): Use tree_low_cst. + (dfs_search_base_offsets): Likewise. + (layout_nonempty_base_or_field): Reflect changes in RLI format + and call byte_position. + (layout_empty_base): Convert offset to ssizetype. + (build_base_field): use rli_size_unit_so_far. + (dfs_propagate_binfo_offsets): Do computation in proper type. + (layout_virtual_bases): Pass ssizetype to propagate_binfo_offsets. + (layout_class_type): Reflect changes in RLI names and fields. + (finish_struct_1): Set DECL_FIELD_OFFSET. + * dump.c (dequeue_and_dump): Call bit_position. + * expr.c (cplus_expand_constant): Use byte_position. + * rtti.c (expand_class_desc): Use bitsize_one_node. + * typeck.c (build_component_addr): Use byte_position and don't + special case for zero offset. + + 2000-03-24 Nathan Sidwell + + * decl.c (vtype_decl_p): Use TYPE_POLYMORPHIC_P. + + * rtti.c (get_tinfo_decl): Set comdat linkage on new-abi + tinfo object. + (emit_tinfo_decl): Only emit polymorphic tinfo's when emitting + vtable. + + 2000-03-20 Theodore Papadopoulo + + * call.c (check_dtor_name, build_new_method_call): Use TYPE_P and + DECL_P macros. + * decl.c (push_class_binding, poplevel, pushtag, lookup_namespace_name, + make_typename_type, check_initializer, cp_finish_decl, + xref_tag): Likewise. + * decl2.c (grokfield, build_expr_from_tree, build_expr_from_tree, + decl_namespace, arg_assoc_template_arg, arg_assoc, + validate_nonmember_using_decl, do_class_using_decl): Likewise. + * error.c (dump_template_argument, dump_expr, cp_file_of, cp_line_of, + args_to_string): Likewise. + * friend.c (is_friend): Likewise. + * lex.c (note_got_semicolon, note_list_got_semicolon, + is_global): Likewise. + * method.c (build_overload_nested_name, build_overload_value, + build_qualified_name, build_qualified_name, hack_identifier): Likewise. + * parse.y (typename_sub, typename_sub1): Likewise. + * pt.c (push_inline_template_parms_recursive, check_template_shadow, + process_partial_specialization, convert_template_argument, + template_args_equal, add_pending_template, lookup_template_class, + for_each_template_parm_r, maybe_fold_nontype_arg, + tsubst, instantiate_template, type_unification_real, unify, + instantiate_pending_templates, set_mangled_name_for_template_decl): + Likewise. + * repo.c (repo_get_id, repo_template_used): Likewise. + * search.c (lookup_field_1): Likewise. + * tree.c (walk_tree, get_type_decl, cp_tree_equal, member_p): Likewise. + * xref.c (classname): Likewise. + + 2000-03-22 Mark Mitchell + + * cp-tree.h (BINFO_FOR_VBASE): Adjust documentation. + (CANONICAL_BINFO): New macro. + (BINFO_NEW_VTABLE_MARKED): Use it. + (SET_BINFO_NEW_VTABLE_MARKED): Likewise. + (CLEAR_BINFO_NEW_VTABLE_MARKED): Likewise. + * class.c (dfs_build_vbase_offset_vtbl_entries): Use BINFO_TYPE, + not TREE_TYPE. + (build_primary_vtable): Adjust usage of BINFO_NEW_VTABLE_MARKED. + (build_secondary_vtable): Likewise. + (dfs_finish_vtbls): Likewise. + (dfs_accumulate_vtbl_inits): Likewise. + (accumulate_vtbl_inits): New function. + (finish_vtbls): Make sure that virtual bases come after + non-virtual bases in the vtable group. + (record_base_offsets): Don't save and restore TREE_VIA_VIRTUAL. + (finish_struct_1): Adjust usage of BINFO_NEW_VTABLE_MARKED. + * search.c (struct vbase_info): Move definition. + (marked_new_vtable_p): Adjust usage of BINFO_NEW_VTABLE_MARKED. + (unmarked_new_vtable_p): Likewise. + (dfs_mark_vtable_path): Remove. + (dfs_mark_new_vtable): Remove. + (dfs_unmark_new_vtable): Likewise. + (dfs_clear_search_slot): Likewise. + (dfs_find_vbases): Adjust usage of BINFO_NEW_VTABLE_MARKED. + (dfs_clear_vbase_slots): Likewise. + (init_vbase_pointers): LIkewise. + + 2000-03-22 Jason Merrill + + * typeck.c (type_after_usual_arithmetic_conversions): Prefer a + SIZETYPE to a non-SIZETYPE. + + 2000-03-21 Mark Mitchell + + * class.c (layout_virtual_bases): Adjust names in conditionally + compiled code. + + * class.c (record_base_offsets): New function. + (layout_conflict_p): Likewise. + (layout_nonempty_base_or_field): Use it. + (layout_empty_base): New function. + (build_base_field): Use it. + (build_base_fields): Update comment. + (layout_virtual_bases): Fold in a little code form + layout_basetypes. Use layout_empty_base. + (layout_basetypes): Remove. + (end_of_class): New function. + (layout_class_type): Use it. Adjust. + + * cp-tree.h (CLASSTYPE_VBASECLASSES): Fix typo in comment. + (fntype_p): Remove. + * search.c (dfs_skip_nonprimary_vbases_unmarkedp): Fix typo in + comment. + (dfs_skip_nonprimary_vbases_markedp): Likewise. + * typeck.c (fntype_p): Remove. + + * cp-tree.h (TI_SPEC_INFO): Remove. + (CLASSTYPE_TI_SPEC_INFO): Likewise. + * pt.c (process_partial_specialization): Likewise. + + * class.c (build_base_field): Fix thinko in computation of binfo + offsets. + + * tree.c (mark_local_for_remap_p): Mark variables declared in + TARGET_EXPRs as well. + + 2000-03-21 Nathan Sidwell + + * typeck.c (require_complete_type, complete_type, + complete_type_or_else, c_sizeof, c_sizeof_nowarn, + build_array_ref, convert_arguments, pointer_diff, + build_x_unary_op, build_unary_op, build_c_cast, + build_modify_expr): Use COMPLETE_TYPE_P etc. + * call.c (is_complete, convert_like_real, + build_new_method_call): Likewise. + * class.c (build_vbase_pointer_fields, check_bases, + build_base_field, finish_struct_1, pushclass): Likewise. + * cvt.c (cp_convert_to_pointer, convert_to_void): Likewise. + * decl.c (maybe_process_template_type_declaration, pushtag, + pushdecl, redeclaration_error_message, start_decl, start_decl_1, + layout_var_decl, check_initializer, cp_finish_decl, + grokdeclarator, require_complete_types_for_parms, + grok_op_properties, xref_tag, xref_basetypes, + check_function_type): Likewise. + * decl2.c (check_classfn, reparse_absdcl_as_casts): Likewise. + * friend.c (do_friend): Likewise. + * init.c (build_offset_ref): Likewise. + * parse.y (structsp): Likewise. + * pt.c (maybe_process_partial_specialization, + tsubst_friend_function, instantiate_class_template, tsubst, + do_type_instantiation, instantiate_pending_templates): Likewise. + * repo.c (repo_get_id): Likewise. + * rtti.c (build_typeid, get_typeid, build_dynamic_cast_1, + synthesize_tinfo_var, emit_support_tinfos): Likewise. + * search.c (lookup_fnfields_1, lookup_conversions): Likewise. + * semantics.c (begin_class_definition): Likewise. + * tree.c (build_cplus_method_type): Likewise. + * typeck2.c (digest_init, build_functional_cast, + add_exception_specifier): Likewise. + * parse.h, parse.c: Regenerated. + + 2000-03-21 Nathan Sidwell + + * inc/cxxabi.h: New header file. Define new-abi entry points. + (__pointer_type_info::target): Rename member to ... + (__pointer_type_info::type): ... here. + (__base_class_info::type): Rename member to ... + (__base_class_info::base): ... here. + * Make-lang.in (CXX_EXTRA_HEADERS): Add cxxabi.h + * cp-tree.h (CPTI_ABI): New global tree enumeration. + (abi_node): New global tree node. + * decl.c (abi_node): Document. + (init_decl_processing): Initialize abi_node. + * rtti.c (build_dynamic_cast_1): Use abi_node for new-abi. + (get_vmi_pseudo_type_info): Likewise. + (create_tinfo_types): Likewise. + (emit_support_tinfos): Likewise. + * tinfo.h (cxxabi.h): Include for new-abi. + Move rtti class definitions to new header file. + * tinfo.cc (abi): Use the namespace. + (std): Move new abi rtti classes from here ... + (__cxxabiv1): ... to here. + * tinfo2.cc (cxxabi.h): Include for new-abi. + Move rtti class definitions to new header file. + (std): Move new abi rtti classes from here ... + (__cxxabiv1): ... to here. + * inc/typeinfo (__class_type_info): Move into __cxxabiv1 + namespace. + + 2000-03-20 Jed Wing + Jason Merrill + + * method.c (build_overload_int): Use host_integerp. + + 2000-03-20 Theodore Papadopoulo + + * init.c (build_offset_ref): Handle the case of a templated member + function. + + 2000-03-19 Martin v. Löwis + + * except.c (expand_exception_blocks): Clear catch_clauses_last. + + 2000-03-18 Mark Mitchell + + * cp-tree.h (CLEAR_DECL_C_BIT_FIELD): New macro. + * class.c (check_bitfield_decl): Turn illegal bitfields into + non-bitfields. + (dfs_propagate_binfo_offsets): Adjust for new size_binop + semantics. + (dfs_offset_for_unshared_vbases): Likewise. + * cvt.c (cp_convert_to_pointer): Convert NULL to a + pointer-to-member correctly under the new ABI. + * expr.c (cplus_expand_constant): Don't use cp_convert when + turning an offset into a pointer-to-member. + * init.c (resolve_offset_ref): Don't adjust pointers-to-members + when dereferencing them under the new ABI. + * typeck.c (get_member_function_from_ptrfunc): Tweak calculation + of pointers-to-members under the new ABI. + + * class.c (check_bitfield_decl): Remove restriction on really long + bitfields. + (layout_class_type): Implement new ABI handling of bitfields + longer than their types. + + 2000-03-18 Martin v. Löwis + + * parse.y (extdefs): Call ggc_collect. + * parse.c: Regenerated. + + 2000-03-18 Nathan Sidwell + + * class.c (build_base_field): Use TYPE_ALIGN to examine a type. + (note_name_declared_in_class): Use OVL_CURRENT to get at a + potential overload. + + 2000-03-17 Richard Kenner + + * class.c (build_vbase_path): Use integer_zerop. + (build_vtable_entry): Use tree_low_cst. + (get_vfield_offset): Use bit_position. + (dfs_modify_vtables): New variable vindex_val; `i' is HOST_WIDE_INT. + Use tree_low_cst. + (check_bitfield_decl): Set DECL_SIZE using convert. + (build_base_field): Set DECL_SIZE and DECL_SIZE_UNIT using size_binop. + (layout_virtual_bases): DSIZE is unsigned HOST_WIDE_INT. + Use tree_low_cst. + (finish_struct_1): Use bit_position. + (dump_class_hierarchy): Use tree_low_cst. + * cp-tree.h (min_precision): Add declaration. + * decl.c (xref_tag, xref_basetypes): Use tree_low_cst. + * error.c (dump_type_suffix): Use host_integerp and tree_low_cst. + (dump_expr): Use integer_zerop, host_integerp, and tree_low_cst. + * expr.c (cplus_expand_constant): Use bit_position. + * init.c (build_vec_init): Use host_integerp and tree_low_cst. + * rtti.c (get_base_offset): Use bit_position. + * typeck.c (build_binary_op): Use integer_zerop, compare_tree_int, + host_integerp, and tree_low_cst. + (pointer_int_sum): Use integer_zerop. + (build_component_addr): Use bit_position. + + 2000-03-17 Nathan Sidwell + + * typeck.c (require_complete_type): Don't assume size_zero_node. + (complete_type_or_else): Likewise. + + 2000-03-16 Steven Grady + Jason Merrill + + * rtti.c (build_dynamic_cast_1): Improve diagnostics. + + 2000-03-16 Nathan Sidwell + + * decl2.c (grokfield): Bail out if type is error_mark_node. + + 2000-03-15 Nathan Sidwell + + * tinfo2.cc (__ptr_to_member_data): Rename to ... + (__pointer_to_member_data): ... here. Adjust. + * rtti.c (create_tinfo_types): Adjust. + + 2000-03-15 Nathan Sidwell + + * cp-tree.h (CPTI_REF_DESC_TYPE, ref_desc_type_node): Remove. + * decl.c (ref_desc_type_node): Undocument. + * rtti.c (ptr_ref_initializer): Rename to ... + (ptr_initializer): ... here. Adjust comments. + (ptmd_initializer): Fix comment thinko. + (synthesize_tinfo_var): Remove REFERENCE_TYPE case. + (create_tinfo_types): Remove ref_desc_type_node init. + * tinfo2.cc (__reference_type_info): Remove. + + 2000-03-15 Nathan Sidwell + + * decl.c (cp_finish_decl): Remove obsolete comment. + + * typeck.c (build_ptrmemfunc1): Kill uninitialized warning. + + 2000-03-14 Mark Mitchell + + * cp-tree.h: Tweak documentation. + * class.c (build_vbase_pointer_fields): Layout the fields, too. + (avoid_overlap): Remove. + (get_binfo_offset_as_int): New function. + (dfs_serach_base_offsets): Likewise. + (layout_nonempty_base_or_field): Likewise. + (build_base_field): Layout fields here. Avoid placing two objects + of the same type at the same address, under the new ABI. + (build_base_fields): Adjust accordingly. + (create_vtable_ptr): Return the new field, but don't attach it to + TYPE_FIELDS. + (remove_base_field): Remove. + (remove_base_fields): Remove. + (layout_basetypes): Adjust accordingly. + (layout_class_type): Call layout_field for each field, rather than + just making a wholesale call to layout_type. + + 2000-03-14 Jeff Sturm + + * except.c (expand_throw): Fix typo in _Jv_Sjlj_Throw. + + 2000-03-13 Jason Merrill + + * decl.c (grokfndecl): Set TREE_NOTHROW if TYPE_NOTHROW_P. + + * except.c (dtor_nothrow): New fn. + (do_pop_exception): Use it. Take type parm. + (push_eh_cleanup): Take type parm. + (expand_start_catch_block): Pass it. + (build_eh_type_type_ref): Accept null type. + + 2000-03-12 Mark Mitchell + + * cp-tree.h (revert_static_member_fn): Change prototype. + * decl.c (grokfndecl): Adjust call to revert_static_member_fn. + (grok_op_properties): Likewise. + (start_function): Likewise. + (revert_static_member_fn): Simplify. + * pt.c (check_explicit_specialization): Adjust call to + revert_static_member_fn. + + 2000-03-11 Mark Mitchell + + * cp-tree.h (scope_kind): New type. + (tmpl_spec_kind): Likewise. + (declare_pseudo_global_level): Remove. + (pseudo_global_level_p): Rename to template_parm_scope_p. + (pushlevel): Remove declaration. + (begin_scope): New function. + (finish_scope): Likewise. + (current_tmpl_spec_kind): Likewise. + * decl.c (struct binding_level): Shorten parm_flag to 2 bits. + Shorten keep to 2 bits. Rename pseudo_global to template_parms_p. + Add template_spec_p. + (toplevel_bindings_p): Adjust. + (declare_pseudo_global_level): Remove. + (pseudo_global_level_p): Rename to template_parm_scope_p. + (current_tmpl_spec_kind): New function. + (begin_scope): Likewise. + (finish_scope): Likewise. + (maybe_push_to_top_level): Adjust. + (maybe_process_template_type_declaration): Likewise. + (pushtag): Likewise. + (pushdecl_nonclass_level): Likewise. + (lookup_tag): Likewise. + (grokfndecl): Handle member template specializations. Share + constructor and non-constructor code. + * decl2.c (check_classfn): Handle member template specializations. + * pt.c (begin_template_parm_list): Use begin_scope. + (begin_specialization): Likewise. + (end_specialization): Likewise. + (check_explicit_specialization): Use current_tmpl_spec_kind. + Handle member template specializations. + (end_template_decl): Use finish_scope. Remove call to + get_pending_sizes. + (push_template_decl_real): Remove bogus error message. + (tsubst_decl): Fix typo in code contained in comment. + (instantiate_template): Handle member template specializations. + (most_general_template): Likewise. + + 2000-03-11 Gabriel Dos Reis + + * lex.c (whitespace_cr): Compress consecutive calls to warning(). + (do_identifier): Ditto for error(). + + * pt.c (convert_nontype_argument): Ditto for cp_error(). + (convert_template_argument): Ditto for cp_pedwarn(). + + 2000-03-11 Jason Merrill + + * exception.cc (__check_null_eh_spec): New fn. + * except.c (expand_end_eh_spec): Call it if the spec is throw(). + + 2000-03-10 Jason Merrill + + * decl.c (push_throw_library_fn): Take the FUNCTION_TYPE. + * except.c (expand_end_eh_spec): Add the return type. + * rtti.c (throw_bad_cast): Add the parmtypes. + (throw_bad_typeid): Likewise. + + * semantics.c (expand_stmt): Only leave out rtl for unused + artificials, and set DECL_IGNORED_P on them as well. + * decl.c (wrapup_globals_for_namespace): Likewise. + + 2000-03-09 Nathan Sidwell + + * decl.c (maybe_commonize_var): Skip all artificial decls. + * pt.c (tsubst_decl): Don't copy TREE_ASM_WRITTEN. + + 2000-03-10 Jason Merrill + + * lang-options.h, decl2.c: Add -fno-enforce-eh-specs. + * cp-tree.h: Declare flag_enforce_eh_specs. + * decl.c (store_parm_decls, finish_function): Check it. + + C library functions don't throw. + * Makefile.in (cfns.h): New target. + (except.o): Depend on it. + * Make-lang.in (cc1plus): Depend on cfns.gperf. + * cfns.gperf: New file. + * cfns.h: Generated. + * except.c: Include it. + (nothrow_libfn_p): New fn. + * decl.c (grokfndecl): Use it. + * cp-tree.h: Declare it. + + * decl.c (push_overloaded_decl_1, auto_function, + define_function): Lose. + (build_library_fn_1): New static fn. + (builtin_function): Use it. + (get_atexit_node): Use build_library_fn_ptr. + (build_library_fn, build_cp_library_fn, build_library_fn_ptr, + build_cp_library_fn_ptr, push_library_fn, push_cp_library_fn, + push_void_library_fn, push_throw_library_fn): New fns. + * cp-tree.h: Declare them. + (cp_tree_index): Remove CPTI_BAD_CAST, CPTI_BAD_TYPEID. + (throw_bad_cast_node, throw_bad_typeid_node): Lose. + * except.c (init_exception_processing, call_eh_info, do_pop_exception, + (expand_end_eh_spec, alloc_eh_object, expand_throw): Use above fns. + * rtti.c (build_runtime_decl): Lose. + (throw_bad_cast, throw_bad_typeid, get_tinfo_decl, + build_dynamic_cast_1, expand_si_desc, expand_class_desc, + expand_ptr_desc, expand_attr_desc, expand_generic_desc): Use above fns. + + * call.c (build_call): Remove result_type parm. + Call mark_used on unused artificial fns. + * init.c, method.c, typeck.c, except.c, rtti.c: Adjust. + + 2000-03-09 Jason Merrill + + * call.c (build_call): Set TREE_NOTHROW on the CALL_EXPR as + appropriate. + * decl.c (define_function): Set TREE_NOTHROW on the FUNCTION_DECL. + * except.c (call_eh_info, alloc_eh_object, expand_throw): Set + TREE_NOTHROW or TREE_THIS_VOLATILE on the function as appropriate. + * rtti.c (build_runtime_decl, get_tinfo_decl, build_dynamic_cast_1, + expand_si_desc, expand_class_desc, expand_ptr_desc, expand_attr_desc, + expand_generic_desc): Likewise. + + 2000-03-08 Nathan Sidwell + + * exception.cc (__cp_pop_exception): Cleanup the original object. + + 2000-03-08 Nathan Sidwell + + * decl.c (grok_op_properties): Merge conversion to void warning + with other silly op warnings. + + 2000-03-08 Jason Merrill + + * typeck2.c (process_init_constructor): Set TREE_PURPOSE of + array CONSTRUCTOR elements. Don't use expr_tree_cons. + + 2000-03-08 Nathan Sidwell + + * decl.c (cp_make_fname_decl): New function. + (wrapup_globals_for_namespace): Don't emit unused static vars. + (init_decl_processing): Remove comment about use of + array_domain_type. Set make_fname_decl. + (cp_finish_decl): Remove __FUNCTION__ nadgering. + * semantics.c (begin_compound_stmt): Remove + current_function_name_declared flagging. + (expand_stmt): Don't emit unused local statics. + * typeck.c (decay_conversion): Don't treat __FUNCTION__ decls + specially. + + 2000-03-08 Nathan Sidwell + + * typeck.c (convert_for_assignment): Don't look at array + initializer. + * call.c (convert_like_real): Likewise. + + 2000-03-07 Jason Merrill + + Add initial support for '\uNNNN' specifier. + * lex.c (read_ucs): New fn. + (readescape, skip_white_space): Call it. + (is_extended_char, is_extended_char_1): New fns. + (utf8_extend_token): New fn, #if 0'd out. + (real_yylex): Treat extended chars like letters. + + * search.c (note_debug_info_needed): Walk the bases even if we + weren't deferring the type itself. + + 2000-03-07 Kaveh R. Ghazi + + * decl2.c (finish_objects): Constify a char*. + + * method.c (emit_thunk): Likewise. + + 2000-03-06 Nathan Sidwell + + * typeck.c (dubious_conversion_warnings): Look through + REFERENCE_TYPE. + + 2000-03-06 Richard Kenner + + * class.c (dfs_modify_vtables): I is now unsigned. + (check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int. + (build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT. + * error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned. + * init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT. + * method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned. + * typeck.c (build_binary_op, case TRUNC_DIV_EXPR): + Call integer_all_onesp. + * typeck2.c (process_init_constructor): Use compare_tree_int. + + * lang-specs.h (as): Don't call if -syntax-only. + + 2000-03-06 Mark Mitchell + + * expr.c (cplus_expand_expr, case STMT_EXPR): Don't set + RTL_EXPR_HAS_NO_SCOPE after all. + + 2000-03-05 Mark Mitchell + + * expr.c (cplus_expand_expr, case STMT_EXPR): Use + expand_start_stmt_expr and expand_end_stmt_expr directly. Set + RTL_EXPR_HAS_NO_SCOPE. + + * pt.c (instantiate_decl): Clear TI_PENDING_TEMPLATE_FLAG a little + later. + + * dump.c (dequeue_and_dump): Dump SCOPE_NO_CLEANUPS_P. + + 2000-03-05 Nathan Sidwell + + * call.c (convert_like): Macrofy. + (convert_like_with_context): New macro. + (convert_like_real): Renamed from convert_like. Add calling + context parameters, for diagnostics. Add recursive flag. Call + dubious_conversion_warnings for outer conversion. + (build_user_type_conversion): Use convert_like_with_context. + (build_over_call): Likewise. Don't warn about dubious + conversions here. Adjust convert_default_arg calls. + (convert_default_arg): Add context parameters for diagnostics. + Pass through to convert_like_with_context. + * cp-tree.h (convert_default_arg): Add context parameters. + (dubious_conversion_warnings): Prototype new function. + * typeck.c (convert_arguments): Adjust convert_default_arg call. + (dubious_conversion_warnings): New function, broken + out of convert_for_assignment. + (convert_for_assignment): Adjust. + + 2000-03-03 Jason Merrill + + * decl2.c (key_method): Break out from... + (import_export_vtable, import_export_class): ...here. + + * decl.c (finish_function): Don't mess with flag_keep_inline_functions. + * decl2.c (finish_vtable_vardecl): Don't check decl_function_context. + + * search.c (note_debug_info_needed, dfs_debug_mark, + dfs_debug_unmarkedp): Uncomment. Adjust for new scheme. + * decl2.c (finish_vtable_vardecl): Call note_debug_info_needed. + + 2000-03-03 Nathan Sidwell + + * decl.c (cp_finish_decl): Remove obsolete obstack comments, fix + typos. + + 2000-03-02 Mark Mitchell + + * cp-tree.h (TYPE_NEEDS_DESTRUCTOR): Rename to ... + (TYPE_HAS_NONTRIVIAL_DESTRUCTOR): ... this. + (TYPE_HAS_TRIVIAL_DESTRUCTOR): New macro. + (lang_type): Split gets_new into has_new and has_array_new. + (TYPE_VEC_NEW_USES_COOKIE): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR. + (TYPE_GETS_NEW): Split into ... + (TYPE_HAS_NEW_OPERATOR): ... this, and ... + (TYPE_HAS_ARRAY_NEW_OPERATOR): ... this. + (DECL_ARRAY_DELETE_OPERATOR_P): New macro + (build_op_new_call): Don't declare. + (build_new_1): Likewise. + * call.c (build_op_new_call): Remove. + * class.c (check_bases): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR + instead of TYPE_NEEDS_DESTRUCTOR. + (finish_struct_bits): Likewise. + (add_implicitly_declared_members): Likewise. + (check_field_decl): Likewise. + (check_methods): Set TYPE_VEC_DELETE_TAKES_SIZE here, and set it + correctly under the new ABI. + * decl.c (start_decl_1): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR + instead of TYPE_NEEDS_DESTRUCTOR. + (initialize_local_var): Likewise. + (destroy_local_var): Likewise. + (cp_finish_decl): Likewise. + (register_dtor_fn): Likewise. + (grok_op_properties): Set TYPE_HAS_NEW_OPERATOR and + TYPE_HAS_ARRAY_NEW_OPERATOR, not TYPE_HAS_NEW. Don't set + TYPE_VEC_DELETE_TAKES_SIZE here. + (xref_basetypes): Set TYPE_HAS_NEW_OPERATOR and + TYPE_HAS_ARRAY_NEW_OPERATOR, not TYPE_HAS_NEW. + (store_parm_decls): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR. + (finish_destructor_body): Likewise. + (maybe_build_cleanup_1): Likewise. + * decl2.c (do_static_destruction): Likewise. + * init.c (build_new_1): Make it static. + (perform_member_init): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR. + (expand_cleanup_for_base): Likewise. + (get_cookie_size): New function. + (build_new_1): Handle array-new cookies correctly under the new + ABI. + (build_vec_delete_1): Likewise. + (build_vec_init): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR. + (build_delete): Likewise. + (build_vec_delete): Handle array-new cookies correctly under the new + ABI. + * lex.c (do_identifier): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR. + * pt.c (instantiate_class_template): Set TYPE_HAS_NEW_OPERATOR and + TYPE_HAS_ARRAY_NEW_OPERATOR. + * ptree.c (print_lang_type): Check them. + * search.c (context_for_name_lookup): Fix typo in comment. + (tree_has_any_destructor_p): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR. + * tree.c (break_out_cleanups): Likewise. + (build_cplus_array_test_1): Likewise. + (cp_build_qualified_type_real): Likewise. + * typeck.c (complete_type): Likewise. + + * g++spec.c (lang_specific_driver): Add -fnew-abi at the start of + the command-line, not the end. + + 2000-03-01 Jason Merrill + + * pt.c (instantiate_decl): Clear TI_PENDING_TEMPLATE_FLAG. + + 2000-03-02 Tom Tromey + + * cp-tree.h (build_java_class_ref): Declare. + * init.c (build_java_class_ref): No longer static. + * except.c (expand_throw): Generate a Java-style `throw' if the + thrown object is a "Java" object. + (initialize_handler_parm): Generate a Java-style lookup of + exception info if the caught object is a "Java" object. + (catch_language, catch_language_init): New globals. + (decl_is_java_type): New function. + (expand_start_catch_block): Don't call push_eh_info() or + push_eh_cleanup() when handling a Java-style "catch". Pass Java + class reference to build_catch_block. + + 2000-03-02 Richard Kenner + + * typeck.c (comptypes): Treat sizetype like its language equivalent. + + 2000-03-01 Bernd Schmidt + + * typeck.c (maybe_warn_about_returning_address_of_local): Reorganize + to merge reference/pointer code and fix incorrect warnings. + + 2000-02-29 Jason Merrill + + * search.c (protected_accessible_p): Use context_for_name_lookup. + + * init.c (construct_virtual_bases): Fix thinko. + * typeck.c (expand_ptrmemfunc_cst): Fix thinko. + + 2000-03-01 Martin von Loewis + + * decl.c (current_function_decl): Move to toplev.c. + + 2000-02-29 Nathan Sidwell + + * pt.c (fn_type_unification): Unify return type, whenever + provided. + (get_bindings_real): Only pass return type when necessary. + Remove explicit return type check. + * class.c (resolve_address_of_overloaded_function): Pass desired + return type to fn_type_unification. + + 2000-02-28 Richard Kenner + + * class.c (build_vtbl_or_vbase_field, check_methods): Don't clear + DECL_FIELD_SIZE. + (check_bitfield_decl, check_field_decls): Set DECL_SIZE, not + DECL_FIELD_SIZE. + * rtti.c (expand_class_desc): Likewise. + * cp-tree.h (DECL_INIT_PRIORITY): Use underlying union name. + (THUNK_VCALL_OFFSET): Likewise. + (THUNK_DELTA): Reflect changes in ../tree.h. + + 2000-02-28 Jason Merrill + + * search.c (protected_accessible_p): Also allow the access if + the member is public in DERIVED. Lose TYPE parm. + (friend_accessible_p): Lose TYPE parm. + (accessible_p): Adjust. + + 2000-02-27 Richard Kenner + + * class.c (dfs_build_vtable_offset_vtbl_entries): Don't use size_binop + on things that are not sizes; ssize_binop deleted. + Call size_diffop when appropriate. + (dfs_build_vcall_offset_vtbl_entries): Likewise. + (build_primary_vtable, build_secondary_vtable): Likewise. + (dfs_set_offset_for_unshared_vbases, dfs_modify_vtables): Likewise. + Variable I is HOST_WIDE_INT. + (get_vfield_offset): Pass proper types to size_binop. + (size_extra_vtbl_entries, layout_virtual_bases): Likewise. + (finish_struct_1): Likewise. + (skip_rtti_stuff): Arg N is now pointer to signed. + (layout_class_type): Use size_zero_node. + * cp-tree.h (skip_rtti_stuff): Arg N is pointer to signed. + * cvt.c (cp_convert_to_pointer): Pass proper types to size_binop. + * decl.c (complete_arry_type): Pass proper types to size_binop. + (xref_basetypes): BINFO_OFFSET is sizetype. + * error.c (dump_expr): Don't use size_binop non-sizes. + * expr.c (cplus_expand_constant): Pass proper types to size_binop. + * init.c (construct_virtual_bases): Fix type error. + (build_vec_delete_1): Pass proper type to size_binop and don't + fold result. + * lex.c (cp_make_lang_type): BINFO_OFFSET is sizetype. + * rtti.c (get_base_offset): Pass proper type to size_binop. + * search.c (dfs_find_vbases): Fix type error. + (expand_upcast_fixups): Arg to skip_rtti_stuff is pointer to signed. + (dfs_get_vbase_types): BINFO_OFFSET is sizetype. + * tree.c (debug_binfo): Variable N is signed. + Use HOST_WIDE_INT_PRINT_DEC. + * typeck.c (comptypes): sizetype is same as equivalent integer type. + (c_sizeof, c_sizeof_nowarn, expr_sizeof): Use TYPE_SIZE_UNIT, + size_one_node and size_zero_node. + (c_alignof): Use size_one_node. + (build_component_addr): Pass proper types to size_binop. + (expand_ptrmemfunc_cst): Don't use size_binop on non-sizes. + + 2000-02-26 Jason Merrill + + Implement class scope using-declarations for functions. + * class.c (handle_using_decl): Call add_method for used functions. + Use IDENTIFIER_CLASS_VALUE to check for conflicts. + (add_method): Used functions are hidden by local functions. + (check_bases_and_members): Handle using-decls before finalizing + CLASSTYPE_METHOD_VEC. + * call.c (add_function_candidate): Add ctype parm; if nonzero, + override the type of 'this' accordingly. + (add_template_candidate, add_template_candidate_real): Add ctype parm. + (convert_class_to_reference, build_user_type_conversion_1, + build_new_function_call, build_object_call, build_new_op, + build_new_method_call): Pass ctype parm. + + * search.c (lookup_member): Put rval_binfo, not basetype_path, in + the baselink. + * call.c (convert_class_to_reference, build_user_type_conversion_1, + build_new_function_call, build_object_call, build_new_op, + build_new_method_call, build_op_delete_call): Don't get basetype_path + from a baselink. + * typeck.c (build_component_ref): Likewise. + * init.c (build_offset_ref): Likewise. + (resolve_offset_ref): Don't call enforce_access. + Call build_scoped_ref. + * typeck2.c (build_scoped_ref): Simplify. Do nothing if it + would cause an error or if -pedantic. + * class.c (alter_access): Lose binfo parm. + + 2000-02-26 Mark Mitchell + + * semantics.c (simplify_aggr_init_exprs_p): Don't walk into + types. + + 2000-02-25 Alfred Minarik + + * rtti.c (get_vmi_pseudo_type_info): Move __vmi_class_type_info + pseudo_type_info creation into the std namespace + + 2000-02-26 Mark Mitchell + + * cp-tree.h (DECL_NEEDED_P): Tweak to correct usage before EOF. + (import_export_class): Remove declaration. + * decl2.c (import_export_class): Make it static. + * dump.c (dequeue_and_dump): Handle PREDECREMENT_EXPR, + PREINCREMENT_EXPR, POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, + EXPR_WITH_FILE_LOCATION. + * lex.c (check_newline): Tweak filename/lineno setting. + * semantics.c (begin_while_stmt): Fix typo in comment. + + 2000-02-26 Richard Kenner + + * lang-options.h (-fmessage-length=): Add missing option. + + * Make-lang.in (CXX_SRCS): Add .h files and sort list. + + 2000-02-26 Zack Weinberg + + * Make-lang.in: Delete refs to LIBGCC2_DEPS. + + 2000-02-25 Jim Wilson + + * optimize.c (expand_call_inline): Emit the return label before + evaluating the return value. + + 2000-02-24 Mark Mitchell + + * lex.c (check_newline): Use push_srcloc and pop_srcloc, rather + than duplicating functionality here. + * optimize.c: Include input.h. + (expand_call_inline): Use push_srcloc and pop_srcloc. + * parse.y (maybe_cv_qualifier): Remove calls to emit_line_note. + * parse.c: Regenerated. + * Makefile.in (lex.o): Depend on input.h. + (optimize.o): Likewise. + + 2000-02-24 Nathan Sidwell + + * decl.c (grokdeclarator): Diagnose qualifiers on non-member + function type, rather than ICE. + + 2000-02-23 Jason Merrill + + * decl.c (grokdeclarator): Call decl_type_access_control. + * parse.y (parse_end_decl): Don't call decl_type_access_control if + decl is null. + + 2000-02-23 Nathan Sidwell + + * decl.c (decls_match): Remove obsolete static member nadgering. + + 2000-02-21 Martin v. Löwis + + * decl.c (grokdeclarator): Change ANSI to ISO. + * lex.c (consume_string, readescape, do_identifier): Likewise. + (parse_float, real_yylex): Likewise. + * parse.y (paren_expr_or_null, paren_cond_or_null): Likewise. + (unary_expr, new_initializer, cast_expr, primary, primary_no_id, + new_type_id, maybe_label_decls, simple_stmt, + for.init.statement): Likewise. + * pt.c (do_decl_instantiation, do_type_instantiation): Likewise. + * semantics.c (finish_named_return_value): Likewise. + * parse.c: Regenerate. + + 2000-02-21 Mark Mitchell + + * cp-tree.h (CPTI_VTABLE_INDEX_TYPE): New macro. + (CPTI_CLASS_STAR_TYPE): Remove. + (vtable_index_type): Likewise. + (class_star_type_node): Remove. + (TYPE_PTRMEMFUNC_FN_TYPE): Adjust for the new ABI. + (build_binary_op_nodefault): Remove. + * call.c (build_new_op): Use build_binary_op instead of + build_binary_op_nodefault. + * decl.c (init_decl_processing): Remove class_star_type_node + initialization. Make delta_type_node ptrdiff_type_node under the + new ABI. Initialize vtable_index_type. + (build_ptrmemfunc_type): Build different structures for the new + ABI. + (build_enumerator): Use build_binary_op instead of + build_binary_op_nodefault. + * method.c (build_overload_value): Mangle pointers-to-members + appropriately under the new ABI. + * typeck.c (build_array_ref): Use build_binary_op instead of + build_binary_op_nodefault. + (get_member_function_from_ptrfunc): Adjust for the new ABI. + (build_binary_op_nodefault): Rename to ... + (build_binary_op): ... this. Remove old version. Adjust for + pointer-to-member comparisons under the new ABI. + (build_ptrmemfunc1): Remove dead code. Adjust for the new ABI. + (build_ptrmemfunc): Adjust for the new ABI. + (expand_ptrmemfunc_cst): Likewise. + (delta2_from_ptrmemfunc): Assert that we're not using the new ABI. + (pfn_from_ptrmemfunc): Adjust for the new ABI. + + 2000-02-21 Gabriel Dos Reis + + * call.c (build_object_call): Compress consecutive calls to + cp_error. + (build_conditional_expr): Say 'ISO C++' not 'ANSI C++'. + (build_op_delete_call): Adjust message formatting. + + * class.c (check_bases): Compress consecutive calls to + cp_pedwarn. + (finish_struct_anon): Say 'ISO C++'. + + * decl.c (start_decl): Same here. + (grok_reference_init): Likewise. + (grokfndecl): Correct message formatting. + (grokfndecl): Improve diagnostic. + (check_static_variable_definition): Likewise. Say 'ISO C++' + (compute_array_index_type): Say 'ISO C++' + (create_array_type_for_decl): Compress consecutive calls to + cp_error. + (grokdeclarator): Say 'ISO C++' + (grok_op_properties): Likewise. + + * decl2.c (delete_sanity): Clairify diagnostic. + (check_member_template): Same here. + (grok_function_init): Use consistent terminology. + + * expr.c (do_case): Say 'ISO C++' + + * friend.c (do_friend): Compress consecutive calls to warning. + + 2000-02-20 Mark Mitchell + + * cp-tree.h (merge_primary_and_secondary_vtables_p): New macro. + * class.c (build_secondary_vtable): Reorganize. Don't create a + new vtable under the new ABI. + (layout_vtable_decl): Don't add num_extra_vtbl_entries when + computing the size. + (build_vtbl_initializer): Don't return a CONSTRUCTOR; just return + the initializing elements. + (initialize_vtable): New function. + (dfs_finish_vtbls): Use it. + (dfs_accumulate_vtbl_inits): New function. + (finish_vtbls): Merge primary and secondary vtables under the new + ABI. + (finish_struct_1): Remove redundant call to layout_vtable_decl. + * init.c (expand_virtual_init): Deal with BINFO_VTABLEs that + aren't VAR_DECLs. + + * class.c (build_vtable): New function, split out from ... + (get_vtable_decl): ... here, and ... + (build_secondary_vtable): ... here. + + * pt.c (tsubst_decl): Fix formatting. + + 2000-02-19 Richard Kenner + + * class.c (build_primary_vtable, layout_vtable_decl): Likewise. + (avoid_overlap, build_base_field): Likewise. + (build_base_field, build_base_fields, is_empty_class): + Test DECL_SIZE with integer_zero. + (layout_class_type): Set CLASSTYPE_SIZE_UNIT. + * cp-tree.h (struct lang_type): New field size_unit. + (CLASSTYPE_SIZE_UNIT): New macro. + * decl.c (init_decl_processing): Set DECL_SIZE_UNIT. + (cp_finish_decl): Delete -Wlarger-than processing. + * optimize.c (remap_decl): Walk DECL_SIZE_UNIT. + * pt.c (tsubst_decl): Set DECL_SIZE_UNIT. + * tree.c (make_binfo): binfo vector is one entry longer. + (walk_tree): Walk DECL_SIZE_UNIT. + + 2000-02-19 Mark Mitchell + + * class.c (dfs_build_vcall_offset_vtbl_entries): Fix typo in + comment. + (build_vtable_entry): Don't assume all vtable entries are + functions. + (build_vtbl_initializer): Adjust accordingly. + (get_vtable_decl): Fix formatting. + + 2000-02-18 Jason Merrill + + * semantics.c (deferred_type_access_control): Walk the entire + type_lookups list. + (save_type_access_control): Rename from + initial_deferred_type_access_control. Just remember the value. + (decl_type_access_control): New fn. + (begin_function_definition): Use deferred_type_access_control, after + we've started the function. Set type_lookups to error_mark_node. + * parse.y (frob_specs, fn.def1): Adjust. + (parse_decl0, parse_field, parse_field0, parse_bitfield): New fns. + (parse_end_decl, parse_bitfield0, parse_method): New fns. + (fn.def2, initdcl, initdcl0_innards, nomods_initdcl0): Use them. + (after_type_component_declarator0): Likewise. + (after_type_component_declarator): Likewise. + (notype_component_declarator): Likewise. + * cp-tree.h: Adjust. + + * decl.c (redeclaration_error_message): Allow redeclaration of + namespace-scope decls. + + 2000-02-18 Martin von Loewis + + * typeck2.c (my_friendly_abort): Use GCCBUGURL. + + 2000-02-17 Mark Mitchell + + * class.c (add_method): Don't set DECL_VIRTUAL_CONTEXT. + * decl2.c (grokclassfn): Likewise. + + * ir.texi: Document DECL_TEMPLATE_INSTANTIATIONS. + + * decl2.c (lang_decode_option): Don't set default message length + here. + * lex.c (lang_init_options): Set it here. + + 2000-02-16 Mark Mitchell + + Make DECL_CONTEXT mean the class in which a member function was + declared, even for a virtual function. + * cp-tree.h (DECL_CLASS_CONTEXT): Adjust. + (DECL_FRIEND_CONTEXT): New macro. + (DECL_REAL_CONTEXT): Remove. + (SET_DECL_FRIEND_CONTEXT): Likewise. + (DECL_VIRTUAL_CONTEXT): Adjust. + (DECL_CLASS_SCOPE_P): Use TYPE_P. + (add_friends): Remove. + (hack_decl_function_context): Likewise. + * call.c (build_new_function_call): Replace DECL_REAL_CONTEXT with + CP_DECL_CONTEXT. + (build_over_call): Fix indentation. Use DECL_CONTEXT + instead of DECL_CLASS_CONTEXT. + * class.c (dfs_build_vcall_offset_vtbl_entries): Likewise. + (add_method): Set DECL_VIRTUAL_CONTEXT, not DECL_CLASS_CONTEXT. + (strictly_overrides): Use DECL_CONTEXT, not DECL_CLASS_CONTEXT. + (build_vtbl_or_vbase_field): Don't set DECL_CLASS_CONTEXT. + (build_base_field): Likewise. + (finish_struct_1): Likewise. + (build_self_reference): Likewise. + * decl.c (push_class_binding): Use CP_DECL_CONTEXT, not + DECL_REAL_CONTEXT. + (pushtag): Use decl_function_context, not + hack_decl_function_context. + (decls_match): Use CP_DECL_CONTEXT, not DECL_REAL_CONTEXT. + (duplicate_decls): Use DECL_VIRTUAL_CONTEXT. + (pushdecl): Remove bogus code. + (start_decl): Use DECL_CONTEXT rather than DECL_CLASS_CONTEXT. + (cp_finish_decl): Use CP_DECL_CONTEXT, not DECL_REAL_CONTEXT. + (grokfndecl): Use DECL_CONTEXT, not DECL_CLASS_CONTEXT. + Use decl_function_context, nothack_decl_function_context. + (grokvardecl): Don't set DECL_CLASS_CONTEXT. + (grokdeclarator): Likewise. Use decl_function_context, not + hack_decl_function_context. + (copy_args_p): Document. Don't use DECL_CLASS_CONTEXT. + (start_function): Use DECL_FRIEND_CONTEXT, not + DECL_CLASS_CONTEXT. Use decl_function_context, not + hack_decl_function_context. + (finish_function): Use decl_function_context, not + hack_decl_function_context. + (maybe_retrofit_in_chrg): Use DECL_CONTEXT, not + DECL_CLASS_CONTEXT. + (grokclassfn): Set DECL_VIRTUAL_CONTEXT, not DECL_CONTEXT. + (finish_static_data_member_decl): Don't set DECL_CLASS_CONTEXT. + (grokfield): Likewise. + (finish_builtin_type): Likewise. + (finish_vtable_vardec): Use decl_function_context, not + hack_decl_function_context. + (import_export_decl): Use DECL_CONTEXT, not DECL_CLASS_CONTEXT. + (start_static_initialization_or_destruction): Likewise. + (finish_static_initialization_or_destruction): Likewise. + (mark_used): Adjust logic for deciding when to synthesize methods. + * dump.c (dequeue_and_dump): Use CP_DECL_CONTEXT, not + DECL_REAL_CONTEXT. + * error.c (dump_function_decl): Use DECL_CONTEXT, not + DECL_CLASS_CONTEXT. + * friend.c (is_friend): Likewise. + (add_friends): Remove. + (do_friend): Use SET_DECL_FRIEND_CONTEXT. + * lex.c (begin_definition_of_inclass_inline): Use + decl_function_context, not hack_decl_function_context. + (process_next_inline): Likewise. + (do_identifier): Use CP_DECL_CONTEXT, not DECL_REAL_CONTEXT. + * method.c (set_mangled_name_for_decl): Use DECL_CONTEXT, not + DECL_CLASSS_CONTEXT. + (hack_identifier): Likewise. + (synthesize_method): Use decl_function_context, not + hack_decl_function_context. + * pt.c (template_class_depth_real): Use CP_DECL_CONTEXT, not + DECL_REAL_CONTEXT. + (is_member_template): Use decl_function_context, not + hack_decl_function_context. Use DECL_CONTEXT, not + DECL_CLASS_CONTEXT. + (build_template_decl): Set DECL_VIRTUAL_CONTEXT, not + DECL_CLASS_CONTEXT. + (check_default_tmpl_args): Use CP_DECL_CONTEXT, not + DECL_REAL_CONTEXT. + (push_template_decl_real): Likewise. + (instantiate_class_template): Don't call add_friends. + (tsubst_default_argument): Use DECL_CONTEXT, not + DECL_REAL_CONTEXT. + (tsubst_decl): Set DECL_VIRTUAL_CONTEXT, not DECL_CLASS_CONTEXT. + Use DECL_CONTEXT, not DECL_CLASS_CONTEXT. + (set_meangled_name_for_template_decl): Use DECL_CONTEXT, not + DECL_CLASS_CONTEXT. + * repo.c (repo_inline_used): Likewise. + * search.c (current_scope): Adjust for new _CONTEXT macros. + (context_for_name_lookup): Use CP_DECL_CONTEXT, not + DECL_REAL_CONTEXT. + (friend_accessible_p): Use DECL_CONTEXT, not DECL_CLASS_CONTEXT. + (lookup_fnfields_here):Likewise. + (check_final_overrider): Likewise. + (init_vbase_pointers): Likewise. + (virtual_context): Likewise. + * semantics.c (finish_member_declaration): Just set DECL_CONTEXT. + (expand_body): Use decl_function_context, not + hack_decl_function_context. + * tree.c (hack_decl_function_context): Remove. + * typeck.c (build_x_function_call): Use DECL_CONTEXT, not + DECL_CLASS_CONTEXT. + * typeck2.c (error_not_base_type): Likewise. + + 2000-02-15 Jason Merrill + + * decl.c (xref_tag): Don't SET_IDENTIFIER_NAMESPACE_VALUE. + + 2000-02-16 Kaveh R. Ghazi + + * Make-lang.in (g++spec.o): Depend on $(GCC_H), not gcc.h. + + 2000-02-15 Jonathan Larmour + + * lang-specs.h: Add new __GNUC_PATCHLEVEL__ define to default spec. + + 2000-01-16 Gabriel Dos Reis + + * decl2.c (lang_decode_option): Enable automatic line wrapping. + + 2000-02-13 Jason Merrill + + * parse.y (frob_specs): Split out... + (parse_decl): From here. + (fn.def2): Call initial_deferred_type_access_control. + (after_type_component_declarator0): Call frob_specs. + (notype_component_declarator0): Likewise. + * search.c (friend_accessible_p): Nested classes are friends of their + enclosing classes. + + 2000-02-10 Mark Mitchell + + * ir.texi (ADDR_EXPR): Document the fact that an ADDR_EXPR can be + used to create an implicit temporary. + + * class.c (dfs_modify_vtables): Tweak calculation of functions to + override. + + 2000-02-08 Nathan Sidwell + + * typeck.c (strip_all_pointer_quals): Use TYPE_MAIN_VARIANT, to + strip array element qualifiers too. + + 2000-02-07 Mark Mitchell + + * decl.c (store_parm_decls): Don't build cleanups for parameters + while processing_template_decl. + + 2000-02-07 Jason Merrill + + * cp-tree.h (struct saved_scope): Add incomplete field. + (namespace_scope_incomplete): New macro. + * decl.c (pushdecl): Use it. + (hack_incomplete_structures): Use it. See through artificial + binding levels. + (mark_saved_scope): Mark it. + + Implement access control for nested types. + * search.c (type_access_control): New fn. + (accessible_p): Now we do perform access control for types. + * semantics.c (deferred_type_access_control): New fn. + (initial_deferred_type_access_control): New fn. + (begin_function_definition): Call it. Add lookups parm. + * decl.c (struct binding_level): Add this_class field. + (pushlevel_class): Set it. + (mark_binding_level): Mark it. + (lookup_name_real): Use it. Call type_access_control. + (mark_saved_scope): Mark lookups field. + * cp-tree.h (flagged_type_tree): Add lookups field. + (struct saved_scope): Add lookups field. + (type_lookups): New macro. + * parse.y (declmods): Now . + (parse_decl): Add lookups parm. Call + initial_deferred_type_access_control. + (lang_extdef): Clear type_lookups. + (typed_declspecs, declmods, typespec): Set lookups field. + (initdcl): Call deferred_type_access_control. + (fn.def1, fn.def2, typed_declspecs1, initdcl0_innards, nomods_initdcl0, + component_decl_1, named_parm): Adjust. + * friend.c (is_friend): Nested classes are friends of their + enclosing classes. + + * class.c (currently_open_derived_class): New fn. + * method.c (hack_identifier): Use it. + + * lex.c (do_identifier): Remove obsolete code. + + * parse.y (typed_typespecs): Propagate new_type_flag properly. + + 2000-02-05 Zack Weinberg + + * tinfo.h: Remove apostrophes from C++ comment (xgettext + thinks this file is plain C). + + 2000-02-05 Kaveh R. Ghazi + + * Makefile.in (call.o): Depend on $(EXPR_H). + + * call.c: Include "expr.h". + + * class.c (dump_class_hierarchy): Add prototype. + + * search.c (dfs_get_pure_virtuals): Likewise. + + 2000-02-1 Ulrich Drepper + + * parse.y (simple_stmt): Allow :: token in asm parameter list. + * parse.c: Rebuilt. + + 2000-01-31 Jim Wilson + + * class.c (build_vtbl_or_vbase_field): New parameter fcontext. + Store it in DECL_FCONTEXT. + (build_vbase_pointer_fields, create_vtable_ptr): Fix callers. + + 2000-01-31 Jason Merrill + + * tinfo.h (old abi): #include "tconfig.h". + * tinfo.cc (convert_to_base): Move into old abi section. + + 2000-01-31 Mark Mitchell + + * cp-tree.h (BINFO_VIRTUALS): Tweak documentation. + (CLASSTYPE_PRIMARY_BINFO): Use BINFO_PRIMARY_BINFO. + (BINFO_PRIMARY_BINFO): New macro. + (BF_DELTA): Rename to ... + (BV_DELTA): ... this. + (BF_VCALL_INDEX): Rename to ... + (BV_VCALL_INDEX): ... this. + (BF_FN): Rename to ... + (BV_FN): ... this. + * class.c (build_vbase_path): Adjust for changes to reverse_path. + (set_rtti_entry): Rename BF_ macros to BV_ variants. + (modify_vtable_entry): Simplify. + (add_virtual_function): Rename BF_ macros to BV_ variants. + (build_vtable_initializer): Likewise. + (get_class_offset_1): Remove. + (dfs_get_class_offset): Likewise. + (get_class_offset): Likewise. + (dfs_find_final_overrider): New function. + (find_final_overrider): Likewise. + (modify_one_vtable): Remove. + (dfs_find_base): New function. + (dfs_modify_vtables): Fold modify_one_vtable in here. Use + find_final_overrider. + (modify_all_vtables): Adjust. Set BV_VCALL_INDEX on new + virtuals. + (dfs_fixup_vtable_deltas): Remove. + (override_one_vtable): Remove. + (merge_overrides): Likewise. + (layout_virtual_bases): Make sure BINFO_OFFSET is set right for + unreal chilren of virtual bases. + (finish_struct_1): Don't use merge_overrides. Don't use + dfs_fixup_vtable_deltas. + * tree.c (reverse_path): Return a TREE_LIST, not a chain of + BINFOs. + + 2000-01-31 Herman A.J. ten Brugge + Jason Merrill + + * tinfo.h: Rename USItype to myint32, depend on BITS_PER_UNIT. + + 2000-01-31 Alfred Minarik + + * exception.cc (__throw_bad_typeid): Add missing std::. + + 2000-01-31 Kaveh R. Ghazi + + * cp-tree.h (make_thunk): PROTO -> PARAMS. + + 2000-01-31 Nathan Sidwell + + * cp-tree.h (new_abi_rtti_p): Use flag_new_abi. + + Runtime support for new-abi rtti. + * inc/typeinfo (type_info::operator!=): Define in class. + (type_info::before, type_info::name, type_info::operator==, + type_info::operator!=): Define new ABI implementations. + (type_info::is_pointer_p, type_info::is_function_p): Declare + new virtual functions. + (type_info::do_catch, type_info::do_upcast): Likewise. + + * tinfo.h (__base_class_info): Define new class. + (__class_type_info): Likewise. + (__si_class_type_info): Likewise. + (__vmi_class_type_info): Likewise. + (__dynamic_cast): Prototype. + + * tinfo.cc: Conditionalize old and new rtti mechanisms. + (type_info::is_pointer_p): Define new function. + (type_info::is_function_p): Likewise. + (type_info::do_catch): Likewise. + (type_info::do_upcast): Likewise. + (vtable_prefix): New structure for vtable access. + (adjust_pointer): Define new template function. + (contained_p, public_p, virtual_p, contained_public_p, + contained_nonpublic_p, contained_nonvirtual_p): Define new + functions. + (nonvirtual_base_type): New local variable. + (__class_type_info::~__class_type_info): Define. + (__si_class_type_info::~__si_class_type_info): Likewise. + (__vmi_class_type_info::~__vmi_class_type_info): Likewise. + (__class_type_info::do_catch): Define new function. + (__class_type_info::do_upcast): Likewise. + (__class_type_info::find_public_src): Likewise. + (__class_type_info::do_find_public_src): Likewise. + (__si_class_type_info::do_find_public_src): Likewise. + (__vmi_class_type_info::do_find_public_src): Likewise. + (__class_type_info::do_dyncast): Likewise. + (__si_class_type_info::do_dyncast): Likewise. + (__vmi_class_type_info::do_dyncast): Likewise. + (__class_type_info::do_upcast): Likewise. + (__si_class_type_info::do_upcast): Likewise. + (__vmi_class_type_info::do_upcast): Likewise. + (__dynamic_cast): Likewise. + + * tinfo2.cc (__fundamental_type_info): Define new class. + (__pointer_type_info): Likewise. + (__reference_type_info): Likewise. + (__array_type_info): Likewise. + (__function_type_info): Likewise. + (__enum_type_info): Likewise. + (__ptr_to_member_type_info): Likewise. + (__fundamental_type_info::~__fundamental_type_info): Define. + (__pointer_type_info::~__pointer_type_info): Likewise. + (__reference_type_info::~__reference_type_info): Likewise. + (__array_type_info::~__array_type_info): Likewise. + (__function_type_info::~__function_type_info): Likewise. + (__enum_type_info::~__enum_type_info): Likewise. + (__ptr_to_member_type_info::~__ptr_to_member_type_info): Likewise. + (__pointer_type_info::do_catch): Define new function. + (__ptr_to_member_type_info::do_catch): Define new function. + + (__throw_type_match_rtti_2): Use new ABI interface, if enabled. + (__is_pointer): Likewise. + + * exception.cc (__cplus_type_matcher): Deal with new-abi rtti. + + 2000-01-30 Mark Mitchell + + * cp/class.c (build_vtable): Rename to build_primary_vtable. + (prepare_fresh_vtable): Rename to build_secondary_vtable. + (make_new_vtable): New function. + (modify_vtable_entry): Handle generation of new vtables correctly. + (modify_one_vtable): Remove unused parameter. + (dfs_fixup_vtable_deltas): Likewise. + (override_one_vtable): Use build_secondary_vtable. + (finish_struct_1): Use build_primary_vtable and + build_secondary_vtable. + + 2000-01-28 Ulrich Drepper + + * cp/decl.c: Adjust variable names, comments, help strings. + + 2000-01-29 Nathan Sidwell + + * new2.cc (operator delete[]): Use operator delete, don't assume + implementation. + + 2000-01-29 Nathan Sidwell + + * class.c (build_vtbl_initializer): Add argument to + build_vtable_entry call. + + 2000-01-27 Mark Mitchell + + * cp-tree.def (THUNK_DECL): Discuss vcall indices. + * cp-tree.h (BINFO_VIRTUALS): Update documentation. + (BF_DELTA): New macro. + (BF_VCALL_INDEX): Likewise. + (BF_FN): Likewise. + (THUNK_VCALL_OFFSET): Likewise. + (make_thunk): Change prototype. + * class.c (build_vtable_entry): Integrate + build_vtable_entry_for_fn. Handle vcall indices. + (build_vtable_entry_for_fn): Remove. + (set_rtti_entry): Handle vcall indices. Use BF_DELTA, + BF_VCALL_INDEX, BF_FN. + (modify_vtable_entry): Integrate common code from + modify_one_vtable and dfs_fixup_vtable_deltas. + (add_virtual_function): Set BF_VCALL_INDEX. + (build_vtbl_initializer): Simplify. Use BF_DELTA, BF_VCALL_INDEX, + and BF_FN. + (modify_one_vtable): Simplify. + (dfs_fixup_vtable_deltas): Likewise. + (override_one_vtable): Use BF_DELTA, BF_VCALL_INDEX, BF_FN. + * method.c (make_thunk): Handle vcall indices. + + 2000-01-28 Nathan Sidwell + + Compiler side new abi rtti (not enabled). + * cp-tree.h (new_abi_rtti_p): New macro. + (emit_support_tinfos): Prototype new function. + (tinfo_decl_p): Likewise. + (emit_tinfo_decl): Likwise. + * rtti.c (TINFO_PSEUDO_TYPE, TINFO_VTABLE_DECL): New accessor + macros. + (doing_runtime): New local static. + (init_rtti_processing): Add new-abi initializer. + (get_tinfo_decl): Add new-abi logic. + (tinfo_from_decl): Likewise. + (build_dynamic_cast_1): Likewise. + (qualifier_flags): New static function. + (tinfo_base_init): Likewise. + (generic_initializer): Likewise. + (ptr_ref_initializer): Likewise. + (ptmd_initializer): Likewise. + (class_hint_flags): Likewise. + (class_initializer): Likewise. + (synthesize_tinfo_var): Likewise. + (create_real_tinfo_var): Likewise. + (create_pseudo_type_info): Likewise. + (get_vmi_pseudo_type_info): Likewise. + (create_tinfo_types): Likewise. + (emit_support_tinfos): New global function. + (tinfo_decl_p): New global predicate. + (emit_tinfo_decl): New global function. + * class.c (set_rtti_entry): Generalize for old and new rtti. + (build_vtbl_initializer): Likewise. + * decl2.c (finish_file): Likewise. + + 2000-01-27 Jim Wilson + + * optimize.c (remap_decl): Add walk_tree calls for DECL_SIZE (t) + and TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (t))). + + 2000-01-27 Mike Stump + + * decl.c (pushdecl): Fix up shadow warnings with respect to implicit + for scopes. + + 2000-01-26 Jason Merrill + + * pt.c (unify): Use fold, not maybe_fold_nontype_arg. + + 2000-01-26 J"orn Rennecke + + * optimize.c (calls_setjmp_r): Supply new argument + to special_function_p. + + 2000-01-26 Kaveh R. Ghazi + + * call.c: PROTO -> PARAMS. + * class.c: Likewise. + * cp-tree.h: Likewise. + * cvt.c: Likewise. + * decl.c: Likewise. + * decl.h: Likewise. + * decl2.c: Likewise. + * dump.c: Likewise. + * errfn.c: Likewise. + * error.c: Likewise. + * except.c: Likewise. + * expr.c: Likewise. + * init.c: Likewise. + * input.c: Likewise. + * lex.c: Likewise. + * lex.h: Likewise. + * method.c: Likewise. + * optimize.c: Likewise. + * parse.y: Likewise. + * pt.c: Likewise. + * repo.c: Likewise. + * rtti.c: Likewise. + * search.c: Likewise. + * semantics.c: Likewise. + * spew.c: Likewise. + * tree.c: Likewise. + * typeck.c: Likewise. + * typeck2.c: Likewise. + * xref.c: Likewise. + + 2000-01-25 Richard Henderson + + * typeck.c (build_binary_op_nodefault): Remove UNNE_EXPR. + + 2000-01-25 Mark Mitchell + + * cp-tree.h (vcall_offset_in_vtable_p): New macro. + * class.c (build_vbase_offset_vtbl_entries): Fix typo in commment. + (struct vcall_offset_data_s): New type. + (dfs_vcall_offset_queue_p): New function. + (dfs_build_vcall_offset_vtbl_entries): Likewise. + (build_vcall_offset_vtbl_entries): Likewise. + (layout_vtable_decl): Likewise. + (num_vfun_entries): Likewise. + (num_extra_vtbl_entries): Add the entries for vcall offsets. + (build_vtbl_initializer): Likewise. + (dfs_finish_vtabls): Use layout_vtable_decl. + (modify_one_vtables): Always duplicate vtables under the new ABI. + (finish_struct_1): Use layout_vtable_decl. + + 2000-01-25 Kaveh R. Ghazi + + * decl.c (member_function_or_else): Change third arg from a format + specifier to an `enum overload_flags'. Callers changed. + + 2000-01-25 Gabriel Dos Reis + + * typeck.c (composite_pointer_type, c_sizeof, expr_sizeof, + build_binary_op_nodefault, build_unary_op, build_reinterpret_cast, + build_const_cast, get_delta_difference, check_return_expr): Avoid + ANSI string concatenation usage. + + 2000-01-24 Mark Mitchell + + * class.c (layout_class_type): Put the fields required to make a + class non-empty at the end, not the beginning, of the TYPE_FIELDs + list. + + 2000-01-24 Jason Merrill + + * pt.c (maybe_fold_nontype_arg): Do nothing if we're not in a + template. + + * decl2.c (mark_used): Do instantiate inlines that have been + explicitly instantiated. + + 2000-01-24 Richard Henderson + + * call.c (build_over_call): Use expand_tree_builtin. + * typeck.c (build_function_call_real): Likewise. + (build_binary_op_nodefault): Handle unordered compares. + + 2000-01-24 Nathan Sidwell + + * cp-tree.h (CPTI_BAD_CAST, CPTI_BAD_TYPEID, CPTI_DCAST): New + cp_tree_index values. + (throw_bad_cast_node, throw_bad_typeid_node, dynamic_cast_node): + New global node #defines for them. + * rtti.c (call_void_fn): Replace with ... + (build_runtime_decl): ... new static function. + (throw_bad_cast): Use throw_bad_cast_node and build_runtime_decl. + (throw_bad_typeid): Use throw_bad_typeid_node and build_runtime_decl. + (build_dynamic_cast_1): Always produce correctly typed result. + Explicitly produce type_info addresses. Use dynamic_cast_node. + * exception.cc (__throw_bad_cast): Return `void *'. + (__throw_bad_typeid): Return `const type_info &'. + + 2000-01-24 Nathan Sidwell + + * cp-tree.h (get_vtable_decl): Prototype new function. + * class.c (get_vtable_decl): New function. Broken out from ... + (build_vtable): ... here. Use it. + * decl2.c (finish_vtable_vardecl): Ignore dummy vtables created + by get_vtable_decl. + + 2000-01-24 Nathan Sidwell + + * cp-tree.h (CPTI_TP_DESC_TYPE, CPTI_ACCESS_MODE_TYPE, + CPTI_USER_DESC_TYPE, CPTI_CLASS_DESC_TYPE, CPTI_ATTR_DESC_TYPE, + CPTI_PTMF_DESC_TYPE): Remove cp_tree_index enumerations. + (CPTI_TI_DESC_TYPE, CPTI_REF_DESC_TYPE, CPTI_ARY_DESC_TYPE, + CPTI_ENUM_DESC_TYPE, CPTI_CLASS_DESC_TYPE, CPTI_SI_CLASS_DESC_TYPE, + CPTI_VMI_CLASS_DESC_TYPE, CPTI_BASE_DESC_TYPE): New enumerations. + (CPTI_TINFO_FN_ID, CPTI_TINFO_FN_TYPE): Rename to ... + (CPTI_TINFO_DECL_ID, CPTI_TINFO_DECL_TYPE): ... here. + (CPTI_TINFO_VAR_ID): New enumeration. + (__tp_desc_type_node, __access_mode_type_node, + __bltn_desc_type_node, __user_desc_type_node, + __class_desc_type_node, __ptr_desc_type_node, + __attr_desc_type_node, __func_desc_type_node, + __ptmf_desc_type_node, __ptmd_desc_type_node): Remove #defines. + (ti_desc_type_node, bltn_desc_type_node, ptr_desc_type_node, + ref_desc_type_node, ary_desc_type_node, func_desc_type_node, + enum_desc_type_node, class_desc_type_node, + si_class_desc_type_node, vmi_class_desc_type_node, + ptmd_desc_type_node, base_desc_type_node): New #defines. + (tinfo_fn_id, tinfo_fn_type): Rename to ... + (tinfo_decl_id, tinfo_decl_type): ... here. Adjust. + (tinfo_var_id): New enumeration. + (DECL_TINFO_FN_P): Augment comment. + * decl.c (cp_global_trees): Adjust documentation. + * rtti.c (init_rtti_processing): Adjust for tinfo_decl_id, + tinfo_decl_type and tinfo_var_id. + (get_tinfo_decl_dynamic): Adjust for tinfo_decl_type. + (build_typeid): Remove unused variable. + (get_tinfo_var): Use tinfo_var_id. + (tinfo_name): New static function. + (get_tinfo_decl): Adjust for tinfo_decl_id and tinfo_decl_type. + (tinfo_from_decl): Likewise. + (get_base_offset): New static function, broken out of + expand_class_desc. + (expand_si_desc): Use tinfo_name. + (expand_class_desc): Likewise. Lose local static variable. + Use base_desc_type_node. Use get_base_offset. + (expand_ptr_desc): Use tinfo_name. + (expand_attr_desc): Likewise. + (expand_generic_desc): Likewise. + + * tinfo.cc (__GXX_ABI_VERSION): Test value and existence. + * tinfo.h (__GXX_ABI_VERSION): Test value and existence. + + 2000-01-23 Mark Mitchell + + * cp-tree.h (__eprintf): Remove declaration. + * tree.c (__eprintf): Remove definition. + + 2000-01-23 Zack Weinberg + Mark Mitchell + + * cp-tree.h (CLASSTYPE_MARKED_N, SET_CLASSTYPE_MARKED_N, + CLEAR_CLASSTYPE_MARKED_N): Avoid signed vs. unsigned warnings. + + 2000-01-23 Brad Lucier + + * class.c (dump_class_hierarchy): Print HOST_WIDE_INT properly. + + 2000-01-23 Mark Mitchell + + * cp-tree.h (register_dtor_fn): New function. + * decl.c (destroy_local_static): Rename to ... + (register_dtor_fn): ... this. Give it external linkage. + (expand_static_init): Use it. + * decl2.c (do_static_initialization): Likewise, if using + __cxa_atexit. + (do_static_destruction): Check that __cxa_atexit is not in use. + (finish_file): Don't call do_static_destruction if using + __cxa_atexit. + + * typeck.c (convert_arguments): Restore two-message error + reporting. + + 2000-01-20 Nathan Sidwell + + Remap dynamic cast hint values to be consistent across ABIs. + * search.c (dynamic_cast_base_recurse): Remap generated value. + (get_dynamic_cast_base_type): Adjust documentation. + * tinfo.h (__user_type_info::dyncast): Likewise. + (__user_type_info::find_public_subobj): Remap BOFF meaning. + * tinfo.cc (__si_type_info::do_dyncast): Remap BOFF meaning. + (__class_type_info::do_dyncast): Likewise. + (__class_type_info::do_find_public_subobj): Likewise. + * tinfo2.cc (__dynamic_cast): Remap BOFF parameter. + + 2000-01-19 Gabriel Dos Reis + + * typeck.c (build_unary_op): Use cp_pedwarn, not pedwarn. + + * typeck2.c (incomplete_type_error): Restore previous + cp_error and cp_error_at call sequence. + + 2000-01-20 Brad Lucier + + * class.c (dump_class_hierarchy): Make format agree with argument; + cast pointer to unsigned long and print with %lx. + + 2000-01-19 Gabriel Dos Reis + + * decl2.c (lang_decode_option): Set default line-wrap length to 72. + + * typeck.c (composite_pointer_type, common_type, + comp_target_parms, c_sizeof, expr_sizeof, build_array_ref, + build_function_call_real, convert_arguments, + build_binary_op_nodefault, pointer_int_sum, pointer_diff, + build_unary_op, mark_addressable, build_compound_expr, + build_static_cast, build_reinterpret_cast, build_const_cast, + build_c_cast, build_modify_expr, get_delta_difference, + build_ptrmemfunc, check_return_expr): Replace 'ANSI C++' with + 'ISO C++'. Fusion consecutive calls to diagnostic message routines + into a single one. + * typeck2.c (readonly_error, abstract_virtuals_error, + process_init_constructor, check_for_new_type): Likewise. + + 2000-01-19 Mark Mitchell + + * tree.c (bot_manip): Set DECL_CONTEXT for newly created + VAR_DECLs. + + 2000-01-18 Nathan Sidwell + + * cp-tree.h (get_tinfo_fn_dynamic): Remove prototype. + (build_x_typeid): Likewise. + (get_tinfo_fn): Likewise. + (get_tinfo_fn_unused): Rename to ... + (get_tinfo_decl): ... here. + * rtti.c (build_headof): Replace logic error with assertion. + (get_tinfo_fn_dynamic): Rename to ... + (get_tinfo_decl_dynamic): ... here. Make static. Use + complete_type_or_else. + (build_x_typeid): Move into ... + (build_typeid): ... here. Adjust call to + get_tinfo_decl_dynamic. Use tinfo_from_decl. Simplify + throw_bad_typeid expression. + (get_tinfo_fn_unused): Rename to ... + (get_tinfo_decl): ... here. Adjust comment. + (get_tinfo_fn): Delete. + (tinfo_from_decl): New static function. + (get_typeid_1): Call get_tinfo_decl and tinfo_from_decl. + (get_typeid): Use complete_type_or_else. + (build_dynamic_cast_1): Adjust calls to + get_tinfo_decl_dynamic. Simplify throw_bad_cast expression. + * parse.y (primary): Adjust call to build_typeid. + * except.c (build_eh_type_type_ref): Adjust call to + get_tinfo_decl. Mark as used. + * class.c (set_rtti_entry): Adjust call to get_tinfo_decl. + * decl2.c (build_expr_from_tree): Adjust call to build_typeid. + * parse.c: Regenerated. + + 2000-01-17 Mark Mitchell + + * class.c (fixed_type_or_null): Don't clear NONNULL. Document + calling convention. + (resolves_to_fixed_type_p): Document calling convention. + * rtti.c (build_x_typeid): Initialize NONNULL. + + * cp-tree.h (build_shared_int_cst): New function. + * call.c (build_over_call): Use DECL_VIRTUAL_CONTEXT, for clarity. + * class.c (modify_vtable_entry): Likewise. + (add_virtual_function): Split out code to generated shared + INTEGER_CSTs to build_share_int_cst. + (modify_all_vtables): Handle all the overridden functions here. + Add overridden functions from non-primary virtual bases to the + primary vtable. + (finish_struct_1): Adjust call to modify_all_vtables. Add + overridden functions from non-primary bases to the vtable. + * tree.c (build_shared_int_cst): New function. + + * cp-tree.h (scratchalloc): Remove. + (build_scratch_list): Likewise. + * call.c (convert_class_to_reference): Replace build_scratch_list + and build_expr_list with build_tree_list. + (add_candidate): Replace scratchalloc with expralloc. Note memory + leak. + (build_user_type_conversion_1): Replace build_scratch_list + and build_expr_list with build_tree_list. + (build_new_op): Likewise. + (build_op_delete_call): Likewise. + (convert_like): Likewise. + * cvt.c (ocp_convert): Likewise. + * decl.c (start_decl): Likewise. + (start_function): Likewise. + (finish_destructor_body): Likewise. + (maybe_build_cleanup_1): Likewise. + * decl2.c (reparse_decl_as_expr): Likewise. + * init.c (perform_member_init): Likewise. + (expand_cleanup_for_base): Likewise. + (build_builtin_delete_call): Likewise. + (build_new_1): Likewise. + (build_delete): Likewise. + * method.c (do_build_assign_ref): Likewise. + * parse.y (already_scoped_stmt): Likewise. + (nontrivial_exprlist): Likewise. + (net_initializer): Likewise. + (initlist): Likewise. + * parse.c: Regenerated. + * rtti.c (build_x_typeid): Likewise. + (build_dynamic_cast_1): Likewise. + * typeck.c (build_x_compound_expr): Likewise. + (build_static_cast): Likewise. + (build_modify_expr): Likewise. + + * cp-tree.h (DECL_VINDEX): Add documentation. + * class.c (build_vtable_entry): Likewise. + (start_vtable): Add comment. + (add_virtual_function): Replace pending_hard_virtuals with + overridden_virtuals and pending_virtuals with new_virtuals. + Replace redundant assignments with assertions. + (check_for_override): Add comment. + (check_bases_and_members): Replace pending_hard_virtuals with + overridden_virtuals and pending_virtuals with new_virtuals. + (create_vtbl_ptr): Likewise. + (layout_class_type): Likewise. + (finish_struct_1): Likewise. Add comments. + + 2000-01-16 Mark Mitchell + + * class.c (finish_struct_1): Replace redundant code with + assertions. + + * cp-tree.h (flag_new_abi): Move. + (flag_use_cxa_atexit): Likewise. + (flag_honor_std): Likewise. + (flag_rtti): Likewise. + (vbase_offsets_in_vtable_p): Define. + (vptrs_present_everywhere_p): Likewise. + (TYPE_CONTAINS_VPTR_P): Likewise. + (dfs_walk_real): Declare. + * class.c (build_vbase_pointer_fields): Check + vbase_offsets_in_vtable_p. + (dfs_build_vbase_offset_vtbl_entries): Record the vbase indices in + BINFO_VPTR_FIELD. + (build_vbase_offset_vtbl_entries): Simplify. + (build_vbase_offset_vtbl_entries): Adjust. + (build_vbase_pointer): Add ability to look up vbase offsets in + vtable. + (start_vtable): New function. + (add_virtual_function): Use it. + (determine_primary_base): Use TYPE_CONTAINS_VPTR_P. + (num_extra_vtbl_entries): Use vbase_offsets_in_vtable_p. + (build_vtbl_initializer): Take the type of the complete object as + input. Use it to correctly calculate vbase offsets. + (dfs_finish_vtbls): Pass the complete type to + build_vtbl_initializer. + (check_bases_and_members): Use TYPE_CONTAINS_VPTR_P. + (create_vtable_ptr): Create a vtable even if there are no + new virtual functions, under the new ABI. + (finish_struct_1): Likewise. + (get_vfield_name): Use TYPE_CONTAINS_VPTR_P. + * decl.c (exapnd_static_init): Remove call to + preserve_initializer. + * decl2.c (mark_vtable_entries): Tweak to handle vbase offsets in + vtables. + * init.c (initialize_vtbl_ptrs): Initialize them in pre-order. + (expand_virtual_init): Use vbase_offsets_in_vtable_p. + (construct_virtual_bases): Don't initialize virtual base pointers + under the new ABI. + (build_aggr_init): Clean up comment. + (expand_aggr_init_1): Likewise. + * rtti.c (expand_class_desc): Store the virtual function table + index where the vbase offset lives in the offset field. + * search.c (dfs_walk_real): Make it global. + (dfs_debug_mark): Use TYPE_CONTAINS_VPTR_P. + * tree.c (make_binfo): Don't clear BINFO_VPTR_FIELD. + + * tinfo.h (USItype): Make it signed under the new ABI. + * tinfo.cc (convert_to_base): New function. Encapsulate base + conversion logic here. + (__class_type_info::do_upcast): Use it. + (__class_type_info::do_dyncast): Likewise. + (__class_type_info::do_find_public_subobj): Likewise. + + * init.c (construct_virtual_bases): Don't look up the addresses of + virtual bases at run-time. + + * class.c (build_vbase_pointer): Relocate. + (build_vbase_pointer_fields): Likewise. + (dfs_build_vbase_offset_vtbl_entries): Likewise. + (build_vbase_offset_vtbl_entries): Likewise. + + * decl.c (init_decl_processing): Complain if -fnew-abi + -fno-vtable-thunks is used. + + * decl2.c (lang_decode_option): Don't couple flag_honor_std to + flag_new_abi. + + 2000-01-15 Mark Mitchell + + * cp-tree.h (num_extra_vtbl_entries): New function. + (size_extra_vtbl_entries): Likewise. + (dfs_vtable_path_unmark): Likewise. + (dfs_vtable_path_unmarked_real_bases_queue_p): Likewise. + (dfs_vtable_path_marked_real_bases_queue_p): Likewise. + * class.c (num_extra_vtbl_entries): New function. + (size_extra_vtbl_entries): Likewise. + (dfs_build_vbase_offset_vtbl_entries): New function. + (build_vbase_offset_vtbl_entries): Likewise. + (build_vtbl_initializer): Use it. + (finish_struct_1): Adjust vtable sizes (using + num_extra_vtbl_entries). + * expr.c (cplus_expand_expr): Assert that the DECL_RTL for a + THUNK_DECL is non-NULL before expanding it. + * init.c (expand_virtual_init): Adjust the vtable pointer by + size_extra_vtbl_entries before storing it. + * search.c (get_shared_vase_if_not_primary): Adjust prototype. + Handle TREE_LIST parameters here, not in the dfs_* functions. + (dfs_unmarked_real_bases_queue_p): Adjust. + (dfs_marked_real_bases_queue_p): Likewise. + (dfs_vtable_path_unmarked_real_bases_queue_p): New function. + (dfs_vtable_path_marked_real_bases_queue_p): New function. + (dfs_vtable_path_unmark): Likewise. + + 2000-01-14 Mark Mitchell + + * optimize.c (copy_body_r): Clear the operand three of a + TARGET_EXPR when copying it. + + 2000-01-14 Martin v. Löwis + + * method.c (build_decl_overload_real): Check whether we are in :: + before returning __builtin_new/delete. + + 2000-01-13 Mark Mitchell + + * pt.c (tsubst_friend_function): Improve comment. + (instantiate_decl): Avoid crashing when a "nested" function is + instantiated from the top level. + + * dump.c (dqeueue_and_dump): Dump + DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION. + + 2000-01-13 Kaveh R. Ghazi + + * call.c: If GATHER_STATISTICS, declare `n_build_method_call'. + + 2000-01-13 Nathan Sidwell + + * g++spec.c (lang_specific_driver): Add -fnew-abi if + ENABLE_NEW_GXX_ABI defined. + * Make-lang.in (tinfo.o, tinfo2.o, exception.o, new.o, + opnew.o, opnewnt.o, opvnew.o, opvnewnt.o, opdel.o, opdelnt.o, + opvdel.o, opvdelnt.o): Use GXX_ABI_FLAG switch. + + 2000-01-12 Mark Mitchell + + * decl.c (start_cleanup_fn): Call pushdecl. + + * call.c (convert_class_to_reference): Fix typos. + (build_conditional_expr): Handle errors gracefully. + * class.c (push_nested_class): Likewise. + * cp-tree.h (VAR_FUNCTION_OR_PARM_DECL_CHECK): New macro. + (DECL_THIS_EXTERN): Use it. + (DECL_THIS_STATIC): Likewise. + * cvt.c (convert_to_void): Handle errors gracefully. + (build_expr_type_conversion): Likewise. + * decl.c (maybe_push_decl): Likewise. + (start_decl_1): Likewise. + (require_complete_types_for_parms): Likewise. + * parse.y (structsp): Likewise. + (base_class): Likewise. + * parse.c: Regenerated. + * pt.c (finish_member_template_decl): Likewise. + * typeck.c (decay_conversion): Likewise. + + * cp-tree.h (dfs_skip_vbases): New function. + (find_vbase_instance): Likewise. + * class.c (determine_primary_base): Allow a nearly empty base to + serve as a primary base class under the new ABI. + (get_class_offset_1): Rename to ... + (dfs_get_class_offset): ... this. Simplify. Don't issue error + messages here. + (get_class_offset): Use it. Issue error messages here. + (dfs_modify_vtables): Rely on dfs_unmarked_real_bases_queue_p to + find the right copies of virtual bases. + (fixup_vtable_deltas1): Rename to ... + (dfs_fixup_vtable_deltas): ... this. Adjust to handle virtual + bases as primary bases. + (fixup_vtable_deltas): Remove. + (override_one_vtable): Handle virtual bases as primary bases. + (merge_overrides): Likewise. + (finish_struct_1): Likewise. + (dump_class_hierarchy): Dump primary-ness of bases as well. + * search.c (mark_primary_bases): Use a pre-order traversal to + handle primary virtual bases. + (dfs_skip_vbases): New fiunction. + (expand_upcast_fixups): Adjust to handle primary virtual bases. + (fixup_virtual_upcast_offsets): Likewise. + (fixup_all_virtual_upcast_offsets): Likewise. + (dfs_find_vbase_instances): New function. + (find_vbase_instance): Likewise. + + 2000-01-11 Mumit Khan + + * lex.c (DIR_SEPARATOR): Delete macro. + + 2000-01-12 Gabriel Dos Reis + + * decl2.c (lang_decode_option): Handle automatic line wrapping + option. + + 2000-01-11 Mark Mitchell + + * friend.c (do_friend): Don't resolve scopes when processing + template declarations, even if the qualifying scope doesn't + involve template parameters. + + 2000-01-10 Mark Mitchell + + * class.c (dfs_modify_vtables_queue_p): Remove. + (modify_all_vtables): Use dfs_unmarked_real_bases_queue_p + and dfs_marked_real_bases_queue_p instead of + dfs_modify_vtables_queue_p. + + * class.c (build_vbase_path): Simplify. + (dfs_propagate_binfo_offsets): New function. + (propagate_binfo_offsets): Use it. + (remove_base_field): Simplify. + (dfs_set_offset_for_vbases): Remove. + (dfs_set_offset_for_shared_vbases): New function. + (dfs_set_offset_for_unshared_vbases): Likewise. + (layout_virtual_bases): Use them. + (layout_basetypes): Don't call propagate_binfo_offsets. + * search.c (dfs_get_vbase_types): Clone completely fresh binfos + for the vbases. + + * class.c (build_base_field): New function, split out from ... + (build_base_fields): ... here. Use it. Allocate primary bases + first, under the new ABI. + (get_vtable_entry): Remove. + (remove_base_field): New function, split out from ... + (remove_base_fields): ... here. Adjust since primary bases come + first under the new ABI. + + * cp-tree.h (expand_direct_vtbls_init): Remove declaration. + (initialize_vtbl_ptrs): New function. + (expand_indirect_vtbls_init): Change prototype. + (convert_pointer_to_vbase): Declare. + * init.c (expand_direct_vtbls_init): Remove. + (dfs_initialize_vtbl_ptrs): New function. + (initialize_vtbl_ptrs): Likewise. + (emit_base_init): Use initialize_vtbl_ptrs. + * search.c (convert_pointer_to_vbase): Make it global. + (expand_indirect_vtbls_init): Remove vtable initialization code. + * semantics.c (setup_vtbl_ptr): Use initialize_vtbl_ptrs. + + * class.c (dfs_finish_vtbls): New function. + (finish_vtbls): Use it. + (dump_class_hierarchy): New function. + + * cp-tree.h (BINFO_PRIMARY_MARKED_P): Change definition. + (BINFO_VBASE_PRIMARY_P): New macro. + (BINFO_VIRTUALS): Add to documentation. + (SET_BINFO_PRIMARY_MARKED_P): Remove. + (CLEAR_BINFO_PRIMARY_MARKED_P): Likewise. + (dfs_mark_primary_bases_queue_p): Likewise. + (dfs_unmarked_real_bases_queue_p): New function. + (dfs_marked_real_bases_queue_p): Likewise. + * search.c (dfs_mark_primary_bases): Adjust. + (mark_primary_bases): Likewise. + (get_shared_vbase_if_not_primary): New function. + (dfs_unmarked_real_bases_queue_p): Likewise. + (dfs_marked_real_bases_queue_p): Likewise. + (dfs_get_pure_virtuals): Simplify. + (get_pure_virtuals): Likewise. + + 2000-01-10 Kaveh R. Ghazi + + * lex.c: Include tm_p.h. + + 2000-01-07 Nathan Sidwell + + * lang-specs.h (__GXX_ABI_VERSION): New preprocessor macro. + + 2000-01-06 Jason Merrill + + * decl2.c (comdat_linkage): Don't set DECL_DEFER_OUTPUT. + * pt.c (instantiate_decl): Defer comdat templates that might not be + needed. + + * cp-tree.h (DECL_NEEDED_P): Also true if !DECL_COMDAT. + * decl2.c (finish_vtable_vardecl): Don't check !DECL_COMDAT. + (finish_file): Likewise. + + * decl2.c (import_export_class): Undo 12/14 change. + + * error.c (dump_decl): operator new, not operatornew. + + * class.c (field_decl_cmp): A nontype is "greater" than a type. + * search.c (lookup_field_1): Look for the last field with the + desired name. + + 2000-01-05 Nathan Sidwell + + * decl2.c (lookup_arg_dependent): Deal with FNS not being a + FUNCTION_DECL. + + 2000-01-05 Nathan Sidwell + + * typeck.c (build_static_cast): Don't strip target qualifiers + when casting from a class. + + 2000-01-04 Kaveh R. Ghazi + + * class.c (warn_hidden): Initialize variable `fndecl'. + + 2000-01-03 Ulrich Drepper + + * decl.c (flag_isoc9x): New variable to be able to use code in + c-common.c. For now always zero. + + 2000-01-03 Mark Mitchell + + * cp-tree.h (CLASSTYPE_VBASECLASSES): Improve documentation. + * class.c (layout_basetypes): Don't set BINFO_INHERITANCE_CHAIN + or unshare_base_binfos for virtual bases here. + * search.c (dfs_get_vbase_types): Do it here. + (get_vbase_types): Adjust. + + 2000-01-02 Mark Mitchell + + * cp-tree.h (CLASSTYPE_VFIELDS): Move definition. + (BINFO_PRIMARY_MARKED_P): Use flag 5. + (SET_BINFO_PRIMARY_MARKED_P): Likewise. + (CLEAR_BINFO_PRIMARY_MARKED_P): Likewise. + (unmark_primary_bases): Remove declaration. + (unmarkedp): Declare. + (dfs_vbase_unmark): Likewise. + * class.c (determine_primary_base): Return immediately if there + are no base classes. Call mark_primary_bases here. + (modify_all_direct_vtables): Remove. + (modify_all_indirect_vtables): Remove. + (dfs_modify_vtables_queue_p): New function. + (dfs_modify_vtables): New function. + (modify_all_vtables): Use them. + (build_base_fields): Build FIELD_DECLs for primary virtual base + classes. + (create_vtable_ptr): Don't call determine_primary_base here. + (dfs_mark_primary_bases_and_set_vbase_offsets): Rename to ... + (dfs_set_offset_for_vbases): ... this. + (layout_virtual_bases): Use it. + (layout_class_type): Call determine_primary_base here. + * search.c (unmarkedp): Make it global. + (shared_marked_p): Simplify. + (shared_unmarked_p): Likewise. + (dfs_primary_bases_queue_p): Remove. + (dfs_unmark_primary_bases): Likewise. + (unmark_primary_bases): Likewise. + (mark_primary_bases): Simplify. + (get_pure_virtuals): Don't call mark_primary_bases here. + (dfs_vbase_unmark): New function. + (get_vbase_types): Simplify. + + * class.c (struct base_info): Remove. + (determine_primary_base): Take has_virtual_p rather than a + base_info as input. Don't calculate max_has_virtual. + (finish_struct_bits): Remove max_has_virtual argument. + (create_vtable_ptr): Remove max_has_virtual_p argument. + (layout_virtual_bases): Remove max argument. + (layout_basetypes): Likewise. + (layout_class_type): Remove max_has_virtual_p argument. + (finish_struct_1): Remove max_has_virtual. + + * cp-tree.h (dfs_mark_primary_bases_queue_p): New function. + (layout_basetypes): Remove. + * class.c (propagate_binfo_offsets): Moved here from tree.c. + Update to handle primary virtual bases. + (remove_base_fields): New function, split out from + layout_basetypes. + (dfs_mark_primary_bases_and_set_vbase_offsets): New function. + (layout_virtual_bases): New function, split out from + layout_basetypes. Update to handle primary virtual bases. + (layout_basetypes): Moved here from tree.c. Use + remove_base_fields and layout_virtual_bases. + * search.c (dfs_mark_primary_bases_queue_p): New function. + (mark_primary_bases): Use it. + * tree.c (CEIL): Remove. + (propagate_binfo_offsets): Remove. + (layout_basetypes): Remove. + + 2000-01-01 Mark Mitchell + + * cp-tree.h (CLASSTYPE_N_BASECLASSES): Use BINFO_N_BASETYPES. + (BINFO_PRIMARY_MARKED_P): New macro. + (SET_BINFO_PRIMARY_MARKED_P): Likewise. + (CLEAR_BINFO_PRIMARY_MARKED_P): Likewise. + (mark_primary_bases): New function. + (unmark_primary_bases): Likewise. + * search.c (get_abstract_virtuals_1): Remove. + (dfs_mark_primary_bases): New function. + (mark_primary_bases): Likewise. + (dfs_unmark_primary_bases): Likewise. + (unmark_primary_bases): Likewise. + (dfs_get_pure_virtuals): Likewise. + + 2000-01-01 Mark Mitchell + + * cp-tree.h (skip_rtti_stuff): Adjust prototype. + * class.c (skip_rtti_stuff): Reorganize parameters and return value. + (modify_one_vtable): Adjust. + (fixup_vtable_deltas1): Likewise. + (override_one_vtable): Likewise. + * search.c (get_abstract_virtuals_1): Likewise. + (get_pure_virtuals): Likewise. + (expand_upcast_fixups): Likewise. + * tree.c (debug_binfo): Likewise. + + * class.c (build_vtable): Don't return a value. Don't rebuild + vtables for bases that have already been handled. + (prepare_fresh_vtable): Don't rebuild vtables for bases that have + already been handled. + (modify_one_vtable): Adjust accordingly. + (fixup_vtable_deltas1): Likewise. + (finish_struct_1): Likewise. + + 2000-01-01 Martin v. Löwis + + * call.c (build_new_method_call): Also check destructors. + + See ChangeLog.2 for earlier changes. diff -Nrc3pad gcc-3.3.3/gcc/cp/class.c gcc-3.4.0/gcc/cp/class.c *** gcc-3.3.3/gcc/cp/class.c 2004-01-21 05:52:28.000000000 +0000 --- gcc-3.4.0/gcc/cp/class.c 2004-03-09 07:27:23.000000000 +0000 *************** *** 1,22 **** /* Functions related to building classes and their related objects. Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) ! This file is part of GNU CC. ! GNU CC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ --- 1,22 ---- /* Functions related to building classes and their related objects. Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) ! This file is part of GCC. ! GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ *************** Boston, MA 02111-1307, USA. */ *** 25,39 **** #include "config.h" #include "system.h" #include "tree.h" #include "cp-tree.h" #include "flags.h" #include "rtl.h" #include "output.h" #include "toplev.h" - #include "ggc.h" #include "lex.h" #include "target.h" /* The number of nested classes being processed. If we are not in the scope of any class, this is zero. */ --- 25,41 ---- #include "config.h" #include "system.h" + #include "coretypes.h" + #include "tm.h" #include "tree.h" #include "cp-tree.h" #include "flags.h" #include "rtl.h" #include "output.h" #include "toplev.h" #include "lex.h" #include "target.h" + #include "convert.h" /* The number of nested classes being processed. If we are not in the scope of any class, this is zero. */ *************** typedef struct vtbl_init_data_s *** 93,101 **** } vtbl_init_data; /* The type of a function passed to walk_subobject_offsets. */ ! typedef int (*subobject_offset_fn) PARAMS ((tree, tree, splay_tree)); ! /* The stack itself. This is an dynamically resized array. The number of elements allocated is CURRENT_CLASS_STACK_SIZE. */ static int current_class_stack_size; static class_stack_node_t current_class_stack; --- 95,103 ---- } vtbl_init_data; /* The type of a function passed to walk_subobject_offsets. */ ! typedef int (*subobject_offset_fn) (tree, tree, splay_tree); ! /* The stack itself. This is a dynamically resized array. The number of elements allocated is CURRENT_CLASS_STACK_SIZE. */ static int current_class_stack_size; static class_stack_node_t current_class_stack; *************** static class_stack_node_t current_class_ *** 104,216 **** declaration order. */ varray_type local_classes; ! static tree get_vfield_name PARAMS ((tree)); ! static void finish_struct_anon PARAMS ((tree)); ! static tree get_vtable_name PARAMS ((tree)); ! static tree get_basefndecls PARAMS ((tree, tree)); ! static int build_primary_vtable PARAMS ((tree, tree)); ! static int build_secondary_vtable PARAMS ((tree, tree)); ! static void finish_vtbls PARAMS ((tree)); ! static void modify_vtable_entry PARAMS ((tree, tree, tree, tree, tree *)); ! static tree delete_duplicate_fields_1 PARAMS ((tree, tree)); ! static void delete_duplicate_fields PARAMS ((tree)); ! static void finish_struct_bits PARAMS ((tree)); ! static int alter_access PARAMS ((tree, tree, tree)); ! static void handle_using_decl PARAMS ((tree, tree)); ! static void check_for_override PARAMS ((tree, tree)); ! static tree dfs_modify_vtables PARAMS ((tree, void *)); ! static tree modify_all_vtables PARAMS ((tree, tree)); ! static void determine_primary_base PARAMS ((tree)); ! static void finish_struct_methods PARAMS ((tree)); ! static void maybe_warn_about_overly_private_class PARAMS ((tree)); ! static int field_decl_cmp PARAMS ((const tree *, const tree *)); ! static int method_name_cmp PARAMS ((const tree *, const tree *)); ! static void add_implicitly_declared_members PARAMS ((tree, int, int, int)); ! static tree fixed_type_or_null PARAMS ((tree, int *, int *)); ! static tree resolve_address_of_overloaded_function PARAMS ((tree, tree, ! tsubst_flags_t, ! int, int, tree)); ! static tree build_vtable_entry_ref PARAMS ((tree, tree, tree)); ! static tree build_vtbl_ref_1 PARAMS ((tree, tree)); ! static tree build_vtbl_initializer PARAMS ((tree, tree, tree, tree, int *)); ! static int count_fields PARAMS ((tree)); ! static int add_fields_to_vec PARAMS ((tree, tree, int)); ! static void check_bitfield_decl PARAMS ((tree)); static void check_field_decl (tree, tree, int *, int *, int *, int *); static void check_field_decls (tree, tree *, int *, int *, int *); static tree *build_base_field (record_layout_info, tree, splay_tree, tree *); static void build_base_fields (record_layout_info, splay_tree, tree *); ! static void check_methods PARAMS ((tree)); ! static void remove_zero_width_bit_fields PARAMS ((tree)); ! static void check_bases PARAMS ((tree, int *, int *, int *)); static void check_bases_and_members (tree); static tree create_vtable_ptr (tree, tree *); static void include_empty_classes (record_layout_info); static void layout_class_type (tree, tree *); ! static void fixup_pending_inline PARAMS ((tree)); ! static void fixup_inline_methods PARAMS ((tree)); ! static void set_primary_base PARAMS ((tree, tree)); ! static void propagate_binfo_offsets PARAMS ((tree, tree, tree)); static void layout_virtual_bases (record_layout_info, splay_tree); ! static tree dfs_set_offset_for_unshared_vbases PARAMS ((tree, void *)); ! static void build_vbase_offset_vtbl_entries PARAMS ((tree, vtbl_init_data *)); ! static void add_vcall_offset_vtbl_entries_r PARAMS ((tree, vtbl_init_data *)); ! static void add_vcall_offset_vtbl_entries_1 PARAMS ((tree, vtbl_init_data *)); ! static void build_vcall_offset_vtbl_entries PARAMS ((tree, vtbl_init_data *)); static void add_vcall_offset (tree, tree, vtbl_init_data *); ! static void layout_vtable_decl PARAMS ((tree, int)); ! static tree dfs_find_final_overrider PARAMS ((tree, void *)); ! static tree find_final_overrider PARAMS ((tree, tree, tree)); ! static int make_new_vtable PARAMS ((tree, tree)); ! static int maybe_indent_hierarchy PARAMS ((FILE *, int, int)); ! static void dump_class_hierarchy_r PARAMS ((FILE *, int, tree, tree, int)); ! static void dump_class_hierarchy PARAMS ((tree)); ! static void dump_array PARAMS ((FILE *, tree)); ! static void dump_vtable PARAMS ((tree, tree, tree)); ! static void dump_vtt PARAMS ((tree, tree)); ! static tree build_vtable PARAMS ((tree, tree, tree)); ! static void initialize_vtable PARAMS ((tree, tree)); ! static void initialize_array PARAMS ((tree, tree)); ! static void layout_nonempty_base_or_field PARAMS ((record_layout_info, ! tree, tree, splay_tree)); ! static tree end_of_class PARAMS ((tree, int)); ! static bool layout_empty_base PARAMS ((tree, tree, splay_tree, tree)); ! static void accumulate_vtbl_inits PARAMS ((tree, tree, tree, tree, tree)); ! static tree dfs_accumulate_vtbl_inits PARAMS ((tree, tree, tree, tree, ! tree)); ! static void build_rtti_vtbl_entries PARAMS ((tree, vtbl_init_data *)); ! static void build_vcall_and_vbase_vtbl_entries PARAMS ((tree, ! vtbl_init_data *)); ! static void force_canonical_binfo_r PARAMS ((tree, tree, tree, tree)); ! static void force_canonical_binfo PARAMS ((tree, tree, tree, tree)); ! static tree dfs_unshared_virtual_bases PARAMS ((tree, void *)); ! static void mark_primary_bases PARAMS ((tree)); ! static tree mark_primary_virtual_base PARAMS ((tree, tree)); ! static void clone_constructors_and_destructors PARAMS ((tree)); ! static tree build_clone PARAMS ((tree, tree)); ! static void update_vtable_entry_for_fn PARAMS ((tree, tree, tree, tree *)); ! static tree copy_virtuals PARAMS ((tree)); ! static void build_ctor_vtbl_group PARAMS ((tree, tree)); ! static void build_vtt PARAMS ((tree)); ! static tree binfo_ctor_vtable PARAMS ((tree)); ! static tree *build_vtt_inits PARAMS ((tree, tree, tree *, tree *)); ! static tree dfs_build_secondary_vptr_vtt_inits PARAMS ((tree, void *)); ! static tree dfs_ctor_vtable_bases_queue_p PARAMS ((tree, void *data)); ! static tree dfs_fixup_binfo_vtbls PARAMS ((tree, void *)); ! static tree get_original_base PARAMS ((tree, tree)); ! static tree dfs_get_primary_binfo PARAMS ((tree, void*)); ! static int record_subobject_offset PARAMS ((tree, tree, splay_tree)); ! static int check_subobject_offset PARAMS ((tree, tree, splay_tree)); ! static int walk_subobject_offsets PARAMS ((tree, subobject_offset_fn, ! tree, splay_tree, tree, int)); ! static void record_subobject_offsets PARAMS ((tree, tree, splay_tree, int)); ! static int layout_conflict_p PARAMS ((tree, tree, splay_tree, int)); ! static int splay_tree_compare_integer_csts PARAMS ((splay_tree_key k1, ! splay_tree_key k2)); ! static void warn_about_ambiguous_bases PARAMS ((tree)); ! static bool type_requires_array_cookie PARAMS ((tree)); static bool contains_empty_class_p (tree); - static tree dfs_base_derived_from (tree, void *); static bool base_derived_from (tree, tree); static int empty_base_at_nonzero_offset_p (tree, tree, splay_tree); static tree end_of_base (tree); --- 106,210 ---- declaration order. */ varray_type local_classes; ! static tree get_vfield_name (tree); ! static void finish_struct_anon (tree); ! static tree get_vtable_name (tree); ! static tree get_basefndecls (tree, tree); ! static int build_primary_vtable (tree, tree); ! static int build_secondary_vtable (tree); ! static void finish_vtbls (tree); ! static void modify_vtable_entry (tree, tree, tree, tree, tree *); ! static void finish_struct_bits (tree); ! static int alter_access (tree, tree, tree); ! static void handle_using_decl (tree, tree); ! static void check_for_override (tree, tree); ! static tree dfs_modify_vtables (tree, void *); ! static tree modify_all_vtables (tree, tree); ! static void determine_primary_base (tree); ! static void finish_struct_methods (tree); ! static void maybe_warn_about_overly_private_class (tree); ! static int method_name_cmp (const void *, const void *); ! static int resort_method_name_cmp (const void *, const void *); ! static void add_implicitly_declared_members (tree, int, int, int); ! static tree fixed_type_or_null (tree, int *, int *); ! static tree resolve_address_of_overloaded_function (tree, tree, tsubst_flags_t, ! bool, tree); ! static tree build_vtbl_ref_1 (tree, tree); ! static tree build_vtbl_initializer (tree, tree, tree, tree, int *); ! static int count_fields (tree); ! static int add_fields_to_record_type (tree, struct sorted_fields_type*, int); ! static void check_bitfield_decl (tree); static void check_field_decl (tree, tree, int *, int *, int *, int *); static void check_field_decls (tree, tree *, int *, int *, int *); static tree *build_base_field (record_layout_info, tree, splay_tree, tree *); static void build_base_fields (record_layout_info, splay_tree, tree *); ! static void check_methods (tree); ! static void remove_zero_width_bit_fields (tree); ! static void check_bases (tree, int *, int *, int *); static void check_bases_and_members (tree); static tree create_vtable_ptr (tree, tree *); static void include_empty_classes (record_layout_info); static void layout_class_type (tree, tree *); ! static void fixup_pending_inline (tree); ! static void fixup_inline_methods (tree); ! static void set_primary_base (tree, tree); ! static void propagate_binfo_offsets (tree, tree); static void layout_virtual_bases (record_layout_info, splay_tree); ! static void build_vbase_offset_vtbl_entries (tree, vtbl_init_data *); ! static void add_vcall_offset_vtbl_entries_r (tree, vtbl_init_data *); ! static void add_vcall_offset_vtbl_entries_1 (tree, vtbl_init_data *); ! static void build_vcall_offset_vtbl_entries (tree, vtbl_init_data *); static void add_vcall_offset (tree, tree, vtbl_init_data *); ! static void layout_vtable_decl (tree, int); ! static tree dfs_find_final_overrider (tree, void *); ! static tree dfs_find_final_overrider_post (tree, void *); ! static tree dfs_find_final_overrider_q (tree, int, void *); ! static tree find_final_overrider (tree, tree, tree); ! static int make_new_vtable (tree, tree); ! static int maybe_indent_hierarchy (FILE *, int, int); ! static tree dump_class_hierarchy_r (FILE *, int, tree, tree, int); ! static void dump_class_hierarchy (tree); ! static void dump_class_hierarchy_1 (FILE *, int, tree); ! static void dump_array (FILE *, tree); ! static void dump_vtable (tree, tree, tree); ! static void dump_vtt (tree, tree); ! static void dump_thunk (FILE *, int, tree); ! static tree build_vtable (tree, tree, tree); ! static void initialize_vtable (tree, tree); ! static void initialize_array (tree, tree); ! static void layout_nonempty_base_or_field (record_layout_info, ! tree, tree, splay_tree); ! static tree end_of_class (tree, int); ! static bool layout_empty_base (tree, tree, splay_tree); ! static void accumulate_vtbl_inits (tree, tree, tree, tree, tree); ! static tree dfs_accumulate_vtbl_inits (tree, tree, tree, tree, ! tree); ! static void build_rtti_vtbl_entries (tree, vtbl_init_data *); ! static void build_vcall_and_vbase_vtbl_entries (tree, ! vtbl_init_data *); ! static void mark_primary_bases (tree); ! static void clone_constructors_and_destructors (tree); ! static tree build_clone (tree, tree); ! static void update_vtable_entry_for_fn (tree, tree, tree, tree *, unsigned); ! static tree copy_virtuals (tree); ! static void build_ctor_vtbl_group (tree, tree); ! static void build_vtt (tree); ! static tree binfo_ctor_vtable (tree); ! static tree *build_vtt_inits (tree, tree, tree *, tree *); ! static tree dfs_build_secondary_vptr_vtt_inits (tree, void *); ! static tree dfs_ctor_vtable_bases_queue_p (tree, int, void *data); ! static tree dfs_fixup_binfo_vtbls (tree, void *); ! static int record_subobject_offset (tree, tree, splay_tree); ! static int check_subobject_offset (tree, tree, splay_tree); ! static int walk_subobject_offsets (tree, subobject_offset_fn, ! tree, splay_tree, tree, int); ! static void record_subobject_offsets (tree, tree, splay_tree, int); ! static int layout_conflict_p (tree, tree, splay_tree, int); ! static int splay_tree_compare_integer_csts (splay_tree_key k1, ! splay_tree_key k2); ! static void warn_about_ambiguous_bases (tree); ! static bool type_requires_array_cookie (tree); static bool contains_empty_class_p (tree); static bool base_derived_from (tree, tree); static int empty_base_at_nonzero_offset_p (tree, tree, splay_tree); static tree end_of_base (tree); *************** int n_vtable_searches = 0; *** 231,237 **** int n_vtable_elems = 0; int n_convert_harshness = 0; int n_compute_conversion_costs = 0; - int n_build_method_call = 0; int n_inner_fields_searched = 0; #endif --- 225,230 ---- *************** int n_inner_fields_searched = 0; *** 246,256 **** from EXPR. */ tree ! build_base_path (code, expr, binfo, nonnull) ! enum tree_code code; ! tree expr; ! tree binfo; ! int nonnull; { tree v_binfo = NULL_TREE; tree d_binfo = NULL_TREE; --- 239,248 ---- from EXPR. */ tree ! build_base_path (enum tree_code code, ! tree expr, ! tree binfo, ! int nonnull) { tree v_binfo = NULL_TREE; tree d_binfo = NULL_TREE; *************** build_base_path (code, expr, binfo, nonn *** 313,322 **** { /* In a base member initializer, we cannot rely on the vtable being set up. We have to use the vtt_parm. */ ! tree derived = v_binfo; ! ! while (BINFO_INHERITANCE_CHAIN (derived)) ! derived = BINFO_INHERITANCE_CHAIN (derived); v_offset = build (PLUS_EXPR, TREE_TYPE (current_vtt_parm), current_vtt_parm, BINFO_VPTR_INDEX (derived)); --- 305,311 ---- { /* In a base member initializer, we cannot rely on the vtable being set up. We have to use the vtt_parm. */ ! tree derived = BINFO_INHERITANCE_CHAIN (v_binfo); v_offset = build (PLUS_EXPR, TREE_TYPE (current_vtt_parm), current_vtt_parm, BINFO_VPTR_INDEX (derived)); *************** build_base_path (code, expr, binfo, nonn *** 324,346 **** v_offset = build1 (INDIRECT_REF, TREE_TYPE (TYPE_VFIELD (BINFO_TYPE (derived))), v_offset); } else v_offset = build_vfield_ref (build_indirect_ref (expr, NULL), TREE_TYPE (TREE_TYPE (expr))); - v_binfo = binfo_for_vbase (BINFO_TYPE (v_binfo), BINFO_TYPE (d_binfo)); - v_offset = build (PLUS_EXPR, TREE_TYPE (v_offset), v_offset, BINFO_VPTR_FIELD (v_binfo)); v_offset = build1 (NOP_EXPR, build_pointer_type (ptrdiff_type_node), v_offset); v_offset = build_indirect_ref (v_offset, NULL); - TREE_CONSTANT (v_offset) = 1; ! offset = cp_convert (ptrdiff_type_node, ! size_diffop (offset, BINFO_OFFSET (v_binfo))); if (!integer_zerop (offset)) v_offset = build (code, ptrdiff_type_node, v_offset, offset); --- 313,334 ---- v_offset = build1 (INDIRECT_REF, TREE_TYPE (TYPE_VFIELD (BINFO_TYPE (derived))), v_offset); + } else v_offset = build_vfield_ref (build_indirect_ref (expr, NULL), TREE_TYPE (TREE_TYPE (expr))); v_offset = build (PLUS_EXPR, TREE_TYPE (v_offset), v_offset, BINFO_VPTR_FIELD (v_binfo)); v_offset = build1 (NOP_EXPR, build_pointer_type (ptrdiff_type_node), v_offset); v_offset = build_indirect_ref (v_offset, NULL); ! offset = convert_to_integer (ptrdiff_type_node, ! size_diffop (offset, ! BINFO_OFFSET (v_binfo))); if (!integer_zerop (offset)) v_offset = build (code, ptrdiff_type_node, v_offset, offset); *************** convert_to_base_statically (tree expr, t *** 430,472 **** } - /* Virtual function things. */ - - static tree - build_vtable_entry_ref (array_ref, instance, idx) - tree array_ref, instance, idx; - { - tree i, i2, vtable, first_fn, basetype; - - basetype = TREE_TYPE (instance); - if (TREE_CODE (basetype) == REFERENCE_TYPE) - basetype = TREE_TYPE (basetype); - - vtable = get_vtbl_decl_for_binfo (TYPE_BINFO (basetype)); - first_fn = TYPE_BINFO_VTABLE (basetype); - - i = fold (build_array_ref (first_fn, idx)); - i = fold (build_c_cast (ptrdiff_type_node, - build_unary_op (ADDR_EXPR, i, 0))); - i2 = fold (build_array_ref (vtable, build_int_2 (0,0))); - i2 = fold (build_c_cast (ptrdiff_type_node, - build_unary_op (ADDR_EXPR, i2, 0))); - i = fold (cp_build_binary_op (MINUS_EXPR, i, i2)); - - if (TREE_CODE (i) != INTEGER_CST) - abort (); - - return build (VTABLE_REF, TREE_TYPE (array_ref), array_ref, vtable, i); - } - /* Given an object INSTANCE, return an expression which yields the vtable element corresponding to INDEX. There are many special cases for INSTANCE which we take care of here, mainly to avoid creating extra tree nodes when we don't have to. */ static tree ! build_vtbl_ref_1 (instance, idx) ! tree instance, idx; { tree aref; tree vtbl = NULL_TREE; --- 418,430 ---- } /* Given an object INSTANCE, return an expression which yields the vtable element corresponding to INDEX. There are many special cases for INSTANCE which we take care of here, mainly to avoid creating extra tree nodes when we don't have to. */ static tree ! build_vtbl_ref_1 (tree instance, tree idx) { tree aref; tree vtbl = NULL_TREE; *************** build_vtbl_ref_1 (instance, idx) *** 477,485 **** int cdtorp = 0; tree fixed_type = fixed_type_or_null (instance, NULL, &cdtorp); ! tree basetype = TREE_TYPE (instance); ! if (TREE_CODE (basetype) == REFERENCE_TYPE) ! basetype = TREE_TYPE (basetype); if (fixed_type && !cdtorp) { --- 435,441 ---- int cdtorp = 0; tree fixed_type = fixed_type_or_null (instance, NULL, &cdtorp); ! tree basetype = non_reference (TREE_TYPE (instance)); if (fixed_type && !cdtorp) { *************** build_vtbl_ref_1 (instance, idx) *** 490,516 **** } if (!vtbl) ! { ! vtbl = build_vfield_ref (instance, basetype); ! } ! assemble_external (vtbl); aref = build_array_ref (vtbl, idx); - TREE_CONSTANT (aref) |= TREE_CONSTANT (vtbl) && TREE_CONSTANT (idx); return aref; } tree ! build_vtbl_ref (instance, idx) ! tree instance, idx; { tree aref = build_vtbl_ref_1 (instance, idx); - if (flag_vtable_gc) - aref = build_vtable_entry_ref (aref, instance, idx); - return aref; } --- 446,465 ---- } if (!vtbl) ! vtbl = build_vfield_ref (instance, basetype); ! assemble_external (vtbl); aref = build_array_ref (vtbl, idx); return aref; } tree ! build_vtbl_ref (tree instance, tree idx) { tree aref = build_vtbl_ref_1 (instance, idx); return aref; } *************** build_vtbl_ref (instance, idx) *** 518,525 **** function pointer corresponding to vtable element INDEX. */ tree ! build_vfn_ref (instance, idx) ! tree instance, idx; { tree aref = build_vtbl_ref_1 (instance, idx); --- 467,473 ---- function pointer corresponding to vtable element INDEX. */ tree ! build_vfn_ref (tree instance, tree idx) { tree aref = build_vtbl_ref_1 (instance, idx); *************** build_vfn_ref (instance, idx) *** 529,537 **** aref = build1 (NOP_EXPR, TREE_TYPE (aref), build_unary_op (ADDR_EXPR, aref, /*noconvert=*/1)); - if (flag_vtable_gc) - aref = build_vtable_entry_ref (aref, instance, idx); - return aref; } --- 477,482 ---- *************** build_vfn_ref (instance, idx) *** 539,546 **** for the given TYPE. */ static tree ! get_vtable_name (type) ! tree type; { return mangle_vtbl_for_type (type); } --- 484,490 ---- for the given TYPE. */ static tree ! get_vtable_name (tree type) { return mangle_vtbl_for_type (type); } *************** get_vtable_name (type) *** 549,556 **** for TYPE. */ tree ! get_vtt_name (type) ! tree type; { return mangle_vtt_for_type (type); } --- 493,499 ---- for TYPE. */ tree ! get_vtt_name (tree type) { return mangle_vtt_for_type (type); } *************** get_vtt_name (type) *** 560,569 **** Use NAME for the name of the vtable, and VTABLE_TYPE for its type. */ static tree ! build_vtable (class_type, name, vtable_type) ! tree class_type; ! tree name; ! tree vtable_type; { tree decl; --- 503,509 ---- Use NAME for the name of the vtable, and VTABLE_TYPE for its type. */ static tree ! build_vtable (tree class_type, tree name, tree vtable_type) { tree decl; *************** build_vtable (class_type, name, vtable_t *** 577,582 **** --- 517,528 ---- TREE_READONLY (decl) = 1; DECL_VIRTUAL_P (decl) = 1; DECL_ALIGN (decl) = TARGET_VTABLE_ENTRY_ALIGN; + DECL_VTABLE_OR_VTT_P (decl) = 1; + + /* At one time the vtable info was grabbed 2 words at a time. This + fails on sparc unless you have 8-byte alignment. (tiemann) */ + DECL_ALIGN (decl) = MAX (TYPE_ALIGN (double_type_node), + DECL_ALIGN (decl)); import_export_vtable (decl, class_type, 0); *************** build_vtable (class_type, name, vtable_t *** 590,612 **** which are known to exist in the runtime. */ tree ! get_vtable_decl (type, complete) ! tree type; ! int complete; { tree decl; if (CLASSTYPE_VTABLES (type)) return CLASSTYPE_VTABLES (type); ! decl = build_vtable (type, get_vtable_name (type), void_type_node); CLASSTYPE_VTABLES (type) = decl; - /* At one time the vtable info was grabbed 2 words at a time. This - fails on sparc unless you have 8-byte alignment. (tiemann) */ - DECL_ALIGN (decl) = MAX (TYPE_ALIGN (double_type_node), - DECL_ALIGN (decl)); - if (complete) { DECL_EXTERNAL (decl) = 1; --- 536,551 ---- which are known to exist in the runtime. */ tree ! get_vtable_decl (tree type, int complete) { tree decl; if (CLASSTYPE_VTABLES (type)) return CLASSTYPE_VTABLES (type); ! decl = build_vtable (type, get_vtable_name (type), vtbl_type_node); CLASSTYPE_VTABLES (type) = decl; if (complete) { DECL_EXTERNAL (decl) = 1; *************** get_vtable_decl (type, complete) *** 620,627 **** BV_VCALL_INDEX for each entry is cleared. */ static tree ! copy_virtuals (binfo) ! tree binfo; { tree copies; tree t; --- 559,565 ---- BV_VCALL_INDEX for each entry is cleared. */ static tree ! copy_virtuals (tree binfo) { tree copies; tree t; *************** copy_virtuals (binfo) *** 640,647 **** created. */ static int ! build_primary_vtable (binfo, type) ! tree binfo, type; { tree decl; tree virtuals; --- 578,584 ---- created. */ static int ! build_primary_vtable (tree binfo, tree type) { tree decl; tree virtuals; *************** build_primary_vtable (binfo, type) *** 650,656 **** if (binfo) { ! if (BINFO_NEW_VTABLE_MARKED (binfo, type)) /* We have already created a vtable for this base, so there's no need to do it again. */ return 0; --- 587,593 ---- if (binfo) { ! if (BINFO_NEW_VTABLE_MARKED (binfo)) /* We have already created a vtable for this base, so there's no need to do it again. */ return 0; *************** build_primary_vtable (binfo, type) *** 662,669 **** } else { ! my_friendly_assert (TREE_CODE (TREE_TYPE (decl)) == VOID_TYPE, ! 20000118); virtuals = NULL_TREE; } --- 599,605 ---- } else { ! my_friendly_assert (TREE_TYPE (decl) == vtbl_type_node, 20000118); virtuals = NULL_TREE; } *************** build_primary_vtable (binfo, type) *** 676,682 **** on our first approximation. */ TYPE_BINFO_VTABLE (type) = decl; TYPE_BINFO_VIRTUALS (type) = virtuals; ! SET_BINFO_NEW_VTABLE_MARKED (TYPE_BINFO (type), type); return 1; } --- 612,618 ---- on our first approximation. */ TYPE_BINFO_VTABLE (type) = decl; TYPE_BINFO_VIRTUALS (type) = virtuals; ! SET_BINFO_NEW_VTABLE_MARKED (TYPE_BINFO (type)); return 1; } *************** build_primary_vtable (binfo, type) *** 695,713 **** can result. */ static int ! build_secondary_vtable (binfo, for_type) ! tree binfo, for_type; { ! my_friendly_assert (binfo == CANONICAL_BINFO (binfo, for_type), 20010605); ! ! if (BINFO_NEW_VTABLE_MARKED (binfo, for_type)) /* We already created a vtable for this base. There's no need to do it again. */ return 0; /* Remember that we've created a vtable for this BINFO, so that we don't try to do so again. */ ! SET_BINFO_NEW_VTABLE_MARKED (binfo, for_type); /* Make fresh virtual list, so we can smash it later. */ BINFO_VIRTUALS (binfo) = copy_virtuals (binfo); --- 631,646 ---- can result. */ static int ! build_secondary_vtable (tree binfo) { ! if (BINFO_NEW_VTABLE_MARKED (binfo)) /* We already created a vtable for this base. There's no need to do it again. */ return 0; /* Remember that we've created a vtable for this BINFO, so that we don't try to do so again. */ ! SET_BINFO_NEW_VTABLE_MARKED (binfo); /* Make fresh virtual list, so we can smash it later. */ BINFO_VIRTUALS (binfo) = copy_virtuals (binfo); *************** build_secondary_vtable (binfo, for_type) *** 722,730 **** T. Return nonzero if we actually created a new vtable. */ static int ! make_new_vtable (t, binfo) ! tree t; ! tree binfo; { if (binfo == TYPE_BINFO (t)) /* In this case, it is *type*'s vtable we are modifying. We start --- 655,661 ---- T. Return nonzero if we actually created a new vtable. */ static int ! make_new_vtable (tree t, tree binfo) { if (binfo == TYPE_BINFO (t)) /* In this case, it is *type*'s vtable we are modifying. We start *************** make_new_vtable (t, binfo) *** 739,745 **** we will fill in all the virtual functions that override the virtual functions in these base classes which are not defined by the current type. */ ! return build_secondary_vtable (binfo, t); } /* Make *VIRTUALS, an entry on the BINFO_VIRTUALS list for BINFO --- 670,676 ---- we will fill in all the virtual functions that override the virtual functions in these base classes which are not defined by the current type. */ ! return build_secondary_vtable (binfo); } /* Make *VIRTUALS, an entry on the BINFO_VIRTUALS list for BINFO *************** make_new_vtable (t, binfo) *** 749,760 **** the function is actually called. */ static void ! modify_vtable_entry (t, binfo, fndecl, delta, virtuals) ! tree t; ! tree binfo; ! tree fndecl; ! tree delta; ! tree *virtuals; { tree v; --- 680,690 ---- the function is actually called. */ static void ! modify_vtable_entry (tree t, ! tree binfo, ! tree fndecl, ! tree delta, ! tree *virtuals) { tree v; *************** modify_vtable_entry (t, binfo, fndecl, d *** 763,770 **** if (fndecl != BV_FN (v) || !tree_int_cst_equal (delta, BV_DELTA (v))) { - tree base_fndecl; - /* We need a new vtable for BINFO. */ if (make_new_vtable (t, binfo)) { --- 693,698 ---- *************** modify_vtable_entry (t, binfo, fndecl, d *** 777,783 **** v = *virtuals; } - base_fndecl = BV_FN (v); BV_DELTA (v) = delta; BV_VCALL_INDEX (v) = NULL_TREE; BV_FN (v) = fndecl; --- 705,710 ---- *************** modify_vtable_entry (t, binfo, fndecl, d *** 791,807 **** add the method for improved error recovery.) */ void ! add_method (type, method, error_p) ! tree type; ! tree method; ! int error_p; { ! int using = (DECL_CONTEXT (method) != type); int len; int slot; tree method_vec; ! int template_conv_p = (TREE_CODE (method) == TEMPLATE_DECL ! && DECL_TEMPLATE_CONV_FN_P (method)); if (!CLASSTYPE_METHOD_VEC (type)) /* Make a new method vector. We start with 8 entries. We must --- 718,737 ---- add the method for improved error recovery.) */ void ! add_method (tree type, tree method, int error_p) { ! int using; int len; int slot; tree method_vec; ! int template_conv_p; ! ! if (method == error_mark_node) ! return; ! ! using = (DECL_CONTEXT (method) != type); ! template_conv_p = (TREE_CODE (method) == TEMPLATE_DECL ! && DECL_TEMPLATE_CONV_FN_P (method)); if (!CLASSTYPE_METHOD_VEC (type)) /* Make a new method vector. We start with 8 entries. We must *************** add_method (type, method, error_p) *** 823,829 **** if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (method)) slot = CLASSTYPE_CONSTRUCTOR_SLOT; else if (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (method)) ! slot = CLASSTYPE_DESTRUCTOR_SLOT; else { int have_template_convs_p = 0; --- 753,768 ---- if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (method)) slot = CLASSTYPE_CONSTRUCTOR_SLOT; else if (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (method)) ! { ! slot = CLASSTYPE_DESTRUCTOR_SLOT; ! TYPE_HAS_DESTRUCTOR (type) = 1; ! ! if (TYPE_FOR_JAVA (type)) ! error (DECL_ARTIFICIAL (method) ! ? "Java class '%T' cannot have an implicit non-trivial destructor" ! : "Java class '%T' cannot have a destructor", ! DECL_CONTEXT (method)); ! } else { int have_template_convs_p = 0; *************** add_method (type, method, error_p) *** 925,931 **** } } ! if (template_class_depth (type)) /* TYPE is a template class. Don't issue any errors now; wait until instantiation time to complain. */ ; --- 864,870 ---- } } ! if (processing_template_decl) /* TYPE is a template class. Don't issue any errors now; wait until instantiation time to complain. */ ; *************** add_method (type, method, error_p) *** 990,996 **** else { cp_error_at ("`%#D' and `%#D' cannot be overloaded", ! method, fn, method); /* We don't call duplicate_decls here to merge the declarations because that will confuse --- 929,935 ---- else { cp_error_at ("`%#D' and `%#D' cannot be overloaded", ! method, fn); /* We don't call duplicate_decls here to merge the declarations because that will confuse *************** add_method (type, method, error_p) *** 1016,1139 **** /* Subroutines of finish_struct. */ - /* Look through the list of fields for this struct, deleting - duplicates as we go. This must be recursive to handle - anonymous unions. - - FIELD is the field which may not appear anywhere in FIELDS. - FIELD_PTR, if non-null, is the starting point at which - chained deletions may take place. - The value returned is the first acceptable entry found - in FIELDS. - - Note that anonymous fields which are not of UNION_TYPE are - not duplicates, they are just anonymous fields. This happens - when we have unnamed bitfields, for example. */ - - static tree - delete_duplicate_fields_1 (field, fields) - tree field, fields; - { - tree x; - tree prev = 0; - if (DECL_NAME (field) == 0) - { - if (! ANON_AGGR_TYPE_P (TREE_TYPE (field))) - return fields; - - for (x = TYPE_FIELDS (TREE_TYPE (field)); x; x = TREE_CHAIN (x)) - fields = delete_duplicate_fields_1 (x, fields); - return fields; - } - else - { - for (x = fields; x; prev = x, x = TREE_CHAIN (x)) - { - if (DECL_NAME (x) == 0) - { - if (! ANON_AGGR_TYPE_P (TREE_TYPE (x))) - continue; - TYPE_FIELDS (TREE_TYPE (x)) - = delete_duplicate_fields_1 (field, TYPE_FIELDS (TREE_TYPE (x))); - if (TYPE_FIELDS (TREE_TYPE (x)) == 0) - { - if (prev == 0) - fields = TREE_CHAIN (fields); - else - TREE_CHAIN (prev) = TREE_CHAIN (x); - } - } - else if (TREE_CODE (field) == USING_DECL) - /* A using declaration is allowed to appear more than - once. We'll prune these from the field list later, and - handle_using_decl will complain about invalid multiple - uses. */ - ; - else if (DECL_NAME (field) == DECL_NAME (x)) - { - if (TREE_CODE (field) == CONST_DECL - && TREE_CODE (x) == CONST_DECL) - cp_error_at ("duplicate enum value `%D'", x); - else if (TREE_CODE (field) == CONST_DECL - || TREE_CODE (x) == CONST_DECL) - cp_error_at ("duplicate field `%D' (as enum and non-enum)", - x); - else if (DECL_DECLARES_TYPE_P (field) - && DECL_DECLARES_TYPE_P (x)) - { - if (same_type_p (TREE_TYPE (field), TREE_TYPE (x))) - continue; - cp_error_at ("duplicate nested type `%D'", x); - } - else if (DECL_DECLARES_TYPE_P (field) - || DECL_DECLARES_TYPE_P (x)) - { - /* Hide tag decls. */ - if ((TREE_CODE (field) == TYPE_DECL - && DECL_ARTIFICIAL (field)) - || (TREE_CODE (x) == TYPE_DECL - && DECL_ARTIFICIAL (x))) - continue; - cp_error_at ("duplicate field `%D' (as type and non-type)", - x); - } - else - cp_error_at ("duplicate member `%D'", x); - if (prev == 0) - fields = TREE_CHAIN (fields); - else - TREE_CHAIN (prev) = TREE_CHAIN (x); - } - } - } - return fields; - } - - static void - delete_duplicate_fields (fields) - tree fields; - { - tree x; - for (x = fields; x && TREE_CHAIN (x); x = TREE_CHAIN (x)) - TREE_CHAIN (x) = delete_duplicate_fields_1 (x, TREE_CHAIN (x)); - } - /* Change the access of FDECL to ACCESS in T. Return 1 if change was legit, otherwise return 0. */ static int ! alter_access (t, fdecl, access) ! tree t; ! tree fdecl; ! tree access; { tree elem; if (!DECL_LANG_SPECIFIC (fdecl)) retrofit_lang_decl (fdecl); ! if (DECL_DISCRIMINATOR_P (fdecl)) ! abort (); elem = purpose_member (t, DECL_ACCESS (fdecl)); if (elem) --- 955,972 ---- /* Subroutines of finish_struct. */ /* Change the access of FDECL to ACCESS in T. Return 1 if change was legit, otherwise return 0. */ static int ! alter_access (tree t, tree fdecl, tree access) { tree elem; if (!DECL_LANG_SPECIFIC (fdecl)) retrofit_lang_decl (fdecl); ! my_friendly_assert (!DECL_DISCRIMINATOR_P (fdecl), 20030624); elem = purpose_member (t, DECL_ACCESS (fdecl)); if (elem) *************** alter_access (t, fdecl, access) *** 1155,1161 **** } else { ! enforce_access (t, fdecl); DECL_ACCESS (fdecl) = tree_cons (t, access, DECL_ACCESS (fdecl)); return 1; } --- 988,994 ---- } else { ! perform_or_defer_access_check (TYPE_BINFO (t), fdecl); DECL_ACCESS (fdecl) = tree_cons (t, access, DECL_ACCESS (fdecl)); return 1; } *************** alter_access (t, fdecl, access) *** 1165,1173 **** /* Process the USING_DECL, which is a member of T. */ static void ! handle_using_decl (using_decl, t) ! tree using_decl; ! tree t; { tree ctype = DECL_INITIAL (using_decl); tree name = DECL_NAME (using_decl); --- 998,1004 ---- /* Process the USING_DECL, which is a member of T. */ static void ! handle_using_decl (tree using_decl, tree t) { tree ctype = DECL_INITIAL (using_decl); tree name = DECL_NAME (using_decl); *************** handle_using_decl (using_decl, t) *** 1185,1191 **** binfo = lookup_base (t, ctype, ba_any, NULL); if (! binfo) { ! error_not_base_type (t, ctype); return; } --- 1016,1026 ---- binfo = lookup_base (t, ctype, ba_any, NULL); if (! binfo) { ! location_t saved_loc = input_location; ! ! input_location = DECL_SOURCE_LOCATION (using_decl); ! error_not_base_type (ctype, t); ! input_location = saved_loc; return; } *************** handle_using_decl (using_decl, t) *** 1200,1206 **** return; } ! fdecl = lookup_member (binfo, name, 0, 0); if (!fdecl) { --- 1035,1041 ---- return; } ! fdecl = lookup_member (binfo, name, 0, false); if (!fdecl) { *************** handle_using_decl (using_decl, t) *** 1249,1255 **** return; } ! /* Make type T see field decl FDECL with access ACCESS.*/ if (flist) for (; flist; flist = OVL_NEXT (flist)) { --- 1084,1090 ---- return; } ! /* Make type T see field decl FDECL with access ACCESS. */ if (flist) for (; flist; flist = OVL_NEXT (flist)) { *************** handle_using_decl (using_decl, t) *** 1266,1277 **** the bases. */ static void ! check_bases (t, cant_have_default_ctor_p, cant_have_const_ctor_p, ! no_const_asn_ref_p) ! tree t; ! int *cant_have_default_ctor_p; ! int *cant_have_const_ctor_p; ! int *no_const_asn_ref_p; { int n_baseclasses; int i; --- 1101,1110 ---- the bases. */ static void ! check_bases (tree t, ! int* cant_have_default_ctor_p, ! int* cant_have_const_ctor_p, ! int* no_const_asn_ref_p) { int n_baseclasses; int i; *************** check_bases (t, cant_have_default_ctor_p *** 1367,1603 **** TYPE_HAS_COMPLEX_ASSIGN_REF (t) |= TYPE_HAS_COMPLEX_ASSIGN_REF (basetype); TYPE_HAS_COMPLEX_INIT_REF (t) |= TYPE_HAS_COMPLEX_INIT_REF (basetype); - TYPE_OVERLOADS_CALL_EXPR (t) |= TYPE_OVERLOADS_CALL_EXPR (basetype); - TYPE_OVERLOADS_ARRAY_REF (t) |= TYPE_OVERLOADS_ARRAY_REF (basetype); - TYPE_OVERLOADS_ARROW (t) |= TYPE_OVERLOADS_ARROW (basetype); TYPE_POLYMORPHIC_P (t) |= TYPE_POLYMORPHIC_P (basetype); CLASSTYPE_CONTAINS_EMPTY_CLASS_P (t) |= CLASSTYPE_CONTAINS_EMPTY_CLASS_P (basetype); } } - /* Binfo FROM is within a virtual hierarchy which is being reseated to - TO. Move primary information from FROM to TO, and recursively traverse - into FROM's bases. The hierarchy is dominated by TYPE. MAPPINGS is an - assoc list of binfos that have already been reseated. */ - - static void - force_canonical_binfo_r (to, from, type, mappings) - tree to; - tree from; - tree type; - tree mappings; - { - int i, n_baseclasses = BINFO_N_BASETYPES (from); - - my_friendly_assert (to != from, 20010905); - BINFO_INDIRECT_PRIMARY_P (to) - = BINFO_INDIRECT_PRIMARY_P (from); - BINFO_INDIRECT_PRIMARY_P (from) = 0; - BINFO_UNSHARED_MARKED (to) = BINFO_UNSHARED_MARKED (from); - BINFO_UNSHARED_MARKED (from) = 0; - BINFO_LOST_PRIMARY_P (to) = BINFO_LOST_PRIMARY_P (from); - BINFO_LOST_PRIMARY_P (from) = 0; - if (BINFO_PRIMARY_P (from)) - { - tree primary = BINFO_PRIMARY_BASE_OF (from); - tree assoc; - - /* We might have just moved the primary base too, see if it's on our - mappings. */ - assoc = purpose_member (primary, mappings); - if (assoc) - primary = TREE_VALUE (assoc); - BINFO_PRIMARY_BASE_OF (to) = primary; - BINFO_PRIMARY_BASE_OF (from) = NULL_TREE; - } - my_friendly_assert (same_type_p (BINFO_TYPE (to), BINFO_TYPE (from)), - 20010104); - mappings = tree_cons (from, to, mappings); - - if (CLASSTYPE_HAS_PRIMARY_BASE_P (BINFO_TYPE (from)) - && TREE_VIA_VIRTUAL (CLASSTYPE_PRIMARY_BINFO (BINFO_TYPE (from)))) - { - tree from_primary = get_primary_binfo (from); - - if (BINFO_PRIMARY_BASE_OF (from_primary) == from) - force_canonical_binfo (get_primary_binfo (to), from_primary, - type, mappings); - } - - for (i = 0; i != n_baseclasses; i++) - { - tree from_binfo = BINFO_BASETYPE (from, i); - tree to_binfo = BINFO_BASETYPE (to, i); - - if (TREE_VIA_VIRTUAL (from_binfo)) - { - if (BINFO_PRIMARY_P (from_binfo) && - purpose_member (BINFO_PRIMARY_BASE_OF (from_binfo), mappings)) - /* This base is a primary of some binfo we have already - reseated. We must reseat this one too. */ - force_canonical_binfo (to_binfo, from_binfo, type, mappings); - } - else - force_canonical_binfo_r (to_binfo, from_binfo, type, mappings); - } - } - - /* FROM is the canonical binfo for a virtual base. It is being reseated to - make TO the canonical binfo, within the hierarchy dominated by TYPE. - MAPPINGS is an assoc list of binfos that have already been reseated. - Adjust any non-virtual bases within FROM, and also move any virtual bases - which are canonical. This complication arises because selecting primary - bases walks in inheritance graph order, but we don't share binfos for - virtual bases, hence we can fill in the primaries for a virtual base, - and then discover that a later base requires the virtual as its - primary. */ - - static void - force_canonical_binfo (to, from, type, mappings) - tree to; - tree from; - tree type; - tree mappings; - { - tree assoc = purpose_member (BINFO_TYPE (to), - CLASSTYPE_VBASECLASSES (type)); - if (TREE_VALUE (assoc) != to) - { - TREE_VALUE (assoc) = to; - force_canonical_binfo_r (to, from, type, mappings); - } - } - - /* Make BASE_BINFO the a primary virtual base within the hierarchy - dominated by TYPE. Returns BASE_BINFO, if it is not already one, NULL - otherwise (because something else has already made it primary). */ - - static tree - mark_primary_virtual_base (base_binfo, type) - tree base_binfo; - tree type; - { - tree shared_binfo = binfo_for_vbase (BINFO_TYPE (base_binfo), type); - - if (BINFO_PRIMARY_P (shared_binfo)) - { - /* It's already allocated in the hierarchy. BINFO won't have a - primary base in this hierarchy, even though the complete object - BINFO is for, would do. */ - return NULL_TREE; - } - - /* We need to make sure that the assoc list - CLASSTYPE_VBASECLASSES of TYPE, indicates this particular - primary BINFO for the virtual base, as this is the one - that'll really exist. */ - if (base_binfo != shared_binfo) - force_canonical_binfo (base_binfo, shared_binfo, type, NULL); - - return base_binfo; - } - - /* If BINFO is an unmarked virtual binfo for a class with a primary virtual - base, then BINFO has no primary base in this graph. Called from - mark_primary_bases. DATA is the most derived type. */ - - static tree dfs_unshared_virtual_bases (binfo, data) - tree binfo; - void *data; - { - tree t = (tree) data; - - if (!BINFO_UNSHARED_MARKED (binfo) - && CLASSTYPE_HAS_PRIMARY_BASE_P (BINFO_TYPE (binfo))) - { - /* This morally virtual base has a primary base when it - is a complete object. We need to locate the shared instance - of this binfo in the type dominated by T. We duplicate the - primary base information from there to here. */ - tree vbase; - tree unshared_base; - - for (vbase = binfo; !TREE_VIA_VIRTUAL (vbase); - vbase = BINFO_INHERITANCE_CHAIN (vbase)) - continue; - unshared_base = get_original_base (binfo, - binfo_for_vbase (BINFO_TYPE (vbase), - t)); - my_friendly_assert (unshared_base != binfo, 20010612); - BINFO_LOST_PRIMARY_P (binfo) = BINFO_LOST_PRIMARY_P (unshared_base); - if (!BINFO_LOST_PRIMARY_P (binfo)) - BINFO_PRIMARY_BASE_OF (get_primary_binfo (binfo)) = binfo; - } - - if (binfo != TYPE_BINFO (t)) - /* The vtable fields will have been copied when duplicating the - base binfos. That information is bogus, make sure we don't try - and use it. */ - BINFO_VTABLE (binfo) = NULL_TREE; - - /* If this is a virtual primary base, make sure its offset matches - that which it is primary for. */ - if (BINFO_PRIMARY_P (binfo) && TREE_VIA_VIRTUAL (binfo) && - binfo_for_vbase (BINFO_TYPE (binfo), t) == binfo) - { - tree delta = size_diffop (BINFO_OFFSET (BINFO_PRIMARY_BASE_OF (binfo)), - BINFO_OFFSET (binfo)); - if (!integer_zerop (delta)) - propagate_binfo_offsets (binfo, delta, t); - } - - BINFO_UNSHARED_MARKED (binfo) = 0; - return NULL; - } - /* Set BINFO_PRIMARY_BASE_OF for all binfos in the hierarchy dominated by TYPE that are primary bases. */ static void ! mark_primary_bases (type) ! tree type; { tree binfo; /* Walk the bases in inheritance graph order. */ for (binfo = TYPE_BINFO (type); binfo; binfo = TREE_CHAIN (binfo)) { ! tree base_binfo; ! ! if (!CLASSTYPE_HAS_PRIMARY_BASE_P (BINFO_TYPE (binfo))) ! /* Not a dynamic base. */ ! continue; ! ! base_binfo = get_primary_binfo (binfo); ! ! if (TREE_VIA_VIRTUAL (base_binfo)) ! base_binfo = mark_primary_virtual_base (base_binfo, type); ! if (base_binfo) ! BINFO_PRIMARY_BASE_OF (base_binfo) = binfo; ! else BINFO_LOST_PRIMARY_P (binfo) = 1; ! ! BINFO_UNSHARED_MARKED (binfo) = 1; } - /* There could remain unshared morally virtual bases which were not - visited in the inheritance graph walk. These bases will have lost - their virtual primary base (should they have one). We must now - find them. Also we must fix up the BINFO_OFFSETs of primary - virtual bases. We could not do that as we went along, as they - were originally copied from the bases we inherited from by - unshare_base_binfos. That may have decided differently about - where a virtual primary base went. */ - dfs_walk (TYPE_BINFO (type), dfs_unshared_virtual_bases, NULL, type); } /* Make the BINFO the primary base of T. */ static void ! set_primary_base (t, binfo) ! tree t; ! tree binfo; { tree basetype; --- 1200,1251 ---- TYPE_HAS_COMPLEX_ASSIGN_REF (t) |= TYPE_HAS_COMPLEX_ASSIGN_REF (basetype); TYPE_HAS_COMPLEX_INIT_REF (t) |= TYPE_HAS_COMPLEX_INIT_REF (basetype); TYPE_POLYMORPHIC_P (t) |= TYPE_POLYMORPHIC_P (basetype); CLASSTYPE_CONTAINS_EMPTY_CLASS_P (t) |= CLASSTYPE_CONTAINS_EMPTY_CLASS_P (basetype); } } /* Set BINFO_PRIMARY_BASE_OF for all binfos in the hierarchy dominated by TYPE that are primary bases. */ static void ! mark_primary_bases (tree type) { tree binfo; /* Walk the bases in inheritance graph order. */ for (binfo = TYPE_BINFO (type); binfo; binfo = TREE_CHAIN (binfo)) { ! tree base_binfo = get_primary_binfo (binfo); ! if (!base_binfo) ! /* Not a dynamic base. */; ! else if (BINFO_PRIMARY_P (base_binfo)) BINFO_LOST_PRIMARY_P (binfo) = 1; ! else ! { ! BINFO_PRIMARY_BASE_OF (base_binfo) = binfo; ! /* A virtual binfo might have been copied from within ! another hierarchy. As we're about to use it as a primary ! base, make sure the offsets match. */ ! if (TREE_VIA_VIRTUAL (base_binfo)) ! { ! tree delta = size_diffop (convert (ssizetype, ! BINFO_OFFSET (binfo)), ! convert (ssizetype, ! BINFO_OFFSET (base_binfo))); ! ! propagate_binfo_offsets (base_binfo, delta); ! } ! } } } /* Make the BINFO the primary base of T. */ static void ! set_primary_base (tree t, tree binfo) { tree basetype; *************** set_primary_base (t, binfo) *** 1611,1618 **** /* Determine the primary class for T. */ static void ! determine_primary_base (t) ! tree t; { int i, n_baseclasses = CLASSTYPE_N_BASECLASSES (t); tree vbases; --- 1259,1265 ---- /* Determine the primary class for T. */ static void ! determine_primary_base (tree t) { int i, n_baseclasses = CLASSTYPE_N_BASECLASSES (t); tree vbases; *************** determine_primary_base (t) *** 1754,1761 **** use. */ static void ! finish_struct_bits (t) ! tree t; { int i, n_baseclasses = CLASSTYPE_N_BASECLASSES (t); --- 1401,1407 ---- use. */ static void ! finish_struct_bits (tree t) { int i, n_baseclasses = CLASSTYPE_N_BASECLASSES (t); *************** finish_struct_bits (t) *** 1834,1841 **** non-private static member functions. */ static void ! maybe_warn_about_overly_private_class (t) ! tree t; { int has_member_fn = 0; int has_nonprivate_method = 0; --- 1480,1486 ---- non-private static member functions. */ static void ! maybe_warn_about_overly_private_class (tree t) { int has_member_fn = 0; int has_nonprivate_method = 0; *************** maybe_warn_about_overly_private_class (t *** 1899,1908 **** issues error messages specifically referring to constructors/destructors.) */ int i; ! tree binfos = BINFO_BASETYPES (TYPE_BINFO (t)); ! for (i = 0; i < CLASSTYPE_N_BASECLASSES (t); i++) ! if (TREE_VIA_PUBLIC (TREE_VEC_ELT (binfos, i)) ! || TREE_VIA_PROTECTED (TREE_VEC_ELT (binfos, i))) { has_nonprivate_method = 1; break; --- 1544,1553 ---- issues error messages specifically referring to constructors/destructors.) */ int i; ! tree binfo = TYPE_BINFO (t); ! ! for (i = 0; i < BINFO_N_BASETYPES (binfo); i++) ! if (BINFO_BASEACCESS (binfo, i) != access_private_node) { has_nonprivate_method = 1; break; *************** maybe_warn_about_overly_private_class (t *** 1917,1932 **** /* Even if some of the member functions are non-private, the class won't be useful for much if all the constructors or destructors are private: such an object can never be created or destroyed. */ ! if (TYPE_HAS_DESTRUCTOR (t)) { ! tree dtor = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (t), 1); ! ! if (TREE_PRIVATE (dtor)) ! { ! warning ("`%#T' only defines a private destructor and has no friends", ! t); ! return; ! } } if (TYPE_HAS_CONSTRUCTOR (t)) --- 1562,1573 ---- /* Even if some of the member functions are non-private, the class won't be useful for much if all the constructors or destructors are private: such an object can never be created or destroyed. */ ! if (TYPE_HAS_DESTRUCTOR (t) ! && TREE_PRIVATE (CLASSTYPE_DESTRUCTORS (t))) { ! warning ("`%#T' only defines a private destructor and has no friends", ! t); ! return; } if (TYPE_HAS_CONSTRUCTOR (t)) *************** maybe_warn_about_overly_private_class (t *** 1973,2013 **** } } ! /* Function to help qsort sort FIELD_DECLs by name order. */ static int ! field_decl_cmp (x, y) ! const tree *x, *y; { ! if (DECL_NAME (*x) == DECL_NAME (*y)) ! /* A nontype is "greater" than a type. */ ! return DECL_DECLARES_TYPE_P (*y) - DECL_DECLARES_TYPE_P (*x); ! if (DECL_NAME (*x) == NULL_TREE) return -1; ! if (DECL_NAME (*y) == NULL_TREE) return 1; ! if (DECL_NAME (*x) < DECL_NAME (*y)) return -1; return 1; } ! /* Comparison function to compare two TYPE_METHOD_VEC entries by name. */ static int ! method_name_cmp (m1, m2) ! const tree *m1, *m2; { if (*m1 == NULL_TREE && *m2 == NULL_TREE) return 0; if (*m1 == NULL_TREE) return -1; if (*m2 == NULL_TREE) return 1; ! if (DECL_NAME (OVL_CURRENT (*m1)) < DECL_NAME (OVL_CURRENT (*m2))) ! return -1; return 1; } /* Warn about duplicate methods in fn_fields. Also compact method lists so that lookup can be made faster. --- 1614,1698 ---- } } ! static struct { ! gt_pointer_operator new_value; ! void *cookie; ! } resort_data; ! ! /* Comparison function to compare two TYPE_METHOD_VEC entries by name. */ static int ! method_name_cmp (const void* m1_p, const void* m2_p) { ! const tree *const m1 = m1_p; ! const tree *const m2 = m2_p; ! ! if (*m1 == NULL_TREE && *m2 == NULL_TREE) ! return 0; ! if (*m1 == NULL_TREE) return -1; ! if (*m2 == NULL_TREE) return 1; ! if (DECL_NAME (OVL_CURRENT (*m1)) < DECL_NAME (OVL_CURRENT (*m2))) return -1; return 1; } ! /* This routine compares two fields like method_name_cmp but using the ! pointer operator in resort_field_decl_data. */ static int ! resort_method_name_cmp (const void* m1_p, const void* m2_p) { + const tree *const m1 = m1_p; + const tree *const m2 = m2_p; if (*m1 == NULL_TREE && *m2 == NULL_TREE) return 0; if (*m1 == NULL_TREE) return -1; if (*m2 == NULL_TREE) return 1; ! { ! tree d1 = DECL_NAME (OVL_CURRENT (*m1)); ! tree d2 = DECL_NAME (OVL_CURRENT (*m2)); ! resort_data.new_value (&d1, resort_data.cookie); ! resort_data.new_value (&d2, resort_data.cookie); ! if (d1 < d2) ! return -1; ! } return 1; } + /* Resort TYPE_METHOD_VEC because pointers have been reordered. */ + + void + resort_type_method_vec (void* obj, + void* orig_obj ATTRIBUTE_UNUSED , + gt_pointer_operator new_value, + void* cookie) + { + tree method_vec = obj; + int len = TREE_VEC_LENGTH (method_vec); + int slot; + + /* The type conversion ops have to live at the front of the vec, so we + can't sort them. */ + for (slot = 2; slot < len; ++slot) + { + tree fn = TREE_VEC_ELT (method_vec, slot); + + if (!DECL_CONV_FN_P (OVL_CURRENT (fn))) + break; + } + if (len - slot > 1) + { + resort_data.new_value = new_value; + resort_data.cookie = cookie; + qsort (&TREE_VEC_ELT (method_vec, slot), len - slot, sizeof (tree), + resort_method_name_cmp); + } + } + /* Warn about duplicate methods in fn_fields. Also compact method lists so that lookup can be made faster. *************** method_name_cmp (m1, m2) *** 2025,2032 **** search. */ static void ! finish_struct_methods (t) ! tree t; { tree fn_fields; tree method_vec; --- 1710,1716 ---- search. */ static void ! finish_struct_methods (tree t) { tree fn_fields; tree method_vec; *************** finish_struct_methods (t) *** 2078,2157 **** } if (len - slot > 1) qsort (&TREE_VEC_ELT (method_vec, slot), len-slot, sizeof (tree), ! (int (*)(const void *, const void *))method_name_cmp); ! } ! ! /* Emit error when a duplicate definition of a type is seen. Patch up. */ ! ! void ! duplicate_tag_error (t) ! tree t; ! { ! error ("redefinition of `%#T'", t); ! cp_error_at ("previous definition of `%#T'", t); ! ! /* Pretend we haven't defined this type. */ ! ! /* All of the component_decl's were TREE_CHAINed together in the parser. ! finish_struct_methods walks these chains and assembles all methods with ! the same base name into DECL_CHAINs. Now we don't need the parser chains ! anymore, so we unravel them. */ ! ! /* This used to be in finish_struct, but it turns out that the ! TREE_CHAIN is used by dbxout_type_methods and perhaps some other ! things... */ ! if (CLASSTYPE_METHOD_VEC (t)) ! { ! tree method_vec = CLASSTYPE_METHOD_VEC (t); ! int i, len = TREE_VEC_LENGTH (method_vec); ! for (i = 0; i < len; i++) ! { ! tree unchain = TREE_VEC_ELT (method_vec, i); ! while (unchain != NULL_TREE) ! { ! TREE_CHAIN (OVL_CURRENT (unchain)) = NULL_TREE; ! unchain = OVL_NEXT (unchain); ! } ! } ! } ! ! if (TYPE_LANG_SPECIFIC (t)) ! { ! tree binfo = TYPE_BINFO (t); ! int interface_only = CLASSTYPE_INTERFACE_ONLY (t); ! int interface_unknown = CLASSTYPE_INTERFACE_UNKNOWN (t); ! tree template_info = CLASSTYPE_TEMPLATE_INFO (t); ! int use_template = CLASSTYPE_USE_TEMPLATE (t); ! ! memset ((char *) TYPE_LANG_SPECIFIC (t), 0, sizeof (struct lang_type)); ! BINFO_BASETYPES(binfo) = NULL_TREE; ! ! TYPE_LANG_SPECIFIC (t)->u.h.is_lang_type_class = 1; ! TYPE_BINFO (t) = binfo; ! CLASSTYPE_INTERFACE_ONLY (t) = interface_only; ! SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, interface_unknown); ! TYPE_REDEFINED (t) = 1; ! CLASSTYPE_TEMPLATE_INFO (t) = template_info; ! CLASSTYPE_USE_TEMPLATE (t) = use_template; ! CLASSTYPE_DECL_LIST (t) = NULL_TREE; ! } ! TYPE_SIZE (t) = NULL_TREE; ! TYPE_MODE (t) = VOIDmode; ! TYPE_FIELDS (t) = NULL_TREE; ! TYPE_METHODS (t) = NULL_TREE; ! TYPE_VFIELD (t) = NULL_TREE; ! TYPE_CONTEXT (t) = NULL_TREE; ! ! /* Clear TYPE_LANG_FLAGS -- those in TYPE_LANG_SPECIFIC are cleared above. */ ! TYPE_LANG_FLAG_0 (t) = 0; ! TYPE_LANG_FLAG_1 (t) = 0; ! TYPE_LANG_FLAG_2 (t) = 0; ! TYPE_LANG_FLAG_3 (t) = 0; ! TYPE_LANG_FLAG_4 (t) = 0; ! TYPE_LANG_FLAG_5 (t) = 0; ! TYPE_LANG_FLAG_6 (t) = 0; ! /* But not this one. */ ! SET_IS_AGGR_TYPE (t, 1); } /* Make BINFO's vtable have N entries, including RTTI entries, --- 1762,1768 ---- } if (len - slot > 1) qsort (&TREE_VEC_ELT (method_vec, slot), len-slot, sizeof (tree), ! method_name_cmp); } /* Make BINFO's vtable have N entries, including RTTI entries, *************** duplicate_tag_error (t) *** 2159,2167 **** to lay it out. */ static void ! layout_vtable_decl (binfo, n) ! tree binfo; ! int n; { tree atype; tree vtable; --- 1770,1776 ---- to lay it out. */ static void ! layout_vtable_decl (tree binfo, int n) { tree atype; tree vtable; *************** layout_vtable_decl (binfo, n) *** 2177,2187 **** TREE_TYPE (vtable) = atype; DECL_SIZE (vtable) = DECL_SIZE_UNIT (vtable) = NULL_TREE; layout_decl (vtable, 0); - - /* At one time the vtable info was grabbed 2 words at a time. This - fails on SPARC unless you have 8-byte alignment. */ - DECL_ALIGN (vtable) = MAX (TYPE_ALIGN (double_type_node), - DECL_ALIGN (vtable)); } } --- 1786,1791 ---- *************** layout_vtable_decl (binfo, n) *** 2189,2196 **** have the same signature. */ int ! same_signature_p (fndecl, base_fndecl) ! tree fndecl, base_fndecl; { /* One destructor overrides another if they are the same kind of destructor. */ --- 1793,1799 ---- have the same signature. */ int ! same_signature_p (tree fndecl, tree base_fndecl) { /* One destructor overrides another if they are the same kind of destructor. */ *************** same_signature_p (fndecl, base_fndecl) *** 2221,2247 **** return 0; } - /* Called from base_derived_from via dfs_walk. */ - - static tree - dfs_base_derived_from (tree binfo, void *data) - { - tree base = (tree) data; - - if (same_type_p (TREE_TYPE (base), TREE_TYPE (binfo)) - && tree_int_cst_equal (BINFO_OFFSET (base), BINFO_OFFSET (binfo))) - return error_mark_node; - - return NULL_TREE; - } - /* Returns TRUE if DERIVED is a binfo containing the binfo BASE as a subobject. */ static bool base_derived_from (tree derived, tree base) { ! return dfs_walk (derived, dfs_base_derived_from, NULL, base) != NULL_TREE; } typedef struct find_final_overrider_data_s { --- 1824,1850 ---- return 0; } /* Returns TRUE if DERIVED is a binfo containing the binfo BASE as a subobject. */ static bool base_derived_from (tree derived, tree base) { ! tree probe; ! ! for (probe = base; probe; probe = BINFO_INHERITANCE_CHAIN (probe)) ! { ! if (probe == derived) ! return true; ! else if (TREE_VIA_VIRTUAL (probe)) ! /* If we meet a virtual base, we can't follow the inheritance ! any more. See if the complete type of DERIVED contains ! such a virtual base. */ ! return purpose_member (BINFO_TYPE (probe), ! CLASSTYPE_VBASECLASSES (BINFO_TYPE (derived))) ! != NULL_TREE; ! } ! return false; } typedef struct find_final_overrider_data_s { *************** typedef struct find_final_overrider_data *** 2253,2324 **** tree most_derived_type; /* The candidate overriders. */ tree candidates; } find_final_overrider_data; /* Called from find_final_overrider via dfs_walk. */ static tree ! dfs_find_final_overrider (binfo, data) ! tree binfo; ! void *data; { find_final_overrider_data *ffod = (find_final_overrider_data *) data; ! if (same_type_p (BINFO_TYPE (binfo), ! BINFO_TYPE (ffod->declaring_base)) ! && tree_int_cst_equal (BINFO_OFFSET (binfo), ! BINFO_OFFSET (ffod->declaring_base))) { ! tree path; ! tree method; ! /* We haven't found an overrider yet. */ ! method = NULL_TREE; ! /* We've found a path to the declaring base. Walk down the path ! looking for an overrider for FN. */ ! path = reverse_path (binfo); ! while (!same_type_p (BINFO_TYPE (TREE_VALUE (path)), ! ffod->most_derived_type)) ! path = TREE_CHAIN (path); ! while (path) { ! method = look_for_overrides_here (BINFO_TYPE (TREE_VALUE (path)), ! ffod->fn); if (method) { path = TREE_VALUE (path); break; } - - path = TREE_CHAIN (path); } ! /* If we found an overrider, record the overriding function, and ! the base from which it came. */ ! if (path) ! { ! tree *candidate; ! /* Remove any candidates overridden by this new function. */ ! candidate = &ffod->candidates; ! while (*candidate) ! { ! /* If *CANDIDATE overrides METHOD, then METHOD ! cannot override anything else on the list. */ ! if (base_derived_from (TREE_VALUE (*candidate), path)) ! return NULL_TREE; ! /* If METHOD overrides *CANDIDATE, remove *CANDIDATE. */ ! if (base_derived_from (path, TREE_VALUE (*candidate))) ! *candidate = TREE_CHAIN (*candidate); ! else ! candidate = &TREE_CHAIN (*candidate); ! } ! /* Add the new function. */ ! ffod->candidates = tree_cons (method, path, ffod->candidates); ! } ! } return NULL_TREE; } --- 1856,1948 ---- tree most_derived_type; /* The candidate overriders. */ tree candidates; + /* Binfos which inherited virtually on the current path. */ + tree vpath; } find_final_overrider_data; /* Called from find_final_overrider via dfs_walk. */ static tree ! dfs_find_final_overrider (tree binfo, void* data) { find_final_overrider_data *ffod = (find_final_overrider_data *) data; ! if (binfo == ffod->declaring_base) { ! /* We've found a path to the declaring base. Walk the path from ! derived to base, looking for an overrider for FN. */ ! tree path, probe, vpath; ! /* Build the path, using the inheritance chain and record of ! virtual inheritance. */ ! for (path = NULL_TREE, probe = binfo, vpath = ffod->vpath;;) { ! path = tree_cons (NULL_TREE, probe, path); ! if (same_type_p (BINFO_TYPE (probe), ffod->most_derived_type)) ! break; ! if (TREE_VIA_VIRTUAL (probe)) ! { ! probe = TREE_VALUE (vpath); ! vpath = TREE_CHAIN (vpath); ! } ! else ! probe = BINFO_INHERITANCE_CHAIN (probe); ! } ! /* Now walk path, looking for overrides. */ ! for (; path; path = TREE_CHAIN (path)) ! { ! tree method = look_for_overrides_here ! (BINFO_TYPE (TREE_VALUE (path)), ffod->fn); ! if (method) { + tree *candidate = &ffod->candidates; path = TREE_VALUE (path); + + /* Remove any candidates overridden by this new function. */ + while (*candidate) + { + /* If *CANDIDATE overrides METHOD, then METHOD + cannot override anything else on the list. */ + if (base_derived_from (TREE_VALUE (*candidate), path)) + return NULL_TREE; + /* If METHOD overrides *CANDIDATE, remove *CANDIDATE. */ + if (base_derived_from (path, TREE_VALUE (*candidate))) + *candidate = TREE_CHAIN (*candidate); + else + candidate = &TREE_CHAIN (*candidate); + } + + /* Add the new function. */ + ffod->candidates = tree_cons (method, path, ffod->candidates); break; } } + } ! return NULL_TREE; ! } ! static tree ! dfs_find_final_overrider_q (tree derived, int ix, void *data) ! { ! tree binfo = BINFO_BASETYPE (derived, ix); ! find_final_overrider_data *ffod = (find_final_overrider_data *) data; ! if (TREE_VIA_VIRTUAL (binfo)) ! ffod->vpath = tree_cons (NULL_TREE, derived, ffod->vpath); ! ! return binfo; ! } + static tree + dfs_find_final_overrider_post (tree binfo, void *data) + { + find_final_overrider_data *ffod = (find_final_overrider_data *) data; + + if (TREE_VIA_VIRTUAL (binfo) && TREE_CHAIN (ffod->vpath)) + ffod->vpath = TREE_CHAIN (ffod->vpath); + return NULL_TREE; } *************** dfs_find_final_overrider (binfo, data) *** 2328,2337 **** DERIVED) is the base object in which FN is declared. */ static tree ! find_final_overrider (derived, binfo, fn) ! tree derived; ! tree binfo; ! tree fn; { find_final_overrider_data ffod; --- 1952,1958 ---- DERIVED) is the base object in which FN is declared. */ static tree ! find_final_overrider (tree derived, tree binfo, tree fn) { find_final_overrider_data ffod; *************** find_final_overrider (derived, binfo, fn *** 2353,2367 **** The solution is to look at all paths to BINFO. If we find different overriders along any two, then there is a problem. */ ffod.fn = fn; ffod.declaring_base = binfo; ffod.most_derived_type = BINFO_TYPE (derived); ffod.candidates = NULL_TREE; ! dfs_walk (derived, ! dfs_find_final_overrider, ! NULL, ! &ffod); /* If there was no winner, issue an error message. */ if (!ffod.candidates || TREE_CHAIN (ffod.candidates)) --- 1974,1993 ---- The solution is to look at all paths to BINFO. If we find different overriders along any two, then there is a problem. */ + if (DECL_THUNK_P (fn)) + fn = THUNK_TARGET (fn); + ffod.fn = fn; ffod.declaring_base = binfo; ffod.most_derived_type = BINFO_TYPE (derived); ffod.candidates = NULL_TREE; + ffod.vpath = NULL_TREE; ! dfs_walk_real (derived, ! dfs_find_final_overrider, ! dfs_find_final_overrider_post, ! dfs_find_final_overrider_q, ! &ffod); /* If there was no winner, issue an error message. */ if (!ffod.candidates || TREE_CHAIN (ffod.candidates)) *************** get_vcall_index (tree fn, tree type) *** 2394,2414 **** } /* Update an entry in the vtable for BINFO, which is in the hierarchy ! dominated by T. FN has been overriden in BINFO; VIRTUALS points to the corresponding position in the BINFO_VIRTUALS list. */ static void ! update_vtable_entry_for_fn (t, binfo, fn, virtuals) ! tree t; ! tree binfo; ! tree fn; ! tree *virtuals; { tree b; tree overrider; tree delta; tree virtual_base; tree first_defn; bool lost = false; /* Find the nearest primary base (possibly binfo itself) which defines --- 2020,2040 ---- } /* Update an entry in the vtable for BINFO, which is in the hierarchy ! dominated by T. FN has been overridden in BINFO; VIRTUALS points to the corresponding position in the BINFO_VIRTUALS list. */ static void ! update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals, ! unsigned ix) { tree b; tree overrider; tree delta; tree virtual_base; tree first_defn; + tree overrider_fn, overrider_target; + tree target_fn = DECL_THUNK_P (fn) ? THUNK_TARGET (fn) : fn; + tree over_return, base_return; bool lost = false; /* Find the nearest primary base (possibly binfo itself) which defines *************** update_vtable_entry_for_fn (t, binfo, fn *** 2416,2422 **** calling FN through BINFO. */ for (b = binfo; ; b = get_primary_binfo (b)) { ! if (look_for_overrides_here (BINFO_TYPE (b), fn)) break; /* The nearest definition is from a lost primary. */ --- 2042,2049 ---- calling FN through BINFO. */ for (b = binfo; ; b = get_primary_binfo (b)) { ! my_friendly_assert (b, 20021227); ! if (look_for_overrides_here (BINFO_TYPE (b), target_fn)) break; /* The nearest definition is from a lost primary. */ *************** update_vtable_entry_for_fn (t, binfo, fn *** 2426,2439 **** first_defn = b; /* Find the final overrider. */ ! overrider = find_final_overrider (TYPE_BINFO (t), b, fn); if (overrider == error_mark_node) return; ! /* Check for unsupported covariant returns again now that we've ! calculated the base offsets. */ ! check_final_overrider (TREE_PURPOSE (overrider), fn); /* Assume that we will produce a thunk that convert all the way to the final overrider, and not to an intermediate virtual base. */ virtual_base = NULL_TREE; --- 2053,2144 ---- first_defn = b; /* Find the final overrider. */ ! overrider = find_final_overrider (TYPE_BINFO (t), b, target_fn); if (overrider == error_mark_node) return; + overrider_target = overrider_fn = TREE_PURPOSE (overrider); + + /* Check for adjusting covariant return types. */ + over_return = TREE_TYPE (TREE_TYPE (overrider_target)); + base_return = TREE_TYPE (TREE_TYPE (target_fn)); + + if (POINTER_TYPE_P (over_return) + && TREE_CODE (over_return) == TREE_CODE (base_return) + && CLASS_TYPE_P (TREE_TYPE (over_return)) + && CLASS_TYPE_P (TREE_TYPE (base_return))) + { + /* If FN is a covariant thunk, we must figure out the adjustment + to the final base FN was converting to. As OVERRIDER_TARGET might + also be converting to the return type of FN, we have to + combine the two conversions here. */ + tree fixed_offset, virtual_offset; + + if (DECL_THUNK_P (fn)) + { + my_friendly_assert (DECL_RESULT_THUNK_P (fn), 20031211); + fixed_offset = ssize_int (THUNK_FIXED_OFFSET (fn)); + virtual_offset = THUNK_VIRTUAL_OFFSET (fn); + } + else + fixed_offset = virtual_offset = NULL_TREE; ! if (virtual_offset) ! /* Find the equivalent binfo within the return type of the ! overriding function. We will want the vbase offset from ! there. */ ! virtual_offset = ! TREE_VALUE (purpose_member ! (BINFO_TYPE (virtual_offset), ! CLASSTYPE_VBASECLASSES (TREE_TYPE (over_return)))); ! else if (!same_type_p (TREE_TYPE (over_return), ! TREE_TYPE (base_return))) ! { ! /* There was no existing virtual thunk (which takes ! precedence). */ ! tree thunk_binfo; ! base_kind kind; ! ! thunk_binfo = lookup_base (TREE_TYPE (over_return), ! TREE_TYPE (base_return), ! ba_check | ba_quiet, &kind); + if (thunk_binfo && (kind == bk_via_virtual + || !BINFO_OFFSET_ZEROP (thunk_binfo))) + { + tree offset = convert (ssizetype, BINFO_OFFSET (thunk_binfo)); + + if (kind == bk_via_virtual) + { + /* We convert via virtual base. Find the virtual + base and adjust the fixed offset to be from there. */ + while (!TREE_VIA_VIRTUAL (thunk_binfo)) + thunk_binfo = BINFO_INHERITANCE_CHAIN (thunk_binfo); + + virtual_offset = thunk_binfo; + offset = size_diffop + (offset, convert + (ssizetype, BINFO_OFFSET (virtual_offset))); + } + if (fixed_offset) + /* There was an existing fixed offset, this must be + from the base just converted to, and the base the + FN was thunking to. */ + fixed_offset = size_binop (PLUS_EXPR, fixed_offset, offset); + else + fixed_offset = offset; + } + } + + if (fixed_offset || virtual_offset) + /* Replace the overriding function with a covariant thunk. We + will emit the overriding function in its own slot as + well. */ + overrider_fn = make_thunk (overrider_target, /*this_adjusting=*/0, + fixed_offset, virtual_offset); + } + else + my_friendly_assert (!DECL_THUNK_P (fn), 20021231); + /* Assume that we will produce a thunk that convert all the way to the final overrider, and not to an intermediate virtual base. */ virtual_base = NULL_TREE; *************** update_vtable_entry_for_fn (t, binfo, fn *** 2451,2468 **** /* If we find a virtual base, and we haven't yet found the overrider, then there is a virtual base between the declaring base (first_defn) and the final overrider. */ ! if (!virtual_base && TREE_VIA_VIRTUAL (b)) ! virtual_base = b; } /* Compute the constant adjustment to the `this' pointer. The `this' pointer, when this function is called, will point at BINFO (or one of its primary bases, which are at the same offset). */ if (virtual_base) /* The `this' pointer needs to be adjusted from the declaration to the nearest virtual base. */ ! delta = size_diffop (BINFO_OFFSET (virtual_base), ! BINFO_OFFSET (first_defn)); else if (lost) /* If the nearest definition is in a lost primary, we don't need an entry in our vtable. Except possibly in a constructor vtable, --- 2156,2206 ---- /* If we find a virtual base, and we haven't yet found the overrider, then there is a virtual base between the declaring base (first_defn) and the final overrider. */ ! if (TREE_VIA_VIRTUAL (b)) ! { ! virtual_base = b; ! break; ! } } + if (overrider_fn != overrider_target && !virtual_base) + { + /* The ABI specifies that a covariant thunk includes a mangling + for a this pointer adjustment. This-adjusting thunks that + override a function from a virtual base have a vcall + adjustment. When the virtual base in question is a primary + virtual base, we know the adjustments are zero, (and in the + non-covariant case, we would not use the thunk). + Unfortunately we didn't notice this could happen, when + designing the ABI and so never mandated that such a covariant + thunk should be emitted. Because we must use the ABI mandated + name, we must continue searching from the binfo where we + found the most recent definition of the function, towards the + primary binfo which first introduced the function into the + vtable. If that enters a virtual base, we must use a vcall + this-adjusting thunk. Bleah! */ + tree probe = first_defn; + + while ((probe = get_primary_binfo (probe)) + && (unsigned) list_length (BINFO_VIRTUALS (probe)) > ix) + if (TREE_VIA_VIRTUAL (probe)) + virtual_base = probe; + + if (virtual_base) + /* Even if we find a virtual base, the correct delta is + between the overrider and the binfo we're building a vtable + for. */ + goto virtual_covariant; + } + /* Compute the constant adjustment to the `this' pointer. The `this' pointer, when this function is called, will point at BINFO (or one of its primary bases, which are at the same offset). */ if (virtual_base) /* The `this' pointer needs to be adjusted from the declaration to the nearest virtual base. */ ! delta = size_diffop (convert (ssizetype, BINFO_OFFSET (virtual_base)), ! convert (ssizetype, BINFO_OFFSET (first_defn))); else if (lost) /* If the nearest definition is in a lost primary, we don't need an entry in our vtable. Except possibly in a constructor vtable, *************** update_vtable_entry_for_fn (t, binfo, fn *** 2473,2499 **** /* The `this' pointer needs to be adjusted from pointing to BINFO to pointing at the base where the final overrider appears. */ ! delta = size_diffop (BINFO_OFFSET (TREE_VALUE (overrider)), ! BINFO_OFFSET (binfo)); ! modify_vtable_entry (t, ! binfo, ! TREE_PURPOSE (overrider), ! delta, ! virtuals); if (virtual_base) BV_VCALL_INDEX (*virtuals) ! = get_vcall_index (TREE_PURPOSE (overrider), ! BINFO_TYPE (virtual_base)); } /* Called from modify_all_vtables via dfs_walk. */ static tree ! dfs_modify_vtables (binfo, data) ! tree binfo; ! void *data; { if (/* There's no need to modify the vtable for a non-virtual primary base; we're not going to use that vtable anyhow. --- 2211,2232 ---- /* The `this' pointer needs to be adjusted from pointing to BINFO to pointing at the base where the final overrider appears. */ ! virtual_covariant: ! delta = size_diffop (convert (ssizetype, ! BINFO_OFFSET (TREE_VALUE (overrider))), ! convert (ssizetype, BINFO_OFFSET (binfo))); ! modify_vtable_entry (t, binfo, overrider_fn, delta, virtuals); if (virtual_base) BV_VCALL_INDEX (*virtuals) ! = get_vcall_index (overrider_target, BINFO_TYPE (virtual_base)); } /* Called from modify_all_vtables via dfs_walk. */ static tree ! dfs_modify_vtables (tree binfo, void* data) { if (/* There's no need to modify the vtable for a non-virtual primary base; we're not going to use that vtable anyhow. *************** dfs_modify_vtables (binfo, data) *** 2503,2531 **** /* Similarly, a base without a vtable needs no modification. */ && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo))) { ! tree t; tree virtuals; tree old_virtuals; ! ! t = (tree) data; ! make_new_vtable (t, binfo); /* Now, go through each of the virtual functions in the virtual function table for BINFO. Find the final overrider, and update the BINFO_VIRTUALS list appropriately. */ ! for (virtuals = BINFO_VIRTUALS (binfo), old_virtuals = BINFO_VIRTUALS (TYPE_BINFO (BINFO_TYPE (binfo))); virtuals; ! virtuals = TREE_CHAIN (virtuals), old_virtuals = TREE_CHAIN (old_virtuals)) update_vtable_entry_for_fn (t, binfo, BV_FN (old_virtuals), ! &virtuals); } ! SET_BINFO_MARKED (binfo); return NULL_TREE; } --- 2236,2263 ---- /* Similarly, a base without a vtable needs no modification. */ && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo))) { ! tree t = (tree) data; tree virtuals; tree old_virtuals; ! unsigned ix; ! make_new_vtable (t, binfo); /* Now, go through each of the virtual functions in the virtual function table for BINFO. Find the final overrider, and update the BINFO_VIRTUALS list appropriately. */ ! for (ix = 0, virtuals = BINFO_VIRTUALS (binfo), old_virtuals = BINFO_VIRTUALS (TYPE_BINFO (BINFO_TYPE (binfo))); virtuals; ! ix++, virtuals = TREE_CHAIN (virtuals), old_virtuals = TREE_CHAIN (old_virtuals)) update_vtable_entry_for_fn (t, binfo, BV_FN (old_virtuals), ! &virtuals, ix); } ! BINFO_MARKED (binfo) = 1; return NULL_TREE; } *************** dfs_modify_vtables (binfo, data) *** 2540,2558 **** should therefore be appended to the end of the vtable for T. */ static tree ! modify_all_vtables (t, virtuals) ! tree t; ! tree virtuals; { tree binfo = TYPE_BINFO (t); tree *fnsp; /* Update all of the vtables. */ ! dfs_walk (binfo, ! dfs_modify_vtables, ! dfs_unmarked_real_bases_queue_p, ! t); ! dfs_walk (binfo, dfs_unmark, dfs_marked_real_bases_queue_p, t); /* Add virtual functions not already in our primary vtable. These will be both those introduced by this class, and those overridden --- 2272,2285 ---- should therefore be appended to the end of the vtable for T. */ static tree ! modify_all_vtables (tree t, tree virtuals) { tree binfo = TYPE_BINFO (t); tree *fnsp; /* Update all of the vtables. */ ! dfs_walk (binfo, dfs_modify_vtables, unmarkedp, t); ! dfs_walk (binfo, dfs_unmark, markedp, t); /* Add virtual functions not already in our primary vtable. These will be both those introduced by this class, and those overridden *************** modify_all_vtables (t, virtuals) *** 2585,2592 **** indicated NAME. */ static tree ! get_basefndecls (name, t) ! tree name, t; { tree methods; tree base_fndecls = NULL_TREE; --- 2312,2318 ---- indicated NAME. */ static tree ! get_basefndecls (tree name, tree t) { tree methods; tree base_fndecls = NULL_TREE; *************** get_basefndecls (name, t) *** 2625,2632 **** mark this field as being virtual as well. */ static void ! check_for_override (decl, ctype) ! tree decl, ctype; { if (TREE_CODE (decl) == TEMPLATE_DECL) /* In [temp.mem] we have: --- 2351,2357 ---- mark this field as being virtual as well. */ static void ! check_for_override (tree decl, tree ctype) { if (TREE_CODE (decl) == TEMPLATE_DECL) /* In [temp.mem] we have: *************** check_for_override (decl, ctype) *** 2656,2663 **** We know that constructors and destructors don't apply. */ void ! warn_hidden (t) ! tree t; { tree method_vec = CLASSTYPE_METHOD_VEC (t); int n_methods = method_vec ? TREE_VEC_LENGTH (method_vec) : 0; --- 2381,2387 ---- We know that constructors and destructors don't apply. */ void ! warn_hidden (tree t) { tree method_vec = CLASSTYPE_METHOD_VEC (t); int n_methods = method_vec ? TREE_VEC_LENGTH (method_vec) : 0; *************** warn_hidden (t) *** 2726,2733 **** things we should check for also. */ static void ! finish_struct_anon (t) ! tree t; { tree field; --- 2450,2456 ---- things we should check for also. */ static void ! finish_struct_anon (tree t) { tree field; *************** finish_struct_anon (t) *** 2756,2765 **** || TYPE_ANONYMOUS_P (TREE_TYPE (elt)))) continue; - if (DECL_NAME (elt) == constructor_name (t)) - cp_pedwarn_at ("ISO C++ forbids member `%D' with same name as enclosing class", - elt); - if (TREE_CODE (elt) != FIELD_DECL) { cp_pedwarn_at ("`%#D' invalid; an anonymous union can only have non-static data members", --- 2479,2484 ---- *************** finish_struct_anon (t) *** 2792,2801 **** (FUNCTION_DECL, TEMPLATE_DECL). */ void ! maybe_add_class_template_decl_list (type, t, friend_p) ! tree type; ! tree t; ! int friend_p; { /* Save some memory by not creating TREE_LIST if TYPE is not template. */ if (CLASSTYPE_TEMPLATE_INFO (type)) --- 2511,2517 ---- (FUNCTION_DECL, TEMPLATE_DECL). */ void ! maybe_add_class_template_decl_list (tree type, tree t, int friend_p) { /* Save some memory by not creating TREE_LIST if TYPE is not template. */ if (CLASSTYPE_TEMPLATE_INFO (type)) *************** maybe_add_class_template_decl_list (type *** 2814,2826 **** DECL is returned; otherwise the return value is NULL_TREE. */ static void ! add_implicitly_declared_members (t, cant_have_default_ctor, ! cant_have_const_cctor, ! cant_have_const_assignment) ! tree t; ! int cant_have_default_ctor; ! int cant_have_const_cctor; ! int cant_have_const_assignment; { tree default_fn; tree implicit_fns = NULL_TREE; --- 2530,2539 ---- DECL is returned; otherwise the return value is NULL_TREE. */ static void ! add_implicitly_declared_members (tree t, ! int cant_have_default_ctor, ! int cant_have_const_cctor, ! int cant_have_const_assignment) { tree default_fn; tree implicit_fns = NULL_TREE; *************** add_implicitly_declared_members (t, cant *** 2911,2918 **** in TYPE, including anonymous union members. */ static int ! count_fields (fields) ! tree fields; { tree x; int n_fields = 0; --- 2624,2630 ---- in TYPE, including anonymous union members. */ static int ! count_fields (tree fields) { tree x; int n_fields = 0; *************** count_fields (fields) *** 2927,2946 **** } /* Subroutine of finish_struct_1. Recursively add all the fields in the ! TREE_LIST FIELDS to the TREE_VEC FIELD_VEC, starting at offset IDX. */ static int ! add_fields_to_vec (fields, field_vec, idx) ! tree fields, field_vec; ! int idx; { tree x; for (x = fields; x; x = TREE_CHAIN (x)) { if (TREE_CODE (x) == FIELD_DECL && ANON_AGGR_TYPE_P (TREE_TYPE (x))) ! idx = add_fields_to_vec (TYPE_FIELDS (TREE_TYPE (x)), field_vec, idx); else ! TREE_VEC_ELT (field_vec, idx++) = x; } return idx; } --- 2639,2656 ---- } /* Subroutine of finish_struct_1. Recursively add all the fields in the ! TREE_LIST FIELDS to the SORTED_FIELDS_TYPE elts, starting at offset IDX. */ static int ! add_fields_to_record_type (tree fields, struct sorted_fields_type *field_vec, int idx) { tree x; for (x = fields; x; x = TREE_CHAIN (x)) { if (TREE_CODE (x) == FIELD_DECL && ANON_AGGR_TYPE_P (TREE_TYPE (x))) ! idx = add_fields_to_record_type (TYPE_FIELDS (TREE_TYPE (x)), field_vec, idx); else ! field_vec->elts[idx++] = x; } return idx; } *************** add_fields_to_vec (fields, field_vec, id *** 2950,2957 **** flags. */ static void ! check_bitfield_decl (field) ! tree field; { tree type = TREE_TYPE (field); tree w = NULL_TREE; --- 2660,2666 ---- flags. */ static void ! check_bitfield_decl (tree field) { tree type = TREE_TYPE (field); tree w = NULL_TREE; *************** check_bitfield_decl (field) *** 3018,3048 **** { DECL_SIZE (field) = convert (bitsizetype, w); DECL_BIT_FIELD (field) = 1; - - if (integer_zerop (w) - && ! (* targetm.ms_bitfield_layout_p) (DECL_FIELD_CONTEXT (field))) - { - #ifdef EMPTY_FIELD_BOUNDARY - DECL_ALIGN (field) = MAX (DECL_ALIGN (field), - EMPTY_FIELD_BOUNDARY); - #endif - #ifdef PCC_BITFIELD_TYPE_MATTERS - if (PCC_BITFIELD_TYPE_MATTERS) - { - DECL_ALIGN (field) = MAX (DECL_ALIGN (field), - TYPE_ALIGN (type)); - DECL_USER_ALIGN (field) |= TYPE_USER_ALIGN (type); - } - #endif - } } else { /* Non-bit-fields are aligned for their type. */ DECL_BIT_FIELD (field) = 0; CLEAR_DECL_C_BIT_FIELD (field); - DECL_ALIGN (field) = MAX (DECL_ALIGN (field), TYPE_ALIGN (type)); - DECL_USER_ALIGN (field) |= TYPE_USER_ALIGN (type); } } --- 2727,2738 ---- *************** check_bitfield_decl (field) *** 3051,3065 **** flags. */ static void ! check_field_decl (field, t, cant_have_const_ctor, ! cant_have_default_ctor, no_const_asn_ref, ! any_default_members) ! tree field; ! tree t; ! int *cant_have_const_ctor; ! int *cant_have_default_ctor; ! int *no_const_asn_ref; ! int *any_default_members; { tree type = strip_array_types (TREE_TYPE (field)); --- 2741,2752 ---- flags. */ static void ! check_field_decl (tree field, ! tree t, ! int* cant_have_const_ctor, ! int* cant_have_default_ctor, ! int* no_const_asn_ref, ! int* any_default_members) { tree type = strip_array_types (TREE_TYPE (field)); *************** check_field_decl (field, t, cant_have_co *** 3123,3129 **** /* `build_class_init_list' does not recognize non-FIELD_DECLs. */ if (TREE_CODE (t) == UNION_TYPE && any_default_members != 0) ! cp_error_at ("multiple fields in union `%T' initialized"); *any_default_members = 1; } } --- 2810,2816 ---- /* `build_class_init_list' does not recognize non-FIELD_DECLs. */ if (TREE_CODE (t) == UNION_TYPE && any_default_members != 0) ! error ("multiple fields in union `%T' initialized", t); *any_default_members = 1; } } *************** check_field_decls (tree t, tree *access_ *** 3168,3176 **** int has_pointers; int any_default_members; - /* First, delete any duplicate fields. */ - delete_duplicate_fields (TYPE_FIELDS (t)); - /* Assume there are no access declarations. */ *access_decls = NULL_TREE; /* Assume this class has no pointer members. */ --- 2855,2860 ---- *************** check_field_decls (tree t, tree *access_ *** 3188,3194 **** if (TREE_CODE (x) == FIELD_DECL) { ! DECL_PACKED (x) |= TYPE_PACKED (t); if (DECL_C_BIT_FIELD (x) && integer_zerop (DECL_INITIAL (x))) /* We don't treat zero-width bitfields as making a class --- 2872,2886 ---- if (TREE_CODE (x) == FIELD_DECL) { ! if (TYPE_PACKED (t)) ! { ! if (!pod_type_p (TREE_TYPE (x)) && !TYPE_PACKED (TREE_TYPE (x))) ! cp_warning_at ! ("ignoring packed attribute on unpacked non-POD field `%#D'", ! x); ! else ! DECL_PACKED (x) = 1; ! } if (DECL_C_BIT_FIELD (x) && integer_zerop (DECL_INITIAL (x))) /* We don't treat zero-width bitfields as making a class *************** check_field_decls (tree t, tree *access_ *** 3231,3239 **** /* If we've gotten this far, it's a data member, possibly static, or an enumerator. */ - DECL_CONTEXT (x) = t; /* ``A local class cannot have static data members.'' ARM 9.4 */ if (current_function_decl && TREE_STATIC (x)) cp_error_at ("field `%D' in local class cannot be static", x); --- 2923,2952 ---- /* If we've gotten this far, it's a data member, possibly static, or an enumerator. */ DECL_CONTEXT (x) = t; + /* When this goes into scope, it will be a non-local reference. */ + DECL_NONLOCAL (x) = 1; + + if (TREE_CODE (t) == UNION_TYPE) + { + /* [class.union] + + If a union contains a static data member, or a member of + reference type, the program is ill-formed. */ + if (TREE_CODE (x) == VAR_DECL) + { + cp_error_at ("`%D' may not be static because it is a member of a union", x); + continue; + } + if (TREE_CODE (type) == REFERENCE_TYPE) + { + cp_error_at ("`%D' may not have reference type `%T' because it is a member of a union", + x, type); + continue; + } + } + /* ``A local class cannot have static data members.'' ARM 9.4 */ if (current_function_decl && TREE_STATIC (x)) cp_error_at ("field `%D' in local class cannot be static", x); *************** check_field_decls (tree t, tree *access_ *** 3253,3283 **** type = build_pointer_type (type); TREE_TYPE (x) = type; } - else if (TREE_CODE (type) == OFFSET_TYPE) - { - cp_error_at ("field `%D' invalidly declared offset type", x); - type = build_pointer_type (type); - TREE_TYPE (x) = type; - } if (type == error_mark_node) continue; ! /* When this goes into scope, it will be a non-local reference. */ ! DECL_NONLOCAL (x) = 1; ! ! if (TREE_CODE (x) == CONST_DECL) continue; - if (TREE_CODE (x) == VAR_DECL) - { - if (TREE_CODE (t) == UNION_TYPE) - /* Unions cannot have static members. */ - cp_error_at ("field `%D' declared static in union", x); - - continue; - } - /* Now it can only be a FIELD_DECL. */ if (TREE_PRIVATE (x) || TREE_PROTECTED (x)) --- 2966,2978 ---- type = build_pointer_type (type); TREE_TYPE (x) = type; } if (type == error_mark_node) continue; ! if (TREE_CODE (x) == CONST_DECL || TREE_CODE (x) == VAR_DECL) continue; /* Now it can only be a FIELD_DECL. */ if (TREE_PRIVATE (x) || TREE_PROTECTED (x)) *************** check_field_decls (tree t, tree *access_ *** 3305,3313 **** type = strip_array_types (type); ! if (TREE_CODE (type) == POINTER_TYPE) has_pointers = 1; if (DECL_MUTABLE_P (x) || TYPE_HAS_MUTABLE_P (type)) CLASSTYPE_HAS_MUTABLE (t) = 1; --- 3000,3016 ---- type = strip_array_types (type); ! if (TYPE_PTR_P (type)) has_pointers = 1; + if (CLASS_TYPE_P (type)) + { + if (CLASSTYPE_REF_FIELDS_NEED_INIT (type)) + SET_CLASSTYPE_REF_FIELDS_NEED_INIT (t, 1); + if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (type)) + SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT (t, 1); + } + if (DECL_MUTABLE_P (x) || TYPE_HAS_MUTABLE_P (type)) CLASSTYPE_HAS_MUTABLE (t) = 1; *************** check_field_decls (tree t, tree *access_ *** 3338,3344 **** cp_warning_at ("non-static const member `%#D' in class without a constructor", x); } /* A field that is pseudo-const makes the structure likewise. */ ! else if (IS_AGGR_TYPE (type)) { C_TYPE_FIELDS_READONLY (t) |= C_TYPE_FIELDS_READONLY (type); SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT (t, --- 3041,3047 ---- cp_warning_at ("non-static const member `%#D' in class without a constructor", x); } /* A field that is pseudo-const makes the structure likewise. */ ! else if (CLASS_TYPE_P (type)) { C_TYPE_FIELDS_READONLY (t) |= C_TYPE_FIELDS_READONLY (type); SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT (t, *************** check_field_decls (tree t, tree *access_ *** 3349,3356 **** /* Core issue 80: A nonstatic data member is required to have a different name from the class iff the class has a user-defined constructor. */ ! if (DECL_NAME (x) == constructor_name (t) ! && TYPE_HAS_CONSTRUCTOR (t)) cp_pedwarn_at ("field `%#D' with same name as class", x); /* We set DECL_C_BIT_FIELD in grokbitfield. --- 3052,3058 ---- /* Core issue 80: A nonstatic data member is required to have a different name from the class iff the class has a user-defined constructor. */ ! if (constructor_name_p (DECL_NAME (x), t) && TYPE_HAS_CONSTRUCTOR (t)) cp_pedwarn_at ("field `%#D' with same name as class", x); /* We set DECL_C_BIT_FIELD in grokbitfield. *************** check_field_decls (tree t, tree *access_ *** 3394,3403 **** OFFSETS. */ static int ! record_subobject_offset (type, offset, offsets) ! tree type; ! tree offset; ! splay_tree offsets; { splay_tree_node n; --- 3096,3102 ---- OFFSETS. */ static int ! record_subobject_offset (tree type, tree offset, splay_tree offsets) { splay_tree_node n; *************** record_subobject_offset (type, offset, o *** 3422,3431 **** already an entry in OFFSETS for the same TYPE as the same OFFSET. */ static int ! check_subobject_offset (type, offset, offsets) ! tree type; ! tree offset; ! splay_tree offsets; { splay_tree_node n; tree t; --- 3121,3127 ---- already an entry in OFFSETS for the same TYPE as the same OFFSET. */ static int ! check_subobject_offset (tree type, tree offset, splay_tree offsets) { splay_tree_node n; tree t; *************** check_subobject_offset (type, offset, of *** 3457,3469 **** is returned. Otherwise, returns zero. */ static int ! walk_subobject_offsets (type, f, offset, offsets, max_offset, vbases_p) ! tree type; ! subobject_offset_fn f; ! tree offset; ! splay_tree offsets; ! tree max_offset; ! int vbases_p; { int r = 0; tree type_binfo = NULL_TREE; --- 3153,3164 ---- is returned. Otherwise, returns zero. */ static int ! walk_subobject_offsets (tree type, ! subobject_offset_fn f, ! tree offset, ! splay_tree offsets, ! tree max_offset, ! int vbases_p) { int r = 0; tree type_binfo = NULL_TREE; *************** walk_subobject_offsets (type, f, offset, *** 3572,3593 **** virtual. (If it is non-virtual, then it was walked above.) */ vbase = get_primary_binfo (type_binfo); ! if (vbase && TREE_VIA_VIRTUAL (vbase)) { ! tree derived = type_binfo; ! while (BINFO_INHERITANCE_CHAIN (derived)) ! derived = BINFO_INHERITANCE_CHAIN (derived); ! derived = TREE_TYPE (derived); ! vbase = binfo_for_vbase (TREE_TYPE (vbase), derived); ! ! if (BINFO_PRIMARY_BASE_OF (vbase) == type_binfo) ! { ! r = (walk_subobject_offsets ! (vbase, f, offset, ! offsets, max_offset, /*vbases_p=*/0)); ! if (r) ! return r; ! } } } } --- 3267,3280 ---- virtual. (If it is non-virtual, then it was walked above.) */ vbase = get_primary_binfo (type_binfo); ! if (vbase && TREE_VIA_VIRTUAL (vbase) ! && BINFO_PRIMARY_BASE_OF (vbase) == type_binfo) { ! r = (walk_subobject_offsets ! (vbase, f, offset, ! offsets, max_offset, /*vbases_p=*/0)); ! if (r) ! return r; } } } *************** walk_subobject_offsets (type, f, offset, *** 3661,3671 **** examined. */ static void ! record_subobject_offsets (type, offset, offsets, vbases_p) ! tree type; ! tree offset; ! splay_tree offsets; ! int vbases_p; { walk_subobject_offsets (type, record_subobject_offset, offset, offsets, /*max_offset=*/NULL_TREE, vbases_p); --- 3348,3357 ---- examined. */ static void ! record_subobject_offsets (tree type, ! tree offset, ! splay_tree offsets, ! int vbases_p) { walk_subobject_offsets (type, record_subobject_offset, offset, offsets, /*max_offset=*/NULL_TREE, vbases_p); *************** record_subobject_offsets (type, offset, *** 3676,3686 **** virtual bases of TYPE are examined. */ static int ! layout_conflict_p (type, offset, offsets, vbases_p) ! tree type; ! tree offset; ! splay_tree offsets; ! int vbases_p; { splay_tree_node max_node; --- 3362,3371 ---- virtual bases of TYPE are examined. */ static int ! layout_conflict_p (tree type, ! tree offset, ! splay_tree offsets, ! int vbases_p) { splay_tree_node max_node; *************** layout_nonempty_base_or_field (record_la *** 3709,3715 **** tree binfo, splay_tree offsets) { - tree t = rli->t; tree offset = NULL_TREE; bool field_p; tree type; --- 3394,3399 ---- *************** layout_nonempty_base_or_field (record_la *** 3790,3797 **** propagate_binfo_offsets (binfo, size_diffop (convert (ssizetype, offset), convert (ssizetype, ! BINFO_OFFSET (binfo))), ! t); } /* Returns true if TYPE is empty and OFFSET is nonzero. */ --- 3474,3480 ---- propagate_binfo_offsets (binfo, size_diffop (convert (ssizetype, offset), convert (ssizetype, ! BINFO_OFFSET (binfo)))); } /* Returns true if TYPE is empty and OFFSET is nonzero. */ *************** empty_base_at_nonzero_offset_p (tree typ *** 3811,3821 **** type. Return nonzero iff we added it at the end. */ static bool ! layout_empty_base (binfo, eoc, offsets, t) ! tree binfo; ! tree eoc; ! splay_tree offsets; ! tree t; { tree alignment; tree basetype = BINFO_TYPE (binfo); --- 3494,3500 ---- type. Return nonzero iff we added it at the end. */ static bool ! layout_empty_base (tree binfo, tree eoc, splay_tree offsets) { tree alignment; tree basetype = BINFO_TYPE (binfo); *************** layout_empty_base (binfo, eoc, offsets, *** 3824,3837 **** /* This routine should only be used for empty classes. */ my_friendly_assert (is_empty_class (basetype), 20000321); alignment = ssize_int (CLASSTYPE_ALIGN_UNIT (basetype)); - - if (abi_version_at_least (2)) - BINFO_OFFSET (binfo) = size_zero_node; - if (warn_abi && !integer_zerop (BINFO_OFFSET (binfo))) - warning ("offset of empty base `%T' may not be ABI-compliant and may" - "change in a future version of GCC", - BINFO_TYPE (binfo)); /* This is an empty base class. We first try to put it at offset zero. */ if (layout_conflict_p (binfo, --- 3503,3520 ---- /* This routine should only be used for empty classes. */ my_friendly_assert (is_empty_class (basetype), 20000321); alignment = ssize_int (CLASSTYPE_ALIGN_UNIT (basetype)); + if (!integer_zerop (BINFO_OFFSET (binfo))) + { + if (abi_version_at_least (2)) + propagate_binfo_offsets + (binfo, size_diffop (size_zero_node, BINFO_OFFSET (binfo))); + else if (warn_abi) + warning ("offset of empty base `%T' may not be ABI-compliant and may" + "change in a future version of GCC", + BINFO_TYPE (binfo)); + } + /* This is an empty base class. We first try to put it at offset zero. */ if (layout_conflict_p (binfo, *************** layout_empty_base (binfo, eoc, offsets, *** 3842,3848 **** /* That didn't work. Now, we move forward from the next available spot in the class. */ atend = true; ! propagate_binfo_offsets (binfo, convert (ssizetype, eoc), t); while (1) { if (!layout_conflict_p (binfo, --- 3525,3531 ---- /* That didn't work. Now, we move forward from the next available spot in the class. */ atend = true; ! propagate_binfo_offsets (binfo, convert (ssizetype, eoc)); while (1) { if (!layout_conflict_p (binfo, *************** layout_empty_base (binfo, eoc, offsets, *** 3853,3859 **** break; /* There's overlap here, too. Bump along to the next spot. */ ! propagate_binfo_offsets (binfo, alignment, t); } } return atend; --- 3536,3542 ---- break; /* There's overlap here, too. Bump along to the next spot. */ ! propagate_binfo_offsets (binfo, alignment); } } return atend; *************** build_base_field (record_layout_info rli *** 3917,3923 **** byte-aligned. */ eoc = round_up (rli_size_unit_so_far (rli), CLASSTYPE_ALIGN_UNIT (basetype)); ! atend = layout_empty_base (binfo, eoc, offsets, t); /* A nearly-empty class "has no proper base class that is empty, not morally virtual, and at an offset other than zero." */ if (!TREE_VIA_VIRTUAL (binfo) && CLASSTYPE_NEARLY_EMPTY_P (t)) --- 3600,3606 ---- byte-aligned. */ eoc = round_up (rli_size_unit_so_far (rli), CLASSTYPE_ALIGN_UNIT (basetype)); ! atend = layout_empty_base (binfo, eoc, offsets); /* A nearly-empty class "has no proper base class that is empty, not morally virtual, and at an offset other than zero." */ if (!TREE_VIA_VIRTUAL (binfo) && CLASSTYPE_NEARLY_EMPTY_P (t)) *************** build_base_fields (record_layout_info rl *** 3996,4006 **** if (base_binfo == CLASSTYPE_PRIMARY_BINFO (t)) continue; ! /* A primary virtual base class is allocated just like any other ! base class, but a non-primary virtual base is allocated ! later, in layout_virtual_bases. */ ! if (TREE_VIA_VIRTUAL (base_binfo) ! && !BINFO_PRIMARY_P (base_binfo)) continue; next_field = build_base_field (rli, base_binfo, --- 3679,3687 ---- if (base_binfo == CLASSTYPE_PRIMARY_BINFO (t)) continue; ! /* Virtual bases are added at the end (a primary virtual base ! will have already been added). */ ! if (TREE_VIA_VIRTUAL (base_binfo)) continue; next_field = build_base_field (rli, base_binfo, *************** build_base_fields (record_layout_info rl *** 4013,4020 **** methods, and so forth. */ static void ! check_methods (t) ! tree t; { tree x; --- 3694,3700 ---- methods, and so forth. */ static void ! check_methods (tree t) { tree x; *************** check_methods (t) *** 4046,4054 **** NAME. */ static tree ! build_clone (fn, name) ! tree fn; ! tree name; { tree parms; tree clone; --- 3726,3732 ---- NAME. */ static tree ! build_clone (tree fn, tree name) { tree parms; tree clone; *************** build_clone (fn, name) *** 4097,4111 **** /* If this is subobject constructor or destructor, add the vtt parameter. */ TREE_TYPE (clone) ! = build_cplus_method_type (basetype, ! TREE_TYPE (TREE_TYPE (clone)), ! parmtypes); if (exceptions) TREE_TYPE (clone) = build_exception_variant (TREE_TYPE (clone), exceptions); TREE_TYPE (clone) ! = build_type_attribute_variant (TREE_TYPE (clone), ! TYPE_ATTRIBUTES (TREE_TYPE (fn))); } /* Copy the function parameters. But, DECL_ARGUMENTS on a TEMPLATE_DECL --- 3775,3789 ---- /* If this is subobject constructor or destructor, add the vtt parameter. */ TREE_TYPE (clone) ! = build_method_type_directly (basetype, ! TREE_TYPE (TREE_TYPE (clone)), ! parmtypes); if (exceptions) TREE_TYPE (clone) = build_exception_variant (TREE_TYPE (clone), exceptions); TREE_TYPE (clone) ! = cp_build_type_attribute_variant (TREE_TYPE (clone), ! TYPE_ATTRIBUTES (TREE_TYPE (fn))); } /* Copy the function parameters. But, DECL_ARGUMENTS on a TEMPLATE_DECL *************** build_clone (fn, name) *** 4170,4178 **** CLASTYPE_METHOD_VEC as well. */ void ! clone_function_decl (fn, update_method_vec_p) ! tree fn; ! int update_method_vec_p; { tree clone; --- 3848,3854 ---- CLASTYPE_METHOD_VEC as well. */ void ! clone_function_decl (tree fn, int update_method_vec_p) { tree clone; *************** clone_function_decl (fn, update_method_v *** 4231,4238 **** clones. */ void ! adjust_clone_args (decl) ! tree decl; { tree clone; --- 3907,3913 ---- clones. */ void ! adjust_clone_args (tree decl) { tree clone; *************** adjust_clone_args (decl) *** 4282,4290 **** clone_parms); TREE_TYPE (clone_parms) = TREE_TYPE (orig_clone_parms); } ! type = build_cplus_method_type (basetype, ! TREE_TYPE (TREE_TYPE (clone)), ! clone_parms); if (exceptions) type = build_exception_variant (type, exceptions); TREE_TYPE (clone) = type; --- 3957,3965 ---- clone_parms); TREE_TYPE (clone_parms) = TREE_TYPE (orig_clone_parms); } ! type = build_method_type_directly (basetype, ! TREE_TYPE (TREE_TYPE (clone)), ! clone_parms); if (exceptions) type = build_exception_variant (type, exceptions); TREE_TYPE (clone) = type; *************** adjust_clone_args (decl) *** 4301,4308 **** in-charge and not-in-charge variant. */ static void ! clone_constructors_and_destructors (t) ! tree t; { tree fns; --- 3976,3982 ---- in-charge and not-in-charge variant. */ static void ! clone_constructors_and_destructors (tree t) { tree fns; *************** clone_constructors_and_destructors (t) *** 4320,4327 **** /* Remove all zero-width bit-fields from T. */ static void ! remove_zero_width_bit_fields (t) ! tree t; { tree *fieldsp; --- 3994,4000 ---- /* Remove all zero-width bit-fields from T. */ static void ! remove_zero_width_bit_fields (tree t) { tree *fieldsp; *************** remove_zero_width_bit_fields (t) *** 4341,4348 **** array whose elements have the indicated class TYPE. */ static bool ! type_requires_array_cookie (type) ! tree type; { tree fns; bool has_two_argument_delete_p = false; --- 4014,4020 ---- array whose elements have the indicated class TYPE. */ static bool ! type_requires_array_cookie (tree type) { tree fns; bool has_two_argument_delete_p = false; *************** check_bases_and_members (tree t) *** 4484,4492 **** on VIRTUALS_P. */ static tree ! create_vtable_ptr (t, virtuals_p) ! tree t; ! tree *virtuals_p; { tree fn; --- 4156,4162 ---- on VIRTUALS_P. */ static tree ! create_vtable_ptr (tree t, tree* virtuals_p) { tree fn; *************** create_vtable_ptr (t, virtuals_p) *** 4520,4526 **** type-based alias analysis code would decide that assignments to the base class vtable pointer can't alias assignments to the derived class vtable pointer, since they have different ! types. Thus, in an derived class destructor, where the base class constructor was inlined, we could generate bad code for setting up the vtable pointer. --- 4190,4196 ---- type-based alias analysis code would decide that assignments to the base class vtable pointer can't alias assignments to the derived class vtable pointer, since they have different ! types. Thus, in a derived class destructor, where the base class constructor was inlined, we could generate bad code for setting up the vtable pointer. *************** create_vtable_ptr (t, virtuals_p) *** 4537,4544 **** DECL_ARTIFICIAL (field) = 1; DECL_FIELD_CONTEXT (field) = t; DECL_FCONTEXT (field) = t; - DECL_ALIGN (field) = TYPE_ALIGN (vtbl_ptr_type_node); - DECL_USER_ALIGN (field) = TYPE_USER_ALIGN (vtbl_ptr_type_node); TYPE_VFIELD (t) = field; --- 4207,4212 ---- *************** create_vtable_ptr (t, virtuals_p) *** 4562,4569 **** complete. */ static void ! fixup_pending_inline (fn) ! tree fn; { if (DECL_PENDING_INLINE_INFO (fn)) { --- 4230,4236 ---- complete. */ static void ! fixup_pending_inline (tree fn) { if (DECL_PENDING_INLINE_INFO (fn)) { *************** fixup_pending_inline (fn) *** 4580,4587 **** complete. */ static void ! fixup_inline_methods (type) ! tree type; { tree method = TYPE_METHODS (type); --- 4247,4253 ---- complete. */ static void ! fixup_inline_methods (tree type) { tree method = TYPE_METHODS (type); *************** fixup_inline_methods (type) *** 4613,4622 **** OFFSET, which is a type offset, is number of bytes. */ static void ! propagate_binfo_offsets (binfo, offset, t) ! tree binfo; ! tree offset; ! tree t; { int i; tree primary_binfo; --- 4279,4285 ---- OFFSET, which is a type offset, is number of bytes. */ static void ! propagate_binfo_offsets (tree binfo, tree offset) { int i; tree primary_binfo; *************** propagate_binfo_offsets (binfo, offset, *** 4657,4695 **** /* Skip virtual bases that aren't our canonical primary base. */ if (TREE_VIA_VIRTUAL (base_binfo) ! && (BINFO_PRIMARY_BASE_OF (base_binfo) != binfo ! || base_binfo != binfo_for_vbase (BINFO_TYPE (base_binfo), t))) continue; ! propagate_binfo_offsets (base_binfo, offset, t); ! } ! } ! ! /* Called via dfs_walk from layout_virtual bases. */ ! ! static tree ! dfs_set_offset_for_unshared_vbases (binfo, data) ! tree binfo; ! void *data; ! { ! /* If this is a virtual base, make sure it has the same offset as ! the shared copy. If it's a primary base, then we know it's ! correct. */ ! if (TREE_VIA_VIRTUAL (binfo)) ! { ! tree t = (tree) data; ! tree vbase; ! tree offset; ! ! vbase = binfo_for_vbase (BINFO_TYPE (binfo), t); ! if (vbase != binfo) ! { ! offset = size_diffop (BINFO_OFFSET (vbase), BINFO_OFFSET (binfo)); ! propagate_binfo_offsets (binfo, offset, t); ! } } - - return NULL_TREE; } /* Set BINFO_OFFSET for all of the virtual bases for RLI->T. Update --- 4320,4330 ---- /* Skip virtual bases that aren't our canonical primary base. */ if (TREE_VIA_VIRTUAL (base_binfo) ! && BINFO_PRIMARY_BASE_OF (base_binfo) != binfo) continue; ! propagate_binfo_offsets (base_binfo, offset); } } /* Set BINFO_OFFSET for all of the virtual bases for RLI->T. Update *************** dfs_set_offset_for_unshared_vbases (binf *** 4699,4705 **** static void layout_virtual_bases (record_layout_info rli, splay_tree offsets) { ! tree vbases; tree t = rli->t; bool first_vbase = true; tree *next_field; --- 4334,4340 ---- static void layout_virtual_bases (record_layout_info rli, splay_tree offsets) { ! tree vbase; tree t = rli->t; bool first_vbase = true; tree *next_field; *************** layout_virtual_bases (record_layout_info *** 4715,4721 **** #ifdef STRUCTURE_SIZE_BOUNDARY /* Packed structures don't need to have minimum size. */ if (! TYPE_PACKED (t)) ! TYPE_ALIGN (t) = MAX (TYPE_ALIGN (t), STRUCTURE_SIZE_BOUNDARY); #endif rli->offset = TYPE_SIZE_UNIT (t); rli->bitpos = bitsize_zero_node; --- 4350,4356 ---- #ifdef STRUCTURE_SIZE_BOUNDARY /* Packed structures don't need to have minimum size. */ if (! TYPE_PACKED (t)) ! TYPE_ALIGN (t) = MAX (TYPE_ALIGN (t), (unsigned) STRUCTURE_SIZE_BOUNDARY); #endif rli->offset = TYPE_SIZE_UNIT (t); rli->bitpos = bitsize_zero_node; *************** layout_virtual_bases (record_layout_info *** 4731,4747 **** /* Go through the virtual bases, allocating space for each virtual base that is not already a primary base class. These are allocated in inheritance graph order. */ ! for (vbases = TYPE_BINFO (t); ! vbases; ! vbases = TREE_CHAIN (vbases)) { ! tree vbase; ! ! if (!TREE_VIA_VIRTUAL (vbases)) continue; - vbase = binfo_for_vbase (BINFO_TYPE (vbases), t); - if (!BINFO_PRIMARY_P (vbase)) { tree basetype = TREE_TYPE (vbase); --- 4366,4376 ---- /* Go through the virtual bases, allocating space for each virtual base that is not already a primary base class. These are allocated in inheritance graph order. */ ! for (vbase = TYPE_BINFO (t); vbase; vbase = TREE_CHAIN (vbase)) { ! if (!TREE_VIA_VIRTUAL (vbase)) continue; if (!BINFO_PRIMARY_P (vbase)) { tree basetype = TREE_TYPE (vbase); *************** layout_virtual_bases (record_layout_info *** 4772,4784 **** first_vbase = false; } } - - /* Now, go through the TYPE_BINFO hierarchy, setting the - BINFO_OFFSETs correctly for all non-primary copies of the virtual - bases and their direct and indirect bases. The ambiguity checks - in lookup_base depend on the BINFO_OFFSETs being set - correctly. */ - dfs_walk (TYPE_BINFO (t), dfs_set_offset_for_unshared_vbases, NULL, t); } /* Returns the offset of the byte just past the end of the base class --- 4401,4406 ---- *************** end_of_base (tree binfo) *** 4805,4813 **** only non-virtual bases are included. */ static tree ! end_of_class (t, include_virtuals_p) ! tree t; ! int include_virtuals_p; { tree result = size_zero_node; tree binfo; --- 4427,4433 ---- only non-virtual bases are included. */ static tree ! end_of_class (tree t, int include_virtuals_p) { tree result = size_zero_node; tree binfo; *************** end_of_class (t, include_virtuals_p) *** 4853,4860 **** subobjects of U. */ static void ! warn_about_ambiguous_bases (t) ! tree t; { int i; tree vbases; --- 4473,4479 ---- subobjects of U. */ static void ! warn_about_ambiguous_bases (tree t) { int i; tree vbases; *************** warn_about_ambiguous_bases (t) *** 4887,4895 **** /* Compare two INTEGER_CSTs K1 and K2. */ static int ! splay_tree_compare_integer_csts (k1, k2) ! splay_tree_key k1; ! splay_tree_key k2; { return tree_int_cst_compare ((tree) k1, (tree) k2); } --- 4506,4512 ---- /* Compare two INTEGER_CSTs K1 and K2. */ static int ! splay_tree_compare_integer_csts (splay_tree_key k1, splay_tree_key k2) { return tree_int_cst_compare ((tree) k1, (tree) k2); } *************** include_empty_classes (record_layout_inf *** 4914,4920 **** if (TREE_CODE (rli_size) == INTEGER_CST && INT_CST_LT_UNSIGNED (rli_size, eoc)) { ! rli->bitpos = round_up (rli->bitpos, BITS_PER_UNIT); rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos, --- 4531,4549 ---- if (TREE_CODE (rli_size) == INTEGER_CST && INT_CST_LT_UNSIGNED (rli_size, eoc)) { ! if (!abi_version_at_least (2)) ! /* In version 1 of the ABI, the size of a class that ends with ! a bitfield was not rounded up to a whole multiple of a ! byte. Because rli_size_unit_so_far returns only the number ! of fully allocated bytes, any extra bits were not included ! in the size. */ ! rli->bitpos = round_down (rli->bitpos, BITS_PER_UNIT); ! else ! /* The size should have been rounded to a whole byte. */ ! my_friendly_assert (tree_int_cst_equal (rli->bitpos, ! round_down (rli->bitpos, ! BITS_PER_UNIT)), ! 20030903); rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos, *************** layout_class_type (tree t, tree *virtual *** 5004,5009 **** --- 4633,4640 ---- } type = TREE_TYPE (field); + + padding = NULL_TREE; /* If this field is a bit-field whose width is greater than its type, then there are some special rules for allocating *************** layout_class_type (tree t, tree *virtual *** 5013,5019 **** { integer_type_kind itk; tree integer_type; ! /* We must allocate the bits as if suitably aligned for the longest integer type that fits in this many bits. type of the field. Then, we are supposed to use the left over --- 4644,4650 ---- { integer_type_kind itk; tree integer_type; ! bool was_unnamed_p = false; /* We must allocate the bits as if suitably aligned for the longest integer type that fits in this many bits. type of the field. Then, we are supposed to use the left over *************** layout_class_type (tree t, tree *virtual *** 5028,5052 **** type that fits. */ integer_type = integer_types[itk - 1]; ! if (abi_version_at_least (2) && TREE_CODE (t) == UNION_TYPE) ! /* In a union, the padding field must have the full width ! of the bit-field; all fields start at offset zero. */ ! padding = DECL_SIZE (field); ! else { ! if (warn_abi && TREE_CODE (t) == UNION_TYPE) ! warning ("size assigned to `%T' may not be " ! "ABI-compliant and may change in a future " ! "version of GCC", ! t); ! padding = size_binop (MINUS_EXPR, DECL_SIZE (field), ! TYPE_SIZE (integer_type)); } DECL_SIZE (field) = TYPE_SIZE (integer_type); DECL_ALIGN (field) = TYPE_ALIGN (integer_type); DECL_USER_ALIGN (field) = TYPE_USER_ALIGN (integer_type); layout_nonempty_base_or_field (rli, field, NULL_TREE, empty_base_offsets); /* Now that layout has been performed, set the size of the field to the size of its declared type; the rest of the field is effectively invisible. */ --- 4659,4705 ---- type that fits. */ integer_type = integer_types[itk - 1]; ! /* Figure out how much additional padding is required. GCC ! 3.2 always created a padding field, even if it had zero ! width. */ ! if (!abi_version_at_least (2) ! || INT_CST_LT (TYPE_SIZE (integer_type), DECL_SIZE (field))) { ! if (abi_version_at_least (2) && TREE_CODE (t) == UNION_TYPE) ! /* In a union, the padding field must have the full width ! of the bit-field; all fields start at offset zero. */ ! padding = DECL_SIZE (field); ! else ! { ! if (warn_abi && TREE_CODE (t) == UNION_TYPE) ! warning ("size assigned to `%T' may not be " ! "ABI-compliant and may change in a future " ! "version of GCC", ! t); ! padding = size_binop (MINUS_EXPR, DECL_SIZE (field), ! TYPE_SIZE (integer_type)); ! } } + #ifdef PCC_BITFIELD_TYPE_MATTERS + /* An unnamed bitfield does not normally affect the + alignment of the containing class on a target where + PCC_BITFIELD_TYPE_MATTERS. But, the C++ ABI does not + make any exceptions for unnamed bitfields when the + bitfields are longer than their types. Therefore, we + temporarily give the field a name. */ + if (PCC_BITFIELD_TYPE_MATTERS && !DECL_NAME (field)) + { + was_unnamed_p = true; + DECL_NAME (field) = make_anon_name (); + } + #endif DECL_SIZE (field) = TYPE_SIZE (integer_type); DECL_ALIGN (field) = TYPE_ALIGN (integer_type); DECL_USER_ALIGN (field) = TYPE_USER_ALIGN (integer_type); layout_nonempty_base_or_field (rli, field, NULL_TREE, empty_base_offsets); + if (was_unnamed_p) + DECL_NAME (field) = NULL_TREE; /* Now that layout has been performed, set the size of the field to the size of its declared type; the rest of the field is effectively invisible. */ *************** layout_class_type (tree t, tree *virtual *** 5062,5072 **** "change in a future version of GCC", field); } else ! { ! padding = NULL_TREE; ! layout_nonempty_base_or_field (rli, field, NULL_TREE, ! empty_base_offsets); ! } /* Remember the location of any empty classes in FIELD. */ if (abi_version_at_least (2)) --- 4715,4722 ---- "change in a future version of GCC", field); } else ! layout_nonempty_base_or_field (rli, field, NULL_TREE, ! empty_base_offsets); /* Remember the location of any empty classes in FIELD. */ if (abi_version_at_least (2)) *************** layout_class_type (tree t, tree *virtual *** 5109,5116 **** char_type_node); DECL_BIT_FIELD (padding_field) = 1; DECL_SIZE (padding_field) = padding; ! DECL_ALIGN (padding_field) = 1; ! DECL_USER_ALIGN (padding_field) = 0; layout_nonempty_base_or_field (rli, padding_field, NULL_TREE, empty_base_offsets); --- 4759,4766 ---- char_type_node); DECL_BIT_FIELD (padding_field) = 1; DECL_SIZE (padding_field) = padding; ! DECL_CONTEXT (padding_field) = t; ! DECL_ARTIFICIAL (padding_field) = 1; layout_nonempty_base_or_field (rli, padding_field, NULL_TREE, empty_base_offsets); *************** layout_class_type (tree t, tree *virtual *** 5197,5202 **** --- 4847,4854 ---- DECL_FIELD_OFFSET (*next_field) = DECL_FIELD_OFFSET (field); DECL_FIELD_BIT_OFFSET (*next_field) = DECL_FIELD_BIT_OFFSET (field); + DECL_SIZE (*next_field) = DECL_SIZE (field); + DECL_MODE (*next_field) = DECL_MODE (field); next_field = &TREE_CHAIN (*next_field); } *************** key_method (tree type) *** 5269,5276 **** is complete. */ void ! finish_struct_1 (t) ! tree t; { tree x; /* A TREE_LIST. The TREE_VALUE of each node is a FUNCTION_DECL. */ --- 4921,4927 ---- is complete. */ void ! finish_struct_1 (tree t) { tree x; /* A TREE_LIST. The TREE_VALUE of each node is a FUNCTION_DECL. */ *************** finish_struct_1 (t) *** 5291,5297 **** /* If this type was previously laid out as a forward reference, make sure we lay it out again. */ TYPE_SIZE (t) = NULL_TREE; - CLASSTYPE_GOT_SEMICOLON (t) = 0; CLASSTYPE_PRIMARY_BINFO (t) = NULL_TREE; fixup_inline_methods (t); --- 4942,4947 ---- *************** finish_struct_1 (t) *** 5306,5324 **** bases and members and add implicitly generated methods. */ check_bases_and_members (t); ! /* Find the key method */ ! if (TYPE_CONTAINS_VPTR_P (t)) { CLASSTYPE_KEY_METHOD (t) = key_method (t); /* If a polymorphic class has no key method, we may emit the vtable ! in every translation unit where the class definition appears. */ if (CLASSTYPE_KEY_METHOD (t) == NULL_TREE) keyed_classes = tree_cons (NULL_TREE, t, keyed_classes); } /* Layout the class itself. */ layout_class_type (t, &virtuals); /* Make sure that we get our own copy of the vfield FIELD_DECL. */ vfield = TYPE_VFIELD (t); --- 4956,4978 ---- bases and members and add implicitly generated methods. */ check_bases_and_members (t); ! /* Find the key method. */ ! if (TYPE_CONTAINS_VPTR_P (t)) { CLASSTYPE_KEY_METHOD (t) = key_method (t); /* If a polymorphic class has no key method, we may emit the vtable ! in every translation unit where the class definition appears. */ if (CLASSTYPE_KEY_METHOD (t) == NULL_TREE) keyed_classes = tree_cons (NULL_TREE, t, keyed_classes); } /* Layout the class itself. */ layout_class_type (t, &virtuals); + if (CLASSTYPE_AS_BASE (t) != t) + /* We use the base type for trivial assignments, and hence it + needs a mode. */ + compute_record_mode (CLASSTYPE_AS_BASE (t)); /* Make sure that we get our own copy of the vfield FIELD_DECL. */ vfield = TYPE_VFIELD (t); *************** finish_struct_1 (t) *** 5356,5362 **** /* We must enter these virtuals into the table. */ if (!CLASSTYPE_HAS_PRIMARY_BASE_P (t)) build_primary_vtable (NULL_TREE, t); ! else if (! BINFO_NEW_VTABLE_MARKED (TYPE_BINFO (t), t)) /* Here we know enough to change the type of our virtual function table, but we will wait until later this function. */ build_primary_vtable (CLASSTYPE_PRIMARY_BINFO (t), t); --- 5010,5016 ---- /* We must enter these virtuals into the table. */ if (!CLASSTYPE_HAS_PRIMARY_BASE_P (t)) build_primary_vtable (NULL_TREE, t); ! else if (! BINFO_NEW_VTABLE_MARKED (TYPE_BINFO (t))) /* Here we know enough to change the type of our virtual function table, but we will wait until later this function. */ build_primary_vtable (CLASSTYPE_PRIMARY_BINFO (t), t); *************** finish_struct_1 (t) *** 5383,5390 **** fn = TREE_CHAIN (fn), vindex += (TARGET_VTABLE_USES_DESCRIPTORS ? TARGET_VTABLE_USES_DESCRIPTORS : 1)) ! if (TREE_CODE (DECL_VINDEX (BV_FN (fn))) != INTEGER_CST) ! DECL_VINDEX (BV_FN (fn)) = build_shared_int_cst (vindex); } finish_struct_bits (t); --- 5037,5053 ---- fn = TREE_CHAIN (fn), vindex += (TARGET_VTABLE_USES_DESCRIPTORS ? TARGET_VTABLE_USES_DESCRIPTORS : 1)) ! { ! tree fndecl = BV_FN (fn); ! ! if (DECL_THUNK_P (fndecl)) ! /* A thunk. We should never be calling this entry directly ! from this vtable -- we'd use the entry for the non ! thunk base function. */ ! DECL_VINDEX (fndecl) = NULL_TREE; ! else if (TREE_CODE (DECL_VINDEX (fndecl)) != INTEGER_CST) ! DECL_VINDEX (fndecl) = build_shared_int_cst (vindex); ! } } finish_struct_bits (t); *************** finish_struct_1 (t) *** 5406,5415 **** n_fields = count_fields (TYPE_FIELDS (t)); if (n_fields > 7) { ! tree field_vec = make_tree_vec (n_fields); ! add_fields_to_vec (TYPE_FIELDS (t), field_vec, 0); ! qsort (&TREE_VEC_ELT (field_vec, 0), n_fields, sizeof (tree), ! (int (*)(const void *, const void *))field_decl_cmp); if (! DECL_LANG_SPECIFIC (TYPE_MAIN_DECL (t))) retrofit_lang_decl (TYPE_MAIN_DECL (t)); DECL_SORTED_FIELDS (TYPE_MAIN_DECL (t)) = field_vec; --- 5069,5080 ---- n_fields = count_fields (TYPE_FIELDS (t)); if (n_fields > 7) { ! struct sorted_fields_type *field_vec = ggc_alloc (sizeof (struct sorted_fields_type) ! + n_fields * sizeof (tree)); ! field_vec->len = n_fields; ! add_fields_to_record_type (TYPE_FIELDS (t), field_vec, 0); ! qsort (field_vec->elts, n_fields, sizeof (tree), ! field_decl_cmp); if (! DECL_LANG_SPECIFIC (TYPE_MAIN_DECL (t))) retrofit_lang_decl (TYPE_MAIN_DECL (t)); DECL_SORTED_FIELDS (TYPE_MAIN_DECL (t)) = field_vec; *************** finish_struct_1 (t) *** 5456,5463 **** order. Rearrange them to declaration order. */ void ! unreverse_member_declarations (t) ! tree t; { tree next; tree prev; --- 5121,5127 ---- order. Rearrange them to declaration order. */ void ! unreverse_member_declarations (tree t) { tree next; tree prev; *************** unreverse_member_declarations (t) *** 5488,5498 **** } tree ! finish_struct (t, attributes) ! tree t, attributes; { ! const char *saved_filename = input_filename; ! int saved_lineno = lineno; /* Now that we've got all the field declarations, reverse everything as necessary. */ --- 5152,5160 ---- } tree ! finish_struct (tree t, tree attributes) { ! location_t saved_loc = input_location; /* Now that we've got all the field declarations, reverse everything as necessary. */ *************** finish_struct (t, attributes) *** 5502,5509 **** /* Nadger the current location so that diagnostics point to the start of the struct, not the end. */ ! input_filename = DECL_SOURCE_FILE (TYPE_NAME (t)); ! lineno = DECL_SOURCE_LINE (TYPE_NAME (t)); if (processing_template_decl) { --- 5164,5170 ---- /* Nadger the current location so that diagnostics point to the start of the struct, not the end. */ ! input_location = DECL_SOURCE_LOCATION (TYPE_NAME (t)); if (processing_template_decl) { *************** finish_struct (t, attributes) *** 5513,5520 **** else finish_struct_1 (t); ! input_filename = saved_filename; ! lineno = saved_lineno; TYPE_BEING_DEFINED (t) = 0; --- 5174,5180 ---- else finish_struct_1 (t); ! input_location = saved_loc; TYPE_BEING_DEFINED (t) = 0; *************** finish_struct (t, attributes) *** 5538,5547 **** before this function is called. */ static tree ! fixed_type_or_null (instance, nonnull, cdtorp) ! tree instance; ! int *nonnull; ! int *cdtorp; { switch (TREE_CODE (instance)) { --- 5198,5204 ---- before this function is called. */ static tree ! fixed_type_or_null (tree instance, int* nonnull, int* cdtorp) { switch (TREE_CODE (instance)) { *************** fixed_type_or_null (instance, nonnull, c *** 5673,5681 **** before this function is called. */ int ! resolves_to_fixed_type_p (instance, nonnull) ! tree instance; ! int *nonnull; { tree t = TREE_TYPE (instance); int cdtorp = 0; --- 5330,5336 ---- before this function is called. */ int ! resolves_to_fixed_type_p (tree instance, int* nonnull) { tree t = TREE_TYPE (instance); int cdtorp = 0; *************** resolves_to_fixed_type_p (instance, nonn *** 5692,5742 **** void ! init_class_processing () { current_class_depth = 0; current_class_stack_size = 10; current_class_stack ! = (class_stack_node_t) xmalloc (current_class_stack_size ! * sizeof (struct class_stack_node)); VARRAY_TREE_INIT (local_classes, 8, "local_classes"); - access_default_node = build_int_2 (0, 0); - access_public_node = build_int_2 (ak_public, 0); - access_protected_node = build_int_2 (ak_protected, 0); - access_private_node = build_int_2 (ak_private, 0); - access_default_virtual_node = build_int_2 (4, 0); - access_public_virtual_node = build_int_2 (4 | ak_public, 0); - access_protected_virtual_node = build_int_2 (4 | ak_protected, 0); - access_private_virtual_node = build_int_2 (4 | ak_private, 0); - ridpointers[(int) RID_PUBLIC] = access_public_node; ridpointers[(int) RID_PRIVATE] = access_private_node; ridpointers[(int) RID_PROTECTED] = access_protected_node; } ! /* Set current scope to NAME. CODE tells us if this is a ! STRUCT, UNION, or ENUM environment. ! ! NAME may end up being NULL_TREE if this is an anonymous or ! late-bound struct (as in "struct { ... } foo;") */ ! ! /* Set global variables CURRENT_CLASS_NAME and CURRENT_CLASS_TYPE to ! appropriate values, found by looking up the type definition of ! NAME (as a CODE). ! ! If MODIFY is 1, we set IDENTIFIER_CLASS_VALUE's of names ! which can be seen locally to the class. They are shadowed by ! any subsequent local declaration (including parameter names). ! ! If MODIFY is 2, we set IDENTIFIER_CLASS_VALUE's of names ! which have static meaning (i.e., static members, static ! member functions, enum declarations, etc). ! ! If MODIFY is 3, we set IDENTIFIER_CLASS_VALUE of names ! which can be seen locally to the class (as in 1), but ! know that we are doing this for declaration purposes ! (i.e. friend foo::bar (int)). So that we may avoid calls to lookup_name, we cache the _TYPE nodes of local TYPE_DECLs in the TREE_TYPE field of the name. --- 5347,5367 ---- void ! init_class_processing (void) { current_class_depth = 0; current_class_stack_size = 10; current_class_stack ! = xmalloc (current_class_stack_size * sizeof (struct class_stack_node)); VARRAY_TREE_INIT (local_classes, 8, "local_classes"); ridpointers[(int) RID_PUBLIC] = access_public_node; ridpointers[(int) RID_PRIVATE] = access_private_node; ridpointers[(int) RID_PROTECTED] = access_protected_node; } ! /* Set global variables CURRENT_CLASS_NAME and CURRENT_CLASS_TYPE as ! appropriate for TYPE. So that we may avoid calls to lookup_name, we cache the _TYPE nodes of local TYPE_DECLs in the TREE_TYPE field of the name. *************** init_class_processing () *** 5750,5758 **** that name becomes `error_mark_node'. */ void ! pushclass (type, modify) ! tree type; ! int modify; { type = TYPE_MAIN_VARIANT (type); --- 5375,5381 ---- that name becomes `error_mark_node'. */ void ! pushclass (tree type) { type = TYPE_MAIN_VARIANT (type); *************** pushclass (type, modify) *** 5761,5769 **** { current_class_stack_size *= 2; current_class_stack ! = (class_stack_node_t) xrealloc (current_class_stack, ! current_class_stack_size ! * sizeof (struct class_stack_node)); } /* Insert a new entry on the class stack. */ --- 5384,5392 ---- { current_class_stack_size *= 2; current_class_stack ! = xrealloc (current_class_stack, ! current_class_stack_size ! * sizeof (struct class_stack_node)); } /* Insert a new entry on the class stack. */ *************** pushclass (type, modify) *** 5796,5834 **** /* If we're about to enter a nested class, clear IDENTIFIER_CLASS_VALUE for the enclosing classes. */ ! if (modify && current_class_depth > 1) clear_identifier_class_values (); pushlevel_class (); ! if (modify) { ! if (type != previous_class_type || current_class_depth > 1) ! push_class_decls (type); ! else { ! tree item; ! ! /* We are re-entering the same class we just left, so we ! don't have to search the whole inheritance matrix to find ! all the decls to bind again. Instead, we install the ! cached class_shadowed list, and walk through it binding ! names and setting up IDENTIFIER_TYPE_VALUEs. */ ! set_class_shadows (previous_class_values); ! for (item = previous_class_values; item; item = TREE_CHAIN (item)) ! { ! tree id = TREE_PURPOSE (item); ! tree decl = TREE_TYPE (item); ! push_class_binding (id, decl); ! if (TREE_CODE (decl) == TYPE_DECL) ! set_identifier_type_value (id, TREE_TYPE (decl)); ! } ! unuse_fields (type); } ! cxx_remember_type_decls (CLASSTYPE_NESTED_UDTS (type)); } } /* When we exit a toplevel class scope, we save the --- 5419,5468 ---- /* If we're about to enter a nested class, clear IDENTIFIER_CLASS_VALUE for the enclosing classes. */ ! if (current_class_depth > 1) clear_identifier_class_values (); pushlevel_class (); ! if (type != previous_class_type || current_class_depth > 1) { ! push_class_decls (type); ! if (CLASSTYPE_TEMPLATE_INFO (type) && !CLASSTYPE_USE_TEMPLATE (type)) { ! /* If we are entering the scope of a template declaration (not a ! specialization), we need to push all the using decls with ! dependent scope too. */ ! tree fields; ! for (fields = TYPE_FIELDS (type); ! fields; fields = TREE_CHAIN (fields)) ! if (TREE_CODE (fields) == USING_DECL && !TREE_TYPE (fields)) ! pushdecl_class_level (fields); } + } + else + { + tree item; ! /* We are re-entering the same class we just left, so we don't ! have to search the whole inheritance matrix to find all the ! decls to bind again. Instead, we install the cached ! class_shadowed list, and walk through it binding names and ! setting up IDENTIFIER_TYPE_VALUEs. */ ! set_class_shadows (previous_class_values); ! for (item = previous_class_values; item; item = TREE_CHAIN (item)) ! { ! tree id = TREE_PURPOSE (item); ! tree decl = TREE_TYPE (item); ! ! push_class_binding (id, decl); ! if (TREE_CODE (decl) == TYPE_DECL) ! set_identifier_type_value (id, decl); ! } ! unuse_fields (type); } + + cxx_remember_type_decls (CLASSTYPE_NESTED_UTDS (type)); } /* When we exit a toplevel class scope, we save the *************** pushclass (type, modify) *** 5837,5843 **** must invalidate our cache. */ void ! invalidate_class_lookup_cache () { tree t; --- 5471,5477 ---- must invalidate our cache. */ void ! invalidate_class_lookup_cache (void) { tree t; *************** invalidate_class_lookup_cache () *** 5853,5859 **** previously, that is the one popped to. */ void ! popclass () { poplevel_class (); pop_class_decls (); --- 5487,5493 ---- previously, that is the one popped to. */ void ! popclass (void) { poplevel_class (); pop_class_decls (); *************** popclass () *** 5871,5884 **** no type. */ int ! currently_open_class (t) ! tree t; { int i; ! if (t == current_class_type) return 1; for (i = 1; i < current_class_depth; ++i) ! if (current_class_stack [i].type == t) return 1; return 0; } --- 5505,5518 ---- no type. */ int ! currently_open_class (tree t) { int i; ! if (current_class_type && same_type_p (t, current_class_type)) return 1; for (i = 1; i < current_class_depth; ++i) ! if (current_class_stack[i].type ! && same_type_p (current_class_stack [i].type, t)) return 1; return 0; } *************** currently_open_class (t) *** 5888,5898 **** something via unqualified lookup. */ tree ! currently_open_derived_class (t) ! tree t; { int i; if (DERIVED_FROM_P (t, current_class_type)) return current_class_type; --- 5522,5538 ---- something via unqualified lookup. */ tree ! currently_open_derived_class (tree t) { int i; + /* The bases of a dependent type are unknown. */ + if (dependent_type_p (t)) + return NULL_TREE; + + if (!current_class_type) + return NULL_TREE; + if (DERIVED_FROM_P (t, current_class_type)) return current_class_type; *************** currently_open_derived_class (t) *** 5904,5919 **** } /* When entering a class scope, all enclosing class scopes' names with ! static meaning (static variables, static functions, types and enumerators) ! have to be visible. This recursive function calls pushclass for all ! enclosing class contexts until global or a local scope is reached. ! TYPE is the enclosed class and MODIFY is equivalent with the pushclass ! formal of the same name. */ void ! push_nested_class (type, modify) ! tree type; ! int modify; { tree context; --- 5544,5556 ---- } /* When entering a class scope, all enclosing class scopes' names with ! static meaning (static variables, static functions, types and ! enumerators) have to be visible. This recursive function calls ! pushclass for all enclosing class contexts until global or a local ! scope is reached. TYPE is the enclosed class. */ void ! push_nested_class (tree type) { tree context; *************** push_nested_class (type, modify) *** 5929,5942 **** context = DECL_CONTEXT (TYPE_MAIN_DECL (type)); if (context && CLASS_TYPE_P (context)) ! push_nested_class (context, 2); ! pushclass (type, modify); } ! /* Undoes a push_nested_class call. MODIFY is passed on to popclass. */ void ! pop_nested_class () { tree context = DECL_CONTEXT (TYPE_MAIN_DECL (current_class_type)); --- 5566,5579 ---- context = DECL_CONTEXT (TYPE_MAIN_DECL (type)); if (context && CLASS_TYPE_P (context)) ! push_nested_class (context); ! pushclass (type); } ! /* Undoes a push_nested_class call. */ void ! pop_nested_class (void) { tree context = DECL_CONTEXT (TYPE_MAIN_DECL (current_class_type)); *************** pop_nested_class () *** 5948,5954 **** /* Returns the number of extern "LANG" blocks we are nested within. */ int ! current_lang_depth () { return VARRAY_ACTIVE_SIZE (current_lang_base); } --- 5585,5591 ---- /* Returns the number of extern "LANG" blocks we are nested within. */ int ! current_lang_depth (void) { return VARRAY_ACTIVE_SIZE (current_lang_base); } *************** current_lang_depth () *** 5957,5964 **** so that behavior of name-mangling machinery is correct. */ void ! push_lang_context (name) ! tree name; { VARRAY_PUSH_TREE (current_lang_base, current_lang_name); --- 5594,5600 ---- so that behavior of name-mangling machinery is correct. */ void ! push_lang_context (tree name) { VARRAY_PUSH_TREE (current_lang_base, current_lang_name); *************** push_lang_context (name) *** 5993,5999 **** /* Get out of the current language scope. */ void ! pop_lang_context () { current_lang_name = VARRAY_TOP_TREE (current_lang_base); VARRAY_POP (current_lang_base); --- 5629,5635 ---- /* Get out of the current language scope. */ void ! pop_lang_context (void) { current_lang_name = VARRAY_TOP_TREE (current_lang_base); VARRAY_POP (current_lang_base); *************** pop_lang_context () *** 6003,6027 **** /* Given an OVERLOAD and a TARGET_TYPE, return the function that matches the TARGET_TYPE. If there is no satisfactory match, return ! error_mark_node, and issue an error message if COMPLAIN is ! nonzero. Permit pointers to member function if PTRMEM is nonzero. ! If TEMPLATE_ONLY, the name of the overloaded function ! was a template-id, and EXPLICIT_TARGS are the explicitly provided template arguments. */ static tree ! resolve_address_of_overloaded_function (target_type, ! overload, ! flags, ! ptrmem, ! template_only, ! explicit_targs) ! tree target_type; ! tree overload; ! tsubst_flags_t flags; ! int ptrmem; ! int template_only; ! tree explicit_targs; { /* Here's what the standard says: --- 5639,5656 ---- /* Given an OVERLOAD and a TARGET_TYPE, return the function that matches the TARGET_TYPE. If there is no satisfactory match, return ! error_mark_node, and issue a error & warning messages under control ! of FLAGS. Permit pointers to member function if FLAGS permits. If ! TEMPLATE_ONLY, the name of the overloaded function was a ! template-id, and EXPLICIT_TARGS are the explicitly provided template arguments. */ static tree ! resolve_address_of_overloaded_function (tree target_type, ! tree overload, ! tsubst_flags_t flags, ! bool template_only, ! tree explicit_targs) { /* Here's what the standard says: *************** resolve_address_of_overloaded_function ( *** 6064,6072 **** && (TREE_CODE (TREE_TYPE (target_type)) == METHOD_TYPE)), 0); ! if (TREE_CODE (overload) == COMPONENT_REF) ! overload = TREE_OPERAND (overload, 1); ! /* Check that the TARGET_TYPE is reasonable. */ if (TYPE_PTRFN_P (target_type)) /* This is OK. */; --- 5693,5700 ---- && (TREE_CODE (TREE_TYPE (target_type)) == METHOD_TYPE)), 0); ! my_friendly_assert (is_overloaded_fn (overload), 20030910); ! /* Check that the TARGET_TYPE is reasonable. */ if (TYPE_PTRFN_P (target_type)) /* This is OK. */; *************** cannot resolve overloaded function `%D' *** 6097,6105 **** { tree fns; ! for (fns = overload; fns; fns = OVL_CHAIN (fns)) { ! tree fn = OVL_FUNCTION (fns); tree fntype; if (TREE_CODE (fn) == TEMPLATE_DECL) --- 5725,5733 ---- { tree fns; ! for (fns = overload; fns; fns = OVL_NEXT (fns)) { ! tree fn = OVL_CURRENT (fns); tree fntype; if (TREE_CODE (fn) == TEMPLATE_DECL) *************** cannot resolve overloaded function `%D' *** 6150,6158 **** if (TREE_CODE (target_fn_type) == METHOD_TYPE) target_arg_types = TREE_CHAIN (target_arg_types); ! for (fns = overload; fns; fns = OVL_CHAIN (fns)) { ! tree fn = OVL_FUNCTION (fns); tree instantiation; tree instantiation_type; tree targs; --- 5778,5786 ---- if (TREE_CODE (target_fn_type) == METHOD_TYPE) target_arg_types = TREE_CHAIN (target_arg_types); ! for (fns = overload; fns; fns = OVL_NEXT (fns)) { ! tree fn = OVL_CURRENT (fns); tree instantiation; tree instantiation_type; tree targs; *************** cannot resolve overloaded function `%D' *** 6176,6182 **** continue; /* Instantiate the template. */ ! instantiation = instantiate_template (fn, targs); if (instantiation == error_mark_node) /* Instantiation failed. */ continue; --- 5804,5810 ---- continue; /* Instantiate the template. */ ! instantiation = instantiate_template (fn, targs, flags); if (instantiation == error_mark_node) /* Instantiation failed. */ continue; *************** cannot resolve overloaded function `%D' *** 6250,6256 **** fn = TREE_PURPOSE (matches); if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn) ! && !ptrmem && !flag_ms_extensions) { static int explained; --- 5878,5884 ---- fn = TREE_PURPOSE (matches); if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn) ! && !(flags & tf_ptrmem_ok) && !flag_ms_extensions) { static int explained; *************** cannot resolve overloaded function `%D' *** 6287,6293 **** /* This function will instantiate the type of the expression given in RHS to match the type of LHSTYPE. If errors exist, then return ! error_mark_node. FLAGS is a bit mask. If ITF_COMPLAIN is set, then we complain on errors. If we are not complaining, never modify rhs, as overload resolution wants to try many possible instantiations, in the hope that at least one will work. --- 5915,5921 ---- /* This function will instantiate the type of the expression given in RHS to match the type of LHSTYPE. If errors exist, then return ! error_mark_node. FLAGS is a bit mask. If TF_ERROR is set, then we complain on errors. If we are not complaining, never modify rhs, as overload resolution wants to try many possible instantiations, in the hope that at least one will work. *************** cannot resolve overloaded function `%D' *** 6296,6328 **** function, or a pointer to member function. */ tree ! instantiate_type (lhstype, rhs, flags) ! tree lhstype, rhs; ! tsubst_flags_t flags; { tsubst_flags_t flags_in = flags; - int complain = (flags & tf_error); - int strict = (flags & tf_no_attributes) - ? COMPARE_NO_ATTRIBUTES : COMPARE_STRICT; - int allow_ptrmem = flags & tf_ptrmem_ok; flags &= ~tf_ptrmem_ok; if (TREE_CODE (lhstype) == UNKNOWN_TYPE) { ! if (complain) error ("not enough type information"); return error_mark_node; } if (TREE_TYPE (rhs) != NULL_TREE && ! (type_unknown_p (rhs))) { ! if (comptypes (lhstype, TREE_TYPE (rhs), strict)) return rhs; ! if (complain) ! error ("argument of type `%T' does not match `%T'", ! TREE_TYPE (rhs), lhstype); ! return error_mark_node; } if (TREE_CODE (rhs) == BASELINK) --- 5924,5959 ---- function, or a pointer to member function. */ tree ! instantiate_type (tree lhstype, tree rhs, tsubst_flags_t flags) { tsubst_flags_t flags_in = flags; flags &= ~tf_ptrmem_ok; if (TREE_CODE (lhstype) == UNKNOWN_TYPE) { ! if (flags & tf_error) error ("not enough type information"); return error_mark_node; } if (TREE_TYPE (rhs) != NULL_TREE && ! (type_unknown_p (rhs))) { ! if (same_type_p (lhstype, TREE_TYPE (rhs))) return rhs; ! if (flag_ms_extensions ! && TYPE_PTRMEMFUNC_P (lhstype) ! && !TYPE_PTRMEMFUNC_P (TREE_TYPE (rhs))) ! /* Microsoft allows `A::f' to be resolved to a ! pointer-to-member. */ ! ; ! else ! { ! if (flags & tf_error) ! error ("argument of type `%T' does not match `%T'", ! TREE_TYPE (rhs), lhstype); ! return error_mark_node; ! } } if (TREE_CODE (rhs) == BASELINK) *************** instantiate_type (lhstype, rhs, flags) *** 6369,6381 **** return instantiate_type (lhstype, rhs, flags); case COMPONENT_REF: ! return instantiate_type (lhstype, TREE_OPERAND (rhs, 1), flags); case OFFSET_REF: rhs = TREE_OPERAND (rhs, 1); if (BASELINK_P (rhs)) ! return instantiate_type (lhstype, BASELINK_FUNCTIONS (rhs), ! flags | allow_ptrmem); /* This can happen if we are forming a pointer-to-member for a member template. */ --- 6000,6020 ---- return instantiate_type (lhstype, rhs, flags); case COMPONENT_REF: ! { ! tree addr = instantiate_type (lhstype, TREE_OPERAND (rhs, 1), flags); ! ! if (addr != error_mark_node ! && TREE_SIDE_EFFECTS (TREE_OPERAND (rhs, 0))) ! /* Do not lose object's side effects. */ ! addr = build (COMPOUND_EXPR, TREE_TYPE (addr), ! TREE_OPERAND (rhs, 0), addr); ! return addr; ! } case OFFSET_REF: rhs = TREE_OPERAND (rhs, 1); if (BASELINK_P (rhs)) ! return instantiate_type (lhstype, BASELINK_FUNCTIONS (rhs), flags_in); /* This can happen if we are forming a pointer-to-member for a member template. */ *************** instantiate_type (lhstype, rhs, flags) *** 6389,6409 **** tree args = TREE_OPERAND (rhs, 1); return ! resolve_address_of_overloaded_function (lhstype, ! fns, ! flags_in, ! allow_ptrmem, ! /*template_only=*/1, args); } case OVERLOAD: return ! resolve_address_of_overloaded_function (lhstype, ! rhs, ! flags_in, ! allow_ptrmem, ! /*template_only=*/0, /*explicit_targs=*/NULL_TREE); case TREE_LIST: --- 6028,6043 ---- tree args = TREE_OPERAND (rhs, 1); return ! resolve_address_of_overloaded_function (lhstype, fns, flags_in, ! /*template_only=*/true, args); } case OVERLOAD: + case FUNCTION_DECL: return ! resolve_address_of_overloaded_function (lhstype, rhs, flags_in, ! /*template_only=*/false, /*explicit_targs=*/NULL_TREE); case TREE_LIST: *************** instantiate_type (lhstype, rhs, flags) *** 6451,6457 **** case ABS_EXPR: case MAX_EXPR: case MIN_EXPR: - case FFS_EXPR: case BIT_AND_EXPR: case BIT_IOR_EXPR: --- 6085,6090 ---- *************** instantiate_type (lhstype, rhs, flags) *** 6465,6471 **** case PREDECREMENT_EXPR: case POSTINCREMENT_EXPR: case POSTDECREMENT_EXPR: ! if (complain) error ("invalid operation on uninstantiated type"); return error_mark_node; --- 6098,6104 ---- case PREDECREMENT_EXPR: case POSTINCREMENT_EXPR: case POSTDECREMENT_EXPR: ! if (flags & tf_error) error ("invalid operation on uninstantiated type"); return error_mark_node; *************** instantiate_type (lhstype, rhs, flags) *** 6481,6494 **** case TRUTH_ANDIF_EXPR: case TRUTH_ORIF_EXPR: case TRUTH_NOT_EXPR: ! if (complain) error ("not enough type information"); return error_mark_node; case COND_EXPR: if (type_unknown_p (TREE_OPERAND (rhs, 0))) { ! if (complain) error ("not enough type information"); return error_mark_node; } --- 6114,6127 ---- case TRUTH_ANDIF_EXPR: case TRUTH_ORIF_EXPR: case TRUTH_NOT_EXPR: ! if (flags & tf_error) error ("not enough type information"); return error_mark_node; case COND_EXPR: if (type_unknown_p (TREE_OPERAND (rhs, 0))) { ! if (flags & tf_error) error ("not enough type information"); return error_mark_node; } *************** instantiate_type (lhstype, rhs, flags) *** 6540,6547 **** all be the same name. Who knows for multiple inheritance). */ static tree ! get_vfield_name (type) ! tree type; { tree binfo = TYPE_BINFO (type); char *buf; --- 6173,6179 ---- all be the same name. Who knows for multiple inheritance). */ static tree ! get_vfield_name (tree type) { tree binfo = TYPE_BINFO (type); char *buf; *************** get_vfield_name (type) *** 6552,6572 **** binfo = BINFO_BASETYPE (binfo, 0); type = BINFO_TYPE (binfo); ! buf = (char *) alloca (sizeof (VFIELD_NAME_FORMAT) ! + TYPE_NAME_LENGTH (type) + 2); sprintf (buf, VFIELD_NAME_FORMAT, IDENTIFIER_POINTER (constructor_name (type))); return get_identifier (buf); } void ! print_class_statistics () { #ifdef GATHER_STATISTICS fprintf (stderr, "convert_harshness = %d\n", n_convert_harshness); fprintf (stderr, "compute_conversion_costs = %d\n", n_compute_conversion_costs); - fprintf (stderr, "build_method_call = %d (inner = %d)\n", - n_build_method_call, n_inner_fields_searched); if (n_vtables) { fprintf (stderr, "vtables = %d; vtable searches = %d\n", --- 6184,6201 ---- binfo = BINFO_BASETYPE (binfo, 0); type = BINFO_TYPE (binfo); ! buf = alloca (sizeof (VFIELD_NAME_FORMAT) + TYPE_NAME_LENGTH (type) + 2); sprintf (buf, VFIELD_NAME_FORMAT, IDENTIFIER_POINTER (constructor_name (type))); return get_identifier (buf); } void ! print_class_statistics (void) { #ifdef GATHER_STATISTICS fprintf (stderr, "convert_harshness = %d\n", n_convert_harshness); fprintf (stderr, "compute_conversion_costs = %d\n", n_compute_conversion_costs); if (n_vtables) { fprintf (stderr, "vtables = %d; vtable searches = %d\n", *************** print_class_statistics () *** 6584,6590 **** the inserted class name is treated as if it were a public member name. */ void ! build_self_reference () { tree name = constructor_name (current_class_type); tree value = build_lang_decl (TYPE_DECL, name, current_class_type); --- 6213,6219 ---- the inserted class name is treated as if it were a public member name. */ void ! build_self_reference (void) { tree name = constructor_name (current_class_type); tree value = build_lang_decl (TYPE_DECL, name, current_class_type); *************** build_self_reference () *** 6607,6614 **** /* Returns 1 if TYPE contains only padding bytes. */ int ! is_empty_class (type) ! tree type; { if (type == error_mark_node) return 0; --- 6236,6242 ---- /* Returns 1 if TYPE contains only padding bytes. */ int ! is_empty_class (tree type) { if (type == error_mark_node) return 0; *************** contains_empty_class_p (tree type) *** 6654,6661 **** a *_TYPE node. NODE can also be a local class. */ tree ! get_enclosing_class (type) ! tree type; { tree node = type; --- 6282,6288 ---- a *_TYPE node. NODE can also be a local class. */ tree ! get_enclosing_class (tree type) { tree node = type; *************** get_enclosing_class (type) *** 6680,6713 **** return NULL_TREE; } - /* Return 1 if TYPE or one of its enclosing classes is derived from BASE. */ - - int - is_base_of_enclosing_class (base, type) - tree base, type; - { - while (type) - { - if (lookup_base (type, base, ba_any, NULL)) - return 1; - - type = get_enclosing_class (type); - } - return 0; - } - /* Note that NAME was looked up while the current class was being defined and that the result of that lookup was DECL. */ void ! maybe_note_name_used_in_class (name, decl) ! tree name; ! tree decl; { splay_tree names_used; /* If we're not defining a class, there's nothing to do. */ ! if (!innermost_scope_is_class_p ()) return; /* If there's already a binding for this NAME, then we don't have --- 6307,6322 ---- return NULL_TREE; } /* Note that NAME was looked up while the current class was being defined and that the result of that lookup was DECL. */ void ! maybe_note_name_used_in_class (tree name, tree decl) { splay_tree names_used; /* If we're not defining a class, there's nothing to do. */ ! if (innermost_scope_kind() != sk_class) return; /* If there's already a binding for this NAME, then we don't have *************** maybe_note_name_used_in_class (name, dec *** 6729,6737 **** to see that the declaration is valid. */ void ! note_name_declared_in_class (name, decl) ! tree name; ! tree decl; { splay_tree names_used; splay_tree_node n; --- 6338,6344 ---- to see that the declaration is valid. */ void ! note_name_declared_in_class (tree name, tree decl) { splay_tree names_used; splay_tree_node n; *************** note_name_declared_in_class (name, decl) *** 6762,6769 **** will return the VAR_DECL for the primary vtable. */ tree ! get_vtbl_decl_for_binfo (binfo) ! tree binfo; { tree decl; --- 6369,6375 ---- will return the VAR_DECL for the primary vtable. */ tree ! get_vtbl_decl_for_binfo (tree binfo) { tree decl; *************** get_vtbl_decl_for_binfo (binfo) *** 6779,6925 **** return decl; } - /* Called from get_primary_binfo via dfs_walk. DATA is a TREE_LIST - who's TREE_PURPOSE is the TYPE of the required primary base and - who's TREE_VALUE is a list of candidate binfos that we fill in. */ ! static tree ! dfs_get_primary_binfo (binfo, data) ! tree binfo; ! void *data; ! { ! tree cons = (tree) data; ! tree primary_base = TREE_PURPOSE (cons); ! ! if (TREE_VIA_VIRTUAL (binfo) ! && same_type_p (BINFO_TYPE (binfo), primary_base)) ! /* This is the right type of binfo, but it might be an unshared ! instance, and the shared instance is later in the dfs walk. We ! must keep looking. */ ! TREE_VALUE (cons) = tree_cons (NULL, binfo, TREE_VALUE (cons)); ! ! return NULL_TREE; ! } ! ! /* Returns the unshared binfo for the primary base of BINFO. Note ! that in a complex hierarchy the resulting BINFO may not actually ! *be* primary. In particular if the resulting BINFO is a virtual ! base, and it occurs elsewhere in the hierarchy, then this ! occurrence may not actually be a primary base in the complete ! object. Check BINFO_PRIMARY_P to be sure. */ tree ! get_primary_binfo (binfo) ! tree binfo; { tree primary_base; ! tree result = NULL_TREE; ! tree virtuals; primary_base = CLASSTYPE_PRIMARY_BINFO (BINFO_TYPE (binfo)); if (!primary_base) return NULL_TREE; ! /* A non-virtual primary base is always a direct base, and easy to ! find. */ ! if (!TREE_VIA_VIRTUAL (primary_base)) ! { ! int i; ! ! /* Scan the direct basetypes until we find a base with the same ! type as the primary base. */ ! for (i = 0; i < BINFO_N_BASETYPES (binfo); ++i) ! { ! tree base_binfo = BINFO_BASETYPE (binfo, i); ! ! if (same_type_p (BINFO_TYPE (base_binfo), ! BINFO_TYPE (primary_base))) ! return base_binfo; ! } ! ! /* We should always find the primary base. */ ! abort (); ! } ! ! /* For a primary virtual base, we have to scan the entire hierarchy ! rooted at BINFO; the virtual base could be an indirect virtual ! base. There could be more than one instance of the primary base ! in the hierarchy, and if one is the canonical binfo we want that ! one. If it exists, it should be the first one we find, but as a ! consistency check we find them all and make sure. */ ! virtuals = build_tree_list (BINFO_TYPE (primary_base), NULL_TREE); ! dfs_walk (binfo, dfs_get_primary_binfo, NULL, virtuals); ! virtuals = TREE_VALUE (virtuals); ! ! /* We must have found at least one instance. */ ! my_friendly_assert (virtuals, 20010612); ! ! if (TREE_CHAIN (virtuals)) ! { ! /* We found more than one instance of the base. We must make ! sure that, if one is the canonical one, it is the first one ! we found. As the chain is in reverse dfs order, that means ! the last on the list. */ ! tree complete_binfo; ! tree canonical; ! ! for (complete_binfo = binfo; ! BINFO_INHERITANCE_CHAIN (complete_binfo); ! complete_binfo = BINFO_INHERITANCE_CHAIN (complete_binfo)) ! continue; ! canonical = binfo_for_vbase (BINFO_TYPE (primary_base), ! BINFO_TYPE (complete_binfo)); ! ! for (; virtuals; virtuals = TREE_CHAIN (virtuals)) ! { ! result = TREE_VALUE (virtuals); ! ! if (canonical == result) ! { ! /* This is the unshared instance. Make sure it was the ! first one found. */ ! my_friendly_assert (!TREE_CHAIN (virtuals), 20010612); ! break; ! } ! } ! } ! else ! result = TREE_VALUE (virtuals); return result; } /* If INDENTED_P is zero, indent to INDENT. Return nonzero. */ static int ! maybe_indent_hierarchy (stream, indent, indented_p) ! FILE *stream; ! int indent; ! int indented_p; { if (!indented_p) fprintf (stream, "%*s", indent, ""); return 1; } ! /* Dump the offsets of all the bases rooted at BINFO (in the hierarchy ! dominated by T) to stderr. INDENT should be zero when called from ! the top level; it is incremented recursively. */ ! static void ! dump_class_hierarchy_r (stream, flags, t, binfo, indent) ! FILE *stream; ! int flags; ! tree t; ! tree binfo; ! int indent; { - int i; int indented = 0; indented = maybe_indent_hierarchy (stream, indent, 0); fprintf (stream, "%s (0x%lx) ", type_as_string (binfo, TFF_PLAIN_IDENTIFIER), (unsigned long) binfo); fprintf (stream, HOST_WIDE_INT_PRINT_DEC, tree_low_cst (BINFO_OFFSET (binfo), 0)); if (is_empty_class (BINFO_TYPE (binfo))) --- 6385,6447 ---- return decl; } ! /* Returns the binfo for the primary base of BINFO. If the resulting ! BINFO is a virtual base, and it is inherited elsewhere in the ! hierarchy, then the returned binfo might not be the primary base of ! BINFO in the complete object. Check BINFO_PRIMARY_P or ! BINFO_LOST_PRIMARY_P to be sure. */ tree ! get_primary_binfo (tree binfo) { tree primary_base; ! tree result; primary_base = CLASSTYPE_PRIMARY_BINFO (BINFO_TYPE (binfo)); if (!primary_base) return NULL_TREE; ! result = copied_binfo (primary_base, binfo); return result; } /* If INDENTED_P is zero, indent to INDENT. Return nonzero. */ static int ! maybe_indent_hierarchy (FILE * stream, int indent, int indented_p) { if (!indented_p) fprintf (stream, "%*s", indent, ""); return 1; } ! /* Dump the offsets of all the bases rooted at BINFO to STREAM. ! INDENT should be zero when called from the top level; it is ! incremented recursively. IGO indicates the next expected BINFO in ! inheritance graph ordering. */ ! static tree ! dump_class_hierarchy_r (FILE *stream, ! int flags, ! tree binfo, ! tree igo, ! int indent) { int indented = 0; + tree base_binfos; indented = maybe_indent_hierarchy (stream, indent, 0); fprintf (stream, "%s (0x%lx) ", type_as_string (binfo, TFF_PLAIN_IDENTIFIER), (unsigned long) binfo); + if (binfo != igo) + { + fprintf (stream, "alternative-path\n"); + return igo; + } + igo = TREE_CHAIN (binfo); + fprintf (stream, HOST_WIDE_INT_PRINT_DEC, tree_low_cst (BINFO_OFFSET (binfo), 0)); if (is_empty_class (BINFO_TYPE (binfo))) *************** dump_class_hierarchy_r (stream, flags, t *** 6927,6941 **** else if (CLASSTYPE_NEARLY_EMPTY_P (BINFO_TYPE (binfo))) fprintf (stream, " nearly-empty"); if (TREE_VIA_VIRTUAL (binfo)) ! { ! tree canonical = binfo_for_vbase (BINFO_TYPE (binfo), t); ! ! fprintf (stream, " virtual"); ! if (canonical == binfo) ! fprintf (stream, " canonical"); ! else ! fprintf (stream, " non-canonical"); ! } fprintf (stream, "\n"); indented = 0; --- 6449,6455 ---- else if (CLASSTYPE_NEARLY_EMPTY_P (BINFO_TYPE (binfo))) fprintf (stream, " nearly-empty"); if (TREE_VIA_VIRTUAL (binfo)) ! fprintf (stream, " virtual"); fprintf (stream, "\n"); indented = 0; *************** dump_class_hierarchy_r (stream, flags, t *** 6992,7029 **** fprintf (stream, "\n"); } ! for (i = 0; i < BINFO_N_BASETYPES (binfo); ++i) ! dump_class_hierarchy_r (stream, flags, ! t, BINFO_BASETYPE (binfo, i), ! indent + 2); } /* Dump the BINFO hierarchy for T. */ static void ! dump_class_hierarchy (t) ! tree t; { - int flags; - FILE *stream = dump_begin (TDI_class, &flags); - - if (!stream) - return; - fprintf (stream, "Class %s\n", type_as_string (t, TFF_PLAIN_IDENTIFIER)); fprintf (stream, " size=%lu align=%lu\n", (unsigned long)(tree_low_cst (TYPE_SIZE (t), 0) / BITS_PER_UNIT), (unsigned long)(TYPE_ALIGN (t) / BITS_PER_UNIT)); ! dump_class_hierarchy_r (stream, flags, t, TYPE_BINFO (t), 0); fprintf (stream, "\n"); ! dump_end (TDI_class, stream); } static void ! dump_array (stream, decl) ! FILE *stream; ! tree decl; { tree inits; int ix; --- 6506,6570 ---- fprintf (stream, "\n"); } + base_binfos = BINFO_BASETYPES (binfo); + if (base_binfos) + { + int ix, n; ! n = TREE_VEC_LENGTH (base_binfos); ! for (ix = 0; ix != n; ix++) ! { ! tree base_binfo = TREE_VEC_ELT (base_binfos, ix); ! ! igo = dump_class_hierarchy_r (stream, flags, base_binfo, ! igo, indent + 2); ! } ! } ! ! return igo; } /* Dump the BINFO hierarchy for T. */ static void ! dump_class_hierarchy_1 (FILE *stream, int flags, tree t) { fprintf (stream, "Class %s\n", type_as_string (t, TFF_PLAIN_IDENTIFIER)); fprintf (stream, " size=%lu align=%lu\n", (unsigned long)(tree_low_cst (TYPE_SIZE (t), 0) / BITS_PER_UNIT), (unsigned long)(TYPE_ALIGN (t) / BITS_PER_UNIT)); ! fprintf (stream, " base size=%lu base align=%lu\n", ! (unsigned long)(tree_low_cst (TYPE_SIZE (CLASSTYPE_AS_BASE (t)), 0) ! / BITS_PER_UNIT), ! (unsigned long)(TYPE_ALIGN (CLASSTYPE_AS_BASE (t)) ! / BITS_PER_UNIT)); ! dump_class_hierarchy_r (stream, flags, TYPE_BINFO (t), TYPE_BINFO (t), 0); fprintf (stream, "\n"); ! } ! ! /* Debug interface to hierarchy dumping. */ ! ! extern void ! debug_class (tree t) ! { ! dump_class_hierarchy_1 (stderr, TDF_SLIM, t); } static void ! dump_class_hierarchy (tree t) ! { ! int flags; ! FILE *stream = dump_begin (TDI_class, &flags); ! ! if (stream) ! { ! dump_class_hierarchy_1 (stream, flags, t); ! dump_end (TDI_class, stream); ! } ! } ! ! static void ! dump_array (FILE * stream, tree decl) { tree inits; int ix; *************** dump_array (stream, decl) *** 7038,7054 **** TFF_PLAIN_IDENTIFIER)); fprintf (stream, "\n"); ! for (ix = 0, inits = TREE_OPERAND (DECL_INITIAL (decl), 1); inits; ix++, inits = TREE_CHAIN (inits)) fprintf (stream, "%-4ld %s\n", (long)(ix * elt), expr_as_string (TREE_VALUE (inits), TFF_PLAIN_IDENTIFIER)); } static void ! dump_vtable (t, binfo, vtable) ! tree t; ! tree binfo; ! tree vtable; { int flags; FILE *stream = dump_begin (TDI_class, &flags); --- 6579,6592 ---- TFF_PLAIN_IDENTIFIER)); fprintf (stream, "\n"); ! for (ix = 0, inits = CONSTRUCTOR_ELTS (DECL_INITIAL (decl)); inits; ix++, inits = TREE_CHAIN (inits)) fprintf (stream, "%-4ld %s\n", (long)(ix * elt), expr_as_string (TREE_VALUE (inits), TFF_PLAIN_IDENTIFIER)); } static void ! dump_vtable (tree t, tree binfo, tree vtable) { int flags; FILE *stream = dump_begin (TDI_class, &flags); *************** dump_vtable (t, binfo, vtable) *** 7078,7086 **** } static void ! dump_vtt (t, vtt) ! tree t; ! tree vtt; { int flags; FILE *stream = dump_begin (TDI_class, &flags); --- 6616,6622 ---- } static void ! dump_vtt (tree t, tree vtt) { int flags; FILE *stream = dump_begin (TDI_class, &flags); *************** dump_vtt (t, vtt) *** 7099,7115 **** dump_end (TDI_class, stream); } /* Virtual function table initialization. */ /* Create all the necessary vtables for T and its base classes. */ static void ! finish_vtbls (t) ! tree t; { tree list; tree vbase; - int i; /* We lay out the primary and secondary vtables in one contiguous vtable. The primary vtable is first, followed by the non-virtual --- 6635,6694 ---- dump_end (TDI_class, stream); } + /* Dump a function or thunk and its thunkees. */ + + static void + dump_thunk (FILE *stream, int indent, tree thunk) + { + static const char spaces[] = " "; + tree name = DECL_NAME (thunk); + tree thunks; + + fprintf (stream, "%.*s%p %s %s", indent, spaces, + (void *)thunk, + !DECL_THUNK_P (thunk) ? "function" + : DECL_THIS_THUNK_P (thunk) ? "this-thunk" : "covariant-thunk", + name ? IDENTIFIER_POINTER (name) : ""); + if (DECL_THUNK_P (thunk)) + { + HOST_WIDE_INT fixed_adjust = THUNK_FIXED_OFFSET (thunk); + tree virtual_adjust = THUNK_VIRTUAL_OFFSET (thunk); + + fprintf (stream, " fixed=" HOST_WIDE_INT_PRINT_DEC, fixed_adjust); + if (!virtual_adjust) + /*NOP*/; + else if (DECL_THIS_THUNK_P (thunk)) + fprintf (stream, " vcall=" HOST_WIDE_INT_PRINT_DEC, + tree_low_cst (virtual_adjust, 0)); + else + fprintf (stream, " vbase=" HOST_WIDE_INT_PRINT_DEC "(%s)", + tree_low_cst (BINFO_VPTR_FIELD (virtual_adjust), 0), + type_as_string (BINFO_TYPE (virtual_adjust), TFF_SCOPE)); + if (THUNK_ALIAS (thunk)) + fprintf (stream, " alias to %p", (void *)THUNK_ALIAS (thunk)); + } + fprintf (stream, "\n"); + for (thunks = DECL_THUNKS (thunk); thunks; thunks = TREE_CHAIN (thunks)) + dump_thunk (stream, indent + 2, thunks); + } + + /* Dump the thunks for FN. */ + + extern void + debug_thunks (tree fn) + { + dump_thunk (stderr, 0, fn); + } + /* Virtual function table initialization. */ /* Create all the necessary vtables for T and its base classes. */ static void ! finish_vtbls (tree t) { tree list; tree vbase; /* We lay out the primary and secondary vtables in one contiguous vtable. The primary vtable is first, followed by the non-virtual *************** finish_vtbls (t) *** 7121,7149 **** /* Then come the virtual bases, also in inheritance graph order. */ for (vbase = TYPE_BINFO (t); vbase; vbase = TREE_CHAIN (vbase)) { - tree real_base; - if (!TREE_VIA_VIRTUAL (vbase)) continue; ! ! /* Although we walk in inheritance order, that might not get the ! canonical base. */ ! real_base = binfo_for_vbase (BINFO_TYPE (vbase), t); ! ! accumulate_vtbl_inits (real_base, real_base, ! TYPE_BINFO (t), t, list); ! } ! ! /* Fill in BINFO_VPTR_FIELD in the immediate binfos for our virtual ! base classes, for the benefit of the debugging backends. */ ! for (i = 0; i < BINFO_N_BASETYPES (TYPE_BINFO (t)); ++i) ! { ! tree base = BINFO_BASETYPE (TYPE_BINFO (t), i); ! if (TREE_VIA_VIRTUAL (base)) ! { ! vbase = binfo_for_vbase (BINFO_TYPE (base), t); ! BINFO_VPTR_FIELD (base) = BINFO_VPTR_FIELD (vbase); ! } } if (TYPE_BINFO_VTABLE (t)) --- 6700,6708 ---- /* Then come the virtual bases, also in inheritance graph order. */ for (vbase = TYPE_BINFO (t); vbase; vbase = TREE_CHAIN (vbase)) { if (!TREE_VIA_VIRTUAL (vbase)) continue; ! accumulate_vtbl_inits (vbase, vbase, TYPE_BINFO (t), t, list); } if (TYPE_BINFO_VTABLE (t)) *************** finish_vtbls (t) *** 7153,7161 **** /* Initialize the vtable for BINFO with the INITS. */ static void ! initialize_vtable (binfo, inits) ! tree binfo; ! tree inits; { tree decl; --- 6712,6718 ---- /* Initialize the vtable for BINFO with the INITS. */ static void ! initialize_vtable (tree binfo, tree inits) { tree decl; *************** initialize_vtable (binfo, inits) *** 7169,7183 **** the INITS. */ static void ! initialize_array (decl, inits) ! tree decl; ! tree inits; { tree context; context = DECL_CONTEXT (decl); DECL_CONTEXT (decl) = NULL_TREE; ! DECL_INITIAL (decl) = build_nt (CONSTRUCTOR, NULL_TREE, inits); TREE_HAS_CONSTRUCTOR (DECL_INITIAL (decl)) = 1; cp_finish_decl (decl, DECL_INITIAL (decl), NULL_TREE, 0); DECL_CONTEXT (decl) = context; --- 6726,6738 ---- the INITS. */ static void ! initialize_array (tree decl, tree inits) { tree context; context = DECL_CONTEXT (decl); DECL_CONTEXT (decl) = NULL_TREE; ! DECL_INITIAL (decl) = build_constructor (NULL_TREE, inits); TREE_HAS_CONSTRUCTOR (DECL_INITIAL (decl)) = 1; cp_finish_decl (decl, DECL_INITIAL (decl), NULL_TREE, 0); DECL_CONTEXT (decl) = context; *************** initialize_array (decl, inits) *** 7197,7204 **** Secondary VTTs look like complete object VTTs without part 4. */ static void ! build_vtt (t) ! tree t; { tree inits; tree type; --- 6752,6758 ---- Secondary VTTs look like complete object VTTs without part 4. */ static void ! build_vtt (tree t) { tree inits; tree type; *************** build_vtt (t) *** 7228,7268 **** dump_vtt (t, vtt); } - /* The type corresponding to BASE_BINFO is a base of the type of BINFO, but - from within some hierarchy which is inherited from the type of BINFO. - Return BASE_BINFO's equivalent binfo from the hierarchy dominated by - BINFO. */ - - static tree - get_original_base (base_binfo, binfo) - tree base_binfo; - tree binfo; - { - tree derived; - int ix; - - if (same_type_p (BINFO_TYPE (base_binfo), BINFO_TYPE (binfo))) - return binfo; - if (TREE_VIA_VIRTUAL (base_binfo)) - return binfo_for_vbase (BINFO_TYPE (base_binfo), BINFO_TYPE (binfo)); - derived = get_original_base (BINFO_INHERITANCE_CHAIN (base_binfo), binfo); - - for (ix = 0; ix != BINFO_N_BASETYPES (derived); ix++) - if (same_type_p (BINFO_TYPE (base_binfo), - BINFO_TYPE (BINFO_BASETYPE (derived, ix)))) - return BINFO_BASETYPE (derived, ix); - abort (); - return NULL; - } - /* When building a secondary VTT, BINFO_VTABLE is set to a TREE_LIST with PURPOSE the RTTI_BINFO, VALUE the real vtable pointer for this binfo, and CHAIN the vtable pointer for this binfo after construction is complete. VALUE can also be another BINFO, in which case we recurse. */ static tree ! binfo_ctor_vtable (binfo) ! tree binfo; { tree vt; --- 6782,6794 ---- dump_vtt (t, vtt); } /* When building a secondary VTT, BINFO_VTABLE is set to a TREE_LIST with PURPOSE the RTTI_BINFO, VALUE the real vtable pointer for this binfo, and CHAIN the vtable pointer for this binfo after construction is complete. VALUE can also be another BINFO, in which case we recurse. */ static tree ! binfo_ctor_vtable (tree binfo) { tree vt; *************** binfo_ctor_vtable (binfo) *** 7289,7299 **** vtables for the BINFO-in-T variant. */ static tree * ! build_vtt_inits (binfo, t, inits, index) ! tree binfo; ! tree t; ! tree *inits; ! tree *index; { int i; tree b; --- 6815,6821 ---- vtables for the BINFO-in-T variant. */ static tree * ! build_vtt_inits (tree binfo, tree t, tree* inits, tree* index) { int i; tree b; *************** build_vtt_inits (binfo, t, inits, index) *** 7369,7381 **** if (top_level_p) for (b = TYPE_BINFO (BINFO_TYPE (binfo)); b; b = TREE_CHAIN (b)) { - tree vbase; - if (!TREE_VIA_VIRTUAL (b)) continue; ! vbase = binfo_for_vbase (BINFO_TYPE (b), t); ! inits = build_vtt_inits (vbase, t, inits, index); } if (!top_level_p) --- 6891,6900 ---- if (top_level_p) for (b = TYPE_BINFO (BINFO_TYPE (binfo)); b; b = TREE_CHAIN (b)) { if (!TREE_VIA_VIRTUAL (b)) continue; ! inits = build_vtt_inits (b, t, inits, index); } if (!top_level_p) *************** build_vtt_inits (binfo, t, inits, index) *** 7400,7408 **** TREE_TOP_LEVEL flag indicates that this is the primary VTT. */ static tree ! dfs_build_secondary_vptr_vtt_inits (binfo, data) ! tree binfo; ! void *data; { tree l; tree t; --- 6919,6925 ---- TREE_TOP_LEVEL flag indicates that this is the primary VTT. */ static tree ! dfs_build_secondary_vptr_vtt_inits (tree binfo, void* data) { tree l; tree t; *************** dfs_build_secondary_vptr_vtt_inits (binf *** 7414,7420 **** t = TREE_CHAIN (l); top_level_p = VTT_TOP_LEVEL_P (l); ! SET_BINFO_MARKED (binfo); /* We don't care about bases that don't have vtables. */ if (!TYPE_VFIELD (BINFO_TYPE (binfo))) --- 6931,6937 ---- t = TREE_CHAIN (l); top_level_p = VTT_TOP_LEVEL_P (l); ! BINFO_MARKED (binfo) = 1; /* We don't care about bases that don't have vtables. */ if (!TYPE_VFIELD (BINFO_TYPE (binfo))) *************** dfs_build_secondary_vptr_vtt_inits (binf *** 7465,7478 **** hierarchy. */ static tree ! dfs_ctor_vtable_bases_queue_p (binfo, data) ! tree binfo; ! void *data; { ! if (TREE_VIA_VIRTUAL (binfo)) ! /* Get the shared version. */ ! binfo = binfo_for_vbase (BINFO_TYPE (binfo), TREE_PURPOSE ((tree) data)); ! if (!BINFO_MARKED (binfo) == VTT_MARKED_BINFO_P ((tree) data)) return NULL_TREE; return binfo; --- 6982,6992 ---- hierarchy. */ static tree ! dfs_ctor_vtable_bases_queue_p (tree derived, int ix, ! void* data) { ! tree binfo = BINFO_BASETYPE (derived, ix); ! if (!BINFO_MARKED (binfo) == VTT_MARKED_BINFO_P ((tree) data)) return NULL_TREE; return binfo; *************** dfs_ctor_vtable_bases_queue_p (binfo, da *** 7484,7494 **** TREE_VALUE is the TREE_TYPE of the base whose sub vtt was generated. */ static tree ! dfs_fixup_binfo_vtbls (binfo, data) ! tree binfo; ! void *data; { ! CLEAR_BINFO_MARKED (binfo); /* We don't care about bases that don't have vtables. */ if (!TYPE_VFIELD (BINFO_TYPE (binfo))) --- 6998,7006 ---- TREE_VALUE is the TREE_TYPE of the base whose sub vtt was generated. */ static tree ! dfs_fixup_binfo_vtbls (tree binfo, void* data) { ! BINFO_MARKED (binfo) = 0; /* We don't care about bases that don't have vtables. */ if (!TYPE_VFIELD (BINFO_TYPE (binfo))) *************** dfs_fixup_binfo_vtbls (binfo, data) *** 7509,7517 **** hierarchy dominated by T. */ static void ! build_ctor_vtbl_group (binfo, t) ! tree binfo; ! tree t; { tree list; tree type; --- 7021,7027 ---- hierarchy dominated by T. */ static void ! build_ctor_vtbl_group (tree binfo, tree t) { tree list; tree type; *************** build_ctor_vtbl_group (binfo, t) *** 7541,7554 **** vbase = TREE_CHAIN (vbase)) { tree b; - tree orig_base; if (!TREE_VIA_VIRTUAL (vbase)) continue; ! b = binfo_for_vbase (BINFO_TYPE (vbase), t); ! orig_base = binfo_for_vbase (BINFO_TYPE (vbase), BINFO_TYPE (binfo)); ! accumulate_vtbl_inits (b, orig_base, binfo, t, list); } inits = TREE_VALUE (list); --- 7051,7062 ---- vbase = TREE_CHAIN (vbase)) { tree b; if (!TREE_VIA_VIRTUAL (vbase)) continue; ! b = copied_binfo (vbase, binfo); ! accumulate_vtbl_inits (b, vbase, binfo, t, list); } inits = TREE_VALUE (list); *************** build_ctor_vtbl_group (binfo, t) *** 7574,7585 **** but are not necessarily the same in terms of layout. */ static void ! accumulate_vtbl_inits (binfo, orig_binfo, rtti_binfo, t, inits) ! tree binfo; ! tree orig_binfo; ! tree rtti_binfo; ! tree t; ! tree inits; { int i; int ctor_vtbl_p = !same_type_p (BINFO_TYPE (rtti_binfo), t); --- 7082,7092 ---- but are not necessarily the same in terms of layout. */ static void ! accumulate_vtbl_inits (tree binfo, ! tree orig_binfo, ! tree rtti_binfo, ! tree t, ! tree inits) { int i; int ctor_vtbl_p = !same_type_p (BINFO_TYPE (rtti_binfo), t); *************** accumulate_vtbl_inits (binfo, orig_binfo *** 7628,7639 **** the BINFO vtable. */ static tree ! dfs_accumulate_vtbl_inits (binfo, orig_binfo, rtti_binfo, t, l) ! tree binfo; ! tree orig_binfo; ! tree rtti_binfo; ! tree t; ! tree l; { tree inits = NULL_TREE; tree vtbl = NULL_TREE; --- 7135,7145 ---- the BINFO vtable. */ static tree ! dfs_accumulate_vtbl_inits (tree binfo, ! tree orig_binfo, ! tree rtti_binfo, ! tree t, ! tree l) { tree inits = NULL_TREE; tree vtbl = NULL_TREE; *************** dfs_accumulate_vtbl_inits (binfo, orig_b *** 7680,7687 **** either case, we share our vtable with LAST, i.e. the derived-most base within B of which we are a primary. */ if (b == rtti_binfo ! || (b && binfo_for_vbase (BINFO_TYPE (b), ! BINFO_TYPE (rtti_binfo)))) /* Just set our BINFO_VTABLE to point to LAST, as we may not have set LAST's BINFO_VTABLE yet. We'll extract the actual vptr in binfo_ctor_vtable after everything's been set up. */ --- 7186,7193 ---- either case, we share our vtable with LAST, i.e. the derived-most base within B of which we are a primary. */ if (b == rtti_binfo ! || (b && purpose_member (BINFO_TYPE (b), ! CLASSTYPE_VBASECLASSES (BINFO_TYPE (rtti_binfo))))) /* Just set our BINFO_VTABLE to point to LAST, as we may not have set LAST's BINFO_VTABLE yet. We'll extract the actual vptr in binfo_ctor_vtable after everything's been set up. */ *************** dfs_accumulate_vtbl_inits (binfo, orig_b *** 7689,7695 **** /* Otherwise, this is case 3 and we get our own. */ } ! else if (!BINFO_NEW_VTABLE_MARKED (orig_binfo, BINFO_TYPE (rtti_binfo))) return inits; if (!vtbl) --- 7195,7201 ---- /* Otherwise, this is case 3 and we get our own. */ } ! else if (!BINFO_NEW_VTABLE_MARKED (orig_binfo)) return inits; if (!vtbl) *************** dfs_accumulate_vtbl_inits (binfo, orig_b *** 7755,7766 **** constructed. */ static tree ! build_vtbl_initializer (binfo, orig_binfo, t, rtti_binfo, non_fn_entries_p) ! tree binfo; ! tree orig_binfo; ! tree t; ! tree rtti_binfo; ! int *non_fn_entries_p; { tree v, b; tree vfun_inits; --- 7261,7271 ---- constructed. */ static tree ! build_vtbl_initializer (tree binfo, ! tree orig_binfo, ! tree t, ! tree rtti_binfo, ! int* non_fn_entries_p) { tree v, b; tree vfun_inits; *************** build_vtbl_initializer (binfo, orig_binf *** 7793,7799 **** for (vbase = CLASSTYPE_VBASECLASSES (t); vbase; vbase = TREE_CHAIN (vbase)) ! CLEAR_BINFO_VTABLE_PATH_MARKED (TREE_VALUE (vbase)); /* If the target requires padding between data entries, add that now. */ if (TARGET_VTABLE_DATA_ENTRY_DISTANCE > 1) --- 7298,7304 ---- for (vbase = CLASSTYPE_VBASECLASSES (t); vbase; vbase = TREE_CHAIN (vbase)) ! BINFO_VTABLE_PATH_MARKED (TREE_VALUE (vbase)) = 0; /* If the target requires padding between data entries, add that now. */ if (TARGET_VTABLE_DATA_ENTRY_DISTANCE > 1) *************** build_vtbl_initializer (binfo, orig_binf *** 7824,7834 **** { tree delta; tree vcall_index; ! tree fn; tree init = NULL_TREE; fn = BV_FN (v); ! /* If the only definition of this function signature along our primary base chain is from a lost primary, this vtable slot will never be used, so just zero it out. This is important to avoid --- 7329,7351 ---- { tree delta; tree vcall_index; ! tree fn, fn_original; tree init = NULL_TREE; fn = BV_FN (v); ! fn_original = fn; ! if (DECL_THUNK_P (fn)) ! { ! if (!DECL_NAME (fn)) ! finish_thunk (fn); ! if (THUNK_ALIAS (fn)) ! { ! fn = THUNK_ALIAS (fn); ! BV_FN (v) = fn; ! } ! fn_original = THUNK_TARGET (fn); ! } ! /* If the only definition of this function signature along our primary base chain is from a lost primary, this vtable slot will never be used, so just zero it out. This is important to avoid *************** build_vtbl_initializer (binfo, orig_binf *** 7842,7848 **** for (b = binfo; ; b = get_primary_binfo (b)) { /* We found a defn before a lost primary; go ahead as normal. */ ! if (look_for_overrides_here (BINFO_TYPE (b), fn)) break; /* The nearest definition is from a lost primary; clear the --- 7359,7365 ---- for (b = binfo; ; b = get_primary_binfo (b)) { /* We found a defn before a lost primary; go ahead as normal. */ ! if (look_for_overrides_here (BINFO_TYPE (b), fn_original)) break; /* The nearest definition is from a lost primary; clear the *************** build_vtbl_initializer (binfo, orig_binf *** 7866,7875 **** /* You can't call an abstract virtual function; it's abstract. So, we replace these functions with __pure_virtual. */ ! if (DECL_PURE_VIRTUAL_P (fn)) fn = abort_fndecl; else if (!integer_zerop (delta) || vcall_index) ! fn = make_thunk (fn, delta, vcall_index); /* Take the address of the function, considering it to be of an appropriate generic type. */ init = build1 (ADDR_EXPR, vfunc_ptr_type_node, fn); --- 7383,7396 ---- /* You can't call an abstract virtual function; it's abstract. So, we replace these functions with __pure_virtual. */ ! if (DECL_PURE_VIRTUAL_P (fn_original)) fn = abort_fndecl; else if (!integer_zerop (delta) || vcall_index) ! { ! fn = make_thunk (fn, /*this_adjusting=*/1, delta, vcall_index); ! if (!DECL_NAME (fn)) ! finish_thunk (fn); ! } /* Take the address of the function, considering it to be of an appropriate generic type. */ init = build1 (ADDR_EXPR, vfunc_ptr_type_node, fn); *************** build_vtbl_initializer (binfo, orig_binf *** 7914,7922 **** offsets in BINFO, which is in the hierarchy dominated by T. */ static void ! build_vcall_and_vbase_vtbl_entries (binfo, vid) ! tree binfo; ! vtbl_init_data *vid; { tree b; --- 7435,7441 ---- offsets in BINFO, which is in the hierarchy dominated by T. */ static void ! build_vcall_and_vbase_vtbl_entries (tree binfo, vtbl_init_data* vid) { tree b; *************** build_vcall_and_vbase_vtbl_entries (binf *** 7938,7946 **** where the next vbase offset will go. */ static void ! build_vbase_offset_vtbl_entries (binfo, vid) ! tree binfo; ! vtbl_init_data *vid; { tree vbase; tree t; --- 7457,7463 ---- where the next vbase offset will go. */ static void ! build_vbase_offset_vtbl_entries (tree binfo, vtbl_init_data* vid) { tree vbase; tree t; *************** build_vbase_offset_vtbl_entries (binfo, *** 7990,8002 **** /* Find the instance of this virtual base in the complete object. */ ! b = binfo_for_vbase (BINFO_TYPE (vbase), t); /* If we've already got an offset for this virtual base, we don't need another one. */ if (BINFO_VTABLE_PATH_MARKED (b)) continue; ! SET_BINFO_VTABLE_PATH_MARKED (b); /* Figure out where we can find this vbase offset. */ delta = size_binop (MULT_EXPR, --- 7507,7519 ---- /* Find the instance of this virtual base in the complete object. */ ! b = copied_binfo (vbase, binfo); /* If we've already got an offset for this virtual base, we don't need another one. */ if (BINFO_VTABLE_PATH_MARKED (b)) continue; ! BINFO_VTABLE_PATH_MARKED (b) = 1; /* Figure out where we can find this vbase offset. */ delta = size_binop (MULT_EXPR, *************** build_vbase_offset_vtbl_entries (binfo, *** 8008,8023 **** if (binfo != TYPE_BINFO (t)) { - tree orig_vbase; - - /* Find the instance of this virtual base in the type of BINFO. */ - orig_vbase = binfo_for_vbase (BINFO_TYPE (vbase), - BINFO_TYPE (binfo)); - /* The vbase offset had better be the same. */ ! if (!tree_int_cst_equal (delta, ! BINFO_VPTR_FIELD (orig_vbase))) ! abort (); } /* The next vbase will come at a more negative offset. */ --- 7525,7534 ---- if (binfo != TYPE_BINFO (t)) { /* The vbase offset had better be the same. */ ! my_friendly_assert (tree_int_cst_equal (delta, ! BINFO_VPTR_FIELD (vbase)), ! 20030202); } /* The next vbase will come at a more negative offset. */ *************** build_vbase_offset_vtbl_entries (binfo, *** 8044,8052 **** to VID->INITS. */ static void ! build_vcall_offset_vtbl_entries (binfo, vid) ! tree binfo; ! vtbl_init_data *vid; { /* We only need these entries if this base is a virtual base. We compute the indices -- but do not add to the vtable -- when --- 7555,7561 ---- to VID->INITS. */ static void ! build_vcall_offset_vtbl_entries (tree binfo, vtbl_init_data* vid) { /* We only need these entries if this base is a virtual base. We compute the indices -- but do not add to the vtable -- when *************** build_vcall_offset_vtbl_entries (binfo, *** 8084,8092 **** /* Build vcall offsets, starting with those for BINFO. */ static void ! add_vcall_offset_vtbl_entries_r (binfo, vid) ! tree binfo; ! vtbl_init_data *vid; { int i; tree primary_binfo; --- 7593,7599 ---- /* Build vcall offsets, starting with those for BINFO. */ static void ! add_vcall_offset_vtbl_entries_r (tree binfo, vtbl_init_data* vid) { int i; tree primary_binfo; *************** add_vcall_offset_vtbl_entries_r (binfo, *** 8120,8128 **** /* Called from build_vcall_offset_vtbl_entries_r. */ static void ! add_vcall_offset_vtbl_entries_1 (binfo, vid) ! tree binfo; ! vtbl_init_data* vid; { /* Make entries for the rest of the virtuals. */ if (abi_version_at_least (2)) --- 7627,7633 ---- /* Called from build_vcall_offset_vtbl_entries_r. */ static void ! add_vcall_offset_vtbl_entries_1 (tree binfo, vtbl_init_data* vid) { /* Make entries for the rest of the virtuals. */ if (abi_version_at_least (2)) *************** add_vcall_offset_vtbl_entries_1 (binfo, *** 8177,8184 **** if (vid->ctor_vtbl_p) /* For a ctor vtable we need the equivalent binfo within the hierarchy where rtti_binfo is the most derived type. */ ! non_primary_binfo = get_original_base ! (non_primary_binfo, TYPE_BINFO (BINFO_TYPE (vid->rtti_binfo))); for (base_virtuals = BINFO_VIRTUALS (binfo), derived_virtuals = BINFO_VIRTUALS (non_primary_binfo), --- 7682,7689 ---- if (vid->ctor_vtbl_p) /* For a ctor vtable we need the equivalent binfo within the hierarchy where rtti_binfo is the most derived type. */ ! non_primary_binfo ! = original_binfo (non_primary_binfo, vid->rtti_binfo); for (base_virtuals = BINFO_VIRTUALS (binfo), derived_virtuals = BINFO_VIRTUALS (non_primary_binfo), *************** add_vcall_offset (tree orig_fn, tree bin *** 8269,8288 **** vcall_offset = fold (build1 (NOP_EXPR, vtable_entry_type, vcall_offset)); } ! /* Add the intiailizer to the vtable. */ *vid->last_init = build_tree_list (NULL_TREE, vcall_offset); vid->last_init = &TREE_CHAIN (*vid->last_init); } } ! /* Return vtbl initializers for the RTTI entries coresponding to the BINFO's vtable. The RTTI entries should indicate the object given by VID->rtti_binfo. */ static void ! build_rtti_vtbl_entries (binfo, vid) ! tree binfo; ! vtbl_init_data *vid; { tree b; tree t; --- 7774,7791 ---- vcall_offset = fold (build1 (NOP_EXPR, vtable_entry_type, vcall_offset)); } ! /* Add the initializer to the vtable. */ *vid->last_init = build_tree_list (NULL_TREE, vcall_offset); vid->last_init = &TREE_CHAIN (*vid->last_init); } } ! /* Return vtbl initializers for the RTTI entries corresponding to the BINFO's vtable. The RTTI entries should indicate the object given by VID->rtti_binfo. */ static void ! build_rtti_vtbl_entries (tree binfo, vtbl_init_data* vid) { tree b; tree t; diff -Nrc3pad gcc-3.3.3/gcc/cp/config-lang.in gcc-3.4.0/gcc/cp/config-lang.in *** gcc-3.3.3/gcc/cp/config-lang.in 2003-06-23 20:31:55.000000000 +0000 --- gcc-3.4.0/gcc/cp/config-lang.in 2003-06-23 20:52:12.000000000 +0000 *************** *** 1,21 **** # Top level configure fragment for GNU C++. ! # Copyright (C) 1994, 1995, 1997, 1998, 2000, 2001 # Free Software Foundation, Inc. ! #This file is part of GNU CC. ! #GNU CC is free software; you can redistribute it and/or modify #it under the terms of the GNU General Public License as published by #the Free Software Foundation; either version 2, or (at your option) #any later version. ! #GNU CC is distributed in the hope that it will be useful, #but WITHOUT ANY WARRANTY; without even the implied warranty of #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #GNU General Public License for more details. #You should have received a copy of the GNU General Public License ! #along with GNU CC; see the file COPYING. If not, write to #the Free Software Foundation, 59 Temple Place - Suite 330, #Boston, MA 02111-1307, USA. --- 1,21 ---- # Top level configure fragment for GNU C++. ! # Copyright (C) 1994, 1995, 1997, 1998, 2000, 2001, 2002 # Free Software Foundation, Inc. ! #This file is part of GCC. ! #GCC is free software; you can redistribute it and/or modify #it under the terms of the GNU General Public License as published by #the Free Software Foundation; either version 2, or (at your option) #any later version. ! #GCC is distributed in the hope that it will be useful, #but WITHOUT ANY WARRANTY; without even the implied warranty of #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #GNU General Public License for more details. #You should have received a copy of the GNU General Public License ! #along with GCC; see the file COPYING. If not, write to #the Free Software Foundation, 59 Temple Place - Suite 330, #Boston, MA 02111-1307, USA. *************** compilers="cc1plus\$(exeext)" *** 32,37 **** stagestuff="g++\$(exeext) g++-cross\$(exeext) cc1plus\$(exeext)" ! target_libs="${libstdcxx_version} target-gperf" ! gtfiles="\$(srcdir)/cp/mangle.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.h \$(srcdir)/cp/lex.h \$(srcdir)/cp/call.c \$(srcdir)/cp/decl.c \$(srcdir)/cp/decl2.c \$(srcdir)/cp/parse.y \$(srcdir)/cp/pt.c \$(srcdir)/cp/repo.c \$(srcdir)/cp/spew.c \$(srcdir)/cp/tree.c \$(srcdir)/c-common.c \$(srcdir)/c-common.h \$(srcdir)/c-pragma.c" --- 32,37 ---- stagestuff="g++\$(exeext) g++-cross\$(exeext) cc1plus\$(exeext)" ! target_libs="target-libstdc++-v3 target-gperf" ! gtfiles="\$(srcdir)/cp/mangle.c \$(srcdir)/cp/name-lookup.h \$(srcdir)/cp/name-lookup.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.h \$(srcdir)/cp/lex.h \$(srcdir)/cp/call.c \$(srcdir)/cp/decl.c \$(srcdir)/cp/decl2.c \$(srcdir)/cp/pt.c \$(srcdir)/cp/repo.c \$(srcdir)/cp/semantics.c \$(srcdir)/cp/tree.c \$(srcdir)/cp/parser.c \$(srcdir)/cp/method.c \$(srcdir)/c-common.c \$(srcdir)/c-common.h \$(srcdir)/c-pragma.c" diff -Nrc3pad gcc-3.3.3/gcc/cp/cp-lang.c gcc-3.4.0/gcc/cp/cp-lang.c *** gcc-3.3.3/gcc/cp/cp-lang.c 2003-12-22 21:00:53.000000000 +0000 --- gcc-3.4.0/gcc/cp/cp-lang.c 2003-12-23 16:53:47.000000000 +0000 *************** *** 2,41 **** Copyright 2001, 2002 Free Software Foundation, Inc. Contributed by Alexandre Oliva ! This file is part of GNU CC. ! GNU CC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "config.h" #include "system.h" #include "tree.h" #include "cp-tree.h" #include "c-common.h" #include "toplev.h" #include "langhooks.h" #include "langhooks-def.h" ! static HOST_WIDE_INT cxx_get_alias_set PARAMS ((tree)); ! static bool ok_to_generate_alias_set_for_type PARAMS ((tree)); ! static bool cxx_warn_unused_global_decl PARAMS ((tree)); ! static tree cp_expr_size PARAMS ((tree)); ! static bool cp_var_mod_type_p PARAMS ((tree)); #undef LANG_HOOKS_NAME #define LANG_HOOKS_NAME "GNU C++" #undef LANG_HOOKS_INIT #define LANG_HOOKS_INIT cxx_init #undef LANG_HOOKS_FINISH --- 2,51 ---- Copyright 2001, 2002 Free Software Foundation, Inc. Contributed by Alexandre Oliva ! This file is part of GCC. ! GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "config.h" #include "system.h" + #include "coretypes.h" + #include "tm.h" #include "tree.h" #include "cp-tree.h" #include "c-common.h" #include "toplev.h" #include "langhooks.h" #include "langhooks-def.h" + #include "diagnostic.h" + #include "cxx-pretty-print.h" ! enum c_language_kind c_language = clk_cxx; ! ! static HOST_WIDE_INT cxx_get_alias_set (tree); ! static bool ok_to_generate_alias_set_for_type (tree); ! static bool cxx_warn_unused_global_decl (tree); ! static tree cp_expr_size (tree); ! static size_t cp_tree_size (enum tree_code); ! static bool cp_var_mod_type_p (tree); ! static void cxx_initialize_diagnostics (diagnostic_context *); #undef LANG_HOOKS_NAME #define LANG_HOOKS_NAME "GNU C++" + #undef LANG_HOOKS_TREE_SIZE + #define LANG_HOOKS_TREE_SIZE cp_tree_size #undef LANG_HOOKS_INIT #define LANG_HOOKS_INIT cxx_init #undef LANG_HOOKS_FINISH *************** static bool cp_var_mod_type_p PARAMS ((t *** 43,51 **** #undef LANG_HOOKS_CLEAR_BINDING_STACK #define LANG_HOOKS_CLEAR_BINDING_STACK pop_everything #undef LANG_HOOKS_INIT_OPTIONS ! #define LANG_HOOKS_INIT_OPTIONS cxx_init_options ! #undef LANG_HOOKS_DECODE_OPTION ! #define LANG_HOOKS_DECODE_OPTION c_common_decode_option #undef LANG_HOOKS_POST_OPTIONS #define LANG_HOOKS_POST_OPTIONS c_common_post_options #undef LANG_HOOKS_GET_ALIAS_SET --- 53,67 ---- #undef LANG_HOOKS_CLEAR_BINDING_STACK #define LANG_HOOKS_CLEAR_BINDING_STACK pop_everything #undef LANG_HOOKS_INIT_OPTIONS ! #define LANG_HOOKS_INIT_OPTIONS c_common_init_options ! #undef LANG_HOOKS_INITIALIZE_DIAGNOSTICS ! #define LANG_HOOKS_INITIALIZE_DIAGNOSTICS cxx_initialize_diagnostics ! #undef LANG_HOOKS_HANDLE_OPTION ! #define LANG_HOOKS_HANDLE_OPTION c_common_handle_option ! #undef LANG_HOOKS_HANDLE_FILENAME ! #define LANG_HOOKS_HANDLE_FILENAME c_common_handle_filename ! #undef LANG_HOOKS_MISSING_ARGUMENT ! #define LANG_HOOKS_MISSING_ARGUMENT c_common_missing_argument #undef LANG_HOOKS_POST_OPTIONS #define LANG_HOOKS_POST_OPTIONS c_common_post_options #undef LANG_HOOKS_GET_ALIAS_SET *************** static bool cp_var_mod_type_p PARAMS ((t *** 66,73 **** #define LANG_HOOKS_MAYBE_BUILD_CLEANUP cxx_maybe_build_cleanup #undef LANG_HOOKS_TRUTHVALUE_CONVERSION #define LANG_HOOKS_TRUTHVALUE_CONVERSION c_common_truthvalue_conversion - #undef LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES - #define LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES cxx_insert_default_attributes #undef LANG_HOOKS_UNSAFE_FOR_REEVAL #define LANG_HOOKS_UNSAFE_FOR_REEVAL c_common_unsafe_for_reeval #undef LANG_HOOKS_SET_DECL_ASSEMBLER_NAME --- 82,87 ---- *************** static bool cp_var_mod_type_p PARAMS ((t *** 88,97 **** --- 102,119 ---- #define LANG_HOOKS_DECL_PRINTABLE_NAME cxx_printable_name #undef LANG_HOOKS_PRINT_ERROR_FUNCTION #define LANG_HOOKS_PRINT_ERROR_FUNCTION cxx_print_error_function + #undef LANG_HOOKS_BUILTIN_TYPE_DECLS + #define LANG_HOOKS_BUILTIN_TYPE_DECLS cxx_builtin_type_decls + #undef LANG_HOOKS_PUSHLEVEL + #define LANG_HOOKS_PUSHLEVEL lhd_do_nothing_i + #undef LANG_HOOKS_POPLEVEL + #define LANG_HOOKS_POPLEVEL lhd_do_nothing_iii_return_null_tree #undef LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL #define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL cxx_warn_unused_global_decl #undef LANG_HOOKS_WRITE_GLOBALS #define LANG_HOOKS_WRITE_GLOBALS lhd_do_nothing + #undef LANG_HOOKS_DECL_UNINIT + #define LANG_HOOKS_DECL_UNINIT c_decl_uninit #undef LANG_HOOKS_FUNCTION_INIT *************** static bool cp_var_mod_type_p PARAMS ((t *** 99,104 **** --- 121,131 ---- #undef LANG_HOOKS_FUNCTION_FINAL #define LANG_HOOKS_FUNCTION_FINAL cxx_pop_function_context + #undef LANG_HOOKS_RTL_EXPAND_START + #define LANG_HOOKS_RTL_EXPAND_START cxx_expand_function_start + #undef LANG_HOOKS_RTL_EXPAND_STMT + #define LANG_HOOKS_RTL_EXPAND_STMT expand_stmt + /* Attribute hooks. */ #undef LANG_HOOKS_COMMON_ATTRIBUTE_TABLE #define LANG_HOOKS_COMMON_ATTRIBUTE_TABLE c_common_attribute_table *************** static bool cp_var_mod_type_p PARAMS ((t *** 129,134 **** --- 156,163 ---- #define LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P anon_aggr_type_p #undef LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P #define LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P cp_var_mod_type_p + #undef LANG_HOOKS_TREE_INLINING_ESTIMATE_NUM_INSNS + #define LANG_HOOKS_TREE_INLINING_ESTIMATE_NUM_INSNS c_estimate_num_insns #undef LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN #define LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN cp_dump_tree #undef LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN *************** static bool cp_var_mod_type_p PARAMS ((t *** 136,141 **** --- 165,175 ---- #undef LANG_HOOKS_EXPR_SIZE #define LANG_HOOKS_EXPR_SIZE cp_expr_size + #undef LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR + #define LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR cxx_callgraph_analyze_expr + #undef LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION + #define LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION expand_body + #undef LANG_HOOKS_MAKE_TYPE #define LANG_HOOKS_MAKE_TYPE cxx_make_type #undef LANG_HOOKS_TYPE_FOR_MODE *************** static bool cp_var_mod_type_p PARAMS ((t *** 152,157 **** --- 186,193 ---- #define LANG_HOOKS_INCOMPLETE_TYPE_ERROR cxx_incomplete_type_error #undef LANG_HOOKS_TYPE_PROMOTES_TO #define LANG_HOOKS_TYPE_PROMOTES_TO cxx_type_promotes_to + #undef LANG_HOOKS_REGISTER_BUILTIN_TYPE + #define LANG_HOOKS_REGISTER_BUILTIN_TYPE c_register_builtin_type /* Each front end provides its own hooks, for toplev.c. */ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; *************** const char *const tree_code_name[] = { *** 201,208 **** Return TRUE if T safe for aliasing FALSE otherwise. */ static bool ! ok_to_generate_alias_set_for_type (t) ! tree t; { if (TYPE_PTRMEMFUNC_P (t)) return true; --- 237,243 ---- Return TRUE if T safe for aliasing FALSE otherwise. */ static bool ! ok_to_generate_alias_set_for_type (tree t) { if (TYPE_PTRMEMFUNC_P (t)) return true; *************** ok_to_generate_alias_set_for_type (t) *** 255,263 **** /* Special routine to get the alias set for C++. */ static HOST_WIDE_INT ! cxx_get_alias_set (t) ! tree t; { if (/* It's not yet safe to use alias sets for some classes in C++. */ !ok_to_generate_alias_set_for_type (t) /* Nor is it safe to use alias sets for pointers-to-member --- 290,304 ---- /* Special routine to get the alias set for C++. */ static HOST_WIDE_INT ! cxx_get_alias_set (tree t) { + if (TREE_CODE (t) == RECORD_TYPE + && TYPE_CONTEXT (t) && CLASS_TYPE_P (TYPE_CONTEXT (t)) + && CLASSTYPE_AS_BASE (TYPE_CONTEXT (t)) == t) + /* The base variant of a type must be in the same alias set as the + complete type. */ + return get_alias_set (TYPE_CONTEXT (t)); + if (/* It's not yet safe to use alias sets for some classes in C++. */ !ok_to_generate_alias_set_for_type (t) /* Nor is it safe to use alias sets for pointers-to-member *************** cxx_get_alias_set (t) *** 273,280 **** /* Called from check_global_declarations. */ static bool ! cxx_warn_unused_global_decl (decl) ! tree decl; { if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl)) return false; --- 314,320 ---- /* Called from check_global_declarations. */ static bool ! cxx_warn_unused_global_decl (tree decl) { if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl)) return false; *************** cxx_warn_unused_global_decl (decl) *** 293,300 **** might have allocated something there. */ static tree ! cp_expr_size (exp) ! tree exp; { if (CLASS_TYPE_P (TREE_TYPE (exp))) { --- 333,339 ---- might have allocated something there. */ static tree ! cp_expr_size (tree exp) { if (CLASS_TYPE_P (TREE_TYPE (exp))) { *************** cp_expr_size (exp) *** 308,320 **** abort (); /* This would be wrong for a type with virtual bases, but they are caught by the abort above. */ ! return CLASSTYPE_SIZE_UNIT (TREE_TYPE (exp)); } else /* Use the default code. */ return lhd_expr_size (exp); } /* Returns true if T is a variably modified type, in the sense of C99. This routine needs only check cases that cannot be handled by the language-independent logic in tree-inline.c. */ --- 347,379 ---- abort (); /* This would be wrong for a type with virtual bases, but they are caught by the abort above. */ ! return (is_empty_class (TREE_TYPE (exp)) ! ? size_zero_node ! : CLASSTYPE_SIZE_UNIT (TREE_TYPE (exp))); } else /* Use the default code. */ return lhd_expr_size (exp); } + /* Langhook for tree_size: determine size of our 'x' and 'c' nodes. */ + static size_t + cp_tree_size (enum tree_code code) + { + switch (code) + { + case PTRMEM_CST: return sizeof (struct ptrmem_cst); + case BASELINK: return sizeof (struct tree_baselink); + case TEMPLATE_PARM_INDEX: return sizeof (template_parm_index); + case DEFAULT_ARG: return sizeof (struct tree_default_arg); + case OVERLOAD: return sizeof (struct tree_overload); + case WRAPPER: return sizeof (struct tree_wrapper); + default: + abort (); + } + /* NOTREACHED */ + } + /* Returns true if T is a variably modified type, in the sense of C99. This routine needs only check cases that cannot be handled by the language-independent logic in tree-inline.c. */ *************** cp_var_mod_type_p (tree type) *** 324,330 **** { /* If TYPE is a pointer-to-member, it is variably modified if either the class or the member are variably modified. */ ! if (TYPE_PTRMEM_P (type) || TYPE_PTRMEMFUNC_P (type)) return (variably_modified_type_p (TYPE_PTRMEM_CLASS_TYPE (type)) || variably_modified_type_p (TYPE_PTRMEM_POINTED_TO_TYPE (type))); --- 383,389 ---- { /* If TYPE is a pointer-to-member, it is variably modified if either the class or the member are variably modified. */ ! if (TYPE_PTR_TO_MEMBER_P (type)) return (variably_modified_type_p (TYPE_PTRMEM_CLASS_TYPE (type)) || variably_modified_type_p (TYPE_PTRMEM_POINTED_TO_TYPE (type))); *************** cp_var_mod_type_p (tree type) *** 332,334 **** --- 391,414 ---- return false; } + /* Stub routine to tell people that this doesn't work yet. */ + void + c_reset_state (void) + { + sorry ("inter-module optimisations not implemented yet"); + } + + /* Construct a C++-aware pretty-printer for CONTEXT. It is assumed + that CONTEXT->printer is an already constructed basic pretty_printer. */ + static void + cxx_initialize_diagnostics (diagnostic_context *context) + { + pretty_printer *base = context->printer; + cxx_pretty_printer *pp = xmalloc (sizeof (cxx_pretty_printer)); + memcpy (pp_base (pp), base, sizeof (pretty_printer)); + pp_cxx_pretty_printer_init (pp); + context->printer = (pretty_printer *) pp; + + /* It is safe to free this object because it was previously malloc()'d. */ + free (base); + } diff -Nrc3pad gcc-3.3.3/gcc/cp/cp-tree.def gcc-3.4.0/gcc/cp/cp-tree.def *** gcc-3.3.3/gcc/cp/cp-tree.def 2003-03-09 21:35:33.000000000 +0000 --- gcc-3.4.0/gcc/cp/cp-tree.def 2003-08-15 12:15:56.000000000 +0000 *************** *** 1,24 **** /* This file contains the definitions and documentation for the additional tree codes used in the GNU C++ compiler (see tree.def for the standard codes). ! Copyright (C) 1987, 1988, 1990, 1993, 1997, 1998, ! 1999, 2000, 2001 Free Software Foundation, Inc. Hacked by Michael Tiemann (tiemann@cygnus.com) ! This file is part of GNU CC. ! GNU CC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ --- 1,24 ---- /* This file contains the definitions and documentation for the additional tree codes used in the GNU C++ compiler (see tree.def for the standard codes). ! Copyright (C) 1987, 1988, 1990, 1993, 1997, 1998, 2003, ! 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. Hacked by Michael Tiemann (tiemann@cygnus.com) ! This file is part of GCC. ! GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ *************** Boston, MA 02111-1307, USA. */ *** 26,53 **** /* An OFFSET_REF is used in two situations: 1. An expression of the form `A::m' where `A' is a class and `m' is ! a non-static data member. In this case, operand 0 will be a ! TYPE (corresponding to `A') and operand 1 will be a FIELD_DECL ! (corresponding to `m'. The expression is a pointer-to-member if its address is taken, but simply denotes a member of the object if its address isnot taken. In the latter case, resolve_offset_ref is used to convert it to a representation of the member referred to by the OFFSET_REF. 2. An expression of the form `x.*p'. In this case, operand 0 will be an expression corresponding to `x' and operand 1 will be an ! expression with pointer-to-member type. ! ! OFFSET_REFs are only used during the parsing phase; once semantic ! analysis has taken place they are eliminated. */ DEFTREECODE (OFFSET_REF, "offset_ref", 'r', 2) /* A pointer-to-member constant. For a pointer-to-member constant `X::Y' The PTRMEM_CST_CLASS is the RECORD_TYPE for `X' and the PTRMEM_CST_MEMBER is the _DECL for `Y'. */ ! DEFTREECODE (PTRMEM_CST, "ptrmem_cst", 'c', 2) /* For NEW_EXPR, operand 0 is the placement list. Operand 1 is the new-declarator. --- 26,53 ---- /* An OFFSET_REF is used in two situations: 1. An expression of the form `A::m' where `A' is a class and `m' is ! a non-static member. In this case, operand 0 will be a TYPE ! (corresponding to `A') and operand 1 will be a FIELD_DECL, ! BASELINK, or TEMPLATE_ID_EXPR (corresponding to `m'). The expression is a pointer-to-member if its address is taken, but simply denotes a member of the object if its address isnot taken. In the latter case, resolve_offset_ref is used to convert it to a representation of the member referred to by the OFFSET_REF. + + This form is only used during the parsing phase; once semantic + analysis has taken place they are eliminated. 2. An expression of the form `x.*p'. In this case, operand 0 will be an expression corresponding to `x' and operand 1 will be an ! expression with pointer-to-member type. */ DEFTREECODE (OFFSET_REF, "offset_ref", 'r', 2) /* A pointer-to-member constant. For a pointer-to-member constant `X::Y' The PTRMEM_CST_CLASS is the RECORD_TYPE for `X' and the PTRMEM_CST_MEMBER is the _DECL for `Y'. */ ! DEFTREECODE (PTRMEM_CST, "ptrmem_cst", 'c', 0) /* For NEW_EXPR, operand 0 is the placement list. Operand 1 is the new-declarator. *************** DEFTREECODE (DELETE_EXPR, "dl_expr", 'e' *** 62,69 **** DEFTREECODE (VEC_DELETE_EXPR, "vec_dl_expr", 'e', 2) /* Value is reference to particular overloaded class method. ! Operand 0 is the class name (an IDENTIFIER_NODE); ! operand 1 is the field (also an IDENTIFIER_NODE). The COMPLEXITY field holds the class level (usually 0). */ DEFTREECODE (SCOPE_REF, "scope_ref", 'r', 2) --- 62,68 ---- DEFTREECODE (VEC_DELETE_EXPR, "vec_dl_expr", 'e', 2) /* Value is reference to particular overloaded class method. ! Operand 0 is the class, operand 1 is the field The COMPLEXITY field holds the class level (usually 0). */ DEFTREECODE (SCOPE_REF, "scope_ref", 'r', 2) *************** DEFTREECODE (THROW_EXPR, "throw_expr", ' *** 89,94 **** --- 88,97 ---- these to avoid actually creating instances of the empty classes. */ DEFTREECODE (EMPTY_CLASS_EXPR, "empty_class_expr", 'e', 0) + /* A DECL which is really just a placeholder for an expression. Used to + implement non-class scope anonymous unions. */ + DEFTREECODE (ALIAS_DECL, "alias_decl", 'd', 0) + /* A reference to a member function or member functions from a base class. BASELINK_FUNCTIONS gives the FUNCTION_DECL, TEMPLATE_DECL, OVERLOAD, or TEMPLATE_ID_EXPR corresponding to the *************** DEFTREECODE (EMPTY_CLASS_EXPR, "empty_cl *** 101,107 **** the type of the expression. This type is either a FUNCTION_TYPE, METHOD_TYPE, or `unknown_type_node' indicating that the function is overloaded. */ ! DEFTREECODE (BASELINK, "baselink", 'e', 3) /* Template definition. The following fields have the specified uses, although there are other macros in cp-tree.h that should be used for --- 104,110 ---- the type of the expression. This type is either a FUNCTION_TYPE, METHOD_TYPE, or `unknown_type_node' indicating that the function is overloaded. */ ! DEFTREECODE (BASELINK, "baselink", 'x', 0) /* Template definition. The following fields have the specified uses, although there are other macros in cp-tree.h that should be used for *************** DEFTREECODE (TEMPLATE_DECL, "template_de *** 153,168 **** The LEVEL is the level of the parameter when we are worrying about the types of things; the ORIG_LEVEL is the level when we are worrying about instantiating things. */ ! DEFTREECODE (TEMPLATE_PARM_INDEX, "template_parm_index", 'x', ! /* The addition of (sizeof(tree) - 1) in the next expression ! is to handle the case when padding pushes us past an even ! multiple of sizeof(tree). */ ! /* We used to try to calculate this using ! 1+3*sizeof(HOST_WIDE_INT), but that fails if alignment ! makes it bigger. */ ! ((sizeof (template_parm_index) - sizeof (struct tree_common)) ! + sizeof (tree) - 1) ! / sizeof (tree)) /* Index into a template parameter list. This parameter must be a type. The TYPE_FIELDS value will be a TEMPLATE_PARM_INDEX. */ --- 156,162 ---- The LEVEL is the level of the parameter when we are worrying about the types of things; the ORIG_LEVEL is the level when we are worrying about instantiating things. */ ! DEFTREECODE (TEMPLATE_PARM_INDEX, "template_parm_index", 'x', 0) /* Index into a template parameter list. This parameter must be a type. The TYPE_FIELDS value will be a TEMPLATE_PARM_INDEX. */ *************** DEFTREECODE (UNBOUND_CLASS_TEMPLATE, "un *** 201,236 **** DEFTREECODE (TYPEOF_TYPE, "typeof_type", 't', 0) /* A using declaration. DECL_INITIAL contains the specified scope. ! This is not an alias, but is later expanded into multiple aliases. */ DEFTREECODE (USING_DECL, "using_decl", 'd', 0) /* A using directive. The operand is USING_STMT_NAMESPACE. */ DEFTREECODE (USING_STMT, "using_directive", 'e', 1) /* An un-parsed default argument. Looks like an IDENTIFIER_NODE. */ ! DEFTREECODE (DEFAULT_ARG, "default_arg", 'x', 2) /* A template-id, like foo. The first operand is the template. ! The second is the TREE_LIST or TREE_VEC of explicitly specified ! arguments. The template will be a FUNCTION_DECL, TEMPLATE_DECL, or ! an OVERLOAD. If the template-id refers to a member template, the ! template may be an IDENTIFIER_NODE. In an uninstantiated template, ! the template may be a LOOKUP_EXPR. */ DEFTREECODE (TEMPLATE_ID_EXPR, "template_id_expr", 'e', 2) /* A list-like node for chaining overloading candidates. TREE_TYPE is the original name, and the parameter is the FUNCTION_DECL. */ ! DEFTREECODE (OVERLOAD, "overload", 'x', 1) /* A generic wrapper for something not tree that we want to include in tree structure. */ ! DEFTREECODE (WRAPPER, "wrapper", 'x', 1) ! ! /* Used to represent deferred name lookup for dependent names while ! parsing a template declaration. The first argument is an ! IDENTIFIER_NODE for the name in question. The TREE_TYPE is ! unused. */ ! DEFTREECODE (LOOKUP_EXPR, "lookup_expr", 'e', 1) /* A whole bunch of tree codes for the initial, superficial parsing of templates. */ --- 195,225 ---- DEFTREECODE (TYPEOF_TYPE, "typeof_type", 't', 0) /* A using declaration. DECL_INITIAL contains the specified scope. ! This is not an alias, but is later expanded into multiple aliases. ! The decl will have a NULL_TYPE iff the scope is a dependent scope, ! otherwise it will have a void type. */ DEFTREECODE (USING_DECL, "using_decl", 'd', 0) /* A using directive. The operand is USING_STMT_NAMESPACE. */ DEFTREECODE (USING_STMT, "using_directive", 'e', 1) /* An un-parsed default argument. Looks like an IDENTIFIER_NODE. */ ! DEFTREECODE (DEFAULT_ARG, "default_arg", 'x', 0) /* A template-id, like foo. The first operand is the template. ! The second is NULL if there are no explicit arguments, or a ! TREE_VEC of arguments. The template will be a FUNCTION_DECL, ! TEMPLATE_DECL, or an OVERLOAD. If the template-id refers to a ! member template, the template may be an IDENTIFIER_NODE. */ DEFTREECODE (TEMPLATE_ID_EXPR, "template_id_expr", 'e', 2) /* A list-like node for chaining overloading candidates. TREE_TYPE is the original name, and the parameter is the FUNCTION_DECL. */ ! DEFTREECODE (OVERLOAD, "overload", 'x', 0) /* A generic wrapper for something not tree that we want to include in tree structure. */ ! DEFTREECODE (WRAPPER, "wrapper", 'x', 0) /* A whole bunch of tree codes for the initial, superficial parsing of templates. */ *************** DEFTREECODE (DOTSTAR_EXPR, "dotstar_expr *** 244,253 **** DEFTREECODE (TYPEID_EXPR, "typeid_expr", 'e', 1) DEFTREECODE (PSEUDO_DTOR_EXPR, "pseudo_dtor_expr", 'e', 3) /* CTOR_INITIALIZER is a placeholder in template code for a call to setup_vtbl_pointer (and appears in all functions, not just ctors). */ DEFTREECODE (CTOR_INITIALIZER, "ctor_initializer", 'e', 1) - DEFTREECODE (RETURN_INIT, "return_init", 'e', 2) DEFTREECODE (TRY_BLOCK, "try_block", 'e', 2) DEFTREECODE (EH_SPEC_BLOCK, "eh_spec_block", 'e', 2) /* A HANDLER wraps a catch handler for the HANDLER_TYPE. If this is --- 233,252 ---- DEFTREECODE (TYPEID_EXPR, "typeid_expr", 'e', 1) DEFTREECODE (PSEUDO_DTOR_EXPR, "pseudo_dtor_expr", 'e', 3) + /* A placeholder for an expression that is not type-dependent, but + does occur in a template. When an expression that is not + type-dependent appears in a larger expression, we must compute the + type of that larger expression. That computation would normally + modify the original expression, which would change the mangling of + that expression if it appeared in a template argument list. In + that situation, we create a NON_DEPENDENT_EXPR to take the place of + the original expression. The expression is the only operand -- it + is only needed for diagnostics. */ + DEFTREECODE (NON_DEPENDENT_EXPR, "non_dependent_expr", 'e', 1) + /* CTOR_INITIALIZER is a placeholder in template code for a call to setup_vtbl_pointer (and appears in all functions, not just ctors). */ DEFTREECODE (CTOR_INITIALIZER, "ctor_initializer", 'e', 1) DEFTREECODE (TRY_BLOCK, "try_block", 'e', 2) DEFTREECODE (EH_SPEC_BLOCK, "eh_spec_block", 'e', 2) /* A HANDLER wraps a catch handler for the HANDLER_TYPE. If this is diff -Nrc3pad gcc-3.3.3/gcc/cp/cp-tree.h gcc-3.4.0/gcc/cp/cp-tree.h *** gcc-3.3.3/gcc/cp/cp-tree.h 2004-01-30 00:41:01.000000000 +0000 --- gcc-3.4.0/gcc/cp/cp-tree.h 2004-03-20 00:13:08.000000000 +0000 *************** *** 1,38 **** /* Definitions for C++ parsing and type checking. Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, ! 2000, 2001, 2002, 2003 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) ! This file is part of GNU CC. ! GNU CC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GCC_CP_TREE_H #define GCC_CP_TREE_H #include "function.h" #include "hashtab.h" #include "splay-tree.h" #include "varray.h" - #ifndef __GNUC__ - #error "You should be using 'make bootstrap' -- see installation instructions" - #endif - #include "c-common.h" struct diagnostic_context; --- 1,36 ---- /* Definitions for C++ parsing and type checking. Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, ! 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) ! This file is part of GCC. ! GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GCC_CP_TREE_H #define GCC_CP_TREE_H + #include "ggc.h" #include "function.h" #include "hashtab.h" #include "splay-tree.h" #include "varray.h" #include "c-common.h" + #include "name-lookup.h" struct diagnostic_context; *************** struct diagnostic_context; *** 41,53 **** IDENTIFIER_MARKED (IDENTIFIER_NODEs) NEW_EXPR_USE_GLOBAL (in NEW_EXPR). DELETE_EXPR_USE_GLOBAL (in DELETE_EXPR). ! LOOKUP_EXPR_GLOBAL (in LOOKUP_EXPR). TREE_INDIRECT_USING (in NAMESPACE_DECL). ICS_USER_FLAG (in _CONV) CLEANUP_P (in TRY_BLOCK) AGGR_INIT_VIA_CTOR_P (in AGGR_INIT_EXPR) PTRMEM_OK_P (in ADDR_EXPR, OFFSET_REF) PARMLIST_ELLIPSIS_P (in PARMLIST) 1: IDENTIFIER_VIRTUAL_P. TI_PENDING_TEMPLATE_FLAG. TEMPLATE_PARMS_FOR_INLINE. --- 39,53 ---- IDENTIFIER_MARKED (IDENTIFIER_NODEs) NEW_EXPR_USE_GLOBAL (in NEW_EXPR). DELETE_EXPR_USE_GLOBAL (in DELETE_EXPR). ! COMPOUND_EXPR_OVERLOADED (in COMPOUND_EXPR). TREE_INDIRECT_USING (in NAMESPACE_DECL). ICS_USER_FLAG (in _CONV) CLEANUP_P (in TRY_BLOCK) AGGR_INIT_VIA_CTOR_P (in AGGR_INIT_EXPR) PTRMEM_OK_P (in ADDR_EXPR, OFFSET_REF) PARMLIST_ELLIPSIS_P (in PARMLIST) + DECL_PRETTY_FUNCTION_P (in VAR_DECL) + KOENIG_LOOKUP_P (in CALL_EXPR) 1: IDENTIFIER_VIRTUAL_P. TI_PENDING_TEMPLATE_FLAG. TEMPLATE_PARMS_FOR_INLINE. *************** struct diagnostic_context; *** 55,67 **** (TREE_CALLS_NEW) (in _EXPR or _REF) (commented-out). TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (in _TYPE). ICS_ELLIPSIS_FLAG (in _CONV) ! BINFO_ACCESS (in BINFO) DECL_INITIALIZED_P (in VAR_DECL) 2: IDENTIFIER_OPNAME_P. TYPE_POLYMORPHIC_P (in _TYPE) ICS_THIS_FLAG (in _CONV) BINFO_LOST_PRIMARY_P (in BINFO) TREE_PARMLIST (in TREE_LIST) 3: TYPE_USES_VIRTUAL_BASECLASSES (in a class TYPE). BINFO_VTABLE_PATH_MARKED. BINFO_PUSHDECLS_MARKED. --- 55,68 ---- (TREE_CALLS_NEW) (in _EXPR or _REF) (commented-out). TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (in _TYPE). ICS_ELLIPSIS_FLAG (in _CONV) ! BINFO_DEPENDENT_BASE_P (in BINFO) DECL_INITIALIZED_P (in VAR_DECL) 2: IDENTIFIER_OPNAME_P. TYPE_POLYMORPHIC_P (in _TYPE) ICS_THIS_FLAG (in _CONV) BINFO_LOST_PRIMARY_P (in BINFO) TREE_PARMLIST (in TREE_LIST) + DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (in VAR_DECL) 3: TYPE_USES_VIRTUAL_BASECLASSES (in a class TYPE). BINFO_VTABLE_PATH_MARKED. BINFO_PUSHDECLS_MARKED. *************** struct diagnostic_context; *** 75,90 **** NEED_TEMPORARY_P (in REF_BIND, BASE_CONV) IDENTIFIER_TYPENAME_P (in IDENTIFIER_NODE) 5: C_IS_RESERVED_WORD (in IDENTIFIER_NODE) ! 6: BINFO_ACCESS (in BINFO) Usage of TYPE_LANG_FLAG_?: ! 0: C_TYPE_FIELDS_READONLY (in RECORD_TYPE or UNION_TYPE). 1: TYPE_HAS_CONSTRUCTOR. 2: TYPE_HAS_DESTRUCTOR. 3: TYPE_FOR_JAVA. 4: TYPE_HAS_NONTRIVIAL_DESTRUCTOR 5: IS_AGGR_TYPE. ! 6: TYPE_BUILT_IN. Usage of DECL_LANG_FLAG_?: 0: DECL_ERROR_REPORTED (in VAR_DECL). --- 76,92 ---- NEED_TEMPORARY_P (in REF_BIND, BASE_CONV) IDENTIFIER_TYPENAME_P (in IDENTIFIER_NODE) 5: C_IS_RESERVED_WORD (in IDENTIFIER_NODE) ! DECL_VTABLE_OR_VTT_P (in VAR_DECL) ! 6: For future expansion Usage of TYPE_LANG_FLAG_?: ! 0: TYPE_DEPENDENT_P 1: TYPE_HAS_CONSTRUCTOR. 2: TYPE_HAS_DESTRUCTOR. 3: TYPE_FOR_JAVA. 4: TYPE_HAS_NONTRIVIAL_DESTRUCTOR 5: IS_AGGR_TYPE. ! 6: TYPE_DEPENDENT_P_VALID Usage of DECL_LANG_FLAG_?: 0: DECL_ERROR_REPORTED (in VAR_DECL). *************** struct diagnostic_context; *** 125,131 **** The BV_DELTA of each node gives the amount by which to adjust the `this' pointer when calling the function. If the method is an ! overriden version of a base class method, then it is assumed that, prior to adjustment, the this pointer points to an object of the base class. --- 127,133 ---- The BV_DELTA of each node gives the amount by which to adjust the `this' pointer when calling the function. If the method is an ! overridden version of a base class method, then it is assumed that, prior to adjustment, the this pointer points to an object of the base class. *************** struct diagnostic_context; *** 147,153 **** function, it is eventually set to an INTEGER_CST indicating the index in the vtable at which this function can be found. When a virtual function is declared, but before it is known what ! function is overriden, this field is the error_mark_node. Temporarily, it may be set to a TREE_LIST whose TREE_VALUE is the virtual function this one overrides, and whose TREE_CHAIN is --- 149,155 ---- function, it is eventually set to an INTEGER_CST indicating the index in the vtable at which this function can be found. When a virtual function is declared, but before it is known what ! function is overridden, this field is the error_mark_node. Temporarily, it may be set to a TREE_LIST whose TREE_VALUE is the virtual function this one overrides, and whose TREE_CHAIN is *************** struct diagnostic_context; *** 157,163 **** #if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007) ! #define VAR_OR_FUNCTION_DECL_CHECK(NODE) \ ({ const tree __t = (NODE); \ enum tree_code const __c = TREE_CODE(__t); \ if (__c != VAR_DECL && __c != FUNCTION_DECL) \ --- 159,165 ---- #if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007) ! #define VAR_OR_FUNCTION_DECL_CHECK(NODE) __extension__ \ ({ const tree __t = (NODE); \ enum tree_code const __c = TREE_CODE(__t); \ if (__c != VAR_DECL && __c != FUNCTION_DECL) \ *************** struct diagnostic_context; *** 165,171 **** __FUNCTION__); \ __t; }) ! #define VAR_FUNCTION_OR_PARM_DECL_CHECK(NODE) \ ({ const tree __t = (NODE); \ enum tree_code const __c = TREE_CODE(__t); \ if (__c != VAR_DECL \ --- 167,173 ---- __FUNCTION__); \ __t; }) ! #define VAR_FUNCTION_OR_PARM_DECL_CHECK(NODE) __extension__ \ ({ const tree __t = (NODE); \ enum tree_code const __c = TREE_CODE(__t); \ if (__c != VAR_DECL \ *************** struct diagnostic_context; *** 175,181 **** __FUNCTION__); \ __t; }) ! #define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE) \ ({ const tree __t = (NODE); \ enum tree_code const __c = TREE_CODE(__t); \ if (__c != VAR_DECL \ --- 177,183 ---- __FUNCTION__); \ __t; }) ! #define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE) __extension__ \ ({ const tree __t = (NODE); \ enum tree_code const __c = TREE_CODE(__t); \ if (__c != VAR_DECL \ *************** struct diagnostic_context; *** 186,192 **** __FUNCTION__); \ __t; }) ! #define RECORD_OR_UNION_TYPE_CHECK(NODE) \ ({ const tree __t = (NODE); \ enum tree_code const __c = TREE_CODE(__t); \ if (__c != RECORD_TYPE && __c != UNION_TYPE) \ --- 188,194 ---- __FUNCTION__); \ __t; }) ! #define RECORD_OR_UNION_TYPE_CHECK(NODE) __extension__ \ ({ const tree __t = (NODE); \ enum tree_code const __c = TREE_CODE(__t); \ if (__c != RECORD_TYPE && __c != UNION_TYPE) \ *************** struct diagnostic_context; *** 194,200 **** __FUNCTION__); \ __t; }) ! #define BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK(NODE) \ ({ const tree __t = (NODE); \ enum tree_code const __c = TREE_CODE(__t); \ if (__c != BOUND_TEMPLATE_TEMPLATE_PARM) \ --- 196,202 ---- __FUNCTION__); \ __t; }) ! #define BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK(NODE) __extension__ \ ({ const tree __t = (NODE); \ enum tree_code const __c = TREE_CODE(__t); \ if (__c != BOUND_TEMPLATE_TEMPLATE_PARM) \ *************** struct diagnostic_context; *** 212,273 **** #endif - /* Returns TRUE if generated code should match ABI version N or - greater is in use. */ - - #define abi_version_at_least(N) \ - (flag_abi_version == 0 || flag_abi_version >= (N)) - - - /* Datatype used to temporarily save C++ bindings (for implicit - instantiations purposes and like). Implemented in decl.c. */ - typedef struct cxx_saved_binding cxx_saved_binding; - - /* Datatype that represents binding established by a declaration between - a name and a C++ entity. */ - typedef struct cxx_binding cxx_binding; - - /* (GC-)allocate a cxx_binding object. */ - #define cxx_binding_make() (ggc_alloc (sizeof (cxx_binding))) - - /* Zero out a cxx_binding pointed to by B. */ - #define cxx_binding_clear(B) memset ((B), 0, sizeof (cxx_binding)) - - struct cxx_binding GTY(()) - { - /* Link to chain together various bindings for this name. */ - cxx_binding *previous; - /* The non-type entity this name is bound to. */ - tree value; - /* The type entity this name is bound to. */ - tree type; - union tree_binding_u { - tree GTY ((tag ("0"))) scope; - struct cp_binding_level * GTY ((tag ("1"))) level; - } GTY ((desc ("%0.has_level"))) scope; - unsigned has_level : 1; - unsigned value_is_inherited : 1; - unsigned is_local : 1; - }; - - /* The type of dictionary used to map names to types declared at - a given scope. */ - typedef struct binding_table_s *binding_table; - typedef struct binding_entry_s *binding_entry; - - /* The type of a routine repeatedly called by binding_table_foreach. */ - typedef void (*bt_foreach_proc) (binding_entry, void *); - - struct binding_entry_s GTY(()) - { - binding_entry chain; - tree name; - tree type; - }; - - extern void binding_table_foreach (binding_table, bt_foreach_proc, void *); - extern binding_entry binding_table_find (binding_table, tree); - extern void cxx_remember_type_decls (binding_table); /* Language-dependent contents of an identifier. */ --- 214,219 ---- *************** struct lang_identifier GTY(()) *** 278,284 **** cxx_binding *bindings; tree class_value; tree class_template_info; ! struct lang_id2 *x; }; /* In an IDENTIFIER_NODE, nonzero if this identifier is actually a --- 224,232 ---- cxx_binding *bindings; tree class_value; tree class_template_info; ! tree label_value; ! tree implicit_decl; ! tree error_locus; }; /* In an IDENTIFIER_NODE, nonzero if this identifier is actually a *************** struct lang_identifier GTY(()) *** 287,312 **** #define C_IS_RESERVED_WORD(ID) TREE_LANG_FLAG_5 (ID) - extern const short rid_to_yy[RID_MAX]; - #define C_RID_YYCODE(ID) rid_to_yy[C_RID_CODE (ID)] - #define LANG_IDENTIFIER_CAST(NODE) \ ((struct lang_identifier*)IDENTIFIER_NODE_CHECK (NODE)) - struct lang_id2 GTY(()) - { - tree label_value; - tree implicit_decl; - tree error_locus; - }; - - typedef struct flagged_type_tree_s GTY(()) - { - tree t; - int new_type_flag; - tree lookups; - } flagged_type_tree; - typedef struct template_parm_index_s GTY(()) { struct tree_common common; --- 235,243 ---- *************** struct ptrmem_cst GTY(()) *** 326,356 **** }; typedef struct ptrmem_cst * ptrmem_cst_t; - /* Nonzero if this binding is for a local scope, as opposed to a class - or namespace scope. */ - #define LOCAL_BINDING_P(NODE) ((NODE)->is_local) - - /* Nonzero if BINDING_VALUE is from a base class of the class which is - currently being defined. */ - #define INHERITED_VALUE_BINDING_P(NODE) ((NODE)->value_is_inherited) - - /* For a binding between a name and an entity at a non-local scope, - defines the scope where the binding is declared. (Either a class - _TYPE node, or a NAMESPACE_DECL.) This macro should be used only - for namespace-level bindings; on the IDENTIFIER_BINDING list - BINDING_LEVEL is used instead. */ - #define BINDING_SCOPE(NODE) ((NODE)->scope.scope) - - /* Nonzero if NODE has BINDING_LEVEL, rather than BINDING_SCOPE. */ - #define BINDING_HAS_LEVEL_P(NODE) ((NODE)->has_level) - - /* This is the declaration bound to the name. Possible values: - variable, overloaded function, namespace, template, enumerator. */ - #define BINDING_VALUE(NODE) ((NODE)->value) - - /* If name is bound to a type, this is the type (struct, union, enum). */ - #define BINDING_TYPE(NODE) ((NODE)->type) - #define IDENTIFIER_GLOBAL_VALUE(NODE) \ namespace_binding ((NODE), global_namespace) #define SET_IDENTIFIER_GLOBAL_VALUE(NODE, VAL) \ --- 257,262 ---- *************** struct tree_overload GTY(()) *** 408,423 **** (TREE_CODE (NODE) == BASELINK) /* The BINFO indicating the base from which the BASELINK_FUNCTIONS came. */ #define BASELINK_BINFO(NODE) \ ! (TREE_OPERAND (BASELINK_CHECK (NODE), 0)) /* The functions referred to by the BASELINK; either a FUNCTION_DECL, a TEMPLATE_DECL, an OVERLOAD, or a TEMPLATE_ID_EXPR. */ #define BASELINK_FUNCTIONS(NODE) \ ! (TREE_OPERAND (BASELINK_CHECK (NODE), 1)) /* The BINFO in which the search for the functions indicated by this baselink began. This base is used to determine the accessibility of functions selected by overload resolution. */ #define BASELINK_ACCESS_BINFO(NODE) \ ! (TREE_OPERAND (BASELINK_CHECK (NODE), 2)) /* For a type-conversion operator, the BASELINK_OPTYPE indicates the type to which the conversion should occur. This value is important if the BASELINK_FUNCTIONS include a template conversion operator -- --- 314,329 ---- (TREE_CODE (NODE) == BASELINK) /* The BINFO indicating the base from which the BASELINK_FUNCTIONS came. */ #define BASELINK_BINFO(NODE) \ ! (((struct tree_baselink*) BASELINK_CHECK (NODE))->binfo) /* The functions referred to by the BASELINK; either a FUNCTION_DECL, a TEMPLATE_DECL, an OVERLOAD, or a TEMPLATE_ID_EXPR. */ #define BASELINK_FUNCTIONS(NODE) \ ! (((struct tree_baselink*) BASELINK_CHECK (NODE))->functions) /* The BINFO in which the search for the functions indicated by this baselink began. This base is used to determine the accessibility of functions selected by overload resolution. */ #define BASELINK_ACCESS_BINFO(NODE) \ ! (((struct tree_baselink*) BASELINK_CHECK (NODE))->access_binfo) /* For a type-conversion operator, the BASELINK_OPTYPE indicates the type to which the conversion should occur. This value is important if the BASELINK_FUNCTIONS include a template conversion operator -- *************** struct tree_overload GTY(()) *** 426,431 **** --- 332,345 ---- #define BASELINK_OPTYPE(NODE) \ (TREE_CHAIN (BASELINK_CHECK (NODE))) + struct tree_baselink GTY(()) + { + struct tree_common common; + tree binfo; + tree functions; + tree access_binfo; + }; + #define WRAPPER_ZC(NODE) (((struct tree_wrapper*)WRAPPER_CHECK (NODE))->z_c) struct tree_wrapper GTY(()) *************** struct tree_wrapper GTY(()) *** 434,447 **** struct z_candidate *z_c; }; ! #define SRCLOC_FILE(NODE) (((struct tree_srcloc*)SRCLOC_CHECK (NODE))->filename) ! #define SRCLOC_LINE(NODE) (((struct tree_srcloc*)SRCLOC_CHECK (NODE))->linenum) ! struct tree_srcloc GTY(()) { ! struct tree_common common; ! const char *filename; ! int linenum; ! }; /* Macros for access to language-specific slots in an identifier. */ --- 348,368 ---- struct z_candidate *z_c; }; ! /* The different kinds of ids that we ecounter. */ ! ! typedef enum cp_id_kind { ! /* Not an id at all. */ ! CP_ID_KIND_NONE, ! /* An unqualified-id that is not a template-id. */ ! CP_ID_KIND_UNQUALIFIED, ! /* An unqualified-id that is a dependent name. */ ! CP_ID_KIND_UNQUALIFIED_DEPENDENT, ! /* An unqualified template-id. */ ! CP_ID_KIND_TEMPLATE_ID, ! /* A qualified-id. */ ! CP_ID_KIND_QUALIFIED ! } cp_id_kind; /* Macros for access to language-specific slots in an identifier. */ *************** struct tree_srcloc GTY(()) *** 452,473 **** /* The IDENTIFIER_BINDING is the innermost cxx_binding for the identifier. It's PREVIOUS is the next outermost binding. Each ! BINDING_VALUE is a DECL for the associated declaration. Thus, name lookup consists simply of pulling off the node at the front of the list (modulo oddities for looking up the names of types, ! and such.) You can use BINDING_SCOPE or BINDING_LEVEL to ! determine the scope that bound the name. */ #define IDENTIFIER_BINDING(NODE) \ (LANG_IDENTIFIER_CAST (NODE)->bindings) /* The IDENTIFIER_VALUE is the value of the IDENTIFIER_BINDING, or NULL_TREE if there is no binding. */ #define IDENTIFIER_VALUE(NODE) \ ! (IDENTIFIER_BINDING (NODE) ? BINDING_VALUE (IDENTIFIER_BINDING (NODE)) : 0) /* If IDENTIFIER_CLASS_VALUE is set, then NODE is bound in the current class, and IDENTIFIER_CLASS_VALUE is the value binding. This is ! just a pointer to the BINDING_VALUE of one of the bindings in the IDENTIFIER_BINDINGs list, so any time that this is non-NULL so is IDENTIFIER_BINDING. */ #define IDENTIFIER_CLASS_VALUE(NODE) \ --- 373,394 ---- /* The IDENTIFIER_BINDING is the innermost cxx_binding for the identifier. It's PREVIOUS is the next outermost binding. Each ! VALUE field is a DECL for the associated declaration. Thus, name lookup consists simply of pulling off the node at the front of the list (modulo oddities for looking up the names of types, ! and such.) You can use SCOPE field to determine the scope ! that bound the name. */ #define IDENTIFIER_BINDING(NODE) \ (LANG_IDENTIFIER_CAST (NODE)->bindings) /* The IDENTIFIER_VALUE is the value of the IDENTIFIER_BINDING, or NULL_TREE if there is no binding. */ #define IDENTIFIER_VALUE(NODE) \ ! (IDENTIFIER_BINDING (NODE) ? IDENTIFIER_BINDING (NODE)->value : NULL) /* If IDENTIFIER_CLASS_VALUE is set, then NODE is bound in the current class, and IDENTIFIER_CLASS_VALUE is the value binding. This is ! just a pointer to the VALUE field of one of the bindings in the IDENTIFIER_BINDINGs list, so any time that this is non-NULL so is IDENTIFIER_BINDING. */ #define IDENTIFIER_CLASS_VALUE(NODE) \ *************** struct tree_srcloc GTY(()) *** 482,511 **** #define SET_IDENTIFIER_TYPE_VALUE(NODE,TYPE) (TREE_TYPE (NODE) = (TYPE)) #define IDENTIFIER_HAS_TYPE_VALUE(NODE) (IDENTIFIER_TYPE_VALUE (NODE) ? 1 : 0) - #define LANG_ID_FIELD(NAME, NODE) \ - (LANG_IDENTIFIER_CAST (NODE)->x \ - ? LANG_IDENTIFIER_CAST (NODE)->x->NAME : 0) - - #define SET_LANG_ID(NODE, VALUE, NAME) \ - (LANG_IDENTIFIER_CAST (NODE)->x == 0 \ - ? LANG_IDENTIFIER_CAST (NODE)->x \ - = (struct lang_id2 *)ggc_alloc_cleared (sizeof (struct lang_id2)) : 0, \ - LANG_IDENTIFIER_CAST (NODE)->x->NAME = (VALUE)) - #define IDENTIFIER_LABEL_VALUE(NODE) \ ! LANG_ID_FIELD (label_value, NODE) #define SET_IDENTIFIER_LABEL_VALUE(NODE, VALUE) \ ! SET_LANG_ID (NODE, VALUE, label_value) #define IDENTIFIER_IMPLICIT_DECL(NODE) \ ! LANG_ID_FIELD (implicit_decl, NODE) #define SET_IDENTIFIER_IMPLICIT_DECL(NODE, VALUE) \ ! SET_LANG_ID (NODE, VALUE, implicit_decl) #define IDENTIFIER_ERROR_LOCUS(NODE) \ ! LANG_ID_FIELD (error_locus, NODE) #define SET_IDENTIFIER_ERROR_LOCUS(NODE, VALUE) \ ! SET_LANG_ID (NODE, VALUE, error_locus) /* Nonzero if this identifier is used as a virtual function name somewhere (optimizes searches). */ --- 403,422 ---- #define SET_IDENTIFIER_TYPE_VALUE(NODE,TYPE) (TREE_TYPE (NODE) = (TYPE)) #define IDENTIFIER_HAS_TYPE_VALUE(NODE) (IDENTIFIER_TYPE_VALUE (NODE) ? 1 : 0) #define IDENTIFIER_LABEL_VALUE(NODE) \ ! (LANG_IDENTIFIER_CAST (NODE)->label_value) #define SET_IDENTIFIER_LABEL_VALUE(NODE, VALUE) \ ! IDENTIFIER_LABEL_VALUE (NODE) = (VALUE) #define IDENTIFIER_IMPLICIT_DECL(NODE) \ ! (LANG_IDENTIFIER_CAST (NODE)->implicit_decl) #define SET_IDENTIFIER_IMPLICIT_DECL(NODE, VALUE) \ ! IDENTIFIER_IMPLICIT_DECL (NODE) = (VALUE) #define IDENTIFIER_ERROR_LOCUS(NODE) \ ! (LANG_IDENTIFIER_CAST (NODE)->error_locus) #define SET_IDENTIFIER_ERROR_LOCUS(NODE, VALUE) \ ! IDENTIFIER_ERROR_LOCUS (NODE) = (VALUE) /* Nonzero if this identifier is used as a virtual function name somewhere (optimizes searches). */ *************** struct tree_srcloc GTY(()) *** 526,546 **** TREE_LANG_FLAG_3 (NODE) /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only. */ ! #define C_TYPE_FIELDS_READONLY(TYPE) TYPE_LANG_FLAG_0 (TYPE) /* Store a value in that field. */ #define C_SET_EXP_ORIGINAL_CODE(EXP, CODE) \ (TREE_COMPLEXITY (EXP) = (int)(CODE)) enum cp_tree_node_structure_enum { - TS_CP_COMMON, TS_CP_GENERIC, TS_CP_IDENTIFIER, TS_CP_TPI, TS_CP_PTRMEM, TS_CP_OVERLOAD, TS_CP_WRAPPER, ! TS_CP_SRCLOC, LAST_TS_CP_ENUM }; --- 437,470 ---- TREE_LANG_FLAG_3 (NODE) /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only. */ ! #define C_TYPE_FIELDS_READONLY(TYPE) \ ! (LANG_TYPE_CLASS_CHECK (TYPE)->fields_readonly) /* Store a value in that field. */ #define C_SET_EXP_ORIGINAL_CODE(EXP, CODE) \ (TREE_COMPLEXITY (EXP) = (int)(CODE)) + /* The tokens stored in the default argument. */ + + #define DEFARG_TOKENS(NODE) \ + (((struct tree_default_arg *)DEFAULT_ARG_CHECK (NODE))->tokens) + + struct tree_default_arg GTY (()) + { + struct tree_common common; + struct cp_token_cache *tokens; + }; + enum cp_tree_node_structure_enum { TS_CP_GENERIC, TS_CP_IDENTIFIER, TS_CP_TPI, TS_CP_PTRMEM, + TS_CP_BINDING, TS_CP_OVERLOAD, + TS_CP_BASELINK, TS_CP_WRAPPER, ! TS_CP_DEFAULT_ARG, LAST_TS_CP_ENUM }; *************** enum cp_tree_node_structure_enum { *** 548,561 **** union lang_tree_node GTY((desc ("cp_tree_node_structure (&%h)"), chain_next ("(union lang_tree_node *)TREE_CHAIN (&%h.generic)"))) { - struct tree_common GTY ((tag ("TS_CP_COMMON"))) common; union tree_node GTY ((tag ("TS_CP_GENERIC"), desc ("tree_node_structure (&%h)"))) generic; struct template_parm_index_s GTY ((tag ("TS_CP_TPI"))) tpi; struct ptrmem_cst GTY ((tag ("TS_CP_PTRMEM"))) ptrmem; struct tree_overload GTY ((tag ("TS_CP_OVERLOAD"))) overload; struct tree_wrapper GTY ((tag ("TS_CP_WRAPPER"))) wrapper; ! struct tree_srcloc GTY ((tag ("TS_CP_SRCLOC"))) srcloc; struct lang_identifier GTY ((tag ("TS_CP_IDENTIFIER"))) identifier; }; --- 472,485 ---- union lang_tree_node GTY((desc ("cp_tree_node_structure (&%h)"), chain_next ("(union lang_tree_node *)TREE_CHAIN (&%h.generic)"))) { union tree_node GTY ((tag ("TS_CP_GENERIC"), desc ("tree_node_structure (&%h)"))) generic; struct template_parm_index_s GTY ((tag ("TS_CP_TPI"))) tpi; struct ptrmem_cst GTY ((tag ("TS_CP_PTRMEM"))) ptrmem; struct tree_overload GTY ((tag ("TS_CP_OVERLOAD"))) overload; + struct tree_baselink GTY ((tag ("TS_CP_BASELINK"))) baselink; struct tree_wrapper GTY ((tag ("TS_CP_WRAPPER"))) wrapper; ! struct tree_default_arg GTY ((tag ("TS_CP_DEFAULT_ARG"))) default_arg; struct lang_identifier GTY ((tag ("TS_CP_IDENTIFIER"))) identifier; }; *************** enum cp_tree_index *** 591,599 **** CPTI_BASE_DESC_TYPE, CPTI_CLASS_TYPE, - CPTI_RECORD_TYPE, - CPTI_UNION_TYPE, - CPTI_ENUM_TYPE, CPTI_UNKNOWN_TYPE, CPTI_VTBL_TYPE, CPTI_VTBL_PTR_TYPE, --- 515,520 ---- *************** enum cp_tree_index *** 601,619 **** CPTI_ABI, CPTI_TYPE_INFO_TYPE, CPTI_TYPE_INFO_PTR_TYPE, CPTI_ABORT_FNDECL, CPTI_GLOBAL_DELETE_FNDECL, CPTI_AGGR_TAG, - CPTI_ACCESS_DEFAULT, - CPTI_ACCESS_PUBLIC, - CPTI_ACCESS_PROTECTED, - CPTI_ACCESS_PRIVATE, - CPTI_ACCESS_DEFAULT_VIRTUAL, - CPTI_ACCESS_PUBLIC_VIRTUAL, - CPTI_ACCESS_PROTECTED_VIRTUAL, - CPTI_ACCESS_PRIVATE_VIRTUAL, - CPTI_CTOR_IDENTIFIER, CPTI_COMPLETE_CTOR_IDENTIFIER, CPTI_BASE_CTOR_IDENTIFIER, --- 522,532 ---- CPTI_ABI, CPTI_TYPE_INFO_TYPE, CPTI_TYPE_INFO_PTR_TYPE, + CPTI_TYPE_INFO_REF_TYPE, CPTI_ABORT_FNDECL, CPTI_GLOBAL_DELETE_FNDECL, CPTI_AGGR_TAG, CPTI_CTOR_IDENTIFIER, CPTI_COMPLETE_CTOR_IDENTIFIER, CPTI_BASE_CTOR_IDENTIFIER, *************** extern GTY(()) tree cp_global_trees[CPTI *** 680,688 **** #define base_desc_type_node cp_global_trees[CPTI_BASE_DESC_TYPE] #define class_type_node cp_global_trees[CPTI_CLASS_TYPE] - #define record_type_node cp_global_trees[CPTI_RECORD_TYPE] - #define union_type_node cp_global_trees[CPTI_UNION_TYPE] - #define enum_type_node cp_global_trees[CPTI_ENUM_TYPE] #define unknown_type_node cp_global_trees[CPTI_UNKNOWN_TYPE] #define vtbl_type_node cp_global_trees[CPTI_VTBL_TYPE] #define vtbl_ptr_type_node cp_global_trees[CPTI_VTBL_PTR_TYPE] --- 593,598 ---- *************** extern GTY(()) tree cp_global_trees[CPTI *** 690,712 **** #define abi_node cp_global_trees[CPTI_ABI] #define type_info_type_node cp_global_trees[CPTI_TYPE_INFO_TYPE] #define type_info_ptr_type cp_global_trees[CPTI_TYPE_INFO_PTR_TYPE] #define abort_fndecl cp_global_trees[CPTI_ABORT_FNDECL] #define global_delete_fndecl cp_global_trees[CPTI_GLOBAL_DELETE_FNDECL] #define current_aggr cp_global_trees[CPTI_AGGR_TAG] - /* Define the sets of attributes that member functions and baseclasses - can have. These are sensible combinations of {public,private,protected} - cross {virtual,non-virtual}. */ - - #define access_default_node cp_global_trees[CPTI_ACCESS_DEFAULT] - #define access_public_node cp_global_trees[CPTI_ACCESS_PUBLIC] - #define access_protected_node cp_global_trees[CPTI_ACCESS_PROTECTED] - #define access_private_node cp_global_trees[CPTI_ACCESS_PRIVATE] - #define access_default_virtual_node cp_global_trees[CPTI_ACCESS_DEFAULT_VIRTUAL] - #define access_public_virtual_node cp_global_trees[CPTI_ACCESS_PUBLIC_VIRTUAL] - #define access_protected_virtual_node cp_global_trees[CPTI_ACCESS_PROTECTED_VIRTUAL] - #define access_private_virtual_node cp_global_trees[CPTI_ACCESS_PRIVATE_VIRTUAL] - /* We cache these tree nodes so as to call get_identifier less frequently. */ --- 600,610 ---- #define abi_node cp_global_trees[CPTI_ABI] #define type_info_type_node cp_global_trees[CPTI_TYPE_INFO_TYPE] #define type_info_ptr_type cp_global_trees[CPTI_TYPE_INFO_PTR_TYPE] + #define type_info_ref_type cp_global_trees[CPTI_TYPE_INFO_REF_TYPE] #define abort_fndecl cp_global_trees[CPTI_ABORT_FNDECL] #define global_delete_fndecl cp_global_trees[CPTI_GLOBAL_DELETE_FNDECL] #define current_aggr cp_global_trees[CPTI_AGGR_TAG] /* We cache these tree nodes so as to call get_identifier less frequently. */ *************** extern GTY(()) tree cp_global_trees[CPTI *** 780,785 **** --- 678,688 ---- #define keyed_classes cp_global_trees[CPTI_KEYED_CLASSES] + /* Node to indicate default access. This must be distinct from the + access nodes in tree.h. */ + + #define access_default_node null_node + /* Global state. */ struct saved_scope GTY(()) *************** struct saved_scope GTY(()) *** 797,808 **** tree x_previous_class_type; tree x_previous_class_values; tree x_saved_tree; - tree lookups; - tree last_parms; HOST_WIDE_INT x_processing_template_decl; int x_processing_specialization; ! int x_processing_explicit_instantiation; int need_pop_function_context; struct stmt_tree_s x_stmt_tree; --- 700,709 ---- tree x_previous_class_type; tree x_previous_class_values; tree x_saved_tree; HOST_WIDE_INT x_processing_template_decl; int x_processing_specialization; ! bool x_processing_explicit_instantiation; int need_pop_function_context; struct stmt_tree_s x_stmt_tree; *************** struct saved_scope GTY(()) *** 863,874 **** /* A list of private types mentioned, for deferred access checking. */ - #define type_lookups scope_chain->lookups - extern GTY(()) struct saved_scope *scope_chain; - struct unparsed_text; - /* Global state pertinent to the current function. */ struct language_function GTY(()) --- 764,771 ---- *************** struct language_function GTY(()) *** 888,897 **** int returns_abnormally; int in_function_try_handler; int in_base_initializer; - int x_expanding_p; /* True if this function can throw an exception. */ ! bool can_throw : 1; struct named_label_use_list *x_named_label_uses; struct named_label_list *x_named_labels; --- 785,793 ---- int returns_abnormally; int in_function_try_handler; int in_base_initializer; /* True if this function can throw an exception. */ ! BOOL_BITFIELD can_throw : 1; struct named_label_use_list *x_named_label_uses; struct named_label_list *x_named_labels; *************** struct language_function GTY(()) *** 899,905 **** varray_type x_local_names; const char *cannot_inline; - struct unparsed_text *unparsed_inlines; }; /* The current C++-specific per-function global variables. */ --- 795,800 ---- *************** struct language_function GTY(()) *** 951,968 **** #define current_function_returns_abnormally \ cp_function_chain->returns_abnormally ! /* Nonzero if we should generate RTL for functions that we process. ! When this is zero, we just accumulate tree structure, without ! interacting with the back end. */ ! ! #define expanding_p cp_function_chain->x_expanding_p ! ! /* Nonzero if we are in the semantic analysis phase for the current ! function. */ ! ! #define doing_semantic_analysis_p() (!expanding_p) ! ! /* Non-zero if we are processing a base initializer. Zero elsewhere. */ #define in_base_initializer cp_function_chain->in_base_initializer #define in_function_try_handler cp_function_chain->in_function_try_handler --- 846,852 ---- #define current_function_returns_abnormally \ cp_function_chain->returns_abnormally ! /* Nonzero if we are processing a base initializer. Zero elsewhere. */ #define in_base_initializer cp_function_chain->in_base_initializer #define in_function_try_handler cp_function_chain->in_function_try_handler *************** struct language_function GTY(()) *** 973,979 **** #define current_function_return_value \ (cp_function_chain->x_return_value) ! extern GTY(()) tree global_namespace; #define ansi_opname(CODE) \ (operator_name_info[(int) (CODE)].identifier) --- 857,869 ---- #define current_function_return_value \ (cp_function_chain->x_return_value) ! /* True if NAME is the IDENTIFIER_NODE for an overloaded "operator ! new" or "operator delete". */ ! #define NEW_DELETE_OPNAME_P(NAME) \ ! ((NAME) == ansi_opname (NEW_EXPR) \ ! || (NAME) == ansi_opname (VEC_NEW_EXPR) \ ! || (NAME) == ansi_opname (DELETE_EXPR) \ ! || (NAME) == ansi_opname (VEC_DELETE_EXPR)) #define ansi_opname(CODE) \ (operator_name_info[(int) (CODE)].identifier) *************** enum cplus_tree_code { *** 1002,1007 **** --- 892,901 ---- }; #undef DEFTREECODE + #define cp_stmt_codes \ + CTOR_INITIALIZER, TRY_BLOCK, HANDLER, \ + EH_SPEC_BLOCK, USING_STMT, TAG_DEFN + enum languages { lang_c, lang_cplusplus, lang_java }; /* Macros to make error reporting functions' lives easier. */ *************** enum languages { lang_c, lang_cplusplus, *** 1046,1064 **** (IS_AGGR_TYPE_CODE (TREE_CODE (T)) && IS_AGGR_TYPE (T)) #define IS_AGGR_TYPE_CODE(T) ((T) == RECORD_TYPE || (T) == UNION_TYPE) - #define IS_AGGR_TYPE_2(TYPE1, TYPE2) \ - (TREE_CODE (TYPE1) == TREE_CODE (TYPE2) \ - && IS_AGGR_TYPE (TYPE1) && IS_AGGR_TYPE (TYPE2)) #define TAGGED_TYPE_P(T) \ (CLASS_TYPE_P (T) || TREE_CODE (T) == ENUMERAL_TYPE) #define IS_OVERLOAD_TYPE(T) TAGGED_TYPE_P (T) - /* In a *_TYPE, nonzero means a built-in type. */ - #define TYPE_BUILT_IN(NODE) TYPE_LANG_FLAG_6 (NODE) - /* True if this a "Java" type, defined in 'extern "Java"'. */ #define TYPE_FOR_JAVA(NODE) TYPE_LANG_FLAG_3 (NODE) /* Nonzero if this type is const-qualified. */ #define CP_TYPE_CONST_P(NODE) \ ((cp_type_quals (NODE) & TYPE_QUAL_CONST) != 0) --- 940,960 ---- (IS_AGGR_TYPE_CODE (TREE_CODE (T)) && IS_AGGR_TYPE (T)) #define IS_AGGR_TYPE_CODE(T) ((T) == RECORD_TYPE || (T) == UNION_TYPE) #define TAGGED_TYPE_P(T) \ (CLASS_TYPE_P (T) || TREE_CODE (T) == ENUMERAL_TYPE) #define IS_OVERLOAD_TYPE(T) TAGGED_TYPE_P (T) /* True if this a "Java" type, defined in 'extern "Java"'. */ #define TYPE_FOR_JAVA(NODE) TYPE_LANG_FLAG_3 (NODE) + /* True if this type is dependent. This predicate is only valid if + TYPE_DEPENDENT_P_VALID is true. */ + #define TYPE_DEPENDENT_P(NODE) TYPE_LANG_FLAG_0 (NODE) + + /* True if dependent_type_p has been called for this type, with the + result that TYPE_DEPENDENT_P is valid. */ + #define TYPE_DEPENDENT_P_VALID(NODE) TYPE_LANG_FLAG_6(NODE) + /* Nonzero if this type is const-qualified. */ #define CP_TYPE_CONST_P(NODE) \ ((cp_type_quals (NODE) & TYPE_QUAL_CONST) != 0) *************** enum languages { lang_c, lang_cplusplus, *** 1099,1105 **** /* Nonzero iff TYPE is derived from PARENT. Ignores accessibility and ambiguity issues. */ #define DERIVED_FROM_P(PARENT, TYPE) \ ! (lookup_base ((TYPE), PARENT, ba_any, NULL) != NULL_TREE) /* Nonzero iff TYPE is uniquely derived from PARENT. Ignores accessibility. */ #define UNIQUELY_DERIVED_FROM_P(PARENT, TYPE) \ --- 995,1001 ---- /* Nonzero iff TYPE is derived from PARENT. Ignores accessibility and ambiguity issues. */ #define DERIVED_FROM_P(PARENT, TYPE) \ ! (lookup_base ((TYPE), (PARENT), ba_any, NULL) != NULL_TREE) /* Nonzero iff TYPE is uniquely derived from PARENT. Ignores accessibility. */ #define UNIQUELY_DERIVED_FROM_P(PARENT, TYPE) \ *************** enum languages { lang_c, lang_cplusplus, *** 1118,1132 **** are put in this structure to save space. */ struct lang_type_header GTY(()) { ! unsigned is_lang_type_class : 1; ! unsigned has_type_conversion : 1; ! unsigned has_init_ref : 1; ! unsigned has_default_ctor : 1; ! unsigned uses_multiple_inheritance : 1; ! unsigned const_needs_init : 1; ! unsigned ref_needs_init : 1; ! unsigned has_const_assign_ref : 1; }; /* This structure provides additional information above and beyond --- 1014,1028 ---- are put in this structure to save space. */ struct lang_type_header GTY(()) { ! BOOL_BITFIELD is_lang_type_class : 1; ! BOOL_BITFIELD has_type_conversion : 1; ! BOOL_BITFIELD has_init_ref : 1; ! BOOL_BITFIELD has_default_ctor : 1; ! BOOL_BITFIELD uses_multiple_inheritance : 1; ! BOOL_BITFIELD const_needs_init : 1; ! BOOL_BITFIELD ref_needs_init : 1; ! BOOL_BITFIELD has_const_assign_ref : 1; }; /* This structure provides additional information above and beyond *************** struct lang_type_class GTY(()) *** 1158,1168 **** unsigned has_array_new : 1; unsigned gets_delete : 2; - unsigned has_call_overloaded : 1; - unsigned has_array_ref_overloaded : 1; - unsigned has_arrow_overloaded : 1; unsigned interface_only : 1; unsigned interface_unknown : 1; unsigned marks: 6; unsigned vec_new_uses_cookie : 1; --- 1054,1065 ---- unsigned has_array_new : 1; unsigned gets_delete : 2; unsigned interface_only : 1; unsigned interface_unknown : 1; + unsigned contains_empty_class_p : 1; + unsigned anon_aggr : 1; + unsigned non_zero_init : 1; + unsigned empty_p : 1; unsigned marks: 6; unsigned vec_new_uses_cookie : 1; *************** struct lang_type_class GTY(()) *** 1172,1178 **** unsigned redefined : 1; unsigned debug_requested : 1; unsigned use_template : 2; ! unsigned got_semicolon : 1; unsigned ptrmemfunc_flag : 1; unsigned was_anonymous : 1; --- 1069,1075 ---- unsigned redefined : 1; unsigned debug_requested : 1; unsigned use_template : 2; ! unsigned fields_readonly : 1; unsigned ptrmemfunc_flag : 1; unsigned was_anonymous : 1; *************** struct lang_type_class GTY(()) *** 1182,1195 **** unsigned has_complex_assign_ref : 1; unsigned has_abstract_assign_ref : 1; unsigned non_aggregate : 1; - unsigned is_partial_instantiation : 1; unsigned java_interface : 1; - unsigned anon_aggr : 1; - unsigned non_zero_init : 1; - unsigned empty_p : 1; - unsigned contains_empty_class_p : 1; - /* When adding a flag here, consider whether or not it ought to apply to a template instance if it applies to the template. If so, make sure to copy it in instantiate_class_template! */ --- 1079,1086 ---- *************** struct lang_type_class GTY(()) *** 1197,1203 **** /* There are some bits left to fill out a 32-bit word. Keep track of this by updating the size of this bitfield whenever you add or remove a flag. */ ! unsigned dummy : 5; tree primary_base; tree vfields; --- 1088,1094 ---- /* There are some bits left to fill out a 32-bit word. Keep track of this by updating the size of this bitfield whenever you add or remove a flag. */ ! unsigned dummy : 9; tree primary_base; tree vfields; *************** struct lang_type_class GTY(()) *** 1209,1215 **** tree as_base; tree pure_virtuals; tree friend_classes; ! tree methods; tree key_method; tree decl_list; tree template_info; --- 1100,1106 ---- tree as_base; tree pure_virtuals; tree friend_classes; ! tree GTY ((reorder ("resort_type_method_vec"))) methods; tree key_method; tree decl_list; tree template_info; *************** struct lang_type GTY(()) *** 1234,1246 **** #if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007) ! #define LANG_TYPE_CLASS_CHECK(NODE) \ ({ struct lang_type *lt = TYPE_LANG_SPECIFIC (NODE); \ if (! lt->u.h.is_lang_type_class) \ lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \ <->u.c; }) ! #define LANG_TYPE_PTRMEM_CHECK(NODE) \ ({ struct lang_type *lt = TYPE_LANG_SPECIFIC (NODE); \ if (lt->u.h.is_lang_type_class) \ lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \ --- 1125,1137 ---- #if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007) ! #define LANG_TYPE_CLASS_CHECK(NODE) __extension__ \ ({ struct lang_type *lt = TYPE_LANG_SPECIFIC (NODE); \ if (! lt->u.h.is_lang_type_class) \ lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \ <->u.c; }) ! #define LANG_TYPE_PTRMEM_CHECK(NODE) __extension__ \ ({ struct lang_type *lt = TYPE_LANG_SPECIFIC (NODE); \ if (lt->u.h.is_lang_type_class) \ lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \ *************** struct lang_type GTY(()) *** 1308,1325 **** convenient, don't reprocess any methods that appear in its redefinition. */ #define TYPE_REDEFINED(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->redefined) - /* Nonzero means that this _CLASSTYPE node overloads operator(). */ - #define TYPE_OVERLOADS_CALL_EXPR(NODE) \ - (LANG_TYPE_CLASS_CHECK (NODE)->has_call_overloaded) - - /* Nonzero means that this _CLASSTYPE node overloads operator[]. */ - #define TYPE_OVERLOADS_ARRAY_REF(NODE) \ - (LANG_TYPE_CLASS_CHECK (NODE)->has_array_ref_overloaded) - - /* Nonzero means that this _CLASSTYPE node overloads operator->. */ - #define TYPE_OVERLOADS_ARROW(NODE) \ - (LANG_TYPE_CLASS_CHECK (NODE)->has_arrow_overloaded) - /* Nonzero means that this _CLASSTYPE (or one of its ancestors) uses multiple inheritance. If this is 0 for the root of a type hierarchy, then we can use more efficient search techniques. */ --- 1199,1204 ---- *************** struct lang_type GTY(()) *** 1417,1427 **** #define SET_CLASSTYPE_MARKED6(NODE) SET_CLASSTYPE_MARKED_N (NODE, 5) #define CLEAR_CLASSTYPE_MARKED6(NODE) CLEAR_CLASSTYPE_MARKED_N (NODE, 5) ! /* A binding_table of the nested tag-types (class, struct, union, or enum) ! found within this class. The ENTRY->name of each node is the name ! of the type; the ENTRY->type is the type itself. This table includes ! nested member class templates. */ ! #define CLASSTYPE_NESTED_UDTS(NODE) \ (LANG_TYPE_CLASS_CHECK (NODE)->nested_udts) /* Nonzero if NODE has a primary base class, i.e., a base class with --- 1296,1305 ---- #define SET_CLASSTYPE_MARKED6(NODE) SET_CLASSTYPE_MARKED_N (NODE, 5) #define CLEAR_CLASSTYPE_MARKED6(NODE) CLEAR_CLASSTYPE_MARKED_N (NODE, 5) ! /* A dictionary of the nested user-defined-types (class-types, or enums) ! found within this class. This table includes nested member class ! templates. */ ! #define CLASSTYPE_NESTED_UTDS(NODE) \ (LANG_TYPE_CLASS_CHECK (NODE)->nested_udts) /* Nonzero if NODE has a primary base class, i.e., a base class with *************** struct lang_type GTY(()) *** 1438,1458 **** /* A chain of BINFOs for the direct and indirect virtual base classes that this type uses in a post-order depth-first left-to-right order. (In other words, these bases appear in the order that they ! should be initialized.) If a virtual base is primary, then the ! primary copy will appear on this list. Thus, the BINFOs on this ! list are all "real"; they are the same BINFOs that will be ! encountered when using dfs_unmarked_real_bases_queue_p and related ! functions. */ #define CLASSTYPE_VBASECLASSES(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->vbases) - /* For a non-virtual BINFO, the BINFO itself; for a virtual BINFO, the - binfo_for_vbase. C is the most derived class for the hierarchy - containing BINFO. */ - #define CANONICAL_BINFO(BINFO, C) \ - (TREE_VIA_VIRTUAL (BINFO) \ - ? binfo_for_vbase (BINFO_TYPE (BINFO), C) \ - : (BINFO)) - /* Number of direct baseclasses of NODE. */ #define CLASSTYPE_N_BASECLASSES(NODE) \ (BINFO_N_BASETYPES (TYPE_BINFO (NODE))) --- 1316,1324 ---- /* A chain of BINFOs for the direct and indirect virtual base classes that this type uses in a post-order depth-first left-to-right order. (In other words, these bases appear in the order that they ! should be initialized.) */ #define CLASSTYPE_VBASECLASSES(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->vbases) /* Number of direct baseclasses of NODE. */ #define CLASSTYPE_N_BASECLASSES(NODE) \ (BINFO_N_BASETYPES (TYPE_BINFO (NODE))) *************** struct lang_type GTY(()) *** 1482,1495 **** class must provide its own definition for each of these functions. */ #define CLASSTYPE_PURE_VIRTUALS(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->pure_virtuals) - /* Nonzero means that this aggr type has been `closed' by a semicolon. */ - #define CLASSTYPE_GOT_SEMICOLON(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->got_semicolon) - /* Nonzero means that this type has an X() constructor. */ #define TYPE_HAS_DEFAULT_CONSTRUCTOR(NODE) \ (LANG_TYPE_CLASS_CHECK (NODE)->h.has_default_ctor) ! /* Nonzero means that this type contains a mutable member */ #define CLASSTYPE_HAS_MUTABLE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_mutable) #define TYPE_HAS_MUTABLE_P(NODE) (cp_has_mutable_p (NODE)) --- 1348,1358 ---- class must provide its own definition for each of these functions. */ #define CLASSTYPE_PURE_VIRTUALS(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->pure_virtuals) /* Nonzero means that this type has an X() constructor. */ #define TYPE_HAS_DEFAULT_CONSTRUCTOR(NODE) \ (LANG_TYPE_CLASS_CHECK (NODE)->h.has_default_ctor) ! /* Nonzero means that this type contains a mutable member. */ #define CLASSTYPE_HAS_MUTABLE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_mutable) #define TYPE_HAS_MUTABLE_P(NODE) (cp_has_mutable_p (NODE)) *************** struct lang_type GTY(()) *** 1575,1637 **** /* Additional macros for inheritance information. */ /* The BINFO_INHERITANCE_CHAIN is used opposite to the description in ! gcc/tree.h. In particular if D is derived from B then the BINFO ! for B (in D) will have a BINFO_INHERITANCE_CHAIN pointing to ! D. In tree.h, this pointer is described as pointing in other ! direction. There is a different BINFO for each path to a virtual ! base; BINFOs for virtual bases are not shared. ! ! We use TREE_VIA_PROTECTED and TREE_VIA_PUBLIC, but private ! inheritance is indicated by the absence of the other two flags, not ! by TREE_VIA_PRIVATE, which is unused. */ ! ! /* Mark the binfo, whether shared or not. Each instance of a virtual ! base can be separately marked. */ ! #define BINFO_UNSHARED_MARKED(NODE) TREE_LANG_FLAG_0 (NODE) /* Nonzero means marked by DFS or BFS search. */ ! #define BINFO_MARKED(NODE) \ ! (TREE_VIA_VIRTUAL (NODE) \ ! ? CLASSTYPE_MARKED (BINFO_TYPE (NODE)) \ ! : TREE_LANG_FLAG_0 (NODE)) ! /* Macros needed because of C compilers that don't allow conditional ! expressions to be lvalues. Grr! */ ! #define SET_BINFO_MARKED(NODE) \ ! (TREE_VIA_VIRTUAL(NODE) \ ! ? SET_CLASSTYPE_MARKED (BINFO_TYPE (NODE)) \ ! : (void)(TREE_LANG_FLAG_0 (NODE) = 1)) ! #define CLEAR_BINFO_MARKED(NODE) \ ! (TREE_VIA_VIRTUAL (NODE) \ ! ? CLEAR_CLASSTYPE_MARKED (BINFO_TYPE (NODE)) \ ! : (void)(TREE_LANG_FLAG_0 (NODE) = 0)) /* Nonzero means that this class is on a path leading to a new vtable. */ ! #define BINFO_VTABLE_PATH_MARKED(NODE) \ ! (TREE_VIA_VIRTUAL (NODE) \ ! ? CLASSTYPE_MARKED3 (BINFO_TYPE (NODE)) \ ! : TREE_LANG_FLAG_3 (NODE)) ! #define SET_BINFO_VTABLE_PATH_MARKED(NODE) \ ! (TREE_VIA_VIRTUAL(NODE) \ ! ? SET_CLASSTYPE_MARKED3 (BINFO_TYPE (NODE)) \ ! : (TREE_LANG_FLAG_3 (NODE) = 1)) ! #define CLEAR_BINFO_VTABLE_PATH_MARKED(NODE) \ ! (TREE_VIA_VIRTUAL (NODE) \ ! ? CLEAR_CLASSTYPE_MARKED3 (BINFO_TYPE (NODE))\ ! : (TREE_LANG_FLAG_3 (NODE) = 0)) ! ! /* Nonzero means B (a BINFO) has its own vtable. Under the old ABI, ! secondary vtables are sometimes shared. Any copies will not have ! this flag set. ! B is part of the hierarchy dominated by C. */ ! #define BINFO_NEW_VTABLE_MARKED(B, C) \ ! (TREE_LANG_FLAG_4 (CANONICAL_BINFO (B, C))) /* Any subobject that needs a new vtable must have a vptr and must not be a non-virtual primary base (since it would then use the vtable from a derived class and never become non-primary.) */ ! #define SET_BINFO_NEW_VTABLE_MARKED(B, C) \ ! (BINFO_NEW_VTABLE_MARKED (B, C) = 1, \ my_friendly_assert (!BINFO_PRIMARY_P (B) \ || TREE_VIA_VIRTUAL (B), 20000517), \ my_friendly_assert (CLASSTYPE_VFIELDS (BINFO_TYPE (B)) != NULL_TREE, \ --- 1438,1465 ---- /* Additional macros for inheritance information. */ /* The BINFO_INHERITANCE_CHAIN is used opposite to the description in ! gcc/tree.h. In particular if D is non-virtually derived from B ! then the BINFO for B (in D) will have a BINFO_INHERITANCE_CHAIN ! pointing to D. If D is virtually derived, its ! BINFO_INHERITANCE_CHAIN will point to the most derived binfo. In ! tree.h, this pointer is described as pointing in other ! direction. The binfos of virtual bases are shared. */ /* Nonzero means marked by DFS or BFS search. */ ! #define BINFO_MARKED(NODE) TREE_LANG_FLAG_0 (NODE) /* Nonzero means that this class is on a path leading to a new vtable. */ ! #define BINFO_VTABLE_PATH_MARKED(NODE) TREE_LANG_FLAG_3 (NODE) ! /* Nonzero means B (a BINFO) has its own vtable. Any copies will not ! have this flag set. */ ! #define BINFO_NEW_VTABLE_MARKED(B) (TREE_LANG_FLAG_4 (B)) /* Any subobject that needs a new vtable must have a vptr and must not be a non-virtual primary base (since it would then use the vtable from a derived class and never become non-primary.) */ ! #define SET_BINFO_NEW_VTABLE_MARKED(B) \ ! (BINFO_NEW_VTABLE_MARKED (B) = 1, \ my_friendly_assert (!BINFO_PRIMARY_P (B) \ || TREE_VIA_VIRTUAL (B), 20000517), \ my_friendly_assert (CLASSTYPE_VFIELDS (BINFO_TYPE (B)) != NULL_TREE, \ *************** struct lang_type GTY(()) *** 1639,1649 **** /* Nonzero means this class has done dfs_pushdecls. */ #define BINFO_PUSHDECLS_MARKED(NODE) BINFO_VTABLE_PATH_MARKED (NODE) - #define SET_BINFO_PUSHDECLS_MARKED(NODE) SET_BINFO_VTABLE_PATH_MARKED (NODE) - #define CLEAR_BINFO_PUSHDECLS_MARKED(NODE) CLEAR_BINFO_VTABLE_PATH_MARKED (NODE) /* Nonzero if this BINFO is a primary base class. Note, this can be ! set for non-canononical virtual bases. For a virtual primary base you might also need to check whether it is canonical. */ #define BINFO_PRIMARY_P(NODE) \ --- 1467,1475 ---- /* Nonzero means this class has done dfs_pushdecls. */ #define BINFO_PUSHDECLS_MARKED(NODE) BINFO_VTABLE_PATH_MARKED (NODE) /* Nonzero if this BINFO is a primary base class. Note, this can be ! set for non-canonical virtual bases. For a virtual primary base you might also need to check whether it is canonical. */ #define BINFO_PRIMARY_P(NODE) \ *************** struct lang_type GTY(()) *** 1651,1667 **** /* The index in the VTT where this subobject's sub-VTT can be found. NULL_TREE if there is no sub-VTT. */ ! #define BINFO_SUBVTT_INDEX(NODE) TREE_VEC_ELT (NODE, 8) /* The index in the VTT where the vptr for this subobject can be found. NULL_TREE if there is no secondary vptr in the VTT. */ ! #define BINFO_VPTR_INDEX(NODE) TREE_VEC_ELT (NODE, 9) /* The binfo of which NODE is a primary base. (This is different from BINFO_INHERITANCE_CHAIN for virtual base because a virtual base is sometimes a primary base for a class for which it is not an immediate base.) */ ! #define BINFO_PRIMARY_BASE_OF(NODE) TREE_VEC_ELT (NODE, 10) /* Nonzero if this binfo has lost its primary base binfo (because that is a nearly-empty virtual base that has been taken by some other --- 1477,1501 ---- /* The index in the VTT where this subobject's sub-VTT can be found. NULL_TREE if there is no sub-VTT. */ ! #define BINFO_SUBVTT_INDEX(NODE) TREE_VEC_ELT (NODE, BINFO_ELTS + 0) /* The index in the VTT where the vptr for this subobject can be found. NULL_TREE if there is no secondary vptr in the VTT. */ ! #define BINFO_VPTR_INDEX(NODE) TREE_VEC_ELT (NODE, BINFO_ELTS + 1) /* The binfo of which NODE is a primary base. (This is different from BINFO_INHERITANCE_CHAIN for virtual base because a virtual base is sometimes a primary base for a class for which it is not an immediate base.) */ ! #define BINFO_PRIMARY_BASE_OF(NODE) TREE_VEC_ELT (NODE, BINFO_ELTS + 2) ! ! /* C++ binfos have 3 additional entries. */ ! ! #define BINFO_LANG_ELTS (BINFO_ELTS + 3) ! ! /* Nonzero if this binfo is for a dependent base - one that should not ! be searched. */ ! #define BINFO_DEPENDENT_BASE_P(NODE) TREE_LANG_FLAG_1(NODE) /* Nonzero if this binfo has lost its primary base binfo (because that is a nearly-empty virtual base that has been taken by some other *************** struct lang_type GTY(()) *** 1766,1773 **** struct lang_decl_flags GTY(()) { - struct c_lang_decl base; - ENUM_BITFIELD(languages) language : 8; unsigned operator_attr : 1; --- 1600,1605 ---- *************** struct lang_decl_flags GTY(()) *** 1794,1808 **** unsigned u1sel : 1; unsigned u2sel : 1; unsigned can_be_full : 1; ! unsigned unused : 1; /* One unused bit. */ union lang_decl_u { ! /* In a FUNCTION_DECL, VAR_DECL, TYPE_DECL, or TEMPLATE_DECL, this ! is DECL_TEMPLATE_INFO. */ tree GTY ((tag ("0"))) template_info; /* In a NAMESPACE_DECL, this is NAMESPACE_LEVEL. */ struct cp_binding_level * GTY ((tag ("1"))) level; } GTY ((desc ("%1.u1sel"))) u; union lang_decl_u2 { --- 1626,1645 ---- unsigned u1sel : 1; unsigned u2sel : 1; unsigned can_be_full : 1; ! unsigned this_thunk_p : 1; union lang_decl_u { ! /* In a FUNCTION_DECL for which DECL_THUNK_P does not hold, ! VAR_DECL, TYPE_DECL, or TEMPLATE_DECL, this is ! DECL_TEMPLATE_INFO. */ tree GTY ((tag ("0"))) template_info; /* In a NAMESPACE_DECL, this is NAMESPACE_LEVEL. */ struct cp_binding_level * GTY ((tag ("1"))) level; + + /* In a FUNCTION_DECL for which DECL_THUNK_P holds, this is + THUNK_ALIAS. */ + tree GTY ((tag ("2"))) thunk_alias; } GTY ((desc ("%1.u1sel"))) u; union lang_decl_u2 { *************** struct lang_decl_flags GTY(()) *** 1810,1823 **** tree GTY ((tag ("0"))) access; /* For VAR_DECL in function, this is DECL_DISCRIMINATOR. */ ! int discriminator; /* In a FUNCTION_DECL for which DECL_THUNK_P holds, this is ! THUNK_VCALL_OFFSET. */ ! tree GTY((tag ("2"))) vcall_offset; } GTY ((desc ("%1.u2sel"))) u2; }; struct lang_decl GTY(()) { struct lang_decl_flags decl_flags; --- 1647,1663 ---- tree GTY ((tag ("0"))) access; /* For VAR_DECL in function, this is DECL_DISCRIMINATOR. */ ! int GTY ((tag ("1"))) discriminator; /* In a FUNCTION_DECL for which DECL_THUNK_P holds, this is ! THUNK_VIRTUAL_OFFSET. */ ! tree GTY((tag ("2"))) virtual_offset; } GTY ((desc ("%1.u2sel"))) u2; }; + /* sorted_fields is sorted based on a pointer, so we need to be able + to resort it if pointers get rearranged. */ + struct lang_decl GTY(()) { struct lang_decl_flags decl_flags; *************** struct lang_decl GTY(()) *** 1826,1844 **** { struct full_lang_decl { tree befriending_classes; /* For a non-virtual FUNCTION_DECL, this is DECL_FRIEND_CONTEXT. For a virtual FUNCTION_DECL for which ! DECL_THUNK_P does not hold, this is DECL_THUNKS. */ tree context; /* In a FUNCTION_DECL, this is DECL_CLONED_FUNCTION. */ tree cloned_function; /* In a FUNCTION_DECL for which THUNK_P holds, this is ! THUNK_DELTA. */ ! HOST_WIDE_INT delta; /* In an overloaded operator, this is the value of DECL_OVERLOADED_OPERATOR_P. */ --- 1666,1690 ---- { struct full_lang_decl { + /* For a non-thunk function decl, this is a tree list of + friendly classes. For a thunk function decl, it is the + thunked to function decl. */ tree befriending_classes; /* For a non-virtual FUNCTION_DECL, this is DECL_FRIEND_CONTEXT. For a virtual FUNCTION_DECL for which ! DECL_THIS_THUNK_P does not hold, this is DECL_THUNKS. Both ! this pointer and result pointer adjusting thunks are ! chained here. This pointer thunks to return pointer thunks ! will be chained on the return pointer thunk. */ tree context; /* In a FUNCTION_DECL, this is DECL_CLONED_FUNCTION. */ tree cloned_function; /* In a FUNCTION_DECL for which THUNK_P holds, this is ! THUNK_FIXED_OFFSET. */ ! HOST_WIDE_INT fixed_offset; /* In an overloaded operator, this is the value of DECL_OVERLOADED_OPERATOR_P. */ *************** struct lang_decl GTY(()) *** 1849,1856 **** union lang_decl_u3 { ! tree GTY ((tag ("0"))) sorted_fields; ! struct unparsed_text * GTY ((tag ("2"))) pending_inline_info; struct language_function * GTY ((tag ("1"))) saved_language_function; } GTY ((desc ("%1.u3sel + %1.pending_inline_p"))) u; --- 1695,1703 ---- union lang_decl_u3 { ! struct sorted_fields_type * GTY ((tag ("0"), reorder ("resort_sorted_fields"))) ! sorted_fields; ! struct cp_token_cache * GTY ((tag ("2"))) pending_inline_info; struct language_function * GTY ((tag ("1"))) saved_language_function; } GTY ((desc ("%1.u3sel + %1.pending_inline_p"))) u; *************** struct lang_decl GTY(()) *** 1860,1866 **** #if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007) ! #define LANG_DECL_U2_CHECK(NODE, TF) \ ({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \ if (lt->decl_flags.u2sel != TF) \ lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \ --- 1707,1713 ---- #if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007) ! #define LANG_DECL_U2_CHECK(NODE, TF) __extension__ \ ({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \ if (lt->decl_flags.u2sel != TF) \ lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \ *************** struct lang_decl GTY(()) *** 1873,1880 **** #endif /* ENABLE_TREE_CHECKING */ - #define DEFARG_POINTER(NODE) (DEFAULT_ARG_CHECK (NODE)->identifier.id.str) - /* DECL_NEEDED_P holds of a declaration when we need to emit its definition. This is true when the back-end tells us that the symbol has been referenced in the generated code. If, however, --- 1720,1725 ---- *************** struct lang_decl GTY(()) *** 1886,1900 **** ((at_eof && TREE_PUBLIC (DECL) && !DECL_COMDAT (DECL)) \ || (DECL_ASSEMBLER_NAME_SET_P (DECL) \ && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (DECL))) \ ! || (flag_syntax_only && TREE_USED (DECL))) ! ! /* Nonzero iff DECL is memory-based. The DECL_RTL of ! certain const variables might be a CONST_INT, or a REG ! in some cases. We cannot use `memory_operand' as a test ! here because on most RISC machines, a variable's address ! is not, by itself, a legitimate address. */ ! #define DECL_IN_MEMORY_P(NODE) \ ! (DECL_RTL_SET_P (NODE) && GET_CODE (DECL_RTL (NODE)) == MEM) /* For a FUNCTION_DECL or a VAR_DECL, the language linkage for the declaration. Some entities (like a member function in a local --- 1731,1737 ---- ((at_eof && TREE_PUBLIC (DECL) && !DECL_COMDAT (DECL)) \ || (DECL_ASSEMBLER_NAME_SET_P (DECL) \ && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (DECL))) \ ! || (((flag_syntax_only || flag_unit_at_a_time) && TREE_USED (DECL)))) /* For a FUNCTION_DECL or a VAR_DECL, the language linkage for the declaration. Some entities (like a member function in a local *************** struct lang_decl GTY(()) *** 2003,2009 **** /* Nonzero if NODE is a user-defined conversion operator. */ #define DECL_CONV_FN_P(NODE) \ ! (IDENTIFIER_TYPENAME_P (DECL_NAME (NODE))) /* If FN is a conversion operator, the type to which it converts. Otherwise, NULL_TREE. */ --- 1840,1846 ---- /* Nonzero if NODE is a user-defined conversion operator. */ #define DECL_CONV_FN_P(NODE) \ ! (DECL_NAME (NODE) && IDENTIFIER_TYPENAME_P (DECL_NAME (NODE))) /* If FN is a conversion operator, the type to which it converts. Otherwise, NULL_TREE. */ *************** struct lang_decl GTY(()) *** 2021,2027 **** (DECL_LANG_SPECIFIC (NODE)->u.f.operator_code = (CODE)) /* If NODE is an overloaded operator, then this returns the TREE_CODE ! associcated with the overloaded operator. DECL_ASSIGNMENT_OPERATOR_P must also be checked to determine whether or not NODE is an assignment operator. If NODE is not an overloaded operator, ERROR_MARK is returned. Since the numerical --- 1858,1864 ---- (DECL_LANG_SPECIFIC (NODE)->u.f.operator_code = (CODE)) /* If NODE is an overloaded operator, then this returns the TREE_CODE ! associated with the overloaded operator. DECL_ASSIGNMENT_OPERATOR_P must also be checked to determine whether or not NODE is an assignment operator. If NODE is not an overloaded operator, ERROR_MARK is returned. Since the numerical *************** struct lang_decl GTY(()) *** 2057,2065 **** #define DECL_INITIALIZED_P(NODE) \ (TREE_LANG_FLAG_1 (VAR_DECL_CHECK (NODE))) /* Nonzero if the DECL was initialized in the class definition itself, rather than outside the class. This is used for both static member ! VAR_DECLS, and FUNTION_DECLS that are defined in the class. */ #define DECL_INITIALIZED_IN_CLASS_P(DECL) \ (DECL_LANG_SPECIFIC (DECL)->decl_flags.initialized_in_class) --- 1894,1907 ---- #define DECL_INITIALIZED_P(NODE) \ (TREE_LANG_FLAG_1 (VAR_DECL_CHECK (NODE))) + /* Nonzero for a VAR_DECL that was initialized with a + constant-expression. */ + #define DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P(NODE) \ + (TREE_LANG_FLAG_2 (VAR_DECL_CHECK (NODE))) + /* Nonzero if the DECL was initialized in the class definition itself, rather than outside the class. This is used for both static member ! VAR_DECLS, and FUNTION_DECLS that are defined in the class. */ #define DECL_INITIALIZED_IN_CLASS_P(DECL) \ (DECL_LANG_SPECIFIC (DECL)->decl_flags.initialized_in_class) *************** struct lang_decl GTY(()) *** 2126,2133 **** #define DECL_NEEDS_FINAL_OVERRIDER_P(NODE) \ (DECL_LANG_SPECIFIC (NODE)->decl_flags.needs_final_overrider) ! /* The thunks associated with NODE, a FUNCTION_DECL that is not itself ! a thunk. */ #define DECL_THUNKS(NODE) \ (DECL_LANG_SPECIFIC (NODE)->u.f.context) --- 1968,1974 ---- #define DECL_NEEDS_FINAL_OVERRIDER_P(NODE) \ (DECL_LANG_SPECIFIC (NODE)->decl_flags.needs_final_overrider) ! /* The thunks associated with NODE, a FUNCTION_DECL. */ #define DECL_THUNKS(NODE) \ (DECL_LANG_SPECIFIC (NODE)->u.f.context) *************** struct lang_decl GTY(()) *** 2136,2141 **** --- 1977,1990 ---- (TREE_CODE (NODE) == FUNCTION_DECL \ && DECL_LANG_FLAG_7 (NODE)) + /* Nonzero if NODE is a this pointer adjusting thunk. */ + #define DECL_THIS_THUNK_P(NODE) \ + (DECL_THUNK_P (NODE) && DECL_LANG_SPECIFIC (NODE)->decl_flags.this_thunk_p) + + /* Nonzero if NODE is a result pointer adjusting thunk. */ + #define DECL_RESULT_THUNK_P(NODE) \ + (DECL_THUNK_P (NODE) && !DECL_LANG_SPECIFIC (NODE)->decl_flags.this_thunk_p) + /* Nonzero if NODE is a FUNCTION_DECL, but not a thunk. */ #define DECL_NON_THUNK_FUNCTION_P(NODE) \ (TREE_CODE (NODE) == FUNCTION_DECL && !DECL_THUNK_P (NODE)) *************** struct lang_decl GTY(()) *** 2149,2162 **** (DECL_NON_THUNK_FUNCTION_P (NODE) && DECL_EXTERN_C_P (NODE)) /* Set DECL_THUNK_P for node. */ ! #define SET_DECL_THUNK_P(NODE) \ (DECL_LANG_FLAG_7 (NODE) = 1, \ ! DECL_LANG_SPECIFIC (NODE)->u.f.u3sel = 1) /* Nonzero if this DECL is the __PRETTY_FUNCTION__ variable in a template function. */ #define DECL_PRETTY_FUNCTION_P(NODE) \ ! (TREE_LANG_FLAG_0 (NODE)) /* The _TYPE context in which this _DECL appears. This field holds the class where a virtual function instance is actually defined. */ --- 1998,2012 ---- (DECL_NON_THUNK_FUNCTION_P (NODE) && DECL_EXTERN_C_P (NODE)) /* Set DECL_THUNK_P for node. */ ! #define SET_DECL_THUNK_P(NODE, THIS_ADJUSTING) \ (DECL_LANG_FLAG_7 (NODE) = 1, \ ! DECL_LANG_SPECIFIC (NODE)->u.f.u3sel = 1, \ ! DECL_LANG_SPECIFIC (NODE)->decl_flags.this_thunk_p = (THIS_ADJUSTING)) /* Nonzero if this DECL is the __PRETTY_FUNCTION__ variable in a template function. */ #define DECL_PRETTY_FUNCTION_P(NODE) \ ! (TREE_LANG_FLAG_0 (VAR_DECL_CHECK (NODE))) /* The _TYPE context in which this _DECL appears. This field holds the class where a virtual function instance is actually defined. */ *************** struct lang_decl GTY(()) *** 2197,2202 **** --- 2047,2055 ---- (DECL_CONTEXT (NODE) \ && TREE_CODE (DECL_CONTEXT (NODE)) == FUNCTION_DECL) + /* 1 iff VAR_DECL node NODE is virtual table or VTT. */ + #define DECL_VTABLE_OR_VTT_P(NODE) TREE_LANG_FLAG_5 (VAR_DECL_CHECK (NODE)) + /* 1 iff NODE is function-local, but for types. */ #define LOCAL_CLASS_P(NODE) \ (decl_function_context (TYPE_MAIN_DECL (NODE)) != NULL_TREE) *************** struct lang_decl GTY(()) *** 2210,2215 **** --- 2063,2073 ---- of a namespace, to record the transitive closure of using namespace. */ #define DECL_NAMESPACE_USERS(NODE) DECL_INITIAL (NAMESPACE_DECL_CHECK (NODE)) + /* In a NAMESPACE_DECL, the list of namespaces which have associated + themselves with this one. */ + #define DECL_NAMESPACE_ASSOCIATIONS(NODE) \ + (NAMESPACE_DECL_CHECK (NODE)->decl.saved_tree) + /* In a NAMESPACE_DECL, points to the original namespace if this is a namespace alias. */ #define DECL_NAMESPACE_ALIAS(NODE) \ *************** struct lang_decl GTY(()) *** 2318,2328 **** /* Nonzero if the template arguments is actually a vector of vectors, rather than just a vector. */ ! #define TMPL_ARGS_HAVE_MULTIPLE_LEVELS(NODE) \ ! ((NODE) != NULL_TREE \ ! && TREE_CODE (NODE) == TREE_VEC \ ! && TREE_VEC_LENGTH (NODE) > 0 \ ! && TREE_VEC_ELT (NODE, 0) != NULL_TREE \ && TREE_CODE (TREE_VEC_ELT (NODE, 0)) == TREE_VEC) /* The depth of a template argument vector. When called directly by --- 2176,2183 ---- /* Nonzero if the template arguments is actually a vector of vectors, rather than just a vector. */ ! #define TMPL_ARGS_HAVE_MULTIPLE_LEVELS(NODE) \ ! (NODE && TREE_VEC_ELT (NODE, 0) \ && TREE_CODE (TREE_VEC_ELT (NODE, 0)) == TREE_VEC) /* The depth of a template argument vector. When called directly by *************** struct lang_decl GTY(()) *** 2356,2364 **** /* Given a single level of template arguments in NODE, return the number of arguments. */ #define NUM_TMPL_ARGS(NODE) \ ! ((NODE) == NULL_TREE ? 0 \ ! : (TREE_CODE (NODE) == TREE_VEC \ ! ? TREE_VEC_LENGTH (NODE) : list_length (NODE))) /* Returns the innermost level of template arguments in ARGS. */ #define INNERMOST_TEMPLATE_ARGS(NODE) \ --- 2211,2217 ---- /* Given a single level of template arguments in NODE, return the number of arguments. */ #define NUM_TMPL_ARGS(NODE) \ ! (TREE_VEC_LENGTH (NODE)) /* Returns the innermost level of template arguments in ARGS. */ #define INNERMOST_TEMPLATE_ARGS(NODE) \ *************** struct lang_decl GTY(()) *** 2378,2391 **** DECL_TI_TEMPLATE, `template S::f'. As a special case, for a member friend template of a template ! class, this value will not be a TEMPLATE_DECL, but rather a ! LOOKUP_EXPR, IDENTIFIER_NODE or OVERLOAD indicating the name of ! the template and any explicit template arguments provided. For ! example, in: template struct S { friend void f(int, double); } ! the DECL_TI_TEMPLATE will be a LOOKUP_EXPR for `f' and the DECL_TI_ARGS will be {int}. */ #define DECL_TI_TEMPLATE(NODE) TI_TEMPLATE (DECL_TEMPLATE_INFO (NODE)) --- 2231,2243 ---- DECL_TI_TEMPLATE, `template S::f'. As a special case, for a member friend template of a template ! class, this value will not be a TEMPLATE_DECL, but rather an ! IDENTIFIER_NODE or OVERLOAD indicating the name of the template and ! any explicit template arguments provided. For example, in: template struct S { friend void f(int, double); } ! the DECL_TI_TEMPLATE will be an IDENTIFIER_NODE for `f' and the DECL_TI_ARGS will be {int}. */ #define DECL_TI_TEMPLATE(NODE) TI_TEMPLATE (DECL_TEMPLATE_INFO (NODE)) *************** struct lang_decl GTY(()) *** 2402,2407 **** --- 2254,2267 ---- #define ENUM_TI_ARGS(NODE) \ TI_ARGS (ENUM_TEMPLATE_INFO (NODE)) + /* For a template instantiation TYPE, returns the TYPE corresponding + to the primary template. Otherwise returns TYPE itself. */ + #define CLASSTYPE_PRIMARY_TEMPLATE_TYPE(TYPE) \ + ((CLASSTYPE_USE_TEMPLATE ((TYPE)) && !CLASSTYPE_TEMPLATE_SPECIALIZATION ((TYPE))) \ + ? TREE_TYPE (DECL_TEMPLATE_RESULT (DECL_PRIMARY_TEMPLATE \ + (CLASSTYPE_TI_TEMPLATE ((TYPE))))) \ + : (TYPE)) + /* Like DECL_TI_TEMPLATE, but for an ENUMERAL_, RECORD_, or UNION_TYPE. */ #define TYPE_TI_TEMPLATE(NODE) \ (TI_TEMPLATE (TYPE_TEMPLATE_INFO (NODE))) *************** struct lang_decl GTY(()) *** 2425,2431 **** #define NEW_EXPR_USE_GLOBAL(NODE) TREE_LANG_FLAG_0 (NODE) #define DELETE_EXPR_USE_GLOBAL(NODE) TREE_LANG_FLAG_0 (NODE) #define DELETE_EXPR_USE_VEC(NODE) TREE_LANG_FLAG_1 (NODE) ! #define LOOKUP_EXPR_GLOBAL(NODE) TREE_LANG_FLAG_0 (NODE) /* Nonzero if this AGGR_INIT_EXPR provides for initialization via a constructor call, rather than an ordinary function call. */ --- 2285,2298 ---- #define NEW_EXPR_USE_GLOBAL(NODE) TREE_LANG_FLAG_0 (NODE) #define DELETE_EXPR_USE_GLOBAL(NODE) TREE_LANG_FLAG_0 (NODE) #define DELETE_EXPR_USE_VEC(NODE) TREE_LANG_FLAG_1 (NODE) ! ! /* Indicates that this is a non-dependent COMPOUND_EXPR which will ! resolve to a function call. */ ! #define COMPOUND_EXPR_OVERLOADED(NODE) TREE_LANG_FLAG_0 (NODE) ! ! /* In a CALL_EXPR appearing in a template, true if Koenig lookup ! should be performed at instantiation time. */ ! #define KOENIG_LOOKUP_P(NODE) TREE_LANG_FLAG_0(NODE) /* Nonzero if this AGGR_INIT_EXPR provides for initialization via a constructor call, rather than an ordinary function call. */ *************** struct lang_decl GTY(()) *** 2447,2463 **** TEMPLATE_ID_EXPR if we had something like `typename X::Y'. */ #define TYPENAME_TYPE_FULLNAME(NODE) (TYPE_FIELDS (NODE)) - /* Nonzero if NODE is an implicit typename. */ - #define IMPLICIT_TYPENAME_P(NODE) \ - (TREE_CODE (NODE) == TYPENAME_TYPE && TREE_TYPE (NODE)) - - /* Nonzero if NODE is a TYPE_DECL that should not be visible because - it is from a dependent base class. */ - #define IMPLICIT_TYPENAME_TYPE_DECL_P(NODE) \ - (TREE_CODE (NODE) == TYPE_DECL \ - && DECL_ARTIFICIAL (NODE) \ - && IMPLICIT_TYPENAME_P (TREE_TYPE (NODE))) - /* Nonzero in INTEGER_CST means that this int is negative by dint of using a twos-complement negated operand. */ #define TREE_NEGATED_INT(NODE) TREE_LANG_FLAG_0 (INTEGER_CST_CHECK (NODE)) --- 2314,2319 ---- *************** struct lang_decl GTY(()) *** 2539,2546 **** (ARITHMETIC_TYPE_P (TYPE) \ || TREE_CODE (TYPE) == ENUMERAL_TYPE \ || TYPE_PTR_P (TYPE) \ ! || TYPE_PTRMEM_P (TYPE) \ ! || TYPE_PTRMEMFUNC_P (TYPE)) /* [dcl.init.aggr] --- 2395,2401 ---- (ARITHMETIC_TYPE_P (TYPE) \ || TREE_CODE (TYPE) == ENUMERAL_TYPE \ || TYPE_PTR_P (TYPE) \ ! || TYPE_PTR_TO_MEMBER_P (TYPE)) /* [dcl.init.aggr] *************** struct lang_decl GTY(()) *** 2626,2639 **** #define TYPE_HAS_TRIVIAL_ASSIGN_REF(NODE) \ (TYPE_HAS_ASSIGN_REF (NODE) && ! TYPE_HAS_COMPLEX_ASSIGN_REF (NODE)) ! #define TYPE_PTRMEM_P(NODE) \ ! (TREE_CODE (NODE) == POINTER_TYPE \ ! && TREE_CODE (TREE_TYPE (NODE)) == OFFSET_TYPE) ! #define TYPE_PTR_P(NODE) \ ! (TREE_CODE (NODE) == POINTER_TYPE \ ! && TREE_CODE (TREE_TYPE (NODE)) != OFFSET_TYPE) ! #define TYPE_PTROB_P(NODE) \ ! (TYPE_PTR_P (NODE) && TREE_CODE (TREE_TYPE (NODE)) != FUNCTION_TYPE \ && TREE_CODE (TREE_TYPE (NODE)) != VOID_TYPE) #define TYPE_PTROBV_P(NODE) \ (TYPE_PTR_P (NODE) && TREE_CODE (TREE_TYPE (NODE)) != FUNCTION_TYPE) --- 2481,2495 ---- #define TYPE_HAS_TRIVIAL_ASSIGN_REF(NODE) \ (TYPE_HAS_ASSIGN_REF (NODE) && ! TYPE_HAS_COMPLEX_ASSIGN_REF (NODE)) ! /* Returns true if NODE is a pointer-to-data-member. */ ! #define TYPE_PTRMEM_P(NODE) \ ! (TREE_CODE (NODE) == OFFSET_TYPE) ! #define TYPE_PTR_P(NODE) \ ! (TREE_CODE (NODE) == POINTER_TYPE) ! #define TYPE_PTROB_P(NODE) \ ! (TYPE_PTR_P (NODE) \ ! && TREE_CODE (TREE_TYPE (NODE)) != FUNCTION_TYPE \ ! && TREE_CODE (TREE_TYPE (NODE)) != METHOD_TYPE \ && TREE_CODE (TREE_TYPE (NODE)) != VOID_TYPE) #define TYPE_PTROBV_P(NODE) \ (TYPE_PTR_P (NODE) && TREE_CODE (TREE_TYPE (NODE)) != FUNCTION_TYPE) *************** struct lang_decl GTY(()) *** 2654,2659 **** --- 2510,2519 ---- #define TYPE_PTRMEMFUNC_FLAG(NODE) \ (LANG_TYPE_CLASS_CHECK (NODE)->ptrmemfunc_flag) + /* Returns true if NODE is a pointer-to-member. */ + #define TYPE_PTR_TO_MEMBER_P(NODE) \ + (TYPE_PTRMEM_P (NODE) || TYPE_PTRMEMFUNC_P (NODE)) + /* Indicates when overload resolution may resolve to a pointer to member function. [expr.unary.op]/3 */ #define PTRMEM_OK_P(NODE) TREE_LANG_FLAG_0 (NODE) *************** struct lang_decl GTY(()) *** 2692,2704 **** type `const X*'. */ #define TYPE_PTRMEM_CLASS_TYPE(NODE) \ (TYPE_PTRMEM_P (NODE) \ ! ? TYPE_OFFSET_BASETYPE (TREE_TYPE (NODE)) \ : TYPE_PTRMEMFUNC_OBJECT_TYPE (NODE)) /* For a pointer-to-member type of the form `T X::*', this is `T'. */ #define TYPE_PTRMEM_POINTED_TO_TYPE(NODE) \ (TYPE_PTRMEM_P (NODE) \ ! ? TREE_TYPE (TREE_TYPE (NODE)) \ : TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (NODE))) /* For a pointer-to-member constant `X::Y' this is the RECORD_TYPE for --- 2552,2564 ---- type `const X*'. */ #define TYPE_PTRMEM_CLASS_TYPE(NODE) \ (TYPE_PTRMEM_P (NODE) \ ! ? TYPE_OFFSET_BASETYPE (NODE) \ : TYPE_PTRMEMFUNC_OBJECT_TYPE (NODE)) /* For a pointer-to-member type of the form `T X::*', this is `T'. */ #define TYPE_PTRMEM_POINTED_TO_TYPE(NODE) \ (TYPE_PTRMEM_P (NODE) \ ! ? TREE_TYPE (NODE) \ : TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (NODE))) /* For a pointer-to-member constant `X::Y' this is the RECORD_TYPE for *************** struct lang_decl GTY(()) *** 2745,2758 **** /* The format of each node in the DECL_FRIENDLIST is as follows: The TREE_PURPOSE will be the name of a function, i.e., an ! IDENTIFIER_NODE. The TREE_VALUE will be itself a TREE_LIST, the ! list of functions with that name which are friends. The ! TREE_PURPOSE of each node in this sublist will be error_mark_node, ! if the function was declared a friend individually, in which case ! the TREE_VALUE will be the function_decl. If, however, all ! functions with a given name in a class were declared to be friends, ! the TREE_PUROSE will be the class type, and the TREE_VALUE will be ! NULL_TREE. */ #define DECL_FRIENDLIST(NODE) (DECL_INITIAL (NODE)) #define FRIEND_NAME(LIST) (TREE_PURPOSE (LIST)) #define FRIEND_DECLS(LIST) (TREE_VALUE (LIST)) --- 2605,2612 ---- /* The format of each node in the DECL_FRIENDLIST is as follows: The TREE_PURPOSE will be the name of a function, i.e., an ! IDENTIFIER_NODE. The TREE_VALUE will be itself a TREE_LIST, whose ! TREE_VALUEs are friends with the given name. */ #define DECL_FRIENDLIST(NODE) (DECL_INITIAL (NODE)) #define FRIEND_NAME(LIST) (TREE_PURPOSE (LIST)) #define FRIEND_DECLS(LIST) (TREE_VALUE (LIST)) *************** struct lang_decl GTY(()) *** 2783,2789 **** TREE_LIST, whose TREE_VALUE is a PARM_DECL (if the parameter is a non-type parameter), or a TYPE_DECL (if the parameter is a type parameter). The TREE_PURPOSE is the default value, if any. The ! TEMPLATE_PARM_INDEX for the parameter is avilable as the DECL_INITIAL (for a PARM_DECL) or as the TREE_TYPE (for a TYPE_DECL). */ #define DECL_TEMPLATE_PARMS(NODE) DECL_ARGUMENTS (NODE) --- 2637,2643 ---- TREE_LIST, whose TREE_VALUE is a PARM_DECL (if the parameter is a non-type parameter), or a TYPE_DECL (if the parameter is a type parameter). The TREE_PURPOSE is the default value, if any. The ! TEMPLATE_PARM_INDEX for the parameter is available as the DECL_INITIAL (for a PARM_DECL) or as the TREE_TYPE (for a TYPE_DECL). */ #define DECL_TEMPLATE_PARMS(NODE) DECL_ARGUMENTS (NODE) *************** struct lang_decl GTY(()) *** 2867,2879 **** --- 2721,2740 ---- #define DECL_TEMPLATE_TEMPLATE_PARM_P(NODE) \ (TREE_CODE (NODE) == TEMPLATE_DECL && DECL_TEMPLATE_PARM_P (NODE)) + /* Nonzero if NODE is a TEMPLATE_DECL representing an + UNBOUND_CLASS_TEMPLATE tree node. */ + #define DECL_UNBOUND_CLASS_TEMPLATE_P(NODE) \ + (TREE_CODE (NODE) == TEMPLATE_DECL && !DECL_TEMPLATE_RESULT (NODE)) + #define DECL_FUNCTION_TEMPLATE_P(NODE) \ (TREE_CODE (NODE) == TEMPLATE_DECL \ + && !DECL_UNBOUND_CLASS_TEMPLATE_P (NODE) \ && TREE_CODE (DECL_TEMPLATE_RESULT (NODE)) == FUNCTION_DECL) /* Nonzero for a DECL that represents a template class. */ #define DECL_CLASS_TEMPLATE_P(NODE) \ (TREE_CODE (NODE) == TEMPLATE_DECL \ + && !DECL_UNBOUND_CLASS_TEMPLATE_P (NODE) \ && TREE_CODE (DECL_TEMPLATE_RESULT (NODE)) == TYPE_DECL \ && !DECL_TEMPLATE_TEMPLATE_PARM_P (NODE)) *************** struct lang_decl GTY(()) *** 2954,2965 **** #define DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION(DECL) \ (DECL_TEMPLATE_INFO (DECL) && !DECL_USE_TEMPLATE (DECL)) - /* Nonzero if TYPE is a partial instantiation of a template class, - i.e., an instantiation whose instantiation arguments involve - template types. */ - #define PARTIAL_INSTANTIATION_P(TYPE) \ - (LANG_TYPE_CLASS_CHECK (TYPE)->is_partial_instantiation) - /* Nonzero iff we are currently processing a declaration for an entity with its own template parameter list, and which is not a full specialization. */ --- 2815,2820 ---- *************** struct lang_decl GTY(()) *** 2975,2986 **** /* We know what we're doing with this decl now. */ #define DECL_INTERFACE_KNOWN(NODE) DECL_LANG_FLAG_5 (NODE) - /* This function was declared inline. This flag controls the linkage - semantics of 'inline'; whether or not the function is inlined is - controlled by DECL_INLINE. */ - #define DECL_DECLARED_INLINE_P(NODE) \ - (DECL_LANG_SPECIFIC (NODE)->decl_flags.base.declared_inline) - /* DECL_EXTERNAL must be set on a decl until the decl is actually emitted, so that assemble_external will work properly. So we have this flag to tell us whether the decl is really not external. */ --- 2830,2835 ---- *************** struct lang_decl GTY(()) *** 2995,3027 **** A thunk is an alternate entry point for an ordinary FUNCTION_DECL. The address of the ordinary FUNCTION_DECL is given by the DECL_INITIAL, which is always an ADDR_EXPR whose operand is a ! FUNCTION_DECL. The job of the thunk is to adjust the `this' ! pointer before transferring control to the FUNCTION_DECL. ! A thunk may perform either, or both, of the following operations: ! o Adjust the `this' pointer by a constant offset. ! o Adjust the `this' pointer by looking up a vcall-offset in the vtable. ! If both operations are performed, then the constant adjument to ! `this' is performed first. ! The constant adjustment is given by THUNK_DELTA. If the ! vcall-offset is required, the index into the vtable is given by ! THUNK_VCALL_OFFSET. */ /* An integer indicating how many bytes should be subtracted from the ! `this' pointer when this function is called. */ ! #define THUNK_DELTA(DECL) \ ! (DECL_LANG_SPECIFIC (DECL)->u.f.delta) ! /* A tree indicating how many bytes should be subtracted from the ! vtable for the `this' pointer to find the vcall offset. (The vptr ! is always located at offset zero from the f `this' pointer.) If ! NULL, then there is no vcall offset. */ ! #define THUNK_VCALL_OFFSET(DECL) \ ! (LANG_DECL_U2_CHECK (DECL, 0)->vcall_offset) /* These macros provide convenient access to the various _STMT nodes created when parsing template declarations. */ --- 2844,2908 ---- A thunk is an alternate entry point for an ordinary FUNCTION_DECL. The address of the ordinary FUNCTION_DECL is given by the DECL_INITIAL, which is always an ADDR_EXPR whose operand is a ! FUNCTION_DECL. The job of the thunk is to either adjust the this ! pointer before transferring control to the FUNCTION_DECL, or call ! FUNCTION_DECL and then adjust the result value. Note, the result ! pointer adjusting thunk must perform a call to the thunked ! function, (or be implemented via passing some invisible parameter ! to the thunked function, which is modified to perform the ! adjustment just before returning). ! A thunk may perform either, or both, of the following operations: ! o Adjust the this or result pointer by a constant offset. ! o Adjust the this or result pointer by looking up a vcall or vbase offset in the vtable. ! A this pointer adjusting thunk converts from a base to a derived ! class, and hence adds the offsets. A result pointer adjusting thunk ! converts from a derived class to a base, and hence subtracts the ! offsets. If both operations are performed, then the constant ! adjustment is performed first for this pointer adjustment and last ! for the result pointer adjustment. ! The constant adjustment is given by THUNK_FIXED_OFFSET. If the ! vcall or vbase offset is required, THUNK_VIRTUAL_OFFSET is ! used. For this pointer adjusting thunks, it is the vcall offset ! into the vtable. For result pointer adjusting thunks it is the ! binfo of the virtual base to convert to. Use that binfo's vbase ! offset. ! ! It is possible to have equivalent covariant thunks. These are ! distinct virtual covariant thunks whose vbase offsets happen to ! have the same value. THUNK_ALIAS is used to pick one as the ! canonical thunk, which will get all the this pointer adjusting ! thunks attached to it. */ /* An integer indicating how many bytes should be subtracted from the ! this or result pointer when this function is called. */ ! #define THUNK_FIXED_OFFSET(DECL) \ ! (DECL_LANG_SPECIFIC (VAR_OR_FUNCTION_DECL_CHECK (DECL))->u.f.fixed_offset) ! /* A tree indicating how to perform the virtual adjustment. For a this ! adjusting thunk it is the number of bytes to be added to the vtable ! to find the vcall offset. For a result adjusting thunk, it is the ! binfo of the relevant virtual base. If NULL, then there is no ! virtual adjust. (The vptr is always located at offset zero from ! the this or result pointer.) (If the covariant type is within the ! class hierarchy being laid out, the vbase index is not yet known ! at the point we need to create the thunks, hence the need to use ! binfos.) */ ! ! #define THUNK_VIRTUAL_OFFSET(DECL) \ ! (LANG_DECL_U2_CHECK (FUNCTION_DECL_CHECK (DECL), 0)->virtual_offset) ! ! /* A thunk which is equivalent to another thunk. */ ! #define THUNK_ALIAS(DECL) \ ! (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (DECL))->decl_flags.u.thunk_alias) ! ! /* For thunk NODE, this is the FUNCTION_DECL thunked to. */ ! #define THUNK_TARGET(NODE) \ ! (DECL_LANG_SPECIFIC (NODE)->u.f.befriending_classes) /* These macros provide convenient access to the various _STMT nodes created when parsing template declarations. */ *************** struct lang_decl GTY(()) *** 3052,3058 **** (TREE_TYPE (NODE)) /* An enumeration of the kind of tags that C++ accepts. */ ! enum tag_types { record_type, class_type, union_type, enum_type }; /* The various kinds of lvalues we distinguish. */ typedef enum cp_lvalue_kind { --- 2933,2946 ---- (TREE_TYPE (NODE)) /* An enumeration of the kind of tags that C++ accepts. */ ! enum tag_types { ! none_type = 0, /* Not a tag type. */ ! record_type, /* "struct" types. */ ! class_type, /* "class" types. */ ! union_type, /* "union" types. */ ! enum_type, /* "enum" types. */ ! typename_type /* "typename" types. */ ! }; /* The various kinds of lvalues we distinguish. */ typedef enum cp_lvalue_kind { *************** typedef enum cp_lvalue_kind { *** 3060,3075 **** clk_ordinary = 1, /* An ordinary lvalue. */ clk_class = 2, /* An rvalue of class-type. */ clk_bitfield = 4, /* An lvalue for a bit-field. */ } cp_lvalue_kind; - /* The kinds of scopes we recognize. */ - typedef enum scope_kind { - sk_template_parms, /* A scope for template parameters. */ - sk_template_spec /* A scope corresponding to a template - specialization. There is never anything in - this scope. */ - } scope_kind; - /* Various kinds of template specialization, instantiation, etc. */ typedef enum tmpl_spec_kind { tsk_none, /* Not a template at all. */ --- 2948,2956 ---- clk_ordinary = 1, /* An ordinary lvalue. */ clk_class = 2, /* An rvalue of class-type. */ clk_bitfield = 4, /* An lvalue for a bit-field. */ + clk_packed = 8 /* An lvalue for a packed field. */ } cp_lvalue_kind; /* Various kinds of template specialization, instantiation, etc. */ typedef enum tmpl_spec_kind { tsk_none, /* Not a template at all. */ *************** typedef enum tsubst_flags_t { *** 3145,3163 **** tf_none = 0, /* nothing special */ tf_error = 1 << 0, /* give error messages */ tf_warning = 1 << 1, /* give warnings too */ ! tf_no_attributes = 1 << 2, /* ignore attributes on comparisons ! (instantiate_type use) */ ! tf_ignore_bad_quals = 1 << 3, /* ignore bad cvr qualifiers */ ! tf_keep_type_decl = 1 << 4, /* retain typedef type decls (make_typename_type use) */ ! tf_ptrmem_ok = 1 << 5, /* pointers to member ok (internal ! instantiate_type use) */ ! tf_parsing = 1 << 6, /* called from parser ! (make_typename_type use) */ ! tf_conv = 1 << 8, /* We are determining what kind of ! conversion might be permissible, not ! actually performing the ! conversion. */ } tsubst_flags_t; /* The kind of checking we can do looking in a class hierarchy. */ --- 3026,3047 ---- tf_none = 0, /* nothing special */ tf_error = 1 << 0, /* give error messages */ tf_warning = 1 << 1, /* give warnings too */ ! tf_ignore_bad_quals = 1 << 2, /* ignore bad cvr qualifiers */ ! tf_keep_type_decl = 1 << 3, /* retain typedef type decls (make_typename_type use) */ ! tf_ptrmem_ok = 1 << 4, /* pointers to member ok (internal ! instantiate_type use) */ ! tf_user = 1 << 5, /* found template must be a user template ! (lookup_template_class use) */ ! tf_stmt_expr_cmpd = 1 << 6, /* tsubsting the compound statement of ! a statement expr. */ ! tf_stmt_expr_body = 1 << 7, /* tsubsting the statements in the ! body of the compound statement of a ! statement expr. */ ! tf_conv = 1 << 8 /* We are determining what kind of ! conversion might be permissible, ! not actually performing the ! conversion. */ } tsubst_flags_t; /* The kind of checking we can do looking in a class hierarchy. */ *************** typedef enum base_access { *** 3168,3176 **** ba_check = 2, /* Check access */ ba_not_special = 3, /* Do not consider special privilege current_class_type might give. */ ! ba_quiet = 4, /* Do not issue error messages (bit mask). */ } base_access; /* The kind of base we can find, looking in a class hierarchy. Values <0 indicate we failed. */ typedef enum base_kind { --- 3052,3067 ---- ba_check = 2, /* Check access */ ba_not_special = 3, /* Do not consider special privilege current_class_type might give. */ ! ba_quiet = 4 /* Do not issue error messages (bit mask). */ } base_access; + /* The various kinds of access check during parsing. */ + typedef enum deferring_kind { + dk_no_deferred = 0, /* Check access immediately */ + dk_deferred = 1, /* Deferred check */ + dk_no_check = 2 /* No access check */ + } deferring_kind; + /* The kind of base we can find, looking in a class hierarchy. Values <0 indicate we failed. */ typedef enum base_kind { *************** extern GTY(()) tree error_mark_list; *** 3202,3214 **** extern GTY(()) tree integer_two_node; extern GTY(()) tree integer_three_node; - extern GTY(()) tree anonymous_namespace_name; - /* The number of function bodies which we are currently processing. (Zero if we are at namespace scope, one inside the body of a function, two inside the body of a function in a local class, etc.) */ extern int function_depth; /* in pt.c */ /* These values are used for the `STRICT' parameter to type_unification and --- 3093,3129 ---- extern GTY(()) tree integer_two_node; extern GTY(()) tree integer_three_node; /* The number of function bodies which we are currently processing. (Zero if we are at namespace scope, one inside the body of a function, two inside the body of a function in a local class, etc.) */ extern int function_depth; + typedef struct deferred_access GTY(()) + { + /* A TREE_LIST representing name-lookups for which we have deferred + checking access controls. We cannot check the accessibility of + names used in a decl-specifier-seq until we know what is being + declared because code like: + + class A { + class B {}; + B* f(); + } + + A::B* A::f() { return 0; } + + is valid, even though `A::B' is not generally accessible. + + The TREE_PURPOSE of each node is the scope used to qualify the + name being looked up; the TREE_VALUE is the DECL to which the + name was resolved. */ + tree deferred_access_checks; + /* The current mode of access checks. */ + enum deferring_kind deferring_access_checks_kind; + /* The next deferred access data in stack or linked-list. */ + struct deferred_access *next; + } deferred_access; + /* in pt.c */ /* These values are used for the `STRICT' parameter to type_unification and *************** enum overload_flags { NO_SPECIAL = 0, DT *** 3385,3391 **** #define B_CLR(A,X) ((A)[(X)>>3] &= ~(1 << ((X)&7))) #define B_TST(A,X) ((A)[(X)>>3] & (1 << ((X)&7))) ! /* These are uses as bits in flags passed to build_method_call to control its error reporting behavior. LOOKUP_PROTECT means flag access violations. --- 3300,3306 ---- #define B_CLR(A,X) ((A)[(X)>>3] &= ~(1 << ((X)&7))) #define B_TST(A,X) ((A)[(X)>>3] & (1 << ((X)&7))) ! /* These are uses as bits in flags passed to build_new_method_call to control its error reporting behavior. LOOKUP_PROTECT means flag access violations. *************** enum overload_flags { NO_SPECIAL = 0, DT *** 3415,3423 **** LOOKUP_PREFER_TYPES means not to accept objects, and possibly namespaces. LOOKUP_PREFER_NAMESPACES means not to accept objects, and possibly types. ! LOOKUP_PREFER_BOTH means class-or-namespace-name. ! LOOKUP_TEMPLATES_EXPECTED means that class templates also count ! as types. */ #define LOOKUP_PROTECT (1) #define LOOKUP_COMPLAIN (2) --- 3330,3336 ---- LOOKUP_PREFER_TYPES means not to accept objects, and possibly namespaces. LOOKUP_PREFER_NAMESPACES means not to accept objects, and possibly types. ! LOOKUP_PREFER_BOTH means class-or-namespace-name. */ #define LOOKUP_PROTECT (1) #define LOOKUP_COMPLAIN (2) *************** enum overload_flags { NO_SPECIAL = 0, DT *** 3433,3439 **** #define LOOKUP_PREFER_TYPES (2048) #define LOOKUP_PREFER_NAMESPACES (4096) #define LOOKUP_PREFER_BOTH (6144) - #define LOOKUP_TEMPLATES_EXPECTED (8192) #define LOOKUP_NAMESPACES_ONLY(F) \ (((F) & LOOKUP_PREFER_NAMESPACES) && !((F) & LOOKUP_PREFER_TYPES)) --- 3346,3351 ---- *************** enum overload_flags { NO_SPECIAL = 0, DT *** 3480,3499 **** #define COMPARE_STRICT 0 /* Just check if the types are the same. */ #define COMPARE_BASE 1 /* Check to see if the second type is ! derived from the first, or if both ! are pointers (or references) and ! the types pointed to by the second ! type is derived from the pointed to ! by the first. */ ! #define COMPARE_RELAXED 2 /* Like COMPARE_DERIVED, but in ! reverse. Also treat enumeration ! types as the same as integer types ! of the same width. */ ! #define COMPARE_REDECLARATION 4 /* The comparsion is being done when another declaration of an existing entity is seen. */ - #define COMPARE_NO_ATTRIBUTES 8 /* The comparison should ignore - extra-linguistic type attributes. */ /* Used with push_overloaded_decl. */ #define PUSH_GLOBAL 0 /* Push the DECL into namespace scope, --- 3392,3403 ---- #define COMPARE_STRICT 0 /* Just check if the types are the same. */ #define COMPARE_BASE 1 /* Check to see if the second type is ! derived from the first. */ ! #define COMPARE_DERIVED 2 /* Like COMPARE_BASE, but in ! reverse. */ ! #define COMPARE_REDECLARATION 4 /* The comparison is being done when another declaration of an existing entity is seen. */ /* Used with push_overloaded_decl. */ #define PUSH_GLOBAL 0 /* Push the DECL into namespace scope, *************** enum overload_flags { NO_SPECIAL = 0, DT *** 3576,3589 **** /* in lex.c */ ! extern void init_reswords PARAMS ((void)); /* Indexed by TREE_CODE, these tables give C-looking names to operators represented by TREE_CODES. For example, opname_tab[(int) MINUS_EXPR] == "-". */ extern const char **opname_tab, **assignop_tab; ! typedef struct operator_name_info_t { /* The IDENTIFIER_NODE for the operator. */ tree identifier; --- 3480,3493 ---- /* in lex.c */ ! extern void init_reswords (void); /* Indexed by TREE_CODE, these tables give C-looking names to operators represented by TREE_CODES. For example, opname_tab[(int) MINUS_EXPR] == "-". */ extern const char **opname_tab, **assignop_tab; ! typedef struct operator_name_info_t GTY(()) { /* The IDENTIFIER_NODE for the operator. */ tree identifier; *************** typedef struct operator_name_info_t *** 3596,4449 **** } operator_name_info_t; /* A mapping from tree codes to operator name information. */ ! extern operator_name_info_t operator_name_info[]; /* Similar, but for assignment operators. */ ! extern operator_name_info_t assignment_operator_name_info[]; /* in call.c */ ! extern int check_dtor_name PARAMS ((tree, tree)); ! extern int get_arglist_len_in_bytes PARAMS ((tree)); ! extern tree build_vfield_ref PARAMS ((tree, tree)); ! extern tree build_scoped_method_call PARAMS ((tree, tree, tree, tree)); ! extern tree build_conditional_expr PARAMS ((tree, tree, tree)); ! extern tree build_addr_func PARAMS ((tree)); ! extern tree build_call PARAMS ((tree, tree)); ! extern tree build_method_call PARAMS ((tree, tree, tree, tree, int)); ! extern int null_ptr_cst_p PARAMS ((tree)); ! extern int sufficient_parms_p PARAMS ((tree)); ! extern tree type_decays_to PARAMS ((tree)); ! extern tree resolve_scoped_fn_name PARAMS ((tree, tree)); ! extern tree build_user_type_conversion PARAMS ((tree, tree, int)); ! extern tree build_new_function_call PARAMS ((tree, tree)); ! extern tree build_new_method_call (tree, tree, tree, tree, int); ! extern tree build_special_member_call (tree, tree, tree, tree, int); ! extern tree build_new_op PARAMS ((enum tree_code, int, tree, tree, tree)); ! extern tree build_op_delete_call PARAMS ((enum tree_code, tree, tree, int, tree)); ! extern int can_convert PARAMS ((tree, tree)); ! extern int can_convert_arg PARAMS ((tree, tree, tree)); ! extern int can_convert_arg_bad PARAMS ((tree, tree, tree)); ! extern int enforce_access PARAMS ((tree, tree)); ! extern tree convert_default_arg PARAMS ((tree, tree, tree, int)); ! extern tree convert_arg_to_ellipsis PARAMS ((tree)); ! extern tree build_x_va_arg PARAMS ((tree, tree)); ! extern tree cxx_type_promotes_to PARAMS ((tree)); ! extern tree type_passed_as PARAMS ((tree)); ! extern tree convert_for_arg_passing PARAMS ((tree, tree)); ! extern tree cp_convert_parm_for_inlining PARAMS ((tree, tree, tree)); ! extern int is_properly_derived_from PARAMS ((tree, tree)); ! extern tree initialize_reference PARAMS ((tree, tree, tree, tree *)); ! extern tree make_temporary_var_for_ref_to_temp (tree, tree); ! extern tree strip_top_quals PARAMS ((tree)); ! extern tree perform_implicit_conversion PARAMS ((tree, tree)); extern tree perform_direct_initialization_if_possible (tree, tree); /* in class.c */ ! extern tree build_base_path PARAMS ((enum tree_code, tree, tree, int)); extern tree convert_to_base (tree, tree, bool); ! extern tree convert_to_base_statically (tree, tree); ! extern tree build_vtbl_ref PARAMS ((tree, tree)); ! extern tree build_vfn_ref PARAMS ((tree, tree)); ! extern tree get_vtable_decl PARAMS ((tree, int)); ! extern void add_method PARAMS ((tree, tree, int)); ! extern int currently_open_class PARAMS ((tree)); ! extern tree currently_open_derived_class PARAMS ((tree)); ! extern void duplicate_tag_error PARAMS ((tree)); ! extern tree finish_struct PARAMS ((tree, tree)); ! extern void finish_struct_1 PARAMS ((tree)); ! extern int resolves_to_fixed_type_p PARAMS ((tree, int *)); ! extern void init_class_processing PARAMS ((void)); ! extern int is_empty_class PARAMS ((tree)); ! extern void pushclass PARAMS ((tree, int)); ! extern void popclass PARAMS ((void)); ! extern void push_nested_class PARAMS ((tree, int)); ! extern void pop_nested_class PARAMS ((void)); ! extern int current_lang_depth PARAMS ((void)); ! extern void push_lang_context PARAMS ((tree)); ! extern void pop_lang_context PARAMS ((void)); ! extern tree instantiate_type PARAMS ((tree, tree, tsubst_flags_t)); ! extern void print_class_statistics PARAMS ((void)); ! extern void cxx_print_statistics PARAMS ((void)); ! extern void cxx_print_xnode PARAMS ((FILE *, tree, int)); ! extern void cxx_print_decl PARAMS ((FILE *, tree, int)); ! extern void cxx_print_type PARAMS ((FILE *, tree, int)); ! extern void cxx_print_identifier PARAMS ((FILE *, tree, int)); ! extern void cxx_print_error_function PARAMS ((struct diagnostic_context *, ! const char *)); ! extern void build_self_reference PARAMS ((void)); ! extern int same_signature_p PARAMS ((tree, tree)); ! extern void warn_hidden PARAMS ((tree)); ! extern void maybe_add_class_template_decl_list PARAMS ((tree, tree, int)); ! extern tree get_enclosing_class PARAMS ((tree)); ! int is_base_of_enclosing_class PARAMS ((tree, tree)); ! extern void unreverse_member_declarations PARAMS ((tree)); ! extern void invalidate_class_lookup_cache PARAMS ((void)); ! extern void maybe_note_name_used_in_class PARAMS ((tree, tree)); ! extern void note_name_declared_in_class PARAMS ((tree, tree)); ! extern tree get_vtbl_decl_for_binfo PARAMS ((tree)); ! extern tree in_charge_arg_for_name PARAMS ((tree)); ! extern tree build_cxx_call PARAMS ((tree, tree, tree)); ! extern tree get_vtt_name PARAMS ((tree)); ! extern tree get_primary_binfo PARAMS ((tree)); /* in cvt.c */ ! extern tree convert_to_reference PARAMS ((tree, tree, int, int, tree)); ! extern tree convert_from_reference PARAMS ((tree)); ! extern tree convert_lvalue PARAMS ((tree, tree)); ! extern tree force_rvalue PARAMS ((tree)); ! extern tree ocp_convert PARAMS ((tree, tree, int, int)); ! extern tree cp_convert PARAMS ((tree, tree)); ! extern tree convert_to_void PARAMS ((tree, const char */*implicit context*/)); ! extern tree convert_force PARAMS ((tree, tree, int)); ! extern tree build_type_conversion PARAMS ((tree, tree)); ! extern tree build_expr_type_conversion PARAMS ((int, tree, int)); ! extern tree type_promotes_to PARAMS ((tree)); ! extern tree perform_qualification_conversions PARAMS ((tree, tree)); ! extern void clone_function_decl PARAMS ((tree, int)); ! extern void adjust_clone_args PARAMS ((tree)); /* decl.c */ ! extern int global_bindings_p PARAMS ((void)); ! extern int kept_level_p PARAMS ((void)); ! extern bool innermost_scope_is_class_p (void); ! extern tree getdecls PARAMS ((void)); ! extern void pushlevel PARAMS ((int)); ! extern tree poplevel PARAMS ((int,int, int)); ! extern void insert_block PARAMS ((tree)); ! extern void set_block PARAMS ((tree)); ! extern tree pushdecl PARAMS ((tree)); ! extern void cxx_init_decl_processing PARAMS ((void)); enum cp_tree_node_structure_enum cp_tree_node_structure ! PARAMS ((union lang_tree_node *)); ! extern void cxx_insert_default_attributes PARAMS ((tree)); ! extern bool cxx_mark_addressable PARAMS ((tree)); ! extern void cxx_push_function_context PARAMS ((struct function *)); ! extern void cxx_pop_function_context PARAMS ((struct function *)); ! extern void cxx_mark_function_context PARAMS ((struct function *)); ! extern int toplevel_bindings_p PARAMS ((void)); ! extern int namespace_bindings_p PARAMS ((void)); ! extern void keep_next_level PARAMS ((int)); ! extern int template_parm_scope_p PARAMS ((void)); ! extern void set_class_shadows PARAMS ((tree)); ! extern void maybe_push_cleanup_level PARAMS ((tree)); ! extern void begin_scope PARAMS ((scope_kind)); ! extern void finish_scope PARAMS ((void)); ! extern void note_level_for_for PARAMS ((void)); ! extern void note_level_for_try PARAMS ((void)); ! extern void note_level_for_catch PARAMS ((void)); ! extern void resume_level PARAMS ((struct cp_binding_level *)); ! extern void delete_block PARAMS ((tree)); ! extern void add_block_current_level PARAMS ((tree)); ! extern void pushlevel_class PARAMS ((void)); ! extern void poplevel_class PARAMS ((void)); ! extern void print_binding_stack PARAMS ((void)); ! extern void print_binding_level PARAMS ((struct cp_binding_level *)); ! extern void push_namespace PARAMS ((tree)); ! extern void pop_namespace PARAMS ((void)); ! extern void push_nested_namespace PARAMS ((tree)); ! extern void pop_nested_namespace PARAMS ((tree)); ! extern void maybe_push_to_top_level PARAMS ((int)); ! extern void push_to_top_level PARAMS ((void)); ! extern void pop_from_top_level PARAMS ((void)); ! extern void push_switch PARAMS ((tree)); ! extern void pop_switch PARAMS ((void)); ! extern tree identifier_type_value PARAMS ((tree)); ! extern void set_identifier_type_value PARAMS ((tree, tree)); ! extern void pop_everything PARAMS ((void)); ! extern void pushtag PARAMS ((tree, tree, int)); ! extern tree make_anon_name PARAMS ((void)); ! extern void clear_anon_tags PARAMS ((void)); ! extern int decls_match PARAMS ((tree, tree)); ! extern int duplicate_decls PARAMS ((tree, tree)); ! extern tree pushdecl_top_level PARAMS ((tree)); extern tree pushdecl_top_level_and_finish (tree, tree); ! extern bool pushdecl_class_level (tree); ! extern tree pushdecl_namespace_level PARAMS ((tree)); ! extern tree push_using_decl PARAMS ((tree, tree)); ! extern tree push_using_directive PARAMS ((tree)); ! extern bool push_class_level_binding (tree, tree); ! extern tree implicitly_declare PARAMS ((tree)); ! extern tree declare_local_label PARAMS ((tree)); ! extern tree define_label PARAMS ((const char *, int, tree)); ! extern void check_goto PARAMS ((tree)); ! extern void define_case_label PARAMS ((void)); ! extern cxx_binding *binding_for_name (tree, tree); ! extern tree namespace_binding PARAMS ((tree, tree)); ! extern void set_namespace_binding PARAMS ((tree, tree, tree)); ! extern tree lookup_namespace_name PARAMS ((tree, tree)); ! extern tree build_typename_type PARAMS ((tree, tree, tree, tree)); ! extern tree make_typename_type PARAMS ((tree, tree, tsubst_flags_t)); ! extern tree make_unbound_class_template PARAMS ((tree, tree, tsubst_flags_t)); ! extern tree lookup_name_nonclass PARAMS ((tree)); ! extern tree lookup_function_nonclass PARAMS ((tree, tree)); ! extern tree lookup_name PARAMS ((tree, int)); ! extern tree lookup_name_current_level PARAMS ((tree)); ! extern tree lookup_type_current_level PARAMS ((tree)); ! extern tree lookup_name_namespace_only PARAMS ((tree)); ! extern void begin_only_namespace_names PARAMS ((void)); ! extern void end_only_namespace_names PARAMS ((void)); ! extern tree namespace_ancestor PARAMS ((tree, tree)); ! extern bool is_ancestor (tree, tree); ! extern tree unqualified_namespace_lookup PARAMS ((tree, int, tree *)); extern tree check_for_out_of_scope_variable (tree); ! extern bool lookup_using_namespace (tree, cxx_binding *, tree, tree, int, tree *); ! extern bool qualified_lookup_using_namespace (tree, tree, cxx_binding *, int); ! extern tree build_library_fn PARAMS ((tree, tree)); ! extern tree build_library_fn_ptr PARAMS ((const char *, tree)); ! extern tree build_cp_library_fn_ptr PARAMS ((const char *, tree)); ! extern tree push_library_fn PARAMS ((tree, tree)); ! extern tree push_void_library_fn PARAMS ((tree, tree)); ! extern tree push_throw_library_fn PARAMS ((tree, tree)); ! extern int init_type_desc PARAMS ((void)); ! extern tree check_tag_decl PARAMS ((tree)); ! extern void shadow_tag PARAMS ((tree)); ! extern tree groktypename PARAMS ((tree)); ! extern tree start_decl PARAMS ((tree, tree, int, tree, tree)); ! extern void start_decl_1 PARAMS ((tree)); ! extern void cp_finish_decl PARAMS ((tree, tree, tree, int)); ! extern void finish_decl PARAMS ((tree, tree, tree)); ! extern void maybe_inject_for_scope_var PARAMS ((tree)); ! extern tree start_handler_parms PARAMS ((tree, tree)); ! extern int complete_array_type PARAMS ((tree, tree, int)); ! extern tree build_ptrmemfunc_type PARAMS ((tree)); extern tree build_ptrmem_type (tree, tree); /* the grokdeclarator prototype is in decl.h */ ! extern int parmlist_is_exprlist PARAMS ((tree)); ! extern int copy_fn_p PARAMS ((tree)); ! extern void grok_special_member_properties PARAMS ((tree)); ! extern int grok_ctor_properties PARAMS ((tree, tree)); ! extern void grok_op_properties PARAMS ((tree, int)); ! extern tree xref_tag (enum tag_types, tree, tree, bool); ! extern tree xref_tag_from_type PARAMS ((tree, tree, int)); ! extern void xref_basetypes PARAMS ((tree, tree)); ! extern tree start_enum PARAMS ((tree)); ! extern void finish_enum PARAMS ((tree)); ! extern void build_enumerator PARAMS ((tree, tree, tree)); ! extern int start_function PARAMS ((tree, tree, tree, int)); ! extern tree begin_function_body PARAMS ((void)); ! extern void finish_function_body PARAMS ((tree)); ! extern tree finish_function PARAMS ((int)); ! extern tree start_method PARAMS ((tree, tree, tree)); ! extern tree finish_method PARAMS ((tree)); ! extern void maybe_register_incomplete_var PARAMS ((tree)); ! extern void complete_vars PARAMS ((tree)); ! extern void finish_stmt PARAMS ((void)); ! extern void print_other_binding_stack PARAMS ((struct cp_binding_level *)); ! extern void revert_static_member_fn PARAMS ((tree)); ! extern void fixup_anonymous_aggr PARAMS ((tree)); ! extern int check_static_variable_definition PARAMS ((tree, tree)); ! extern tree compute_array_index_type PARAMS ((tree, tree)); ! extern void push_local_binding PARAMS ((tree, tree, int)); ! extern int push_class_binding PARAMS ((tree, tree)); ! extern tree check_default_argument PARAMS ((tree, tree)); ! extern tree push_overloaded_decl PARAMS ((tree, int)); ! extern void clear_identifier_class_values PARAMS ((void)); ! extern void storetags PARAMS ((tree)); ! extern int vtable_decl_p PARAMS ((tree, void *)); ! extern int vtype_decl_p PARAMS ((tree, void *)); ! extern int sigtable_decl_p PARAMS ((tree, void *)); ! typedef int (*walk_globals_pred) PARAMS ((tree, void *)); ! typedef int (*walk_globals_fn) PARAMS ((tree *, void *)); ! extern int walk_globals PARAMS ((walk_globals_pred, ! walk_globals_fn, ! void *)); ! extern int walk_vtables PARAMS ((walk_globals_pred, ! walk_globals_fn, ! void *)); ! typedef int (*walk_namespaces_fn) PARAMS ((tree, void *)); ! extern int walk_namespaces PARAMS ((walk_namespaces_fn, ! void *)); ! extern int wrapup_globals_for_namespace PARAMS ((tree, void *)); ! extern tree cp_namespace_decls PARAMS ((tree)); ! extern tree create_implicit_typedef PARAMS ((tree, tree)); ! extern tree maybe_push_decl PARAMS ((tree)); ! extern tree build_target_expr_with_type PARAMS ((tree, tree)); ! extern int local_variable_p PARAMS ((tree)); ! extern int nonstatic_local_decl_p PARAMS ((tree)); ! extern tree declare_global_var PARAMS ((tree, tree)); ! extern void register_dtor_fn PARAMS ((tree)); ! extern tmpl_spec_kind current_tmpl_spec_kind PARAMS ((int)); ! extern cxx_binding *cxx_scope_find_binding_for_name (tree, tree); ! extern tree cp_fname_init PARAMS ((const char *)); extern bool have_extern_spec; /* in decl2.c */ ! extern int check_java_method PARAMS ((tree)); ! extern int grok_method_quals PARAMS ((tree, tree, tree)); ! extern void warn_if_unknown_interface PARAMS ((tree)); ! extern void grok_x_components PARAMS ((tree)); ! extern void maybe_retrofit_in_chrg PARAMS ((tree)); ! extern void maybe_make_one_only PARAMS ((tree)); ! extern void grokclassfn PARAMS ((tree, tree, enum overload_flags, tree)); ! extern tree grok_array_decl PARAMS ((tree, tree)); ! extern tree delete_sanity PARAMS ((tree, tree, int, int)); ! extern tree check_classfn PARAMS ((tree, tree)); ! extern void check_member_template PARAMS ((tree)); ! extern tree grokfield PARAMS ((tree, tree, tree, tree, tree)); ! extern tree grokbitfield PARAMS ((tree, tree, tree)); ! extern tree groktypefield PARAMS ((tree, tree)); ! extern tree grokoptypename PARAMS ((tree, tree, tree)); ! extern void cplus_decl_attributes PARAMS ((tree *, tree, int)); ! extern tree constructor_name_full PARAMS ((tree)); ! extern tree constructor_name PARAMS ((tree)); ! extern bool constructor_name_p (tree, tree); ! extern void defer_fn PARAMS ((tree)); ! extern void finish_anon_union PARAMS ((tree)); ! extern tree finish_table PARAMS ((tree, tree, tree, int)); ! extern void finish_builtin_type PARAMS ((tree, const char *, ! tree *, int, tree)); ! extern tree coerce_new_type PARAMS ((tree)); ! extern tree coerce_delete_type PARAMS ((tree)); ! extern void comdat_linkage PARAMS ((tree)); ! extern void import_export_vtable PARAMS ((tree, tree, int)); ! extern void import_export_decl PARAMS ((tree)); ! extern void import_export_tinfo PARAMS ((tree, tree, int)); ! extern tree build_cleanup PARAMS ((tree)); ! extern void finish_file PARAMS ((void)); ! extern tree reparse_absdcl_as_expr PARAMS ((tree, tree)); ! extern tree reparse_absdcl_as_casts PARAMS ((tree, tree)); ! extern tree build_expr_from_tree PARAMS ((tree)); extern tree build_offset_ref_call_from_tree (tree, tree); ! extern tree build_call_from_tree (tree, tree, bool); ! extern tree reparse_decl_as_expr PARAMS ((tree, tree)); ! extern tree finish_decl_parsing PARAMS ((tree)); ! extern void set_decl_namespace PARAMS ((tree, tree, int)); ! extern tree current_decl_namespace PARAMS ((void)); ! extern void push_decl_namespace PARAMS ((tree)); ! extern void pop_decl_namespace PARAMS ((void)); ! extern void push_scope PARAMS ((tree)); ! extern void pop_scope PARAMS ((tree)); ! extern void do_namespace_alias PARAMS ((tree, tree)); ! extern void do_toplevel_using_decl PARAMS ((tree)); ! extern void do_local_using_decl PARAMS ((tree)); ! extern tree do_class_using_decl PARAMS ((tree)); ! extern void do_using_directive PARAMS ((tree)); ! extern void check_default_args PARAMS ((tree)); ! extern void mark_used PARAMS ((tree)); ! extern tree handle_class_head (enum tag_types, tree, tree, tree, int, int *); ! extern tree handle_class_head_apparent_template (tree, int *); ! extern tree lookup_arg_dependent PARAMS ((tree, tree, tree)); ! extern void finish_static_data_member_decl PARAMS ((tree, tree, tree, int)); ! extern tree cp_build_parm_decl PARAMS ((tree, tree)); ! extern tree build_artificial_parm PARAMS ((tree, tree)); ! extern tree get_guard PARAMS ((tree)); ! extern tree get_guard_cond PARAMS ((tree)); ! extern tree set_guard PARAMS ((tree)); ! ! extern void cp_error_at PARAMS ((const char *msgid, ...)); ! extern void cp_warning_at PARAMS ((const char *msgid, ...)); ! extern void cp_pedwarn_at PARAMS ((const char *msgid, ...)); /* XXX Not i18n clean. */ ! #define cp_deprecated(STR) \ ! do { \ ! if (warn_deprecated) \ ! warning ("%s is deprecated, please see the documentation for details", \ ! (STR)); \ } while (0) /* in error.c */ ! extern void init_error PARAMS ((void)); ! extern const char *type_as_string PARAMS ((tree, int)); ! extern const char *decl_as_string PARAMS ((tree, int)); ! extern const char *expr_as_string PARAMS ((tree, int)); ! extern const char *context_as_string PARAMS ((tree, int)); ! extern const char *lang_decl_name PARAMS ((tree, int)); ! extern const char *cp_file_of PARAMS ((tree)); ! extern int cp_line_of PARAMS ((tree)); ! extern const char *language_to_string PARAMS ((enum languages, int)); ! extern void print_instantiation_context PARAMS ((void)); /* in except.c */ ! extern void init_exception_processing PARAMS ((void)); ! extern tree expand_start_catch_block PARAMS ((tree)); ! extern void expand_end_catch_block PARAMS ((void)); ! extern void expand_builtin_throw PARAMS ((void)); ! extern void expand_eh_spec_block PARAMS ((tree)); ! extern void expand_exception_blocks PARAMS ((void)); ! extern tree build_exc_ptr PARAMS ((void)); ! extern tree build_throw PARAMS ((tree)); ! extern void mark_all_runtime_matches PARAMS ((void)); ! extern int nothrow_libfn_p PARAMS ((tree)); ! extern void check_handlers PARAMS ((tree)); ! extern void choose_personality_routine PARAMS ((enum languages)); /* in expr.c */ ! extern rtx cxx_expand_expr PARAMS ((tree, rtx, ! enum machine_mode, ! int)); ! extern tree cplus_expand_constant PARAMS ((tree)); /* friend.c */ ! extern int is_friend PARAMS ((tree, tree)); ! extern void make_friend_class PARAMS ((tree, tree)); ! extern void add_friend PARAMS ((tree, tree)); ! extern tree do_friend PARAMS ((tree, tree, tree, tree, tree, enum overload_flags, tree, int)); /* in init.c */ extern tree expand_member_init (tree); extern void emit_mem_initializers (tree); ! extern tree build_aggr_init PARAMS ((tree, tree, int)); ! extern tree build_init PARAMS ((tree, tree, int)); ! extern int is_aggr_type PARAMS ((tree, int)); ! extern tree get_aggr_from_typedef PARAMS ((tree, int)); ! extern tree get_type_value PARAMS ((tree)); extern tree build_zero_init (tree, tree, bool); ! extern tree build_member_call PARAMS ((tree, tree, tree)); ! extern tree build_offset_ref PARAMS ((tree, tree)); ! extern tree resolve_offset_ref PARAMS ((tree)); ! extern tree build_new PARAMS ((tree, tree, tree, int)); ! extern tree build_vec_init PARAMS ((tree, tree, tree, int)); ! extern tree build_x_delete PARAMS ((tree, int, tree)); ! extern tree build_delete PARAMS ((tree, tree, special_function_kind, int, int)); ! extern void push_base_cleanups PARAMS ((void)); ! extern tree build_vbase_delete PARAMS ((tree, tree)); ! extern tree build_vec_delete PARAMS ((tree, tree, special_function_kind, int)); ! extern tree create_temporary_var PARAMS ((tree)); ! extern void begin_init_stmts PARAMS ((tree *, tree *)); ! extern tree finish_init_stmts PARAMS ((tree, tree)); ! extern void initialize_vtbl_ptrs PARAMS ((tree)); ! extern tree build_java_class_ref PARAMS ((tree)); /* in input.c */ /* in lex.c */ ! extern void cxx_dup_lang_specific_decl PARAMS ((tree)); ! extern tree make_pointer_declarator PARAMS ((tree, tree)); ! extern tree make_reference_declarator PARAMS ((tree, tree)); ! extern tree make_call_declarator PARAMS ((tree, tree, tree, tree)); ! extern void set_quals_and_spec PARAMS ((tree, tree, tree)); ! extern void print_parse_statistics PARAMS ((void)); ! extern void do_pending_inlines PARAMS ((void)); ! extern void process_next_inline PARAMS ((struct unparsed_text *)); ! ! extern void yyungetc PARAMS ((int, int)); ! extern void snarf_method PARAMS ((tree)); ! extern void check_for_missing_semicolon PARAMS ((tree)); ! extern void note_got_semicolon PARAMS ((tree)); ! extern void note_list_got_semicolon PARAMS ((tree)); ! extern void do_pending_lang_change PARAMS ((void)); ! extern void see_typename PARAMS ((void)); ! extern void unqualified_name_lookup_error PARAMS ((tree)); ! extern tree do_identifier PARAMS ((tree, int, tree)); ! extern tree do_scoped_id PARAMS ((tree, tree)); ! extern tree identifier_typedecl_value PARAMS ((tree)); ! extern tree build_lang_decl PARAMS ((enum tree_code, tree, tree)); ! extern void retrofit_lang_decl PARAMS ((tree)); ! extern tree copy_decl PARAMS ((tree)); ! extern tree copy_type PARAMS ((tree)); ! extern tree cxx_make_type PARAMS ((enum tree_code)); ! extern tree make_aggr_type PARAMS ((enum tree_code)); ! extern void yyerror PARAMS ((const char *)); ! extern void yyhook PARAMS ((int)); ! extern int cp_type_qual_from_rid PARAMS ((tree)); ! extern const char *cxx_init PARAMS ((const char *)); ! extern void cxx_finish PARAMS ((void)); ! extern void cxx_init_options PARAMS ((void)); /* in method.c */ ! extern void init_method PARAMS ((void)); ! extern void set_mangled_name_for_decl PARAMS ((tree)); ! extern tree build_opfncall PARAMS ((enum tree_code, int, tree, tree, tree)); ! extern tree hack_identifier PARAMS ((tree, tree)); ! extern tree make_thunk PARAMS ((tree, tree, tree)); ! extern void use_thunk PARAMS ((tree, int)); ! extern void synthesize_method PARAMS ((tree)); ! extern tree implicitly_declare_fn PARAMS ((special_function_kind, tree, int)); ! extern tree skip_artificial_parms_for PARAMS ((tree, tree)); /* In optimize.c */ ! extern void optimize_function PARAMS ((tree)); ! extern int calls_setjmp_p PARAMS ((tree)); ! extern int maybe_clone_body PARAMS ((tree)); /* in pt.c */ ! extern void check_template_shadow PARAMS ((tree)); ! extern tree get_innermost_template_args PARAMS ((tree, int)); ! extern tree tsubst PARAMS ((tree, tree, tsubst_flags_t, tree)); ! extern tree tsubst_expr PARAMS ((tree, tree, tsubst_flags_t, tree)); ! extern tree tsubst_copy PARAMS ((tree, tree, tsubst_flags_t, tree)); ! extern void maybe_begin_member_template_processing PARAMS ((tree)); ! extern void maybe_end_member_template_processing PARAMS ((void)); ! extern tree finish_member_template_decl PARAMS ((tree)); ! extern void begin_template_parm_list PARAMS ((void)); ! extern void begin_specialization PARAMS ((void)); ! extern void reset_specialization PARAMS ((void)); ! extern void end_specialization PARAMS ((void)); ! extern void begin_explicit_instantiation PARAMS ((void)); ! extern void end_explicit_instantiation PARAMS ((void)); ! extern tree check_explicit_specialization PARAMS ((tree, tree, int, int)); ! extern tree process_template_parm PARAMS ((tree, tree)); ! extern tree end_template_parm_list PARAMS ((tree)); ! extern void end_template_decl PARAMS ((void)); ! extern tree current_template_args PARAMS ((void)); ! extern tree push_template_decl PARAMS ((tree)); ! extern tree push_template_decl_real PARAMS ((tree, int)); ! extern void redeclare_class_template PARAMS ((tree, tree)); ! extern tree lookup_template_class PARAMS ((tree, tree, tree, tree, int, tsubst_flags_t)); ! extern tree lookup_template_function PARAMS ((tree, tree)); ! extern int uses_template_parms PARAMS ((tree)); ! extern tree instantiate_class_template PARAMS ((tree)); ! extern tree instantiate_template PARAMS ((tree, tree)); ! extern int fn_type_unification PARAMS ((tree, tree, tree, tree, tree, unification_kind_t, int)); ! extern tree tinst_for_decl PARAMS ((void)); ! extern void mark_decl_instantiated PARAMS ((tree, int)); ! extern int more_specialized PARAMS ((tree, tree, int, int)); ! extern void mark_class_instantiated PARAMS ((tree, int)); extern void do_decl_instantiation (tree, tree); ! extern void do_type_instantiation PARAMS ((tree, tree, tsubst_flags_t)); ! extern tree instantiate_decl PARAMS ((tree, int)); ! extern tree get_bindings PARAMS ((tree, tree, tree)); ! extern int push_tinst_level PARAMS ((tree)); ! extern void pop_tinst_level PARAMS ((void)); ! extern int more_specialized_class PARAMS ((tree, tree, tree)); ! extern int is_member_template PARAMS ((tree)); ! extern int comp_template_parms PARAMS ((tree, tree)); ! extern int template_class_depth PARAMS ((tree)); ! extern int is_specialization_of PARAMS ((tree, tree)); ! extern int comp_template_args PARAMS ((tree, tree)); ! extern void maybe_process_partial_specialization PARAMS ((tree)); ! extern void maybe_check_template_type PARAMS ((tree)); ! extern tree most_specialized_instantiation PARAMS ((tree)); ! extern void print_candidates PARAMS ((tree)); ! extern int instantiate_pending_templates PARAMS ((void)); ! extern tree tsubst_default_argument PARAMS ((tree, tree, tree)); ! extern tree most_general_template PARAMS ((tree)); ! extern tree get_mostly_instantiated_function_type PARAMS ((tree)); ! extern int problematic_instantiation_changed PARAMS ((void)); ! extern void record_last_problematic_instantiation PARAMS ((void)); ! extern tree current_instantiation PARAMS ((void)); extern int processing_template_parmlist; /* in repo.c */ ! extern void repo_template_used PARAMS ((tree)); ! extern void repo_template_instantiated PARAMS ((tree, int)); ! extern void init_repo PARAMS ((const char *)); ! extern void finish_repo PARAMS ((void)); /* in rtti.c */ ! extern void init_rtti_processing PARAMS((void)); ! extern tree build_typeid PARAMS((tree)); ! extern tree get_tinfo_decl PARAMS((tree)); ! extern tree get_typeid PARAMS((tree)); ! extern tree build_dynamic_cast PARAMS((tree, tree)); ! extern void emit_support_tinfos PARAMS((void)); ! extern int unemitted_tinfo_decl_p PARAMS((tree, void *)); ! extern int emit_tinfo_decl PARAMS((tree *, void *)); /* in search.c */ extern bool accessible_base_p (tree, tree); ! extern tree lookup_base PARAMS ((tree, tree, base_access, base_kind *)); ! extern int types_overlap_p PARAMS ((tree, tree)); ! extern tree get_vbase PARAMS ((tree, tree)); ! extern tree get_dynamic_cast_base_type PARAMS ((tree, tree)); ! extern void type_access_control PARAMS ((tree, tree)); ! extern int accessible_p PARAMS ((tree, tree)); extern tree lookup_field_1 (tree, tree, bool); ! extern tree lookup_field PARAMS ((tree, tree, int, int)); ! extern tree lookup_nested_field PARAMS ((tree, int)); ! extern int lookup_fnfields_1 PARAMS ((tree, tree)); ! extern tree lookup_fnfields PARAMS ((tree, tree, int)); ! extern tree lookup_member PARAMS ((tree, tree, int, int)); ! extern int look_for_overrides PARAMS ((tree, tree)); ! extern void get_pure_virtuals PARAMS ((tree)); ! extern void get_vbase_types PARAMS ((tree)); ! extern void maybe_suppress_debug_info PARAMS ((tree)); ! extern void note_debug_info_needed PARAMS ((tree)); ! extern void push_class_decls PARAMS ((tree)); ! extern void pop_class_decls PARAMS ((void)); ! extern void unuse_fields PARAMS ((tree)); ! extern void print_search_statistics PARAMS ((void)); ! extern void init_search_processing PARAMS ((void)); ! extern void reinit_search_statistics PARAMS ((void)); ! extern tree current_scope PARAMS ((void)); ! extern int at_function_scope_p PARAMS ((void)); extern bool at_class_scope_p (void); ! extern tree context_for_name_lookup PARAMS ((tree)); ! extern tree lookup_conversions PARAMS ((tree)); ! extern tree binfo_for_vtable PARAMS ((tree)); ! extern tree binfo_from_vbase PARAMS ((tree)); ! extern tree look_for_overrides_here PARAMS ((tree, tree)); ! extern int check_final_overrider PARAMS ((tree, tree)); ! extern tree dfs_walk PARAMS ((tree, ! tree (*) (tree, void *), ! tree (*) (tree, void *), ! void *)); ! extern tree dfs_walk_real PARAMS ((tree, ! tree (*) (tree, void *), ! tree (*) (tree, void *), ! tree (*) (tree, void *), ! void *)); ! extern tree dfs_unmark PARAMS ((tree, void *)); ! extern tree markedp PARAMS ((tree, void *)); ! extern tree unmarkedp PARAMS ((tree, void *)); ! extern tree dfs_unmarked_real_bases_queue_p PARAMS ((tree, void *)); ! extern tree dfs_marked_real_bases_queue_p PARAMS ((tree, void *)); ! extern tree dfs_skip_vbases PARAMS ((tree, void *)); ! extern tree marked_vtable_pathp PARAMS ((tree, void *)); ! extern tree unmarked_vtable_pathp PARAMS ((tree, void *)); ! extern tree find_vbase_instance PARAMS ((tree, tree)); ! extern tree binfo_for_vbase PARAMS ((tree, tree)); ! extern tree binfo_via_virtual PARAMS ((tree, tree)); extern tree build_baselink (tree, tree, tree, tree); extern tree adjust_result_of_qualified_name_lookup (tree, tree, tree); /* in semantics.c */ ! extern void init_cp_semantics PARAMS ((void)); ! extern tree finish_expr_stmt PARAMS ((tree)); ! extern tree begin_if_stmt PARAMS ((void)); ! extern void finish_if_stmt_cond PARAMS ((tree, tree)); ! extern tree finish_then_clause PARAMS ((tree)); ! extern void begin_else_clause PARAMS ((void)); ! extern void finish_else_clause PARAMS ((tree)); ! extern void finish_if_stmt PARAMS ((void)); ! extern tree begin_while_stmt PARAMS ((void)); ! extern void finish_while_stmt_cond PARAMS ((tree, tree)); ! extern void finish_while_stmt PARAMS ((tree)); ! extern tree begin_do_stmt PARAMS ((void)); ! extern void finish_do_body PARAMS ((tree)); ! extern void finish_do_stmt PARAMS ((tree, tree)); ! extern tree finish_return_stmt PARAMS ((tree)); ! extern tree begin_for_stmt PARAMS ((void)); ! extern void finish_for_init_stmt PARAMS ((tree)); ! extern void finish_for_cond PARAMS ((tree, tree)); ! extern void finish_for_expr PARAMS ((tree, tree)); ! extern void finish_for_stmt PARAMS ((tree)); ! extern tree finish_break_stmt PARAMS ((void)); ! extern tree finish_continue_stmt PARAMS ((void)); ! extern tree begin_switch_stmt PARAMS ((void)); ! extern void finish_switch_cond PARAMS ((tree, tree)); ! extern void finish_switch_stmt PARAMS ((tree)); ! extern tree finish_case_label PARAMS ((tree, tree)); ! extern tree finish_goto_stmt PARAMS ((tree)); ! extern tree begin_try_block PARAMS ((void)); ! extern void finish_try_block PARAMS ((tree)); ! extern tree begin_eh_spec_block PARAMS ((void)); ! extern void finish_eh_spec_block PARAMS ((tree, tree)); ! extern void finish_handler_sequence PARAMS ((tree)); ! extern tree begin_function_try_block PARAMS ((void)); ! extern void finish_function_try_block PARAMS ((tree)); ! extern void finish_function_handler_sequence PARAMS ((tree)); ! extern void finish_cleanup_try_block PARAMS ((tree)); ! extern tree begin_handler PARAMS ((void)); ! extern void finish_handler_parms PARAMS ((tree, tree)); ! extern void begin_catch_block PARAMS ((tree)); ! extern void finish_handler PARAMS ((tree)); ! extern void finish_cleanup PARAMS ((tree, tree)); ! extern tree begin_compound_stmt PARAMS ((int)); ! extern tree finish_compound_stmt PARAMS ((int, tree)); ! extern tree finish_asm_stmt PARAMS ((tree, tree, tree, tree, tree)); ! extern void finish_label_stmt PARAMS ((tree)); ! extern void finish_label_decl PARAMS ((tree)); ! extern void finish_subobject PARAMS ((tree)); ! extern tree finish_parenthesized_expr PARAMS ((tree)); ! extern tree begin_stmt_expr PARAMS ((void)); ! extern tree finish_stmt_expr PARAMS ((tree)); ! extern tree finish_call_expr (tree, tree, bool); ! extern tree finish_increment_expr PARAMS ((tree, enum tree_code)); ! extern tree finish_this_expr PARAMS ((void)); ! extern tree finish_object_call_expr PARAMS ((tree, tree, tree)); ! extern tree finish_qualified_object_call_expr PARAMS ((tree, tree, tree)); ! extern tree finish_pseudo_destructor_call_expr PARAMS ((tree, tree, tree)); ! extern tree finish_unary_op_expr PARAMS ((enum tree_code, tree)); ! extern tree finish_id_expr PARAMS ((tree)); extern tree finish_fname (tree); - extern void save_type_access_control PARAMS ((tree)); - extern void reset_type_access_control PARAMS ((void)); - extern void decl_type_access_control PARAMS ((tree)); extern int begin_function_definition (tree, tree, tree); ! extern tree begin_constructor_declarator PARAMS ((tree, tree)); ! extern tree finish_declarator PARAMS ((tree, tree, tree, tree, int)); ! extern void finish_translation_unit PARAMS ((void)); ! extern tree finish_template_type_parm PARAMS ((tree, tree)); ! extern tree finish_template_template_parm PARAMS ((tree, tree)); ! extern tree finish_parmlist PARAMS ((tree, int)); ! extern tree begin_class_definition PARAMS ((tree)); ! extern tree finish_class_definition PARAMS ((tree, tree, int, int)); ! extern void finish_default_args PARAMS ((void)); ! extern void begin_inline_definitions PARAMS ((void)); ! extern tree finish_member_class_template PARAMS ((tree)); ! extern void finish_template_decl PARAMS ((tree)); ! extern tree finish_template_type PARAMS ((tree, tree, int)); ! extern void enter_scope_of PARAMS ((tree)); ! extern tree finish_base_specifier PARAMS ((tree, tree)); ! extern void finish_member_declaration PARAMS ((tree)); ! extern void check_multiple_declarators PARAMS ((void)); ! extern tree finish_typeof PARAMS ((tree)); ! extern tree finish_sizeof PARAMS ((tree)); ! extern tree finish_alignof PARAMS ((tree)); ! extern void finish_decl_cleanup PARAMS ((tree, tree)); ! extern void finish_eh_cleanup PARAMS ((tree)); ! extern void finish_named_return_value PARAMS ((tree, tree)); ! extern void expand_body PARAMS ((tree)); ! extern tree nullify_returns_r PARAMS ((tree *, int *, void *)); ! extern void do_pushlevel PARAMS ((void)); ! extern tree do_poplevel PARAMS ((void)); ! extern void begin_mem_initializers (void); ! extern void finish_mem_initializers PARAMS ((tree)); ! extern void setup_vtbl_ptr PARAMS ((tree, tree)); ! extern void clear_out_block PARAMS ((void)); ! extern tree begin_global_stmt_expr PARAMS ((void)); ! extern tree finish_global_stmt_expr PARAMS ((tree)); extern tree check_template_template_default_arg (tree); ! ! /* in spew.c */ ! extern void init_spew PARAMS ((void)); ! extern int peekyylex PARAMS ((void)); ! extern tree arbitrate_lookup PARAMS ((tree, tree, tree)); ! extern tree frob_opname PARAMS ((tree)); ! extern void maybe_snarf_defarg PARAMS ((void)); ! extern void add_defarg_fn PARAMS ((tree)); ! extern void do_pending_defargs PARAMS ((void)); ! extern void done_pending_defargs PARAMS ((void)); ! extern void unprocessed_defarg_fn PARAMS ((tree)); ! extern void replace_defarg PARAMS ((tree, tree)); ! extern void end_input PARAMS ((void)); /* in tree.c */ ! extern void lang_check_failed PARAMS ((const char *, int, ! const char *)); ! extern tree stabilize_expr PARAMS ((tree, tree *)); ! extern tree cxx_unsave_expr_now PARAMS ((tree)); ! extern tree cxx_maybe_build_cleanup PARAMS ((tree)); ! extern void init_tree PARAMS ((void)); ! extern int pod_type_p PARAMS ((tree)); ! extern int zero_init_p PARAMS ((tree)); ! extern tree canonical_type_variant PARAMS ((tree)); ! extern void unshare_base_binfos PARAMS ((tree)); ! extern int member_p PARAMS ((tree)); ! extern cp_lvalue_kind real_lvalue_p PARAMS ((tree)); ! extern cp_lvalue_kind real_non_cast_lvalue_p (tree); ! extern int non_cast_lvalue_p PARAMS ((tree)); ! extern int non_cast_lvalue_or_else PARAMS ((tree, const char *)); ! extern tree build_min PARAMS ((enum tree_code, tree, ! ...)); ! extern tree build_min_nt PARAMS ((enum tree_code, ...)); ! extern tree build_cplus_new PARAMS ((tree, tree)); ! extern tree get_target_expr PARAMS ((tree)); ! extern tree build_cplus_method_type PARAMS ((tree, tree, tree)); ! extern tree build_cplus_staticfn_type PARAMS ((tree, tree, tree)); ! extern tree build_cplus_array_type PARAMS ((tree, tree)); ! extern tree hash_tree_cons PARAMS ((tree, tree, tree)); ! extern tree hash_tree_chain PARAMS ((tree, tree)); ! extern tree hash_chainon PARAMS ((tree, tree)); ! extern tree make_binfo PARAMS ((tree, tree, tree, tree)); ! extern tree reverse_path PARAMS ((tree)); ! extern int count_functions PARAMS ((tree)); ! extern int is_overloaded_fn PARAMS ((tree)); ! extern tree get_overloaded_fn PARAMS ((tree)); ! extern tree get_first_fn PARAMS ((tree)); ! extern int bound_pmf_p PARAMS ((tree)); ! extern tree ovl_cons PARAMS ((tree, tree)); ! extern tree build_overload PARAMS ((tree, tree)); ! extern tree function_arg_chain PARAMS ((tree)); ! extern int promotes_to_aggr_type PARAMS ((tree, enum tree_code)); ! extern int is_aggr_type_2 PARAMS ((tree, tree)); ! extern const char *cxx_printable_name PARAMS ((tree, int)); ! extern tree build_exception_variant PARAMS ((tree, tree)); ! extern tree bind_template_template_parm PARAMS ((tree, tree)); ! extern tree array_type_nelts_total PARAMS ((tree)); ! extern tree array_type_nelts_top PARAMS ((tree)); ! extern tree break_out_target_exprs PARAMS ((tree)); ! extern tree get_type_decl PARAMS ((tree)); ! extern tree vec_binfo_member PARAMS ((tree, tree)); ! extern tree decl_namespace_context PARAMS ((tree)); ! extern tree lvalue_type PARAMS ((tree)); ! extern tree error_type PARAMS ((tree)); ! extern tree build_zc_wrapper PARAMS ((struct z_candidate *)); ! extern tree build_srcloc_here PARAMS ((void)); ! extern int varargs_function_p PARAMS ((tree)); ! extern int really_overloaded_fn PARAMS ((tree)); ! extern int cp_tree_equal PARAMS ((tree, tree)); ! extern tree no_linkage_check PARAMS ((tree)); ! extern void debug_binfo PARAMS ((tree)); ! extern tree build_dummy_object PARAMS ((tree)); ! extern tree maybe_dummy_object PARAMS ((tree, tree *)); ! extern int is_dummy_object PARAMS ((tree)); extern const struct attribute_spec cxx_attribute_table[]; ! extern tree make_ptrmem_cst PARAMS ((tree, tree)); ! extern tree cp_build_qualified_type_real PARAMS ((tree, int, tsubst_flags_t)); #define cp_build_qualified_type(TYPE, QUALS) \ cp_build_qualified_type_real ((TYPE), (QUALS), tf_error | tf_warning) ! extern tree build_shared_int_cst PARAMS ((int)); ! extern special_function_kind special_function_p PARAMS ((tree)); extern bool name_p (tree); ! extern int count_trees PARAMS ((tree)); ! extern int char_type_p PARAMS ((tree)); ! extern void verify_stmt_tree PARAMS ((tree)); ! extern tree find_tree PARAMS ((tree, tree)); ! extern linkage_kind decl_linkage PARAMS ((tree)); ! extern tree cp_walk_subtrees PARAMS ((tree*, int*, walk_tree_fn, ! void*, void*)); ! extern int cp_cannot_inline_tree_fn PARAMS ((tree*)); ! extern tree cp_add_pending_fn_decls PARAMS ((void*,tree)); ! extern int cp_is_overload_p PARAMS ((tree)); ! extern int cp_auto_var_in_fn_p PARAMS ((tree,tree)); ! extern tree cp_copy_res_decl_for_inlining PARAMS ((tree, tree, tree, void*, ! int*, void*)); /* in typeck.c */ ! extern int string_conv_p PARAMS ((tree, tree, int)); ! extern tree cp_truthvalue_conversion PARAMS ((tree)); ! extern tree condition_conversion PARAMS ((tree)); ! extern tree target_type PARAMS ((tree)); ! extern tree require_complete_type PARAMS ((tree)); ! extern tree complete_type PARAMS ((tree)); ! extern tree complete_type_or_diagnostic PARAMS ((tree, tree, int)); #define complete_type_or_else(T,V) (complete_type_or_diagnostic ((T), (V), 0)) ! extern int type_unknown_p PARAMS ((tree)); ! extern tree commonparms PARAMS ((tree, tree)); ! extern tree original_type PARAMS ((tree)); ! extern int comp_except_specs PARAMS ((tree, tree, int)); ! extern int comptypes PARAMS ((tree, tree, int)); ! extern int comp_target_types PARAMS ((tree, tree, int)); ! extern int compparms PARAMS ((tree, tree)); ! extern int comp_cv_qualification PARAMS ((tree, tree)); ! extern int comp_cv_qual_signature PARAMS ((tree, tree)); ! extern tree expr_sizeof PARAMS ((tree)); ! extern tree cxx_sizeof_or_alignof_type PARAMS ((tree, enum tree_code, int)); #define cxx_sizeof_nowarn(T) cxx_sizeof_or_alignof_type (T, SIZEOF_EXPR, false) ! extern tree inline_conversion PARAMS ((tree)); ! extern tree decay_conversion PARAMS ((tree)); extern tree build_class_member_access_expr (tree, tree, tree, bool); extern tree finish_class_member_access_expr (tree, tree); ! extern tree build_x_indirect_ref PARAMS ((tree, const char *)); ! extern tree build_indirect_ref PARAMS ((tree, const char *)); ! extern tree build_array_ref PARAMS ((tree, tree)); ! extern tree get_member_function_from_ptrfunc PARAMS ((tree *, tree)); ! extern tree build_function_call_real PARAMS ((tree, tree, int)); ! extern tree build_function_call_maybe PARAMS ((tree, tree)); ! extern tree convert_arguments PARAMS ((tree, tree, tree, int)); ! extern tree build_x_binary_op PARAMS ((enum tree_code, tree, tree)); ! extern tree build_x_unary_op PARAMS ((enum tree_code, tree)); ! extern tree unary_complex_lvalue PARAMS ((enum tree_code, tree)); ! extern tree build_x_conditional_expr PARAMS ((tree, tree, tree)); ! extern tree build_x_compound_expr PARAMS ((tree)); ! extern tree build_compound_expr PARAMS ((tree)); ! extern tree build_static_cast PARAMS ((tree, tree)); ! extern tree build_reinterpret_cast PARAMS ((tree, tree)); ! extern tree build_const_cast PARAMS ((tree, tree)); ! extern tree build_c_cast PARAMS ((tree, tree)); ! extern tree build_x_modify_expr PARAMS ((tree, enum tree_code, tree)); ! extern tree build_modify_expr PARAMS ((tree, enum tree_code, tree)); ! extern tree dubious_conversion_warnings PARAMS ((tree, tree, const char *, tree, int)); ! extern tree convert_for_initialization PARAMS ((tree, tree, tree, int, const char *, tree, int)); ! extern int comp_ptr_ttypes PARAMS ((tree, tree)); ! extern int ptr_reasonably_similar PARAMS ((tree, tree)); ! extern tree build_ptrmemfunc PARAMS ((tree, tree, int)); ! extern int cp_type_quals PARAMS ((tree)); ! extern int cp_has_mutable_p PARAMS ((tree)); ! extern int at_least_as_qualified_p PARAMS ((tree, tree)); ! extern int more_qualified_p PARAMS ((tree, tree)); ! extern tree build_ptrmemfunc1 PARAMS ((tree, tree, tree)); ! extern void expand_ptrmemfunc_cst PARAMS ((tree, tree *, tree *)); ! extern tree pfn_from_ptrmemfunc PARAMS ((tree)); ! extern tree type_after_usual_arithmetic_conversions PARAMS ((tree, tree)); ! extern tree composite_pointer_type PARAMS ((tree, tree, tree, tree, ! const char*)); ! extern tree merge_types PARAMS ((tree, tree)); ! extern tree check_return_expr PARAMS ((tree)); #define cp_build_binary_op(code, arg1, arg2) \ build_binary_op(code, arg1, arg2, 1) #define cxx_sizeof(T) cxx_sizeof_or_alignof_type (T, SIZEOF_EXPR, true) --- 3500,4244 ---- } operator_name_info_t; /* A mapping from tree codes to operator name information. */ ! extern GTY(()) operator_name_info_t operator_name_info ! [(int) LAST_CPLUS_TREE_CODE]; /* Similar, but for assignment operators. */ ! extern GTY(()) operator_name_info_t assignment_operator_name_info ! [(int) LAST_CPLUS_TREE_CODE]; /* in call.c */ ! extern bool check_dtor_name (tree, tree); ! extern tree build_vfield_ref (tree, tree); ! extern tree build_conditional_expr (tree, tree, tree); ! extern tree build_addr_func (tree); ! extern tree build_call (tree, tree); ! extern bool null_ptr_cst_p (tree); ! extern bool sufficient_parms_p (tree); ! extern tree type_decays_to (tree); ! extern tree build_user_type_conversion (tree, tree, int); ! extern tree build_new_function_call (tree, tree); ! extern tree build_operator_new_call (tree, tree, tree *, tree *); ! extern tree build_new_method_call (tree, tree, tree, tree, int); ! extern tree build_special_member_call (tree, tree, tree, tree, int); ! extern tree build_new_op (enum tree_code, int, tree, tree, tree, bool *); ! extern tree build_op_delete_call (enum tree_code, tree, tree, int, tree); ! extern bool can_convert (tree, tree); ! extern bool can_convert_arg (tree, tree, tree); ! extern bool can_convert_arg_bad (tree, tree, tree); ! extern bool enforce_access (tree, tree); ! extern tree convert_default_arg (tree, tree, tree, int); ! extern tree convert_arg_to_ellipsis (tree); ! extern tree build_x_va_arg (tree, tree); ! extern tree cxx_type_promotes_to (tree); ! extern tree type_passed_as (tree); ! extern tree convert_for_arg_passing (tree, tree); ! extern tree cp_convert_parm_for_inlining (tree, tree, tree); ! extern bool is_properly_derived_from (tree, tree); ! extern tree initialize_reference (tree, tree, tree, tree *); ! extern tree make_temporary_var_for_ref_to_temp (tree, tree); ! extern tree strip_top_quals (tree); ! extern tree perform_implicit_conversion (tree, tree); extern tree perform_direct_initialization_if_possible (tree, tree); + extern tree in_charge_arg_for_name (tree); + extern tree build_cxx_call (tree, tree, tree); /* in class.c */ ! extern tree build_base_path (enum tree_code, tree, tree, int); extern tree convert_to_base (tree, tree, bool); ! extern tree convert_to_base_statically (tree, tree); ! extern tree build_vtbl_ref (tree, tree); ! extern tree build_vfn_ref (tree, tree); ! extern tree get_vtable_decl (tree, int); ! extern void resort_type_method_vec ! (void *, void *, gt_pointer_operator, void *); ! extern void add_method (tree, tree, int); ! extern int currently_open_class (tree); ! extern tree currently_open_derived_class (tree); ! extern tree finish_struct (tree, tree); ! extern void finish_struct_1 (tree); ! extern int resolves_to_fixed_type_p (tree, int *); ! extern void init_class_processing (void); ! extern int is_empty_class (tree); ! extern void pushclass (tree); ! extern void popclass (void); ! extern void push_nested_class (tree); ! extern void pop_nested_class (void); ! extern int current_lang_depth (void); ! extern void push_lang_context (tree); ! extern void pop_lang_context (void); ! extern tree instantiate_type (tree, tree, tsubst_flags_t); ! extern void print_class_statistics (void); ! extern void cxx_print_statistics (void); ! extern void cxx_print_xnode (FILE *, tree, int); ! extern void cxx_print_decl (FILE *, tree, int); ! extern void cxx_print_type (FILE *, tree, int); ! extern void cxx_print_identifier (FILE *, tree, int); ! extern void cxx_print_error_function (struct diagnostic_context *, ! const char *); ! extern void build_self_reference (void); ! extern int same_signature_p (tree, tree); ! extern void warn_hidden (tree); ! extern void maybe_add_class_template_decl_list (tree, tree, int); ! extern tree get_enclosing_class (tree); ! extern void unreverse_member_declarations (tree); ! extern void invalidate_class_lookup_cache (void); ! extern void maybe_note_name_used_in_class (tree, tree); ! extern void note_name_declared_in_class (tree, tree); ! extern tree get_vtbl_decl_for_binfo (tree); ! extern tree get_vtt_name (tree); ! extern tree get_primary_binfo (tree); ! extern void debug_class (tree); ! extern void debug_thunks (tree); /* in cvt.c */ ! extern tree convert_to_reference (tree, tree, int, int, tree); ! extern tree convert_from_reference (tree); ! extern tree convert_lvalue (tree, tree); ! extern tree force_rvalue (tree); ! extern tree ocp_convert (tree, tree, int, int); ! extern tree cp_convert (tree, tree); ! extern tree convert_to_void (tree, const char */*implicit context*/); ! extern tree convert_force (tree, tree, int); ! extern tree build_type_conversion (tree, tree); ! extern tree build_expr_type_conversion (int, tree, bool); ! extern tree type_promotes_to (tree); ! extern tree perform_qualification_conversions (tree, tree); ! extern void clone_function_decl (tree, int); ! extern void adjust_clone_args (tree); /* decl.c */ ! extern void insert_block (tree); ! extern void set_block (tree); ! extern tree pushdecl (tree); ! extern void cxx_init_decl_processing (void); enum cp_tree_node_structure_enum cp_tree_node_structure ! (union lang_tree_node *); ! extern bool cxx_mark_addressable (tree); ! extern void cxx_push_function_context (struct function *); ! extern void cxx_pop_function_context (struct function *); ! extern void cxx_mark_function_context (struct function *); ! extern void maybe_push_cleanup_level (tree); ! extern void finish_scope (void); ! extern void delete_block (tree); ! extern void add_block_current_level (tree); ! extern void push_switch (tree); ! extern void pop_switch (void); ! extern void pushtag (tree, tree, int); ! extern tree make_anon_name (void); ! extern void clear_anon_tags (void); ! extern int decls_match (tree, tree); ! extern tree duplicate_decls (tree, tree); ! extern tree pushdecl_top_level (tree); extern tree pushdecl_top_level_and_finish (tree, tree); ! extern tree push_using_decl (tree, tree); ! extern tree implicitly_declare (tree); ! extern tree declare_local_label (tree); ! extern tree define_label (location_t, tree); ! extern void check_goto (tree); ! extern void define_case_label (void); ! extern tree make_typename_type (tree, tree, tsubst_flags_t); ! extern tree make_unbound_class_template (tree, tree, tsubst_flags_t); extern tree check_for_out_of_scope_variable (tree); ! extern tree build_library_fn (tree, tree); ! extern tree build_library_fn_ptr (const char *, tree); ! extern tree build_cp_library_fn_ptr (const char *, tree); ! extern tree push_library_fn (tree, tree); ! extern tree push_void_library_fn (tree, tree); ! extern tree push_throw_library_fn (tree, tree); ! extern int init_type_desc (void); ! extern tree check_tag_decl (tree); ! extern tree shadow_tag (tree); ! extern tree groktypename (tree); ! extern tree start_decl (tree, tree, int, tree, tree); ! extern void start_decl_1 (tree); ! extern void cp_finish_decl (tree, tree, tree, int); ! extern void finish_decl (tree, tree, tree); ! extern void maybe_inject_for_scope_var (tree); ! extern tree start_handler_parms (tree, tree); ! extern int complete_array_type (tree, tree, int); ! extern tree build_ptrmemfunc_type (tree); extern tree build_ptrmem_type (tree, tree); /* the grokdeclarator prototype is in decl.h */ ! extern int copy_fn_p (tree); ! extern tree get_scope_of_declarator (tree); ! extern void grok_special_member_properties (tree); ! extern int grok_ctor_properties (tree, tree); ! extern bool grok_op_properties (tree, int, bool); ! extern tree xref_tag (enum tag_types, tree, bool, bool); ! extern tree xref_tag_from_type (tree, tree, int); ! extern void xref_basetypes (tree, tree); ! extern tree start_enum (tree); ! extern void finish_enum (tree); ! extern void build_enumerator (tree, tree, tree); ! extern int start_function (tree, tree, tree, int); ! extern tree begin_function_body (void); ! extern void finish_function_body (tree); ! extern tree finish_function (int); ! extern tree start_method (tree, tree, tree); ! extern tree finish_method (tree); ! extern void maybe_register_incomplete_var (tree); ! extern void complete_vars (tree); ! extern void finish_stmt (void); ! extern void print_other_binding_stack (struct cp_binding_level *); ! extern void revert_static_member_fn (tree); ! extern void fixup_anonymous_aggr (tree); ! extern int check_static_variable_definition (tree, tree); ! extern tree compute_array_index_type (tree, tree); ! extern tree check_default_argument (tree, tree); ! extern int vtable_decl_p (tree, void *); ! extern int vtype_decl_p (tree, void *); ! extern int sigtable_decl_p (tree, void *); ! typedef bool (*walk_globals_pred) (tree, void *); ! typedef bool (*walk_globals_fn) (tree *, void *); ! extern bool walk_globals (walk_globals_pred, walk_globals_fn, void *); ! extern bool walk_vtables (walk_globals_pred, walk_globals_fn, void *); ! typedef int (*walk_namespaces_fn) (tree, void *); ! extern int walk_namespaces (walk_namespaces_fn, ! void *); ! extern int wrapup_globals_for_namespace (tree, void *); ! extern tree create_implicit_typedef (tree, tree); ! extern tree maybe_push_decl (tree); ! extern tree force_target_expr (tree, tree); ! extern tree build_target_expr_with_type (tree, tree); ! extern int local_variable_p (tree); ! extern int nonstatic_local_decl_p (tree); ! extern tree declare_global_var (tree, tree); ! extern void register_dtor_fn (tree); ! extern tmpl_spec_kind current_tmpl_spec_kind (int); ! extern tree cp_fname_init (const char *, tree *); ! extern tree check_elaborated_type_specifier (enum tag_types, tree, bool); ! extern tree cxx_builtin_type_decls (void); ! extern void warn_extern_redeclared_static (tree, tree); ! extern bool have_extern_spec; /* in decl2.c */ ! extern bool check_java_method (tree); ! extern int grok_method_quals (tree, tree, tree); ! extern void grok_x_components (tree); ! extern void maybe_retrofit_in_chrg (tree); ! extern void maybe_make_one_only (tree); ! extern void grokclassfn (tree, tree, enum overload_flags, tree); ! extern tree grok_array_decl (tree, tree); ! extern tree delete_sanity (tree, tree, bool, int); ! extern tree check_classfn (tree, tree, bool); ! extern void check_member_template (tree); ! extern tree grokfield (tree, tree, tree, tree, tree); ! extern tree grokbitfield (tree, tree, tree); ! extern tree groktypefield (tree, tree); ! extern void cplus_decl_attributes (tree *, tree, int); ! extern void defer_fn (tree); ! extern void finish_anon_union (tree); ! extern tree finish_table (tree, tree, tree, int); ! extern tree coerce_new_type (tree); ! extern tree coerce_delete_type (tree); ! extern void comdat_linkage (tree); ! extern void import_export_vtable (tree, tree, int); ! extern void import_export_decl (tree); ! extern void import_export_tinfo (tree, tree, bool); ! extern tree build_cleanup (tree); extern tree build_offset_ref_call_from_tree (tree, tree); ! extern void check_default_args (tree); ! extern void mark_used (tree); ! extern void finish_static_data_member_decl (tree, tree, tree, int); ! extern tree cp_build_parm_decl (tree, tree); ! extern tree build_artificial_parm (tree, tree); ! extern tree get_guard (tree); ! extern tree get_guard_cond (tree); ! extern tree set_guard (tree); ! extern tree cxx_callgraph_analyze_expr (tree *, int *, tree); /* XXX Not i18n clean. */ ! #define cp_deprecated(STR) \ ! do { \ ! if (warn_deprecated) \ ! warning ("%s is deprecated, please see the documentation for details", \ ! (STR)); \ } while (0) /* in error.c */ ! extern void init_error (void); ! extern const char *type_as_string (tree, int); ! extern const char *decl_as_string (tree, int); ! extern const char *expr_as_string (tree, int); ! extern const char *context_as_string (tree, int); ! extern const char *lang_decl_name (tree, int); ! extern const char *language_to_string (enum languages); ! extern void print_instantiation_context (void); /* in except.c */ ! extern void init_exception_processing (void); ! extern tree expand_start_catch_block (tree); ! extern void expand_end_catch_block (void); ! extern void expand_builtin_throw (void); ! extern void expand_eh_spec_block (tree); ! extern void expand_exception_blocks (void); ! extern tree build_exc_ptr (void); ! extern tree build_throw (tree); ! extern void mark_all_runtime_matches (void); ! extern int nothrow_libfn_p (tree); ! extern void check_handlers (tree); ! extern void choose_personality_routine (enum languages); ! extern tree eh_type_info (tree); /* in expr.c */ ! extern rtx cxx_expand_expr (tree, rtx, ! enum machine_mode, ! int, rtx *); ! extern tree cplus_expand_constant (tree); /* friend.c */ ! extern int is_friend (tree, tree); ! extern void make_friend_class (tree, tree, bool); ! extern void add_friend (tree, tree, bool); ! extern tree do_friend (tree, tree, tree, tree, enum overload_flags, tree, int); /* in init.c */ extern tree expand_member_init (tree); extern void emit_mem_initializers (tree); ! extern tree build_aggr_init (tree, tree, int); ! extern tree build_init (tree, tree, int); ! extern int is_aggr_type (tree, int); ! extern tree get_aggr_from_typedef (tree, int); ! extern tree get_type_value (tree); extern tree build_zero_init (tree, tree, bool); ! extern tree build_offset_ref (tree, tree, bool); ! extern tree build_new (tree, tree, tree, int); ! extern tree build_vec_init (tree, tree, tree, int); ! extern tree build_x_delete (tree, int, tree); ! extern tree build_delete (tree, tree, special_function_kind, int, int); ! extern void push_base_cleanups (void); ! extern tree build_vbase_delete (tree, tree); ! extern tree build_vec_delete (tree, tree, special_function_kind, int); ! extern tree create_temporary_var (tree); ! extern void initialize_vtbl_ptrs (tree); ! extern tree build_java_class_ref (tree); /* in input.c */ /* in lex.c */ ! extern void cxx_dup_lang_specific_decl (tree); ! extern tree make_pointer_declarator (tree, tree); ! extern tree make_reference_declarator (tree, tree); ! extern tree make_call_declarator (tree, tree, tree, tree); ! extern void set_quals_and_spec (tree, tree, tree); ! extern void print_parse_statistics (void); ! extern void do_pending_inlines (void); ! extern void yyungetc (int, int); ! extern void snarf_method (tree); ! extern void see_typename (void); ! extern tree unqualified_name_lookup_error (tree); ! extern tree unqualified_fn_lookup_error (tree); ! extern tree build_lang_decl (enum tree_code, tree, tree); ! extern void retrofit_lang_decl (tree); ! extern tree copy_decl (tree); ! extern tree copy_type (tree); ! extern tree cxx_make_type (enum tree_code); ! extern tree make_aggr_type (enum tree_code); ! extern void yyerror (const char *); ! extern void yyhook (int); ! extern int cp_type_qual_from_rid (tree); ! extern bool cxx_init (void); ! extern void cxx_finish (void); /* in method.c */ ! extern void init_method (void); ! extern void set_mangled_name_for_decl (tree); ! extern tree make_thunk (tree, bool, tree, tree); ! extern void finish_thunk (tree); ! extern void use_thunk (tree, bool); ! extern void synthesize_method (tree); ! extern tree implicitly_declare_fn (special_function_kind, tree, bool); ! extern tree skip_artificial_parms_for (tree, tree); /* In optimize.c */ ! extern void optimize_function (tree); ! extern bool calls_setjmp_p (tree); ! extern bool maybe_clone_body (tree); /* in pt.c */ ! extern void check_template_shadow (tree); ! extern tree get_innermost_template_args (tree, int); ! extern void maybe_begin_member_template_processing (tree); ! extern void maybe_end_member_template_processing (void); ! extern tree finish_member_template_decl (tree); ! extern void begin_template_parm_list (void); ! extern void begin_specialization (void); ! extern void reset_specialization (void); ! extern void end_specialization (void); ! extern void begin_explicit_instantiation (void); ! extern void end_explicit_instantiation (void); ! extern tree check_explicit_specialization (tree, tree, int, int); ! extern tree process_template_parm (tree, tree); ! extern tree end_template_parm_list (tree); ! extern void end_template_decl (void); ! extern tree current_template_args (void); ! extern tree push_template_decl (tree); ! extern tree push_template_decl_real (tree, int); ! extern void redeclare_class_template (tree, tree); ! extern tree lookup_template_class (tree, tree, tree, tree, int, tsubst_flags_t); ! extern tree lookup_template_function (tree, tree); ! extern int uses_template_parms (tree); ! extern int uses_template_parms_level (tree, int); ! extern tree instantiate_class_template (tree); ! extern tree instantiate_template (tree, tree, tsubst_flags_t); ! extern int fn_type_unification (tree, tree, tree, tree, tree, unification_kind_t, int); ! extern tree tinst_for_decl (void); ! extern void mark_decl_instantiated (tree, int); ! extern int more_specialized (tree, tree, int, int); ! extern void mark_class_instantiated (tree, int); extern void do_decl_instantiation (tree, tree); ! extern void do_type_instantiation (tree, tree, tsubst_flags_t); ! extern tree instantiate_decl (tree, int); ! extern int push_tinst_level (tree); ! extern void pop_tinst_level (void); ! extern int more_specialized_class (tree, tree, tree); ! extern int is_member_template (tree); ! extern int comp_template_parms (tree, tree); ! extern int template_class_depth (tree); ! extern int is_specialization_of (tree, tree); ! extern bool is_specialization_of_friend (tree, tree); ! extern int comp_template_args (tree, tree); ! extern void maybe_process_partial_specialization (tree); ! extern void maybe_check_template_type (tree); ! extern tree most_specialized_instantiation (tree); ! extern void print_candidates (tree); ! extern int instantiate_pending_templates (void); ! extern tree tsubst_default_argument (tree, tree, tree); ! extern tree tsubst_copy_and_build (tree, tree, tsubst_flags_t, tree, bool); ! extern tree most_general_template (tree); ! extern tree get_mostly_instantiated_function_type (tree); ! extern int problematic_instantiation_changed (void); ! extern void record_last_problematic_instantiation (void); ! extern tree current_instantiation (void); ! extern tree maybe_get_template_decl_from_type_decl (tree); extern int processing_template_parmlist; + extern bool dependent_type_p (tree); + extern bool any_dependent_template_arguments_p (tree); + extern bool dependent_template_p (tree); + extern bool dependent_template_id_p (tree, tree); + extern bool type_dependent_expression_p (tree); + extern bool any_type_dependent_arguments_p (tree); + extern bool value_dependent_expression_p (tree); + extern tree resolve_typename_type (tree, bool); + extern tree template_for_substitution (tree); + extern tree build_non_dependent_expr (tree); + extern tree build_non_dependent_args (tree); + extern bool reregister_specialization (tree, tree, tree); + extern tree fold_non_dependent_expr (tree); /* in repo.c */ ! extern void repo_template_used (tree); ! extern void repo_template_instantiated (tree, bool); ! extern void init_repo (const char *); ! extern void finish_repo (void); /* in rtti.c */ ! /* A varray of all tinfo decls that haven't been emitted yet. */ ! extern GTY(()) varray_type unemitted_tinfo_decls; ! ! extern void init_rtti_processing (void); ! extern tree build_typeid (tree); ! extern tree get_tinfo_decl (tree); ! extern tree get_typeid (tree); ! extern tree build_dynamic_cast (tree, tree); ! extern void emit_support_tinfos (void); ! extern bool emit_tinfo_decl (tree); /* in search.c */ extern bool accessible_base_p (tree, tree); ! extern tree lookup_base (tree, tree, base_access, base_kind *); ! extern int types_overlap_p (tree, tree); ! extern tree get_dynamic_cast_base_type (tree, tree); ! extern int accessible_p (tree, tree); extern tree lookup_field_1 (tree, tree, bool); ! extern tree lookup_field (tree, tree, int, bool); ! extern int lookup_fnfields_1 (tree, tree); ! extern tree lookup_fnfields (tree, tree, int); ! extern tree lookup_member (tree, tree, int, bool); ! extern int look_for_overrides (tree, tree); ! extern void get_pure_virtuals (tree); ! extern void maybe_suppress_debug_info (tree); ! extern void note_debug_info_needed (tree); ! extern void push_class_decls (tree); ! extern void pop_class_decls (void); ! extern void unuse_fields (tree); ! extern void print_search_statistics (void); ! extern void init_search_processing (void); ! extern void reinit_search_statistics (void); ! extern tree current_scope (void); ! extern int at_function_scope_p (void); extern bool at_class_scope_p (void); ! extern bool at_namespace_scope_p (void); ! extern tree context_for_name_lookup (tree); ! extern tree lookup_conversions (tree); ! extern tree binfo_for_vtable (tree); ! extern tree binfo_from_vbase (tree); ! extern tree look_for_overrides_here (tree, tree); ! extern int check_final_overrider (tree, tree); ! extern tree dfs_walk (tree, ! tree (*) (tree, void *), ! tree (*) (tree, int, void *), ! void *); ! extern tree dfs_walk_real (tree, ! tree (*) (tree, void *), ! tree (*) (tree, void *), ! tree (*) (tree, int, void *), ! void *); ! extern tree dfs_unmark (tree, void *); ! extern tree markedp (tree, int, void *); ! extern tree unmarkedp (tree, int, void *); ! extern tree binfo_via_virtual (tree, tree); extern tree build_baselink (tree, tree, tree, tree); extern tree adjust_result_of_qualified_name_lookup (tree, tree, tree); + extern tree copied_binfo (tree, tree); + extern tree original_binfo (tree, tree); + /* in semantics.c */ ! extern void push_deferring_access_checks (deferring_kind); ! extern void resume_deferring_access_checks (void); ! extern void stop_deferring_access_checks (void); ! extern void pop_deferring_access_checks (void); ! extern tree get_deferred_access_checks (void); ! extern void pop_to_parent_deferring_access_checks (void); ! extern void perform_deferred_access_checks (void); ! extern void perform_or_defer_access_check (tree, tree); ! extern void init_cp_semantics (void); ! extern tree finish_expr_stmt (tree); ! extern tree begin_if_stmt (void); ! extern void finish_if_stmt_cond (tree, tree); ! extern tree finish_then_clause (tree); ! extern void begin_else_clause (void); ! extern void finish_else_clause (tree); ! extern void finish_if_stmt (void); ! extern tree begin_while_stmt (void); ! extern void finish_while_stmt_cond (tree, tree); ! extern void finish_while_stmt (tree); ! extern tree begin_do_stmt (void); ! extern void finish_do_body (tree); ! extern void finish_do_stmt (tree, tree); ! extern tree finish_return_stmt (tree); ! extern tree begin_for_stmt (void); ! extern void finish_for_init_stmt (tree); ! extern void finish_for_cond (tree, tree); ! extern void finish_for_expr (tree, tree); ! extern void finish_for_stmt (tree); ! extern tree finish_break_stmt (void); ! extern tree finish_continue_stmt (void); ! extern tree begin_switch_stmt (void); ! extern void finish_switch_cond (tree, tree); ! extern void finish_switch_stmt (tree); ! extern tree finish_case_label (tree, tree); ! extern tree finish_goto_stmt (tree); ! extern tree begin_try_block (void); ! extern void finish_try_block (tree); ! extern tree begin_eh_spec_block (void); ! extern void finish_eh_spec_block (tree, tree); ! extern void finish_handler_sequence (tree); ! extern tree begin_function_try_block (void); ! extern void finish_function_try_block (tree); ! extern void finish_function_handler_sequence (tree); ! extern void finish_cleanup_try_block (tree); ! extern tree begin_handler (void); ! extern void finish_handler_parms (tree, tree); ! extern void begin_catch_block (tree); ! extern void finish_handler (tree); ! extern void finish_cleanup (tree, tree); ! extern tree begin_compound_stmt (bool); ! extern tree finish_compound_stmt (tree); ! extern tree finish_asm_stmt (tree, tree, tree, tree, tree); ! extern tree finish_label_stmt (tree); ! extern void finish_label_decl (tree); ! extern void finish_subobject (tree); ! extern tree finish_parenthesized_expr (tree); ! extern tree finish_non_static_data_member (tree, tree, tree); ! extern tree begin_stmt_expr (void); ! extern tree finish_stmt_expr_expr (tree); ! extern tree finish_stmt_expr (tree, bool); ! extern tree perform_koenig_lookup (tree, tree); ! extern tree finish_call_expr (tree, tree, bool, bool); ! extern tree finish_increment_expr (tree, enum tree_code); ! extern tree finish_this_expr (void); ! extern tree finish_pseudo_destructor_expr (tree, tree, tree); ! extern tree finish_unary_op_expr (enum tree_code, tree); ! extern tree finish_compound_literal (tree, tree); extern tree finish_fname (tree); extern int begin_function_definition (tree, tree, tree); ! extern void finish_translation_unit (void); ! extern tree finish_template_type_parm (tree, tree); ! extern tree finish_template_template_parm (tree, tree); ! extern tree finish_parmlist (tree, int); ! extern tree begin_class_definition (tree); ! extern void finish_default_args (void); ! extern tree finish_member_class_template (tree); ! extern void finish_template_decl (tree); ! extern tree finish_template_type (tree, tree, int); ! extern tree finish_base_specifier (tree, tree, bool); ! extern void finish_member_declaration (tree); ! extern void check_multiple_declarators (void); ! extern void qualified_name_lookup_error (tree, tree); ! extern tree finish_id_expression (tree, tree, tree, ! cp_id_kind *, tree *, ! bool, bool, bool *, ! const char **); ! extern tree finish_typeof (tree); ! extern void finish_decl_cleanup (tree, tree); ! extern void finish_eh_cleanup (tree); ! extern void expand_body (tree); ! extern void cxx_expand_function_start (void); ! extern tree nullify_returns_r (tree *, int *, void *); ! extern void do_pushlevel (scope_kind); ! extern tree do_poplevel (void); ! extern void finish_mem_initializers (tree); ! extern void setup_vtbl_ptr (tree, tree); ! extern void clear_out_block (void); extern tree check_template_template_default_arg (tree); ! extern void expand_or_defer_fn (tree); ! extern void check_accessibility_of_qualified_id (tree, tree, tree); ! extern tree finish_qualified_id_expr (tree, tree, bool, bool); ! extern void simplify_aggr_init_expr (tree *); /* in tree.c */ ! extern void lang_check_failed (const char *, int, ! const char *); ! extern tree stabilize_expr (tree, tree *); ! extern void stabilize_call (tree, tree *); ! extern bool stabilize_init (tree, tree *); ! extern tree cxx_unsave_expr_now (tree); ! extern tree cxx_maybe_build_cleanup (tree); ! extern void init_tree (void); ! extern int pod_type_p (tree); ! extern int zero_init_p (tree); ! extern tree canonical_type_variant (tree); ! extern tree copy_base_binfos (tree, tree, tree); ! extern int member_p (tree); ! extern cp_lvalue_kind real_lvalue_p (tree); ! extern tree build_min (enum tree_code, tree, ...); ! extern tree build_min_nt (enum tree_code, ...); ! extern tree build_min_non_dep (enum tree_code, tree, ...); ! extern tree build_cplus_new (tree, tree); ! extern tree get_target_expr (tree); ! extern tree build_cplus_staticfn_type (tree, tree, tree); ! extern tree build_cplus_array_type (tree, tree); ! extern tree hash_tree_cons (tree, tree, tree); ! extern tree hash_tree_chain (tree, tree); ! extern tree hash_chainon (tree, tree); ! extern tree make_binfo (tree, tree, tree, tree); ! extern int count_functions (tree); ! extern int is_overloaded_fn (tree); ! extern tree get_first_fn (tree); ! extern int bound_pmf_p (tree); ! extern tree ovl_cons (tree, tree); ! extern tree build_overload (tree, tree); ! extern tree function_arg_chain (tree); ! extern int promotes_to_aggr_type (tree, enum tree_code); ! extern const char *cxx_printable_name (tree, int); ! extern tree build_exception_variant (tree, tree); ! extern tree bind_template_template_parm (tree, tree); ! extern tree array_type_nelts_total (tree); ! extern tree array_type_nelts_top (tree); ! extern tree break_out_target_exprs (tree); ! extern tree get_type_decl (tree); ! extern tree vec_binfo_member (tree, tree); ! extern tree decl_namespace_context (tree); ! extern tree lvalue_type (tree); ! extern tree error_type (tree); ! extern tree build_zc_wrapper (struct z_candidate *); ! extern int varargs_function_p (tree); ! extern int really_overloaded_fn (tree); ! extern bool cp_tree_equal (tree, tree); ! extern tree no_linkage_check (tree); ! extern void debug_binfo (tree); ! extern tree build_dummy_object (tree); ! extern tree maybe_dummy_object (tree, tree *); ! extern int is_dummy_object (tree); extern const struct attribute_spec cxx_attribute_table[]; ! extern tree make_ptrmem_cst (tree, tree); ! extern tree cp_build_type_attribute_variant (tree, tree); ! extern tree cp_build_qualified_type_real (tree, int, tsubst_flags_t); #define cp_build_qualified_type(TYPE, QUALS) \ cp_build_qualified_type_real ((TYPE), (QUALS), tf_error | tf_warning) ! extern tree build_shared_int_cst (int); ! extern special_function_kind special_function_p (tree); extern bool name_p (tree); ! extern int count_trees (tree); ! extern int char_type_p (tree); ! extern void verify_stmt_tree (tree); ! extern tree find_tree (tree, tree); ! extern linkage_kind decl_linkage (tree); ! extern tree cp_walk_subtrees (tree*, int*, walk_tree_fn, ! void*, void*); ! extern int cp_cannot_inline_tree_fn (tree*); ! extern tree cp_add_pending_fn_decls (void*,tree); ! extern int cp_is_overload_p (tree); ! extern int cp_auto_var_in_fn_p (tree,tree); ! extern tree cp_copy_res_decl_for_inlining (tree, tree, tree, void*, ! int*, tree); /* in typeck.c */ ! extern int string_conv_p (tree, tree, int); ! extern tree cp_truthvalue_conversion (tree); ! extern tree condition_conversion (tree); ! extern tree target_type (tree); ! extern tree require_complete_type (tree); ! extern tree complete_type (tree); ! extern tree complete_type_or_diagnostic (tree, tree, int); #define complete_type_or_else(T,V) (complete_type_or_diagnostic ((T), (V), 0)) ! extern int type_unknown_p (tree); ! extern tree commonparms (tree, tree); ! extern tree original_type (tree); ! extern bool comp_except_specs (tree, tree, bool); ! extern bool comptypes (tree, tree, int); ! extern bool compparms (tree, tree); ! extern int comp_cv_qualification (tree, tree); ! extern int comp_cv_qual_signature (tree, tree); ! extern tree cxx_sizeof_or_alignof_expr (tree, enum tree_code); ! extern tree cxx_sizeof_or_alignof_type (tree, enum tree_code, bool); #define cxx_sizeof_nowarn(T) cxx_sizeof_or_alignof_type (T, SIZEOF_EXPR, false) ! extern tree inline_conversion (tree); ! extern tree decay_conversion (tree); ! extern tree perform_integral_promotions (tree); extern tree build_class_member_access_expr (tree, tree, tree, bool); extern tree finish_class_member_access_expr (tree, tree); ! extern tree build_x_indirect_ref (tree, const char *); ! extern tree build_indirect_ref (tree, const char *); ! extern tree build_array_ref (tree, tree); ! extern tree get_member_function_from_ptrfunc (tree *, tree); ! extern tree convert_arguments (tree, tree, tree, int); ! extern tree build_x_binary_op (enum tree_code, tree, tree, ! bool *); ! extern tree build_x_unary_op (enum tree_code, tree); ! extern tree unary_complex_lvalue (enum tree_code, tree); ! extern tree build_x_conditional_expr (tree, tree, tree); ! extern tree build_x_compound_expr_from_list (tree, const char *); ! extern tree build_x_compound_expr (tree, tree); ! extern tree build_compound_expr (tree, tree); ! extern tree build_static_cast (tree, tree); ! extern tree build_reinterpret_cast (tree, tree); ! extern tree build_const_cast (tree, tree); ! extern tree build_c_cast (tree, tree); ! extern tree build_x_modify_expr (tree, enum tree_code, tree); ! extern tree build_modify_expr (tree, enum tree_code, tree); ! extern tree dubious_conversion_warnings (tree, tree, const char *, tree, int); ! extern tree convert_for_initialization (tree, tree, tree, int, const char *, tree, int); ! extern int comp_ptr_ttypes (tree, tree); ! extern int ptr_reasonably_similar (tree, tree); ! extern tree build_ptrmemfunc (tree, tree, int); ! extern int cp_type_quals (tree); ! extern bool cp_has_mutable_p (tree); ! extern bool at_least_as_qualified_p (tree, tree); ! extern bool more_qualified_p (tree, tree); ! extern tree build_ptrmemfunc1 (tree, tree, tree); ! extern void expand_ptrmemfunc_cst (tree, tree *, tree *); ! extern tree pfn_from_ptrmemfunc (tree); ! extern tree type_after_usual_arithmetic_conversions (tree, tree); ! extern tree composite_pointer_type (tree, tree, tree, tree, ! const char*); ! extern tree merge_types (tree, tree); ! extern tree check_return_expr (tree); #define cp_build_binary_op(code, arg1, arg2) \ build_binary_op(code, arg1, arg2, 1) #define cxx_sizeof(T) cxx_sizeof_or_alignof_type (T, SIZEOF_EXPR, true) *************** extern tree check_return_expr *** 4451,4497 **** extern tree build_ptrmemfunc_access_expr (tree, tree); extern tree build_address (tree); extern tree build_nop (tree, tree); /* in typeck2.c */ ! extern void require_complete_eh_spec_types PARAMS ((tree, tree)); ! extern void cxx_incomplete_type_diagnostic PARAMS ((tree, tree, int)); #undef cxx_incomplete_type_error ! extern void cxx_incomplete_type_error PARAMS ((tree, tree)); #define cxx_incomplete_type_error(V,T) \ (cxx_incomplete_type_diagnostic ((V), (T), 0)) ! extern tree error_not_base_type PARAMS ((tree, tree)); ! extern tree binfo_or_else PARAMS ((tree, tree)); ! extern void readonly_error PARAMS ((tree, const char *, int)); ! extern int abstract_virtuals_error PARAMS ((tree, tree)); ! extern tree store_init_value PARAMS ((tree, tree)); ! extern tree digest_init PARAMS ((tree, tree, tree *)); ! extern tree build_scoped_ref PARAMS ((tree, tree, tree *)); ! extern tree build_x_arrow PARAMS ((tree)); ! extern tree build_m_component_ref PARAMS ((tree, tree)); ! extern tree build_functional_cast PARAMS ((tree, tree)); ! extern void check_for_new_type PARAMS ((const char *, flagged_type_tree)); ! extern tree add_exception_specifier PARAMS ((tree, tree, int)); ! extern tree merge_exception_specifiers PARAMS ((tree, tree)); /* in mangle.c */ ! extern void init_mangle PARAMS ((void)); ! extern void mangle_decl PARAMS ((tree)); ! extern const char *mangle_type_string PARAMS ((tree)); ! extern tree mangle_type PARAMS ((tree)); ! extern tree mangle_typeinfo_for_type PARAMS ((tree)); ! extern tree mangle_typeinfo_string_for_type PARAMS ((tree)); ! extern tree mangle_vtbl_for_type PARAMS ((tree)); ! extern tree mangle_vtt_for_type PARAMS ((tree)); ! extern tree mangle_ctor_vtbl_for_type PARAMS ((tree, tree)); ! extern tree mangle_thunk PARAMS ((tree, tree, tree)); ! extern tree mangle_conv_op_name_for_type PARAMS ((tree)); ! extern tree mangle_guard_variable PARAMS ((tree)); ! extern tree mangle_ref_init_variable PARAMS ((tree)); /* in dump.c */ ! extern int cp_dump_tree PARAMS ((void *, tree)); /* -- end of C++ */ #endif /* ! GCC_CP_TREE_H */ --- 4246,4306 ---- extern tree build_ptrmemfunc_access_expr (tree, tree); extern tree build_address (tree); extern tree build_nop (tree, tree); + extern tree non_reference (tree); /* in typeck2.c */ ! extern void require_complete_eh_spec_types (tree, tree); ! extern void cxx_incomplete_type_diagnostic (tree, tree, int); #undef cxx_incomplete_type_error ! extern void cxx_incomplete_type_error (tree, tree); #define cxx_incomplete_type_error(V,T) \ (cxx_incomplete_type_diagnostic ((V), (T), 0)) ! extern tree error_not_base_type (tree, tree); ! extern tree binfo_or_else (tree, tree); ! extern void readonly_error (tree, const char *, int); ! extern int abstract_virtuals_error (tree, tree); ! extern tree store_init_value (tree, tree); ! extern tree digest_init (tree, tree, tree *); ! extern tree build_scoped_ref (tree, tree, tree *); ! extern tree build_x_arrow (tree); ! extern tree build_m_component_ref (tree, tree); ! extern tree build_functional_cast (tree, tree); ! extern tree add_exception_specifier (tree, tree, int); ! extern tree merge_exception_specifiers (tree, tree); /* in mangle.c */ ! extern void init_mangle (void); ! extern void mangle_decl (tree); ! extern const char *mangle_type_string (tree); ! extern tree mangle_type (tree); ! extern tree mangle_typeinfo_for_type (tree); ! extern tree mangle_typeinfo_string_for_type (tree); ! extern tree mangle_vtbl_for_type (tree); ! extern tree mangle_vtt_for_type (tree); ! extern tree mangle_ctor_vtbl_for_type (tree, tree); ! extern tree mangle_thunk (tree, int, tree, tree); ! extern tree mangle_conv_op_name_for_type (tree); ! extern tree mangle_guard_variable (tree); ! extern tree mangle_ref_init_variable (tree); /* in dump.c */ ! extern bool cp_dump_tree (void *, tree); /* -- end of C++ */ + /* In order for the format checking to accept the C++ frontend + diagnostic framework extensions, you must include this file before + toplev.h, not after. */ + #define GCC_DIAG_STYLE __gcc_cxxdiag__ + #if GCC_VERSION >= 3004 + #define ATTRIBUTE_GCC_CXXDIAG(m, n) __attribute__ ((__format__ (GCC_DIAG_STYLE, m, n))) ATTRIBUTE_NONNULL(m) + #else + #define ATTRIBUTE_GCC_CXXDIAG(m, n) ATTRIBUTE_NONNULL(m) + #endif + + extern void cp_error_at (const char *, ...) ATTRIBUTE_GCC_CXXDIAG(1, 2); + extern void cp_warning_at (const char *, ...) ATTRIBUTE_GCC_CXXDIAG(1, 2); + extern void cp_pedwarn_at (const char *, ...) ATTRIBUTE_GCC_CXXDIAG(1, 2); + #endif /* ! GCC_CP_TREE_H */ diff -Nrc3pad gcc-3.3.3/gcc/cp/.cvsignore gcc-3.4.0/gcc/cp/.cvsignore *** gcc-3.3.3/gcc/cp/.cvsignore 2001-01-13 00:24:39.000000000 +0000 --- gcc-3.4.0/gcc/cp/.cvsignore 1970-01-01 00:00:00.000000000 +0000 *************** *** 1,3 **** - parse.h - parse.c - g++int.info* --- 0 ---- diff -Nrc3pad gcc-3.3.3/gcc/cp/cvt.c gcc-3.4.0/gcc/cp/cvt.c *** gcc-3.3.3/gcc/cp/cvt.c 2003-03-29 00:50:09.000000000 +0000 --- gcc-3.4.0/gcc/cp/cvt.c 2004-02-23 12:46:37.000000000 +0000 *************** *** 1,33 **** /* Language-level data type conversion for GNU C++. Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Hacked by Michael Tiemann (tiemann@cygnus.com) ! This file is part of GNU CC. ! GNU CC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ! /* This file contains the functions for converting C expressions to different data types. The only entry point is `convert'. Every language front end must have a `convert' function but what kind of conversions it does will depend on the language. */ #include "config.h" #include "system.h" #include "tree.h" #include "flags.h" #include "cp-tree.h" --- 1,35 ---- /* Language-level data type conversion for GNU C++. Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. Hacked by Michael Tiemann (tiemann@cygnus.com) ! This file is part of GCC. ! GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ! /* This file contains the functions for converting C++ expressions to different data types. The only entry point is `convert'. Every language front end must have a `convert' function but what kind of conversions it does will depend on the language. */ #include "config.h" #include "system.h" + #include "coretypes.h" + #include "tm.h" #include "tree.h" #include "flags.h" #include "cp-tree.h" *************** Boston, MA 02111-1307, USA. */ *** 35,44 **** #include "toplev.h" #include "decl.h" ! static tree cp_convert_to_pointer PARAMS ((tree, tree, int)); ! static tree convert_to_pointer_force PARAMS ((tree, tree)); ! static tree build_up_reference PARAMS ((tree, tree, int, tree)); ! static void warn_ref_binding PARAMS ((tree, tree, tree)); /* Change of width--truncation and extension of integers or reals-- is represented with NOP_EXPR. Proper functioning of many things --- 37,46 ---- #include "toplev.h" #include "decl.h" ! static tree cp_convert_to_pointer (tree, tree, bool); ! static tree convert_to_pointer_force (tree, tree); ! static tree build_up_reference (tree, tree, int, tree); ! static void warn_ref_binding (tree, tree, tree); /* Change of width--truncation and extension of integers or reals-- is represented with NOP_EXPR. Proper functioning of many things *************** static void warn_ref_binding PARAMS ((tr *** 72,83 **** but not static_cast). */ static tree ! cp_convert_to_pointer (type, expr, force) ! tree type, expr; ! int force; { ! register tree intype = TREE_TYPE (expr); ! register enum tree_code form; tree rval; if (IS_AGGR_TYPE (intype)) --- 74,83 ---- but not static_cast). */ static tree ! cp_convert_to_pointer (tree type, tree expr, bool force) { ! tree intype = TREE_TYPE (expr); ! enum tree_code form; tree rval; if (IS_AGGR_TYPE (intype)) *************** cp_convert_to_pointer (type, expr, force *** 109,132 **** functions. */ if (TYPE_PTRMEMFUNC_P (intype)) { ! tree fntype = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (intype)); ! tree decl = maybe_dummy_object (TYPE_METHOD_BASETYPE (fntype), 0); ! expr = build (OFFSET_REF, fntype, decl, expr); } ! ! if (TREE_CODE (expr) == OFFSET_REF ! && TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE) ! expr = resolve_offset_ref (expr); ! if (TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE) ! expr = build_addr_func (expr); ! if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE) { ! if (TREE_CODE (TREE_TYPE (TREE_TYPE (expr))) == METHOD_TYPE) ! if (pedantic || warn_pmf2ptr) ! pedwarn ("converting from `%T' to `%T'", TREE_TYPE (expr), ! type); ! return build1 (NOP_EXPR, type, expr); } intype = TREE_TYPE (expr); } --- 109,134 ---- functions. */ if (TYPE_PTRMEMFUNC_P (intype)) { ! if (pedantic || warn_pmf2ptr) ! pedwarn ("converting from `%T' to `%T'", intype, type); ! if (TREE_CODE (expr) == PTRMEM_CST) ! expr = build_address (PTRMEM_CST_MEMBER (expr)); ! else ! { ! tree decl = maybe_dummy_object (TYPE_PTRMEM_CLASS_TYPE (intype), ! 0); ! decl = build_address (decl); ! expr = get_member_function_from_ptrfunc (&decl, expr); ! } } ! else if (TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE) { ! if (pedantic || warn_pmf2ptr) ! pedwarn ("converting from `%T' to `%T'", intype, type); ! expr = build_addr_func (expr); } + if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE) + return build_nop (type, expr); intype = TREE_TYPE (expr); } *************** cp_convert_to_pointer (type, expr, force *** 178,245 **** } } ! if (TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype)) { ! tree b1; ! tree b2; ! tree binfo; ! enum tree_code code = PLUS_EXPR; ! base_kind bk; ! ! b1 = TYPE_OFFSET_BASETYPE (TREE_TYPE (type)); ! b2 = TYPE_OFFSET_BASETYPE (TREE_TYPE (intype)); ! binfo = lookup_base (b1, b2, ba_check, &bk); ! if (!binfo) ! { ! binfo = lookup_base (b2, b1, ba_check, &bk); ! code = MINUS_EXPR; ! } ! if (binfo == error_mark_node) ! return error_mark_node; ! if (bk == bk_via_virtual) ! { ! if (force) ! warning ("pointer to member cast from `%T' to `%T' is via virtual base", ! TREE_TYPE (intype), TREE_TYPE (type)); ! else ! { ! error ("pointer to member cast from `%T' to `%T' is via virtual base", ! TREE_TYPE (intype), TREE_TYPE (type)); ! return error_mark_node; ! } ! /* This is a reinterpret cast, whose result is unspecified. ! We choose to do nothing. */ ! return build1 (NOP_EXPR, type, expr); ! } ! ! if (TREE_CODE (expr) == PTRMEM_CST) ! expr = cplus_expand_constant (expr); ! if (binfo) ! expr = size_binop (code, convert (sizetype, expr), ! BINFO_OFFSET (binfo)); } ! else if (TYPE_PTRMEMFUNC_P (type)) { ! error ("cannot convert `%E' from type `%T' to type `%T'", ! expr, intype, type); ! return error_mark_node; } return build_nop (type, expr); } else if (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)) return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0); else if (TYPE_PTRMEMFUNC_P (intype)) { error ("cannot convert `%E' from type `%T' to type `%T'", expr, intype, type); return error_mark_node; } - my_friendly_assert (form != OFFSET_TYPE, 186); - if (integer_zerop (expr)) { if (TYPE_PTRMEMFUNC_P (type)) --- 180,260 ---- } } ! if (TYPE_PTRMEMFUNC_P (type)) { ! error ("cannot convert `%E' from type `%T' to type `%T'", ! expr, intype, type); ! return error_mark_node; ! } ! return build_nop (type, expr); ! } ! else if (TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype)) ! { ! tree b1; ! tree b2; ! tree binfo; ! enum tree_code code = PLUS_EXPR; ! base_kind bk; ! b1 = TYPE_PTRMEM_CLASS_TYPE (type); ! b2 = TYPE_PTRMEM_CLASS_TYPE (intype); ! binfo = lookup_base (b1, b2, ba_check, &bk); ! if (!binfo) ! { ! binfo = lookup_base (b2, b1, ba_check, &bk); ! code = MINUS_EXPR; } ! if (binfo == error_mark_node) ! return error_mark_node; ! ! if (bk == bk_via_virtual) { ! if (force) ! warning ("pointer to member cast from `%T' to `%T' is via virtual base", ! intype, type); ! else ! { ! error ("pointer to member cast from `%T' to `%T' is via virtual base", ! intype, type); ! return error_mark_node; ! } ! /* This is a reinterpret cast, whose result is unspecified. ! We choose to do nothing. */ ! return build1 (NOP_EXPR, type, expr); } + if (TREE_CODE (expr) == PTRMEM_CST) + expr = cplus_expand_constant (expr); + + if (binfo && !integer_zerop (BINFO_OFFSET (binfo))) + expr = size_binop (code, + build_nop (sizetype, expr), + BINFO_OFFSET (binfo)); return build_nop (type, expr); } else if (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)) return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0); else if (TYPE_PTRMEMFUNC_P (intype)) { + if (!warn_pmf2ptr) + { + if (TREE_CODE (expr) == PTRMEM_CST) + return cp_convert_to_pointer (type, + PTRMEM_CST_MEMBER (expr), + force); + else if (TREE_CODE (expr) == OFFSET_REF) + { + tree object = TREE_OPERAND (expr, 0); + return get_member_function_from_ptrfunc (&object, + TREE_OPERAND (expr, 1)); + } + } error ("cannot convert `%E' from type `%T' to type `%T'", expr, intype, type); return error_mark_node; } if (integer_zerop (expr)) { if (TYPE_PTRMEMFUNC_P (type)) *************** cp_convert_to_pointer (type, expr, force *** 256,263 **** force_fit_type (expr, 0); return expr; } ! else if ((TYPE_PTRMEM_P (type) || TYPE_PTRMEMFUNC_P (type)) ! && INTEGRAL_CODE_P (form)) { error ("invalid conversion from '%T' to '%T'", intype, type); return error_mark_node; --- 271,277 ---- force_fit_type (expr, 0); return expr; } ! else if (TYPE_PTR_TO_MEMBER_P (type) && INTEGRAL_CODE_P (form)) { error ("invalid conversion from '%T' to '%T'", intype, type); return error_mark_node; *************** cp_convert_to_pointer (type, expr, force *** 290,300 **** (such as conversion from sub-type to private super-type). */ static tree ! convert_to_pointer_force (type, expr) ! tree type, expr; { ! register tree intype = TREE_TYPE (expr); ! register enum tree_code form = TREE_CODE (intype); if (form == POINTER_TYPE) { --- 304,313 ---- (such as conversion from sub-type to private super-type). */ static tree ! convert_to_pointer_force (tree type, tree expr) { ! tree intype = TREE_TYPE (expr); ! enum tree_code form = TREE_CODE (intype); if (form == POINTER_TYPE) { *************** convert_to_pointer_force (type, expr) *** 333,339 **** } } ! return cp_convert_to_pointer (type, expr, 1); } /* We are passing something to a function which requires a reference. --- 346,352 ---- } } ! return cp_convert_to_pointer (type, expr, true); } /* We are passing something to a function which requires a reference. *************** convert_to_pointer_force (type, expr) *** 345,353 **** If DIRECT_BIND is set, DECL is the reference we're binding to. */ static tree ! build_up_reference (type, arg, flags, decl) ! tree type, arg, decl; ! int flags; { tree rval; tree argtype = TREE_TYPE (arg); --- 358,364 ---- If DIRECT_BIND is set, DECL is the reference we're binding to. */ static tree ! build_up_reference (tree type, tree arg, int flags, tree decl) { tree rval; tree argtype = TREE_TYPE (arg); *************** build_up_reference (type, arg, flags, de *** 406,413 **** non-volatile const type. */ static void ! warn_ref_binding (reftype, intype, decl) ! tree reftype, intype, decl; { tree ttl = TREE_TYPE (reftype); --- 417,423 ---- non-volatile const type. */ static void ! warn_ref_binding (tree reftype, tree intype, tree decl) { tree ttl = TREE_TYPE (reftype); *************** warn_ref_binding (reftype, intype, decl) *** 436,476 **** we know it's an initialization. */ tree ! convert_to_reference (reftype, expr, convtype, flags, decl) ! tree reftype, expr; ! int convtype, flags; ! tree decl; { ! register tree type = TYPE_MAIN_VARIANT (TREE_TYPE (reftype)); ! register tree intype; tree rval = NULL_TREE; tree rval_as_conversion = NULL_TREE; ! int i; if (TREE_CODE (type) == FUNCTION_TYPE && TREE_TYPE (expr) == unknown_type_node) ! { ! expr = instantiate_type (type, expr, ! (flags & LOOKUP_COMPLAIN) ! ? tf_error | tf_warning : tf_none); ! if (expr == error_mark_node) ! return error_mark_node; ! ! intype = TREE_TYPE (expr); ! } else ! { ! expr = convert_from_reference (expr); ! intype = TREE_TYPE (expr); ! } my_friendly_assert (TREE_CODE (intype) != REFERENCE_TYPE, 364); intype = TYPE_MAIN_VARIANT (intype); ! i = comp_target_types (type, intype, 0); ! ! if (i <= 0 && (convtype & CONV_IMPLICIT) && IS_AGGR_TYPE (intype) && ! (flags & LOOKUP_NO_CONVERSION)) { /* Look for a user-defined conversion to lvalue that we can use. */ --- 446,480 ---- we know it's an initialization. */ tree ! convert_to_reference (tree reftype, tree expr, int convtype, ! int flags, tree decl) { ! tree type = TYPE_MAIN_VARIANT (TREE_TYPE (reftype)); ! tree intype; tree rval = NULL_TREE; tree rval_as_conversion = NULL_TREE; ! bool can_convert_intype_to_type; if (TREE_CODE (type) == FUNCTION_TYPE && TREE_TYPE (expr) == unknown_type_node) ! expr = instantiate_type (type, expr, ! (flags & LOOKUP_COMPLAIN) ! ? tf_error | tf_warning : tf_none); else ! expr = convert_from_reference (expr); ! ! if (expr == error_mark_node) ! return error_mark_node; ! ! intype = TREE_TYPE (expr); my_friendly_assert (TREE_CODE (intype) != REFERENCE_TYPE, 364); intype = TYPE_MAIN_VARIANT (intype); ! can_convert_intype_to_type = can_convert (type, intype); ! if (!can_convert_intype_to_type ! && (convtype & CONV_IMPLICIT) && IS_AGGR_TYPE (intype) && ! (flags & LOOKUP_NO_CONVERSION)) { /* Look for a user-defined conversion to lvalue that we can use. */ *************** convert_to_reference (reftype, expr, con *** 484,495 **** expr = rval_as_conversion; rval_as_conversion = NULL_TREE; intype = type; ! i = 1; } } ! if (((convtype & CONV_STATIC) && i == -1) ! || ((convtype & CONV_IMPLICIT) && i == 1)) { if (flags & LOOKUP_COMPLAIN) { --- 488,499 ---- expr = rval_as_conversion; rval_as_conversion = NULL_TREE; intype = type; ! can_convert_intype_to_type = 1; } } ! if (((convtype & CONV_STATIC) && can_convert (intype, type)) ! || ((convtype & CONV_IMPLICIT) && can_convert_intype_to_type)) { if (flags & LOOKUP_COMPLAIN) { *************** convert_to_reference (reftype, expr, con *** 517,526 **** /* B* bp; A& ar = (A&)bp; is valid, but it's probably not what they meant. */ if (TREE_CODE (intype) == POINTER_TYPE ! && (comptypes (TREE_TYPE (intype), type, ! COMPARE_BASE | COMPARE_RELAXED ))) warning ("casting `%T' to `%T' does not dereference pointer", ! intype, reftype); rval = build_unary_op (ADDR_EXPR, expr, 0); if (rval != error_mark_node) --- 521,530 ---- /* B* bp; A& ar = (A&)bp; is valid, but it's probably not what they meant. */ if (TREE_CODE (intype) == POINTER_TYPE ! && (comptypes (TREE_TYPE (intype), type, ! COMPARE_BASE | COMPARE_DERIVED))) warning ("casting `%T' to `%T' does not dereference pointer", ! intype, reftype); rval = build_unary_op (ADDR_EXPR, expr, 0); if (rval != error_mark_node) *************** convert_to_reference (reftype, expr, con *** 545,552 **** return rval; } - my_friendly_assert (TREE_CODE (intype) != OFFSET_TYPE, 189); - if (flags & LOOKUP_COMPLAIN) error ("cannot convert type `%T' to type `%T'", intype, reftype); --- 549,554 ---- *************** convert_to_reference (reftype, expr, con *** 560,573 **** way down to its lowest form. */ tree ! convert_from_reference (val) ! tree val; { ! tree type = TREE_TYPE (val); ! ! if (TREE_CODE (type) == OFFSET_TYPE) ! type = TREE_TYPE (type); ! if (TREE_CODE (type) == REFERENCE_TYPE) return build_indirect_ref (val, NULL); return val; } --- 562,570 ---- way down to its lowest form. */ tree ! convert_from_reference (tree val) { ! if (TREE_CODE (TREE_TYPE (val)) == REFERENCE_TYPE) return build_indirect_ref (val, NULL); return val; } *************** convert_from_reference (val) *** 576,583 **** preserving cv-qualification. */ tree ! convert_lvalue (totype, expr) ! tree totype, expr; { totype = cp_build_qualified_type (totype, TYPE_QUALS (TREE_TYPE (expr))); totype = build_reference_type (totype); --- 573,579 ---- preserving cv-qualification. */ tree ! convert_lvalue (tree totype, tree expr) { totype = cp_build_qualified_type (totype, TYPE_QUALS (TREE_TYPE (expr))); totype = build_reference_type (totype); *************** force_rvalue (tree expr) *** 604,611 **** /* C++ conversions, preference to static cast conversions. */ tree ! cp_convert (type, expr) ! tree type, expr; { return ocp_convert (type, expr, CONV_OLD_CONVERT, LOOKUP_NORMAL); } --- 600,606 ---- /* C++ conversions, preference to static cast conversions. */ tree ! cp_convert (tree type, tree expr) { return ocp_convert (type, expr, CONV_OLD_CONVERT, LOOKUP_NORMAL); } *************** cp_convert (type, expr) *** 615,629 **** FLAGS indicates how we should behave. */ tree ! ocp_convert (type, expr, convtype, flags) ! tree type, expr; ! int convtype, flags; { ! register tree e = expr; ! register enum tree_code code = TREE_CODE (type); ! if (e == error_mark_node ! || TREE_TYPE (e) == error_mark_node) return error_mark_node; complete_type (type); --- 610,621 ---- FLAGS indicates how we should behave. */ tree ! ocp_convert (tree type, tree expr, int convtype, int flags) { ! tree e = expr; ! enum tree_code code = TREE_CODE (type); ! if (error_operand_p (e) || type == error_mark_node) return error_mark_node; complete_type (type); *************** ocp_convert (type, expr, convtype, flags *** 642,648 **** if (same_type_p (type, TREE_TYPE (e))) /* The call to fold will not always remove the NOP_EXPR as might be expected, since if one of the types is a typedef; ! the comparsion in fold is just equality of pointers, not a call to comptypes. We don't call fold in this case because that can result in infinite recursion; fold will call convert, which will call ocp_convert, etc. */ --- 634,640 ---- if (same_type_p (type, TREE_TYPE (e))) /* The call to fold will not always remove the NOP_EXPR as might be expected, since if one of the types is a typedef; ! the comparison in fold is just equality of pointers, not a call to comptypes. We don't call fold in this case because that can result in infinite recursion; fold will call convert, which will call ocp_convert, etc. */ *************** ocp_convert (type, expr, convtype, flags *** 651,656 **** --- 643,662 ---- conversion. */ else if (TREE_CODE (type) == COMPLEX_TYPE) return fold (convert_to_complex (type, e)); + else if (TREE_CODE (e) == TARGET_EXPR) + { + /* Don't build a NOP_EXPR of class type. Instead, change the + type of the temporary. Only allow this for cv-qual changes, + though. */ + if (!same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (e)), + TYPE_MAIN_VARIANT (type))) + abort (); + TREE_TYPE (e) = TREE_TYPE (TARGET_EXPR_SLOT (e)) = type; + return e; + } + else if (TREE_ADDRESSABLE (type)) + /* We shouldn't be treating objects of ADDRESSABLE type as rvalues. */ + abort (); else return fold (build1 (NOP_EXPR, type, e)); } *************** ocp_convert (type, expr, convtype, flags *** 661,676 **** return e; } - /* Just convert to the type of the member. */ - if (code == OFFSET_TYPE) - { - type = TREE_TYPE (type); - code = TREE_CODE (type); - } - - if (TREE_CODE (e) == OFFSET_REF) - e = resolve_offset_ref (e); - if (INTEGRAL_CODE_P (code)) { tree intype = TREE_TYPE (e); --- 667,672 ---- *************** ocp_convert (type, expr, convtype, flags *** 698,722 **** return error_mark_node; } if (code == BOOLEAN_TYPE) ! { ! tree fn = NULL_TREE; - /* Common Ada/Pascal programmer's mistake. We always warn - about this since it is so bad. */ - if (TREE_CODE (expr) == FUNCTION_DECL) - fn = expr; - else if (TREE_CODE (expr) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND (expr, 0)) == FUNCTION_DECL) - fn = TREE_OPERAND (expr, 0); - if (fn && !DECL_WEAK (fn)) - warning ("the address of `%D', will always be `true'", fn); - return cp_truthvalue_conversion (e); - } return fold (convert_to_integer (type, e)); } ! if (code == POINTER_TYPE || code == REFERENCE_TYPE ! || TYPE_PTRMEMFUNC_P (type)) ! return fold (cp_convert_to_pointer (type, e, 0)); if (code == VECTOR_TYPE) return fold (convert_to_vector (type, e)); if (code == REAL_TYPE || code == COMPLEX_TYPE) --- 694,705 ---- return error_mark_node; } if (code == BOOLEAN_TYPE) ! return cp_truthvalue_conversion (e); return fold (convert_to_integer (type, e)); } ! if (POINTER_TYPE_P (type) || TYPE_PTR_TO_MEMBER_P (type)) ! return fold (cp_convert_to_pointer (type, e, false)); if (code == VECTOR_TYPE) return fold (convert_to_vector (type, e)); if (code == REAL_TYPE || code == COMPLEX_TYPE) *************** ocp_convert (type, expr, convtype, flags *** 787,793 **** no lvalue-rvalue and similar conversions happen [expr.static.cast/4, stmt.expr/1, expr.comma/1]. This permits dereferencing an incomplete type in a void context. The C++ standard does not define what an `access' to an ! object is, but there is reason to beleive that it is the lvalue to rvalue conversion -- if it were not, `*&*p = 1' would violate [expr]/4 in that it accesses `*p' not to calculate the value to be stored. But, dcl.type.cv/8 indicates that volatile semantics should be the same between C and C++ --- 770,776 ---- no lvalue-rvalue and similar conversions happen [expr.static.cast/4, stmt.expr/1, expr.comma/1]. This permits dereferencing an incomplete type in a void context. The C++ standard does not define what an `access' to an ! object is, but there is reason to believe that it is the lvalue to rvalue conversion -- if it were not, `*&*p = 1' would violate [expr]/4 in that it accesses `*p' not to calculate the value to be stored. But, dcl.type.cv/8 indicates that volatile semantics should be the same between C and C++ *************** ocp_convert (type, expr, convtype, flags *** 801,809 **** IMPLICIT is tells us the context of an implicit void conversion. */ tree ! convert_to_void (expr, implicit) ! tree expr; ! const char *implicit; { if (expr == error_mark_node || TREE_TYPE (expr) == error_mark_node) --- 784,790 ---- IMPLICIT is tells us the context of an implicit void conversion. */ tree ! convert_to_void (tree expr, const char *implicit) { if (expr == error_mark_node || TREE_TYPE (expr) == error_mark_node) *************** convert_to_void (expr, implicit) *** 819,826 **** /* The two parts of a cond expr might be separate lvalues. */ tree op1 = TREE_OPERAND (expr,1); tree op2 = TREE_OPERAND (expr,2); ! tree new_op1 = convert_to_void (op1, implicit); ! tree new_op2 = convert_to_void (op2, implicit); expr = build (COND_EXPR, TREE_TYPE (new_op1), TREE_OPERAND (expr, 0), new_op1, new_op2); --- 800,811 ---- /* The two parts of a cond expr might be separate lvalues. */ tree op1 = TREE_OPERAND (expr,1); tree op2 = TREE_OPERAND (expr,2); ! tree new_op1 = convert_to_void ! (op1, (implicit && !TREE_SIDE_EFFECTS (op2) ! ? "second operand of conditional" : NULL)); ! tree new_op2 = convert_to_void ! (op2, (implicit && !TREE_SIDE_EFFECTS (op1) ! ? "third operand of conditional" : NULL)); expr = build (COND_EXPR, TREE_TYPE (new_op1), TREE_OPERAND (expr, 0), new_op1, new_op2); *************** convert_to_void (expr, implicit) *** 831,844 **** { /* The second part of a compound expr contains the value. */ tree op1 = TREE_OPERAND (expr,1); ! tree new_op1 = convert_to_void (op1, implicit); if (new_op1 != op1) { tree t = build (COMPOUND_EXPR, TREE_TYPE (new_op1), TREE_OPERAND (expr, 0), new_op1); - TREE_SIDE_EFFECTS (t) = TREE_SIDE_EFFECTS (expr); - TREE_NO_UNUSED_WARNING (t) = TREE_NO_UNUSED_WARNING (expr); expr = t; } --- 816,829 ---- { /* The second part of a compound expr contains the value. */ tree op1 = TREE_OPERAND (expr,1); ! tree new_op1 = convert_to_void ! (op1, (implicit && !TREE_NO_UNUSED_WARNING (expr) ! ? "right-hand operand of comma" : NULL)); if (new_op1 != op1) { tree t = build (COMPOUND_EXPR, TREE_TYPE (new_op1), TREE_OPERAND (expr, 0), new_op1); expr = t; } *************** convert_to_void (expr, implicit) *** 850,856 **** /* These have already decayed to rvalue. */ break; ! case CALL_EXPR: /* we have a special meaning for volatile void fn() */ break; case INDIRECT_REF: --- 835,841 ---- /* These have already decayed to rvalue. */ break; ! case CALL_EXPR: /* We have a special meaning for volatile void fn(). */ break; case INDIRECT_REF: *************** convert_to_void (expr, implicit) *** 886,895 **** break; } - case OFFSET_REF: - expr = resolve_offset_ref (expr); - break; - default:; } { --- 871,876 ---- *************** convert_to_void (expr, implicit) *** 903,908 **** --- 884,890 ---- of an overloaded function, and this is not one of them. */ pedwarn ("%s cannot resolve address of overloaded function", implicit ? implicit : "void cast"); + expr = void_zero_node; } else if (implicit && probe == expr && is_overloaded_fn (probe)) /* Only warn when there is no &. */ *************** convert_to_void (expr, implicit) *** 912,924 **** if (expr != error_mark_node && !VOID_TYPE_P (TREE_TYPE (expr))) { ! /* FIXME: This is where we should check for expressions with no ! effects. At the moment we do that in both build_x_component_expr ! and expand_expr_stmt -- inconsistently too. For the moment ! leave implicit void conversions unadorned so that expand_expr_stmt ! has a chance of detecting some of the cases. */ ! if (!implicit) ! expr = build1 (CONVERT_EXPR, void_type_node, expr); } return expr; } --- 894,902 ---- if (expr != error_mark_node && !VOID_TYPE_P (TREE_TYPE (expr))) { ! if (implicit && !TREE_SIDE_EFFECTS (expr) && warn_unused_value) ! warning ("%s has no effect", implicit); ! expr = build1 (CONVERT_EXPR, void_type_node, expr); } return expr; } *************** convert_to_void (expr, implicit) *** 941,948 **** do a little bit more work. */ tree ! convert (type, expr) ! tree type, expr; { tree intype; --- 919,925 ---- do a little bit more work. */ tree ! convert (tree type, tree expr) { tree intype; *************** convert (type, expr) *** 966,978 **** (such as conversion from sub-type to private super-type). */ tree ! convert_force (type, expr, convtype) ! tree type; ! tree expr; ! int convtype; { ! register tree e = expr; ! register enum tree_code code = TREE_CODE (type); if (code == REFERENCE_TYPE) return fold (convert_to_reference (type, e, CONV_C_CAST, LOOKUP_COMPLAIN, --- 943,952 ---- (such as conversion from sub-type to private super-type). */ tree ! convert_force (tree type, tree expr, int convtype) { ! tree e = expr; ! enum tree_code code = TREE_CODE (type); if (code == REFERENCE_TYPE) return fold (convert_to_reference (type, e, CONV_C_CAST, LOOKUP_COMPLAIN, *************** convert_force (type, expr, convtype) *** 1010,1017 **** (jason 8/9/95) */ tree ! build_type_conversion (xtype, expr) ! tree xtype, expr; { /* C++: check to see if we can convert this aggregate type into the required type. */ --- 984,990 ---- (jason 8/9/95) */ tree ! build_type_conversion (tree xtype, tree expr) { /* C++: check to see if we can convert this aggregate type into the required type. */ *************** build_type_conversion (xtype, expr) *** 1020,1033 **** /* Convert the given EXPR to one of a group of types suitable for use in an expression. DESIRES is a combination of various WANT_* flags (q.v.) ! which indicates which types are suitable. If COMPLAIN is 1, complain about ambiguity; otherwise, the caller will deal with it. */ tree ! build_expr_type_conversion (desires, expr, complain) ! int desires; ! tree expr; ! int complain; { tree basetype = TREE_TYPE (expr); tree conv = NULL_TREE; --- 993,1003 ---- /* Convert the given EXPR to one of a group of types suitable for use in an expression. DESIRES is a combination of various WANT_* flags (q.v.) ! which indicates which types are suitable. If COMPLAIN is true, complain about ambiguity; otherwise, the caller will deal with it. */ tree ! build_expr_type_conversion (int desires, tree expr, bool complain) { tree basetype = TREE_TYPE (expr); tree conv = NULL_TREE; *************** build_expr_type_conversion (desires, exp *** 1038,1045 **** && !(desires & WANT_NULL)) warning ("converting NULL to non-pointer type"); - if (TREE_CODE (expr) == OFFSET_REF) - expr = resolve_offset_ref (expr); expr = convert_from_reference (expr); basetype = TREE_TYPE (expr); --- 1008,1013 ---- *************** build_expr_type_conversion (desires, exp *** 1065,1071 **** case FUNCTION_TYPE: case ARRAY_TYPE: ! return (desires & WANT_POINTER) ? default_conversion (expr) : NULL_TREE; default: return NULL_TREE; --- 1033,1039 ---- case FUNCTION_TYPE: case ARRAY_TYPE: ! return (desires & WANT_POINTER) ? decay_conversion (expr) : NULL_TREE; default: return NULL_TREE; *************** build_expr_type_conversion (desires, exp *** 1073,1080 **** /* The code for conversions from class type is currently only used for delete expressions. Other expressions are handled by build_new_op. */ ! ! if (! TYPE_HAS_CONVERSION (basetype)) return NULL_TREE; for (conv = lookup_conversions (basetype); conv; conv = TREE_CHAIN (conv)) --- 1041,1049 ---- /* The code for conversions from class type is currently only used for delete expressions. Other expressions are handled by build_new_op. */ ! if (!complete_type_or_else (basetype, expr)) ! return error_mark_node; ! if (!TYPE_HAS_CONVERSION (basetype)) return NULL_TREE; for (conv = lookup_conversions (basetype); conv; conv = TREE_CHAIN (conv)) *************** build_expr_type_conversion (desires, exp *** 1086,1094 **** if (winner && winner == cand) continue; ! candidate = TREE_TYPE (TREE_TYPE (cand)); ! if (TREE_CODE (candidate) == REFERENCE_TYPE) ! candidate = TREE_TYPE (candidate); switch (TREE_CODE (candidate)) { --- 1055,1061 ---- if (winner && winner == cand) continue; ! candidate = non_reference (TREE_TYPE (TREE_TYPE (cand))); switch (TREE_CODE (candidate)) { *************** build_expr_type_conversion (desires, exp *** 1126,1134 **** if (winner) { ! tree type = TREE_TYPE (TREE_TYPE (winner)); ! if (TREE_CODE (type) == REFERENCE_TYPE) ! type = TREE_TYPE (type); return build_user_type_conversion (type, expr, LOOKUP_NORMAL); } --- 1093,1099 ---- if (winner) { ! tree type = non_reference (TREE_TYPE (TREE_TYPE (winner))); return build_user_type_conversion (type, expr, LOOKUP_NORMAL); } *************** build_expr_type_conversion (desires, exp *** 1138,1152 **** /* Implements integral promotion (4.1) and float->double promotion. */ tree ! type_promotes_to (type) ! tree type; { - int type_quals; - if (type == error_mark_node) return error_mark_node; - type_quals = cp_type_quals (type); type = TYPE_MAIN_VARIANT (type); /* bool always promotes to int (not unsigned), even if it's the same --- 1103,1113 ---- /* Implements integral promotion (4.1) and float->double promotion. */ tree ! type_promotes_to (tree type) { if (type == error_mark_node) return error_mark_node; type = TYPE_MAIN_VARIANT (type); /* bool always promotes to int (not unsigned), even if it's the same *************** type_promotes_to (type) *** 1179,1186 **** } else if (type == float_type_node) type = double_type_node; ! ! return cp_build_qualified_type (type, type_quals); } /* The routines below this point are carefully written to conform to --- 1140,1147 ---- } else if (type == float_type_node) type = double_type_node; ! ! return type; } /* The routines below this point are carefully written to conform to *************** type_promotes_to (type) *** 1193,1206 **** the conversion was impossible. */ tree ! perform_qualification_conversions (type, expr) ! tree type; ! tree expr; { ! if (TREE_CODE (type) == POINTER_TYPE ! && TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE ! && comp_ptr_ttypes (TREE_TYPE (type), TREE_TYPE (TREE_TYPE (expr)))) ! return build1 (NOP_EXPR, type, expr); else return error_mark_node; } --- 1154,1175 ---- the conversion was impossible. */ tree ! perform_qualification_conversions (tree type, tree expr) { ! tree expr_type; ! ! expr_type = TREE_TYPE (expr); ! ! if (TYPE_PTR_P (type) && TYPE_PTR_P (expr_type) ! && comp_ptr_ttypes (TREE_TYPE (type), TREE_TYPE (expr_type))) ! return build_nop (type, expr); ! else if (TYPE_PTR_TO_MEMBER_P (type) ! && TYPE_PTR_TO_MEMBER_P (expr_type) ! && same_type_p (TYPE_PTRMEM_CLASS_TYPE (type), ! TYPE_PTRMEM_CLASS_TYPE (expr_type)) ! && comp_ptr_ttypes (TYPE_PTRMEM_POINTED_TO_TYPE (type), ! TYPE_PTRMEM_POINTED_TO_TYPE (expr_type))) ! return build_nop (type, expr); else return error_mark_node; } diff -Nrc3pad gcc-3.3.3/gcc/cp/cxx-pretty-print.c gcc-3.4.0/gcc/cp/cxx-pretty-print.c *** gcc-3.3.3/gcc/cp/cxx-pretty-print.c 1970-01-01 00:00:00.000000000 +0000 --- gcc-3.4.0/gcc/cp/cxx-pretty-print.c 2003-12-21 21:07:29.000000000 +0000 *************** *** 0 **** --- 1,1737 ---- + /* Implementation of subroutines for the GNU C++ pretty-printer. + Copyright (C) 2003 Free Software Foundation, Inc. + Contributed by Gabriel Dos Reis + + This file is part of GCC. + + GCC is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2, or (at your option) any later + version. + + GCC is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with GCC; see the file COPYING. If not, write to the Free + Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + + #include "config.h" + #include "system.h" + #include "coretypes.h" + #include "tm.h" + #include "real.h" + #include "cxx-pretty-print.h" + #include "cp-tree.h" + #include "toplev.h" + + static void pp_cxx_unqualified_id (cxx_pretty_printer *, tree); + static void pp_cxx_nested_name_specifier (cxx_pretty_printer *, tree); + static void pp_cxx_qualified_id (cxx_pretty_printer *, tree); + static void pp_cxx_assignment_expression (cxx_pretty_printer *, tree); + static void pp_cxx_expression (cxx_pretty_printer *, tree); + static void pp_cxx_template_argument_list (cxx_pretty_printer *, tree); + static void pp_cxx_type_specifier_seq (cxx_pretty_printer *, tree); + static void pp_cxx_ptr_operator (cxx_pretty_printer *, tree); + static void pp_cxx_type_id (cxx_pretty_printer *, tree); + static void pp_cxx_direct_abstract_declarator (cxx_pretty_printer *, tree); + static void pp_cxx_declarator (cxx_pretty_printer *, tree); + static void pp_cxx_abstract_declarator (cxx_pretty_printer *, tree); + static void pp_cxx_template_parameter (cxx_pretty_printer *, tree); + + #define pp_cxx_whitespace(PP) pp_c_whitespace (pp_c_base (PP)) + #define pp_cxx_left_paren(PP) pp_c_left_paren (pp_c_base (PP)) + #define pp_cxx_right_paren(PP) pp_c_right_paren (pp_c_base (PP)) + #define pp_cxx_left_brace(PP) pp_c_left_brace (pp_c_base (PP)) + #define pp_cxx_right_brace(PP) pp_c_right_brace (pp_c_base (PP)) + #define pp_cxx_dot(PP) pp_c_dot (pp_c_base (PP)) + #define pp_cxx_arrow(PP) pp_c_arrow (pp_c_base (PP)) + #define pp_cxx_semicolon(PP) pp_c_semicolon (pp_c_base (PP)) + + static inline void + pp_cxx_nonconsecutive_character (cxx_pretty_printer *pp, int c) + { + const char *p = pp_last_position_in_text (pp); + + if (p != NULL && *p == c) + pp_cxx_whitespace (pp); + pp_character (pp, c); + pp_base (pp)->padding = pp_none; + } + + #define pp_cxx_begin_template_argument_list(PP) \ + pp_cxx_nonconsecutive_character (PP, '<') + #define pp_cxx_end_template_argument_list(PP) \ + pp_cxx_nonconsecutive_character (PP, '>') + + #define pp_cxx_identifier(PP, ID) pp_c_identifier (pp_c_base (PP), ID) + #define pp_cxx_tree_identifier(PP, T) pp_c_tree_identifier (pp_c_base (PP), T) + + #define pp_cxx_cv_qualifier_seq(PP, T) \ + pp_c_type_qualifier_list (pp_c_base (PP), T) + #define pp_cxx_storage_class_specifier(PP, T) \ + pp_c_storage_class_specifier (pp_c_base (PP), T) + #define pp_cxx_expression_list(PP, T) \ + pp_c_expression_list (pp_c_base (PP), T) + #define pp_cxx_space_for_pointer_operator(PP, T) \ + pp_c_space_for_pointer_operator (pp_c_base (PP), T) + #define pp_cxx_init_declarator(PP, T) \ + pp_c_init_declarator (pp_c_base (PP), T) + #define pp_cxx_call_argument_list(PP, T) \ + pp_c_call_argument_list (pp_c_base (PP), T) + + static void + pp_cxx_colon_colon (cxx_pretty_printer *pp) + { + pp_colon_colon (pp); + pp_base (pp)->padding = pp_none; + } + + + /* Expressions. */ + + static inline bool + is_destructor_name (tree name) + { + return name == complete_dtor_identifier + || name == base_dtor_identifier + || name == deleting_dtor_identifier; + } + + /* conversion-function-id: + operator conversion-type-id + + conversion-type-id: + type-specifier-seq conversion-declarator(opt) + + conversion-declarator: + ptr-operator conversion-declarator(opt) */ + static inline void + pp_cxx_conversion_function_id (cxx_pretty_printer *pp, tree t) + { + pp_cxx_identifier (pp, "operator"); + pp_cxx_type_specifier_seq (pp, TREE_TYPE (t)); + } + + static inline void + pp_cxx_template_id (cxx_pretty_printer *pp, tree t) + { + pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0)); + pp_cxx_begin_template_argument_list (pp); + pp_cxx_template_argument_list (pp, TREE_OPERAND (t, 1)); + pp_cxx_end_template_argument_list (pp); + } + + /* unqualified-id: + identifier + operator-function-id + conversion-function-id + ~ class-name + template-id */ + static void + pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t) + { + enum tree_code code = TREE_CODE (t); + switch (code) + { + case RESULT_DECL: + pp_cxx_identifier (pp, ""); + break; + + case OVERLOAD: + t = OVL_CURRENT (t); + case VAR_DECL: + case PARM_DECL: + case CONST_DECL: + case TYPE_DECL: + case FUNCTION_DECL: + case NAMESPACE_DECL: + case FIELD_DECL: + case LABEL_DECL: + case USING_DECL: + case TEMPLATE_DECL: + t = DECL_NAME (t); + + case IDENTIFIER_NODE: + if (t == NULL) + pp_cxx_identifier (pp, ""); + else if (IDENTIFIER_TYPENAME_P (t)) + pp_cxx_conversion_function_id (pp, t); + else + { + if (is_destructor_name (t)) + { + pp_complement (pp); + /* FIXME: Why is this necessary? */ + if (TREE_TYPE (t)) + t = constructor_name (TREE_TYPE (t)); + } + pp_cxx_tree_identifier (pp, t); + } + break; + + case TEMPLATE_ID_EXPR: + pp_cxx_template_id (pp, t); + break; + + case RECORD_TYPE: + case UNION_TYPE: + case ENUMERAL_TYPE: + pp_cxx_unqualified_id (pp, TYPE_NAME (t)); + break; + + case TEMPLATE_TYPE_PARM: + t = TYPE_FIELDS (t); + case TEMPLATE_PARM_INDEX: + pp_cxx_unqualified_id (pp, TEMPLATE_PARM_DECL (t)); + break; + + default: + pp_unsupported_tree (pp, t); + break; + } + } + + static inline void + pp_cxx_template_keyword_if_needed (cxx_pretty_printer *pp, tree scope, tree t) + { + if (TREE_CODE (t) == TEMPLATE_ID_EXPR + && TYPE_P (scope) && dependent_type_p (scope)) + pp_cxx_identifier (pp, "template"); + } + + /* nested-name-specifier: + class-or-namespace-name :: nested-name-specifier(opt) + class-or-namespace-name :: template nested-name-specifier */ + static void + pp_cxx_nested_name_specifier (cxx_pretty_printer *pp, tree t) + { + if (t != NULL && t != pp->enclosing_scope) + { + tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t); + pp_cxx_nested_name_specifier (pp, scope); + pp_cxx_template_keyword_if_needed (pp, scope, t); + pp_cxx_unqualified_id (pp, t); + pp_cxx_colon_colon (pp); + } + } + + /* qualified-id: + nested-name-specifier template(opt) unqualified-id */ + static void + pp_cxx_qualified_id (cxx_pretty_printer *pp, tree t) + { + switch (TREE_CODE (t)) + { + case PTRMEM_CST: + pp_cxx_nested_name_specifier (pp, PTRMEM_CST_CLASS (t)); + pp_cxx_unqualified_id (pp, PTRMEM_CST_MEMBER (t)); + break; + + case OVERLOAD: + t = OVL_CURRENT (t); + case FUNCTION_DECL: + if (DECL_FUNCTION_MEMBER_P (t)) + pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t)); + pp_cxx_unqualified_id + (pp, DECL_CONSTRUCTOR_P (t) ? DECL_CONTEXT (t) : t); + break; + + case OFFSET_REF: + case SCOPE_REF: + pp_cxx_nested_name_specifier (pp, TREE_OPERAND (t, 0)); + pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 1)); + break; + + default: + { + tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t); + if (scope != pp->enclosing_scope) + { + pp_cxx_nested_name_specifier (pp, scope); + pp_cxx_template_keyword_if_needed (pp, scope, t); + } + pp_cxx_unqualified_id (pp, t); + } + break; + } + } + + /* id-expression: + unqualified-id + qualified-id */ + static inline void + pp_cxx_id_expression (cxx_pretty_printer *pp, tree t) + { + if (TREE_CODE (t) == OVERLOAD) + t = OVL_CURRENT (t); + if (DECL_P (t) && DECL_CONTEXT (t)) + pp_cxx_qualified_id (pp, t); + else + pp_cxx_unqualified_id (pp, t); + } + + /* primary-expression: + literal + this + :: identifier + :: operator-function-id + :: qualifier-id + ( expression ) + id-expression */ + static void + pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t) + { + switch (TREE_CODE (t)) + { + case STRING_CST: + case INTEGER_CST: + case REAL_CST: + pp_c_constant (pp_c_base (pp), t); + break; + + case BASELINK: + t = BASELINK_FUNCTIONS (t); + case VAR_DECL: + case PARM_DECL: + case FIELD_DECL: + case FUNCTION_DECL: + case OVERLOAD: + case CONST_DECL: + case TEMPLATE_DECL: + pp_cxx_id_expression (pp, t); + break; + + case RESULT_DECL: + case TEMPLATE_TYPE_PARM: + case TEMPLATE_PARM_INDEX: + pp_cxx_unqualified_id (pp, t); + break; + + default: + pp_c_primary_expression (pp_c_base (pp), t); + break; + } + } + + /* postfix-expression: + primary-expression + postfix-expression [ expression ] + postfix-expression ( expression-list(opt) ) + simple-type-specifier ( expression-list(opt) ) + typename ::(opt) nested-name-specifier identifier ( expression-list(opt) ) + typename ::(opt) nested-name-specifier template(opt) + template-id ( expression-list(opt) ) + postfix-expression . template(opt) ::(opt) id-expression + postfix-expression -> template(opt) ::(opt) id-expression + postfix-expression . pseudo-destructor-name + postfix-expression -> pseudo-destructor-name + postfix-expression ++ + postfix-expression -- + dynamic_cast < type-id > ( expression ) + static_cast < type-id > ( expression ) + reinterpret_cast < type-id > ( expression ) + const_cast < type-id > ( expression ) + typeid ( expression ) + typeif ( type-id ) */ + + static void + pp_cxx_postfix_expression (cxx_pretty_printer *pp, tree t) + { + enum tree_code code = TREE_CODE (t); + + switch (code) + { + case AGGR_INIT_EXPR: + case CALL_EXPR: + { + tree fun = TREE_OPERAND (t, 0); + tree args = TREE_OPERAND (t, 1); + tree saved_scope = pp->enclosing_scope; + + if (TREE_CODE (fun) == ADDR_EXPR) + fun = TREE_OPERAND (fun, 0); + + /* In templates, where there is no way to tell whether a given + call uses an actual member function. So the parser builds + FUN as a COMPONENT_REF or a plain IDENTIFIER_NODE until + instantiation time. */ + if (TREE_CODE (fun) != FUNCTION_DECL) + ; + else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun)) + { + tree object = code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t) + ? TREE_OPERAND (t, 2) + : TREE_VALUE (args); + + while (TREE_CODE (object) == NOP_EXPR) + object = TREE_OPERAND (object, 0); + + if (TREE_CODE (object) == ADDR_EXPR) + object = TREE_OPERAND (object, 0); + + if (TREE_CODE (TREE_TYPE (object)) != POINTER_TYPE) + { + pp_cxx_postfix_expression (pp, object); + pp_cxx_dot (pp); + } + else + { + pp_cxx_postfix_expression (pp, object); + pp_cxx_arrow (pp); + } + args = TREE_CHAIN (args); + pp->enclosing_scope = strip_pointer_operator (TREE_TYPE (object)); + } + + pp_cxx_postfix_expression (pp, fun); + pp->enclosing_scope = saved_scope; + pp_cxx_call_argument_list (pp, args); + } + if (code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t)) + { + pp_separate_with (pp, ','); + pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 2)); + } + break; + + case BASELINK: + case VAR_DECL: + case PARM_DECL: + case FIELD_DECL: + case FUNCTION_DECL: + case OVERLOAD: + case CONST_DECL: + case TEMPLATE_DECL: + case RESULT_DECL: + pp_cxx_primary_expression (pp, t); + break; + + case DYNAMIC_CAST_EXPR: + case STATIC_CAST_EXPR: + case REINTERPRET_CAST_EXPR: + case CONST_CAST_EXPR: + if (code == DYNAMIC_CAST_EXPR) + pp_identifier (pp, "dynamic_cast"); + else if (code == STATIC_CAST_EXPR) + pp_identifier (pp, "static_cast"); + else if (code == REINTERPRET_CAST_EXPR) + pp_identifier (pp, "reinterpret_cast"); + else + pp_identifier (pp, "const_cast"); + pp_cxx_begin_template_argument_list (pp); + pp_cxx_type_id (pp, TREE_TYPE (t)); + pp_cxx_end_template_argument_list (pp); + pp_left_paren (pp); + pp_cxx_expression (pp, TREE_OPERAND (t, 0)); + pp_right_paren (pp); + break; + + case EMPTY_CLASS_EXPR: + pp_cxx_type_id (pp, TREE_TYPE (t)); + pp_left_paren (pp); + pp_right_paren (pp); + break; + + case TYPEID_EXPR: + t = TREE_OPERAND (t, 0); + pp_cxx_identifier (pp, "typeid"); + pp_left_paren (pp); + if (TYPE_P (t)) + pp_cxx_type_id (pp, t); + else + pp_cxx_expression (pp, t); + pp_right_paren (pp); + break; + + case PSEUDO_DTOR_EXPR: + pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0)); + pp_cxx_dot (pp); + pp_cxx_qualified_id (pp, TREE_OPERAND (t, 1)); + pp_cxx_colon_colon (pp); + pp_complement (pp); + pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 2)); + break; + + default: + pp_c_postfix_expression (pp_c_base (pp), t); + break; + } + } + + /* new-expression: + ::(opt) new new-placement(opt) new-type-id new-initializer(opt) + ::(opt) new new-placement(opt) ( type-id ) new-initializer(opt) + + new-placement: + ( expression-list ) + + new-type-id: + type-specifier-seq new-declarator(opt) + + new-declarator: + ptr-operator new-declarator(opt) + direct-new-declarator + + direct-new-declarator + [ expression ] + direct-new-declarator [ constant-expression ] + + new-initializer: + ( expression-list(opt) ) */ + static void + pp_cxx_new_expression (cxx_pretty_printer *pp, tree t) + { + enum tree_code code = TREE_CODE (t); + switch (code) + { + case NEW_EXPR: + case VEC_NEW_EXPR: + if (NEW_EXPR_USE_GLOBAL (t)) + pp_cxx_colon_colon (pp); + pp_cxx_identifier (pp, "new"); + if (TREE_OPERAND (t, 0)) + { + pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0)); + pp_space (pp); + } + /* FIXME: array-types are built with one more element. */ + pp_cxx_type_id (pp, TREE_OPERAND (t, 1)); + if (TREE_OPERAND (t, 2)) + { + pp_left_paren (pp); + t = TREE_OPERAND (t, 2); + if (TREE_CODE (t) == TREE_LIST) + pp_c_expression_list (pp_c_base (pp), t); + else if (t == void_zero_node) + ; /* OK, empty initializer list. */ + else + pp_cxx_expression (pp, t); + pp_right_paren (pp); + } + break; + + default: + pp_unsupported_tree (pp, t); + } + } + + /* delete-expression: + ::(opt) delete cast-expression + ::(opt) delete [ ] cast-expression */ + static void + pp_cxx_delete_expression (cxx_pretty_printer *pp, tree t) + { + enum tree_code code = TREE_CODE (t); + switch (code) + { + case DELETE_EXPR: + case VEC_DELETE_EXPR: + if (DELETE_EXPR_USE_GLOBAL (t)) + pp_cxx_colon_colon (pp); + pp_cxx_identifier (pp, "delete"); + if (code == VEC_DELETE_EXPR) + { + pp_left_bracket (pp); + pp_right_bracket (pp); + } + pp_c_cast_expression (pp_c_base (pp), TREE_OPERAND (t, 0)); + break; + + default: + pp_unsupported_tree (pp, t); + } + } + + /* unary-expression: + postfix-expression + ++ cast-expression + -- cast-expression + unary-operator cast-expression + sizeof unary-expression + sizeof ( type-id ) + new-expression + delete-expression + + unary-operator: one of + * & + - ! + + GNU extensions: + __alignof__ unary-expression + __alignof__ ( type-id ) */ + static void + pp_cxx_unary_expression (cxx_pretty_printer *pp, tree t) + { + enum tree_code code = TREE_CODE (t); + switch (code) + { + case NEW_EXPR: + case VEC_NEW_EXPR: + pp_cxx_new_expression (pp, t); + break; + + case DELETE_EXPR: + case VEC_DELETE_EXPR: + pp_cxx_delete_expression (pp, t); + break; + + default: + pp_c_unary_expression (pp_c_base (pp), t); + break; + } + } + + /* cast-expression: + unary-expression + ( type-id ) cast-expression */ + static void + pp_cxx_cast_expression (cxx_pretty_printer *pp, tree t) + { + switch (TREE_CODE (t)) + { + case CAST_EXPR: + pp_cxx_type_id (pp, TREE_TYPE (t)); + pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0)); + break; + + default: + pp_c_cast_expression (pp_c_base (pp), t); + break; + } + } + + /* pm-expression: + cast-expression + pm-expression .* cast-expression + pm-expression ->* cast-expression */ + static void + pp_cxx_pm_expression (cxx_pretty_printer *pp, tree t) + { + switch (TREE_CODE (t)) + { + /* Handle unfortunate OFFESET_REF overloading here. */ + case OFFSET_REF: + if (TYPE_P (TREE_OPERAND (t, 0))) + { + pp_cxx_qualified_id (pp, t); + break; + } + /* Else fall through. */ + case MEMBER_REF: + case DOTSTAR_EXPR: + pp_cxx_pm_expression (pp, TREE_OPERAND (t, 0)); + pp_cxx_dot (pp); + pp_star(pp); + pp_cxx_cast_expression (pp, TREE_OPERAND (t, 1)); + break; + + + default: + pp_cxx_cast_expression (pp, t); + break; + } + } + + /* multiplicative-expression: + pm-expression + multiplicative-expression * pm-expression + multiplicative-expression / pm-expression + multiplicative-expression % pm-expression */ + static void + pp_cxx_multiplicative_expression (cxx_pretty_printer *pp, tree e) + { + enum tree_code code = TREE_CODE (e); + switch (code) + { + case MULT_EXPR: + case TRUNC_DIV_EXPR: + case TRUNC_MOD_EXPR: + pp_cxx_multiplicative_expression (pp, TREE_OPERAND (e, 0)); + pp_space (pp); + if (code == MULT_EXPR) + pp_star (pp); + else if (code == TRUNC_DIV_EXPR) + pp_slash (pp); + else + pp_modulo (pp); + pp_space (pp); + pp_cxx_pm_expression (pp, TREE_OPERAND (e, 1)); + break; + + default: + pp_cxx_pm_expression (pp, e); + break; + } + } + + /* conditional-expression: + logical-or-expression + logical-or-expression ? expression : assignment-expression */ + static void + pp_cxx_conditional_expression (cxx_pretty_printer *pp, tree e) + { + if (TREE_CODE (e) == COND_EXPR) + { + pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0)); + pp_space (pp); + pp_question (pp); + pp_space (pp); + pp_cxx_expression (pp, TREE_OPERAND (e, 1)); + pp_space (pp); + pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2)); + } + else + pp_c_logical_or_expression (pp_c_base (pp), e); + } + + static void + pp_cxx_assignment_operator (cxx_pretty_printer *pp, tree t) + { + const char *op; + + switch (TREE_CODE (t)) + { + case NOP_EXPR: + op = "="; + break; + + case PLUS_EXPR: + op = "+="; + break; + + case MINUS_EXPR: + op = "-="; + break; + + case TRUNC_DIV_EXPR: + op = "/="; + break; + + case TRUNC_MOD_EXPR: + op = "%="; + break; + + default: + op = tree_code_name[TREE_CODE (t)]; + break; + } + + pp_cxx_identifier (pp, op); + } + + + /* assignment-expression: + conditional-expression + logical-or-expression assignment-operator assignment-expression + throw-expression + + throw-expression: + throw assignment-expression(opt) + + assignment-operator: one of + = *= /= %= += -= >>= <<= &= ^= |= */ + static void + pp_cxx_assignment_expression (cxx_pretty_printer *pp, tree e) + { + switch (TREE_CODE (e)) + { + case MODIFY_EXPR: + case INIT_EXPR: + pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0)); + pp_space (pp); + pp_equal (pp); + pp_space (pp); + pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 1)); + break; + + case THROW_EXPR: + pp_cxx_identifier (pp, "throw"); + if (TREE_OPERAND (e, 0)) + pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 0)); + break; + + case MODOP_EXPR: + pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0)); + pp_cxx_assignment_operator (pp, TREE_OPERAND (e, 1)); + pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2)); + break; + + default: + pp_cxx_conditional_expression (pp, e); + break; + } + } + + static void + pp_cxx_expression (cxx_pretty_printer *pp, tree t) + { + switch (TREE_CODE (t)) + { + case STRING_CST: + case INTEGER_CST: + case REAL_CST: + pp_c_constant (pp_c_base (pp), t); + break; + + case RESULT_DECL: + pp_cxx_unqualified_id (pp, t); + break; + + #if 0 + case OFFSET_REF: + #endif + case SCOPE_REF: + case PTRMEM_CST: + pp_cxx_qualified_id (pp, t); + break; + + case OVERLOAD: + t = OVL_CURRENT (t); + case VAR_DECL: + case PARM_DECL: + case FIELD_DECL: + case CONST_DECL: + case FUNCTION_DECL: + case BASELINK: + case TEMPLATE_DECL: + case TEMPLATE_TYPE_PARM: + case TEMPLATE_PARM_INDEX: + pp_cxx_primary_expression (pp, t); + break; + + case CALL_EXPR: + case DYNAMIC_CAST_EXPR: + case STATIC_CAST_EXPR: + case REINTERPRET_CAST_EXPR: + case CONST_CAST_EXPR: + #if 0 + case MEMBER_REF: + #endif + case EMPTY_CLASS_EXPR: + case TYPEID_EXPR: + case PSEUDO_DTOR_EXPR: + case AGGR_INIT_EXPR: + pp_cxx_postfix_expression (pp, t); + break; + + case NEW_EXPR: + case VEC_NEW_EXPR: + pp_cxx_new_expression (pp, t); + break; + + case DELETE_EXPR: + case VEC_DELETE_EXPR: + pp_cxx_delete_expression (pp, t); + break; + + case CAST_EXPR: + pp_cxx_cast_expression (pp, t); + break; + + case OFFSET_REF: + case MEMBER_REF: + case DOTSTAR_EXPR: + pp_cxx_pm_expression (pp, t); + break; + + case MULT_EXPR: + case TRUNC_DIV_EXPR: + case TRUNC_MOD_EXPR: + pp_cxx_multiplicative_expression (pp, t); + break; + + case COND_EXPR: + pp_cxx_conditional_expression (pp, t); + break; + + case MODIFY_EXPR: + case INIT_EXPR: + case THROW_EXPR: + case MODOP_EXPR: + pp_cxx_assignment_expression (pp, t); + break; + + default: + pp_c_expression (pp_c_base (pp), t); + break; + } + } + + + /* Declarations. */ + + /* function-specifier: + inline + virtual + explicit */ + static void + pp_cxx_function_specifier (cxx_pretty_printer *pp, tree t) + { + switch (TREE_CODE (t)) + { + case FUNCTION_DECL: + if (DECL_VIRTUAL_P (t)) + pp_cxx_identifier (pp, "virtual"); + else if (DECL_CONSTRUCTOR_P (t) && DECL_NONCONVERTING_P (t)) + pp_cxx_identifier (pp, "explicit"); + else + pp_c_function_specifier (pp_c_base (pp), t); + + default: + break; + } + } + + /* decl-specifier-seq: + decl-specifier-seq(opt) decl-specifier + + decl-specifier: + storage-class-specifier + type-specifier + function-specifier + friend + typedef */ + static void + pp_cxx_decl_specifier_seq (cxx_pretty_printer *pp, tree t) + { + switch (TREE_CODE (t)) + { + case VAR_DECL: + case PARM_DECL: + case CONST_DECL: + case FIELD_DECL: + pp_cxx_storage_class_specifier (pp, t); + pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t)); + break; + + case TYPE_DECL: + pp_cxx_identifier (pp, "typedef"); + pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t)); + break; + + case RECORD_TYPE: + if (TYPE_PTRMEMFUNC_P (t)) + { + tree pfm = TYPE_PTRMEMFUNC_FN_TYPE (t); + pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (pfm))); + pp_cxx_whitespace (pp); + pp_cxx_ptr_operator (pp, t); + } + break; + + case FUNCTION_DECL: + /* Constructors don't have return types. And conversion functions + do not have a type-specifier in their return types. */ + if (DECL_CONSTRUCTOR_P (t) || DECL_CONV_FN_P (t)) + pp_cxx_function_specifier (pp, t); + else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t)) + pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (t))); + else + default: + pp_c_declaration_specifiers (pp_c_base (pp), t); + break; + } + } + + /* simple-type-specifier: + ::(opt) nested-name-specifier(opt) type-name + ::(opt) nested-name-specifier(opt) template(opt) template-id + char + wchar_t + bool + short + int + long + signed + unsigned + float + double + void */ + static void + pp_cxx_simple_type_specifier (cxx_pretty_printer *pp, tree t) + { + switch (TREE_CODE (t)) + { + case RECORD_TYPE: + case UNION_TYPE: + case ENUMERAL_TYPE: + pp_cxx_qualified_id (pp, t); + break; + + case TEMPLATE_TYPE_PARM: + case TEMPLATE_PARM_INDEX: + pp_cxx_unqualified_id (pp, t); + break; + + case TYPENAME_TYPE: + pp_cxx_identifier (pp, "typename"); + pp_cxx_nested_name_specifier (pp, TYPE_CONTEXT (t)); + pp_cxx_unqualified_id (pp, TYPE_NAME (t)); + break; + + default: + pp_c_type_specifier (pp_c_base (pp), t); + break; + } + } + + /* type-specifier-seq: + type-specifier type-specifier-seq(opt) + + type-specifier: + simple-type-specifier + class-specifier + enum-specifier + elaborated-type-specifier + cv-qualifier */ + + static void + pp_cxx_type_specifier_seq (cxx_pretty_printer *pp, tree t) + { + switch (TREE_CODE (t)) + { + case TEMPLATE_DECL: + case TEMPLATE_TYPE_PARM: + case TYPE_DECL: + case BOUND_TEMPLATE_TEMPLATE_PARM: + pp_c_type_qualifier_list (pp_c_base (pp), t); + pp_cxx_simple_type_specifier (pp, t); + break; + + case METHOD_TYPE: + pp_cxx_type_specifier_seq (pp, TREE_TYPE (t)); + pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t)); + pp_cxx_nested_name_specifier (pp, TYPE_METHOD_BASETYPE (t)); + break; + + default: + if (!(TREE_CODE (t) == FUNCTION_DECL && DECL_CONSTRUCTOR_P (t))) + pp_c_specifier_qualifier_list (pp_c_base (pp), t); + } + } + + /* ptr-operator: + * cv-qualifier-seq(opt) + & + ::(opt) nested-name-specifier * cv-qualifier-seq(opt) */ + + static void + pp_cxx_ptr_operator (cxx_pretty_printer *pp, tree t) + { + if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL) + t = TREE_TYPE (t); + switch (TREE_CODE (t)) + { + case REFERENCE_TYPE: + case POINTER_TYPE: + if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE + || TYPE_PTR_TO_MEMBER_P (TREE_TYPE (t))) + pp_cxx_ptr_operator (pp, TREE_TYPE (t)); + if (TREE_CODE (t) == POINTER_TYPE) + { + pp_star (pp); + pp_cxx_cv_qualifier_seq (pp, t); + } + else + pp_ampersand (pp); + break; + + case RECORD_TYPE: + if (TYPE_PTRMEMFUNC_P (t)) + { + pp_cxx_left_paren (pp); + pp_cxx_nested_name_specifier (pp, TYPE_PTRMEMFUNC_OBJECT_TYPE (t)); + pp_star (pp); + break; + } + case OFFSET_TYPE: + if (TYPE_PTR_TO_MEMBER_P (t)) + { + pp_cxx_nested_name_specifier (pp, TYPE_PTRMEM_CLASS_TYPE (t)); + pp_star (pp); + pp_cxx_cv_qualifier_seq (pp, t); + break; + } + /* else fall through. */ + + default: + pp_unsupported_tree (pp, t); + break; + } + } + + static inline tree + pp_cxx_implicit_parameter_type (tree mf) + { + return TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (mf)))); + } + + /* + parameter-declaration: + decl-specifier-seq declarator + decl-specifier-seq declarator = assignment-expression + decl-specifier-seq abstract-declarator(opt) + decl-specifier-seq abstract-declarator(opt) assignment-expression */ + static inline void + pp_cxx_parameter_declaration (cxx_pretty_printer *pp, tree t) + { + pp_cxx_decl_specifier_seq (pp, t); + if (TYPE_P (t)) + pp_cxx_abstract_declarator (pp, t); + else + pp_cxx_declarator (pp, t); + } + + /* parameter-declaration-clause: + parameter-declaration-list(opt) ...(opt) + parameter-declaration-list , ... + + parameter-declaration-list: + parameter-declaration + parameter-declaration-list , parameter-declaration */ + static void + pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t) + { + tree args = TYPE_P (t) ? NULL : FUNCTION_FIRST_USER_PARM (t); + tree types = TYPE_P (t) ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t); + const bool abstract = args == NULL + || pp_c_base (pp)->flags & pp_c_flag_abstract; + bool first = true; + + /* Skip artificial parameter for nonstatic member functions. */ + if (TREE_CODE (t) == METHOD_TYPE) + types = TREE_CHAIN (types); + + pp_cxx_left_paren (pp); + for (; args; args = TREE_CHAIN (args), types = TREE_CHAIN (types)) + { + if (!first) + pp_separate_with (pp, ','); + first = false; + pp_cxx_parameter_declaration (pp, abstract ? TREE_VALUE (types) : args); + if (!abstract && pp_c_base (pp)->flags & pp_cxx_flag_default_argument) + { + pp_cxx_whitespace (pp); + pp_equal (pp); + pp_cxx_whitespace (pp); + pp_cxx_assignment_expression (pp, TREE_PURPOSE (types)); + } + } + pp_cxx_right_paren (pp); + } + + /* exception-specification: + throw ( type-id-list(opt) ) + + type-id-list + type-id + type-id-list , type-id */ + static void + pp_cxx_exception_specification (cxx_pretty_printer *pp, tree t) + { + tree ex_spec = TYPE_RAISES_EXCEPTIONS (t); + + if (!TYPE_NOTHROW_P (t) && ex_spec == NULL) + return; + pp_cxx_identifier (pp, "throw"); + pp_cxx_left_paren (pp); + for (; ex_spec && TREE_VALUE (ex_spec); ex_spec = TREE_CHAIN (ex_spec)) + { + pp_cxx_type_id (pp, TREE_VALUE (ex_spec)); + if (TREE_CHAIN (ex_spec)) + pp_separate_with (pp, ','); + } + pp_cxx_right_paren (pp); + } + + /* direct-declarator: + declarator-id + direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq(opt) + exception-specification(opt) + direct-declaration [ constant-expression(opt) ] + ( declarator ) */ + static void + pp_cxx_direct_declarator (cxx_pretty_printer *pp, tree t) + { + switch (TREE_CODE (t)) + { + case VAR_DECL: + case PARM_DECL: + case CONST_DECL: + case FIELD_DECL: + if (DECL_NAME (t)) + { + pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t)); + pp_cxx_id_expression (pp, DECL_NAME (t)); + } + pp_cxx_abstract_declarator (pp, TREE_TYPE (t)); + break; + + case FUNCTION_DECL: + pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t))); + pp_cxx_id_expression (pp, t); + pp_cxx_parameter_declaration_clause (pp, t); + + if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t)) + { + pp_base (pp)->padding = pp_before; + pp_cxx_cv_qualifier_seq (pp, pp_cxx_implicit_parameter_type (t)); + } + + pp_cxx_exception_specification (pp, TREE_TYPE (t)); + break; + + case TYPENAME_TYPE: + case TEMPLATE_DECL: + case TEMPLATE_TYPE_PARM: + case TEMPLATE_PARM_INDEX: + break; + + default: + pp_c_direct_declarator (pp_c_base (pp), t); + break; + } + } + + /* declarator: + direct-declarator + ptr-operator declarator */ + static void + pp_cxx_declarator (cxx_pretty_printer *pp, tree t) + { + pp_cxx_direct_declarator (pp, t); + } + + /* ctor-initializer: + : mem-initializer-list + + mem-initializer-list: + mem-initializer + mem-initializer , mem-initializer-list + + mem-initializer: + mem-initializer-id ( expression-list(opt) ) + + mem-initializer-id: + ::(opt) nested-name-specifier(opt) class-name + identifier */ + static void + pp_cxx_ctor_initializer (cxx_pretty_printer *pp, tree t) + { + t = TREE_OPERAND (t, 0); + pp_cxx_whitespace (pp); + pp_colon (pp); + pp_cxx_whitespace (pp); + for (; t; t = TREE_CHAIN (t)) + { + pp_cxx_primary_expression (pp, TREE_PURPOSE (t)); + pp_cxx_call_argument_list (pp, TREE_VALUE (t)); + if (TREE_CHAIN (t)) + pp_separate_with (pp, ','); + } + } + + /* function-definition: + decl-specifier-seq(opt) declarator ctor-initializer(opt) function-body + decl-specifier-seq(opt) declarator function-try-block */ + + void + pp_cxx_function_definition (cxx_pretty_printer *pp, tree t) + { + tree saved_scope = pp->enclosing_scope; + pp_cxx_decl_specifier_seq (pp, t); + pp_cxx_declarator (pp, t); + pp_needs_newline (pp) = true; + pp->enclosing_scope = DECL_CONTEXT (t); + if (DECL_SAVED_TREE (t)) + { + tree body = DECL_SAVED_TREE (t); + if (TREE_CODE (body) == COMPOUND_STMT + && TREE_CODE (COMPOUND_BODY (body)) == CTOR_INITIALIZER) + { + body = COMPOUND_BODY (body); + pp_cxx_ctor_initializer (pp, body); + body = TREE_CHAIN (body); + } + pp_cxx_statement (pp, body); + } + else + { + pp_cxx_semicolon (pp); + pp_needs_newline (pp) = true; + } + pp_flush (pp); + pp->enclosing_scope = saved_scope; + } + + /* abstract-declarator: + ptr-operator abstract-declarator(opt) + direct-abstract-declarator */ + static void + pp_cxx_abstract_declarator (cxx_pretty_printer *pp, tree t) + { + if (TYPE_PTRMEM_P (t) || TYPE_PTRMEMFUNC_P (t)) + pp_cxx_right_paren (pp); + else if (POINTER_TYPE_P (t)) + { + if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE + || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE) + pp_cxx_right_paren (pp); + t = TREE_TYPE (t); + } + pp_cxx_direct_abstract_declarator (pp, t); + } + + /* direct-abstract-declarator: + direct-abstract-declarator(opt) ( parameter-declaration-clause ) + cv-qualifier-seq(opt) exception-specification(opt) + direct-abstract-declarator(opt) [ constant-expression(opt) ] + ( abstract-declarator ) */ + static void + pp_cxx_direct_abstract_declarator (cxx_pretty_printer *pp, tree t) + { + switch (TREE_CODE (t)) + { + case REFERENCE_TYPE: + pp_cxx_abstract_declarator (pp, t); + break; + + case RECORD_TYPE: + if (TYPE_PTRMEMFUNC_P (t)) + pp_cxx_direct_abstract_declarator (pp, TYPE_PTRMEMFUNC_FN_TYPE (t)); + break; + + case METHOD_TYPE: + case FUNCTION_TYPE: + pp_cxx_parameter_declaration_clause (pp, t); + pp_cxx_direct_abstract_declarator (pp, TREE_TYPE (t)); + if (TREE_CODE (t) == METHOD_TYPE) + { + pp_base (pp)->padding = pp_before; + pp_cxx_cv_qualifier_seq + (pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t)))); + } + pp_cxx_exception_specification (pp, t); + break; + + case TYPENAME_TYPE: + case TEMPLATE_TYPE_PARM: + case TEMPLATE_TEMPLATE_PARM: + case BOUND_TEMPLATE_TEMPLATE_PARM: + case UNBOUND_CLASS_TEMPLATE: + break; + + default: + pp_c_direct_abstract_declarator (pp_c_base (pp), t); + break; + } + } + + /* type-id: + type-specifier-seq abstract-declarator(opt) */ + static void + pp_cxx_type_id (cxx_pretty_printer *pp, tree t) + { + pp_flags saved_flags = pp_c_base (pp)->flags; + pp_c_base (pp)->flags |= pp_c_flag_abstract; + + switch (TREE_CODE (t)) + { + case TYPE_DECL: + case UNION_TYPE: + case RECORD_TYPE: + case ENUMERAL_TYPE: + case TYPENAME_TYPE: + case BOUND_TEMPLATE_TEMPLATE_PARM: + case UNBOUND_CLASS_TEMPLATE: + case TEMPLATE_TEMPLATE_PARM: + case TEMPLATE_TYPE_PARM: + case TEMPLATE_PARM_INDEX: + case TEMPLATE_DECL: + case TYPEOF_TYPE: + case TEMPLATE_ID_EXPR: + /* FIXME: Should be pp_cxx_type_specifier_seq. */ + pp_cxx_type_specifier_seq (pp, t); + pp_cxx_declarator (pp, t); + break; + + default: + pp_c_type_id (pp_c_base (pp), t); + break; + } + + pp_c_base (pp)->flags = saved_flags; + } + + /* template-argument-list: + template-argument + template-argument-list, template-argument + + template-argument: + assignment-expression + type-id + template-name */ + static void + pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t) + { + int i; + if (t == NULL) + return; + for (i = 0; i < TREE_VEC_LENGTH (t); ++i) + { + tree arg = TREE_VEC_ELT (t, i); + if (i != 0) + pp_separate_with (pp, ','); + if (TYPE_P (arg) || (TREE_CODE (arg) == TEMPLATE_DECL + && TYPE_P (DECL_TEMPLATE_RESULT (arg)))) + pp_cxx_type_id (pp, arg); + else + pp_cxx_expression (pp, arg); + } + } + + + static void + pp_cxx_exception_declaration (cxx_pretty_printer *pp, tree t) + { + t = DECL_STMT_DECL (t); + pp_cxx_type_specifier_seq (pp, t); + if (TYPE_P (t)) + pp_cxx_abstract_declarator (pp, t); + else + pp_cxx_declarator (pp, t); + } + + /* Statements. */ + + void + pp_cxx_statement (cxx_pretty_printer *pp, tree t) + { + switch (TREE_CODE (t)) + { + case USING_STMT: + pp_cxx_identifier (pp, "using"); + pp_cxx_identifier (pp, "namespace"); + pp_cxx_qualified_id (pp, USING_STMT_NAMESPACE (t)); + break; + + case USING_DECL: + pp_cxx_identifier (pp, "using"); + pp_cxx_nested_name_specifier (pp, DECL_INITIAL (t)); + pp_cxx_unqualified_id (pp, DECL_NAME (t)); + break; + + case EH_SPEC_BLOCK: + break; + + /* try-block: + try compound-statement handler-seq */ + case TRY_BLOCK: + pp_maybe_newline_and_indent (pp, 0); + pp_cxx_identifier (pp, "try"); + pp_newline_and_indent (pp, 3); + pp_cxx_statement (pp, TRY_STMTS (t)); + pp_newline_and_indent (pp, -3); + if (CLEANUP_P (t)) + ; + else + pp_cxx_statement (pp, TRY_HANDLERS (t)); + break; + + /* + handler-seq: + handler handler-seq(opt) + + handler: + catch ( exception-declaration ) compound-statement + + exception-declaration: + type-specifier-seq declarator + type-specifier-seq abstract-declarator + ... */ + case HANDLER: + pp_cxx_identifier (pp, "catch"); + pp_cxx_left_paren (pp); + pp_cxx_exception_declaration (pp, HANDLER_PARMS (t)); + pp_cxx_right_paren (pp); + pp_indentation (pp) += 3; + pp_needs_newline (pp) = true; + pp_cxx_statement (pp, HANDLER_BODY (t)); + pp_indentation (pp) -= 3; + pp_needs_newline (pp) = true; + break; + + default: + pp_c_statement (pp_c_base (pp), t); + break; + } + } + + /* original-namespace-definition: + namespace identifier { namespace-body } + + As an edge case, we also handle unnamed namespace definition here. */ + + static void + pp_cxx_original_namespace_definition (cxx_pretty_printer *pp, tree t) + { + pp_cxx_identifier (pp, "namespace"); + if (DECL_NAME (t)) + pp_cxx_unqualified_id (pp, t); + pp_cxx_whitespace (pp); + pp_cxx_left_brace (pp); + /* We do not print the namespace-body. */ + pp_cxx_whitespace (pp); + pp_cxx_right_brace (pp); + } + + /* namespace-alias: + identifier + + namespace-alias-definition: + namespace identifier = qualified-namespace-specifier ; + + qualified-namespace-specifier: + ::(opt) nested-name-specifier(opt) namespace-name */ + + static void + pp_cxx_namespace_alias_definition (cxx_pretty_printer *pp, tree t) + { + pp_cxx_identifier (pp, "namespace"); + pp_cxx_unqualified_id (pp, t); + pp_cxx_whitespace (pp); + pp_equal (pp); + pp_cxx_whitespace (pp); + pp_cxx_qualified_id (pp, DECL_NAMESPACE_ALIAS (t)); + pp_cxx_semicolon (pp); + } + + /* simple-declaration: + decl-specifier-seq(opt) init-declarator-list(opt) */ + static void + pp_cxx_simple_declaration (cxx_pretty_printer *pp, tree t) + { + pp_cxx_decl_specifier_seq (pp, t); + pp_cxx_init_declarator (pp, t); + pp_cxx_semicolon (pp); + pp_needs_newline (pp) = true; + } + + /* + template-parameter-list: + template-parameter + template-parameter-list , template-parameter */ + + static inline void + pp_cxx_template_parameter_list (cxx_pretty_printer *pp, tree t) + { + const int n = TREE_VEC_LENGTH (t); + int i; + for (i = 0; i < n; ++i) + { + if (i) + pp_separate_with (pp, ','); + pp_cxx_template_parameter (pp, TREE_VEC_ELT (t, i)); + } + } + + /* template-parameter: + type-parameter + parameter-declaration + + type-parameter: + class identifier(opt) + class identifier(op) = type-id + typename identifier(opt) + typename identifier(opt) = type-id + template < template-parameter-list > class identifier(opt) + template < template-parameter-list > class identifier(opt) = template-name + */ + static void + pp_cxx_template_parameter (cxx_pretty_printer *pp, tree t) + { + tree parameter = TREE_VALUE (t); + switch (TREE_CODE (parameter)) + { + case TYPE_DECL: + pp_cxx_identifier (pp, "class"); + if (DECL_NAME (parameter)) + pp_cxx_tree_identifier (pp, DECL_NAME (parameter)); + /* FIXME: Chech if we should print also default argument. */ + break; + + case PARM_DECL: + pp_cxx_parameter_declaration (pp, parameter); + break; + + case TEMPLATE_DECL: + break; + + default: + pp_unsupported_tree (pp, t); + break; + } + } + + /* Pretty-print a template parameter in the canonical form + "template-parameter--". */ + + void + pp_cxx_canonical_template_parameter (cxx_pretty_printer *pp, tree parm) + { + const enum tree_code code = TREE_CODE (parm); + + /* Brings type template parameters to the canonical forms. */ + if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM + || code == BOUND_TEMPLATE_TEMPLATE_PARM) + parm = TEMPLATE_TYPE_PARM_INDEX (parm); + + pp_cxx_begin_template_argument_list (pp); + pp_cxx_identifier (pp, "template-parameter-"); + pp_wide_integer (pp, TEMPLATE_PARM_LEVEL (parm)); + pp_minus (pp); + pp_wide_integer (pp, TEMPLATE_PARM_IDX (parm) + 1); + pp_cxx_end_template_argument_list (pp); + } + + /* + template-declaration: + export(opt) template < template-parameter-list > declaration */ + static void + pp_cxx_template_declaration (cxx_pretty_printer *pp, tree t) + { + tree tmpl = most_general_template (t); + tree level; + int i = 0; + + pp_maybe_newline_and_indent (pp, 0); + for (level = DECL_TEMPLATE_PARMS (tmpl); level; level = TREE_CHAIN (level)) + { + pp_cxx_identifier (pp, "template"); + pp_cxx_begin_template_argument_list (pp); + pp_cxx_template_parameter_list (pp, TREE_VALUE (level)); + pp_cxx_end_template_argument_list (pp); + pp_newline_and_indent (pp, 3); + i += 3; + } + if (TREE_CODE (t) == FUNCTION_DECL && DECL_SAVED_TREE (t)) + pp_cxx_function_definition (pp, t); + else + pp_cxx_simple_declaration (pp, t); + } + + static void + pp_cxx_explicit_specialization (cxx_pretty_printer *pp, tree t) + { + pp_unsupported_tree (pp, t); + } + + static void + pp_cxx_explicit_instantiation (cxx_pretty_printer *pp, tree t) + { + pp_unsupported_tree (pp, t); + } + + /* + declaration: + block-declaration + function-definition + template-declaration + explicit-instantiation + explicit-specialization + linkage-specification + namespace-definition + + block-declaration: + simple-declaration + asm-definition + namespace-alias-definition + using-declaration + using-directive */ + void + pp_cxx_declaration (cxx_pretty_printer *pp, tree t) + { + if (!DECL_LANG_SPECIFIC (t)) + pp_cxx_simple_declaration (pp, t); + else if (DECL_USE_TEMPLATE (t)) + switch (DECL_USE_TEMPLATE (t)) + { + case 1: + pp_cxx_template_declaration (pp, t); + break; + + case 2: + pp_cxx_explicit_specialization (pp, t); + break; + + case 3: + pp_cxx_explicit_instantiation (pp, t); + break; + + default: + break; + } + else switch (TREE_CODE (t)) + { + case VAR_DECL: + case TYPE_DECL: + pp_cxx_simple_declaration (pp, t); + break; + + case FUNCTION_DECL: + if (DECL_SAVED_TREE (t)) + pp_cxx_function_definition (pp, t); + else + pp_cxx_simple_declaration (pp, t); + break; + + case NAMESPACE_DECL: + if (DECL_NAMESPACE_ALIAS (t)) + pp_cxx_namespace_alias_definition (pp, t); + else + pp_cxx_original_namespace_definition (pp, t); + break; + + default: + pp_unsupported_tree (pp, t); + break; + } + } + + + typedef c_pretty_print_fn pp_fun; + + void + pp_cxx_pretty_printer_init (cxx_pretty_printer *pp) + { + pp_c_pretty_printer_init (pp_c_base (pp)); + pp_set_line_maximum_length (pp, 0); + + pp->c_base.declaration = (pp_fun) pp_cxx_declaration; + pp->c_base.declaration_specifiers = (pp_fun) pp_cxx_decl_specifier_seq; + pp->c_base.function_specifier = (pp_fun) pp_cxx_function_specifier; + pp->c_base.type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq; + pp->c_base.declarator = (pp_fun) pp_cxx_declarator; + pp->c_base.direct_declarator = (pp_fun) pp_cxx_direct_declarator; + pp->c_base.parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause; + pp->c_base.type_id = (pp_fun) pp_cxx_type_id; + pp->c_base.abstract_declarator = (pp_fun) pp_cxx_abstract_declarator; + pp->c_base.direct_abstract_declarator = + (pp_fun) pp_cxx_direct_abstract_declarator; + pp->c_base.simple_type_specifier = (pp_fun)pp_cxx_simple_type_specifier; + + /* pp->c_base.statement = (pp_fun) pp_cxx_statement; */ + + pp->c_base.id_expression = (pp_fun) pp_cxx_id_expression; + pp->c_base.primary_expression = (pp_fun) pp_cxx_primary_expression; + pp->c_base.postfix_expression = (pp_fun) pp_cxx_postfix_expression; + pp->c_base.unary_expression = (pp_fun) pp_cxx_unary_expression; + pp->c_base.multiplicative_expression = (pp_fun) pp_cxx_multiplicative_expression; + pp->c_base.conditional_expression = (pp_fun) pp_cxx_conditional_expression; + pp->c_base.assignment_expression = (pp_fun) pp_cxx_assignment_expression; + pp->c_base.expression = (pp_fun) pp_cxx_expression; + pp->enclosing_scope = global_namespace; + } diff -Nrc3pad gcc-3.3.3/gcc/cp/cxx-pretty-print.h gcc-3.4.0/gcc/cp/cxx-pretty-print.h *** gcc-3.3.3/gcc/cp/cxx-pretty-print.h 1970-01-01 00:00:00.000000000 +0000 --- gcc-3.4.0/gcc/cp/cxx-pretty-print.h 2003-10-07 07:07:02.000000000 +0000 *************** *** 0 **** --- 1,52 ---- + /* Interface for the GNU C++ pretty-printer. + Copyright (C) 2003 Free Software Foundation, Inc. + Contributed by Gabriel Dos Reis + + This file is part of GCC. + + GCC is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2, or (at your option) any later + version. + + GCC is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with GCC; see the file COPYING. If not, write to the Free + Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + + #ifndef GCC_CXX_PRETTY_PRINT_H + #define GCC_CXX_PRETTY_PRINT_H + + #include "c-pretty-print.h" + + #undef pp_c_base + #define pp_c_base(PP) (&(PP)->c_base) + + typedef enum + { + /* Ask for an qualified-id. */ + pp_cxx_flag_default_argument = 1 << pp_c_flag_last_bit + + } cxx_pretty_printer_flags; + + typedef struct + { + c_pretty_printer c_base; + /* This is the enclosing scope of the entity being pretty-printed. */ + tree enclosing_scope; + } cxx_pretty_printer; + + void pp_cxx_pretty_printer_init (cxx_pretty_printer *); + + void pp_cxx_declaration (cxx_pretty_printer *, tree); + void pp_cxx_function_definition (cxx_pretty_printer *, tree); + void pp_cxx_canonical_template_parameter (cxx_pretty_printer *, tree); + void pp_cxx_statement (cxx_pretty_printer *, tree); + + + #endif /* GCC_CXX_PRETTY_PRINT_H */ diff -Nrc3pad gcc-3.3.3/gcc/cp/decl2.c gcc-3.4.0/gcc/cp/decl2.c *** gcc-3.3.3/gcc/cp/decl2.c 2003-09-08 19:05:42.000000000 +0000 --- gcc-3.4.0/gcc/cp/decl2.c 2004-04-08 13:37:10.000000000 +0000 *************** *** 1,27 **** ! /* Process declarations and variables for C compiler. Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. Hacked by Michael Tiemann (tiemann@cygnus.com) ! This file is part of GNU CC. ! GNU CC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ! /* Process declarations and symbol lookup for C front end. Also constructs types; the standard scalar types at initialization, and structure, union, array and enum types when they are declared. */ --- 1,27 ---- ! /* Process declarations and variables for C++ compiler. Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Hacked by Michael Tiemann (tiemann@cygnus.com) ! This file is part of GCC. ! GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ! /* Process declarations and symbol lookup for C++ front end. Also constructs types; the standard scalar types at initialization, and structure, union, array and enum types when they are declared. */ *************** Boston, MA 02111-1307, USA. */ *** 30,35 **** --- 30,37 ---- #include "config.h" #include "system.h" + #include "coretypes.h" + #include "tm.h" #include "tree.h" #include "rtl.h" #include "expr.h" *************** Boston, MA 02111-1307, USA. */ *** 40,51 **** #include "output.h" #include "except.h" #include "toplev.h" - #include "ggc.h" #include "timevar.h" #include "cpplib.h" #include "target.h" #include "c-common.h" ! #include "timevar.h" extern cpp_reader *parse_in; /* This structure contains information about the initializations --- 42,53 ---- #include "output.h" #include "except.h" #include "toplev.h" #include "timevar.h" #include "cpplib.h" #include "target.h" #include "c-common.h" ! #include "cgraph.h" ! #include "tree-inline.h" extern cpp_reader *parse_in; /* This structure contains information about the initializations *************** typedef struct priority_info_s { *** 59,93 **** int destructions_p; } *priority_info; ! static void mark_vtable_entries PARAMS ((tree)); ! static void grok_function_init PARAMS ((tree, tree)); ! static int maybe_emit_vtables (tree); ! static void add_using_namespace PARAMS ((tree, tree, int)); ! static cxx_binding *ambiguous_decl (tree, cxx_binding *, cxx_binding *,int); ! static tree build_anon_union_vars PARAMS ((tree, tree*, int, int)); ! static int acceptable_java_type PARAMS ((tree)); ! static void output_vtable_inherit PARAMS ((tree)); ! static tree start_objects PARAMS ((int, int)); ! static void finish_objects PARAMS ((int, int, tree)); ! static tree merge_functions PARAMS ((tree, tree)); ! static tree decl_namespace PARAMS ((tree)); ! static tree validate_nonmember_using_decl PARAMS ((tree, tree *, tree *)); ! static void do_nonmember_using_decl PARAMS ((tree, tree, tree, tree, ! tree *, tree *)); ! static tree start_static_storage_duration_function PARAMS ((void)); ! static void finish_static_storage_duration_function PARAMS ((tree)); ! static priority_info get_priority_info PARAMS ((int)); ! static void do_static_initialization PARAMS ((tree, tree)); ! static void do_static_destruction PARAMS ((tree)); ! static tree start_static_initialization_or_destruction PARAMS ((tree, int)); ! static void finish_static_initialization_or_destruction PARAMS ((tree)); ! static void generate_ctor_or_dtor_function PARAMS ((int, int)); ! static int generate_ctor_and_dtor_functions_for_priority ! PARAMS ((splay_tree_node, void *)); ! static tree prune_vars_needing_no_initialization PARAMS ((tree *)); ! static void write_out_vars PARAMS ((tree)); ! static void import_export_class PARAMS ((tree)); ! static tree get_guard_bits PARAMS ((tree)); /* A list of static class variables. This is needed, because a static class variable can be declared inside the class without --- 61,87 ---- int destructions_p; } *priority_info; ! static void mark_vtable_entries (tree); ! static void grok_function_init (tree, tree); ! static bool maybe_emit_vtables (tree); ! static tree build_anon_union_vars (tree); ! static bool acceptable_java_type (tree); ! static tree start_objects (int, int); ! static void finish_objects (int, int, tree); ! static tree start_static_storage_duration_function (unsigned); ! static void finish_static_storage_duration_function (tree); ! static priority_info get_priority_info (int); ! static void do_static_initialization (tree, tree); ! static void do_static_destruction (tree); ! static tree start_static_initialization_or_destruction (tree, int); ! static void finish_static_initialization_or_destruction (tree); ! static void generate_ctor_or_dtor_function (bool, int, location_t *); ! static int generate_ctor_and_dtor_functions_for_priority (splay_tree_node, ! void *); ! static tree prune_vars_needing_no_initialization (tree *); ! static void write_out_vars (tree); ! static void import_export_class (tree); ! static tree get_guard_bits (tree); /* A list of static class variables. This is needed, because a static class variable can be declared inside the class without *************** int at_eof; *** 115,123 **** tree static_ctors; tree static_dtors; - /* The :: namespace. */ - - tree global_namespace; /* Incorporate `const' and `volatile' qualifiers for member functions. FUNCTION is a TYPE_DECL or a FUNCTION_DECL. --- 109,114 ---- *************** tree global_namespace; *** 126,133 **** TYPE_UNQUALIFIED will be an extension. */ int ! grok_method_quals (ctype, function, quals) ! tree ctype, function, quals; { tree fntype = TREE_TYPE (function); tree raises = TYPE_RAISES_EXCEPTIONS (fntype); --- 117,123 ---- TYPE_UNQUALIFIED will be an extension. */ int ! grok_method_quals (tree ctype, tree function, tree quals) { tree fntype = TREE_TYPE (function); tree raises = TYPE_RAISES_EXCEPTIONS (fntype); *************** grok_method_quals (ctype, function, qual *** 155,164 **** ? "member function" : "type"); ctype = cp_build_qualified_type (ctype, type_quals); ! fntype = build_cplus_method_type (ctype, TREE_TYPE (fntype), ! (TREE_CODE (fntype) == METHOD_TYPE ! ? TREE_CHAIN (TYPE_ARG_TYPES (fntype)) ! : TYPE_ARG_TYPES (fntype))); if (raises) fntype = build_exception_variant (fntype, raises); --- 145,154 ---- ? "member function" : "type"); ctype = cp_build_qualified_type (ctype, type_quals); ! fntype = build_method_type_directly (ctype, TREE_TYPE (fntype), ! (TREE_CODE (fntype) == METHOD_TYPE ! ? TREE_CHAIN (TYPE_ARG_TYPES (fntype)) ! : TYPE_ARG_TYPES (fntype))); if (raises) fntype = build_exception_variant (fntype, raises); *************** grok_method_quals (ctype, function, qual *** 166,209 **** return this_quals; } - /* Warn when -fexternal-templates is used and #pragma - interface/implementation is not used all the times it should be, - inform the user. */ - - void - warn_if_unknown_interface (decl) - tree decl; - { - static int already_warned = 0; - if (already_warned++) - return; - - if (flag_alt_external_templates) - { - tree til = tinst_for_decl (); - int sl = lineno; - const char *sf = input_filename; - - if (til) - { - lineno = TINST_LINE (til); - input_filename = TINST_FILE (til); - } - warning ("template `%#D' instantiated in file without #pragma interface", - decl); - lineno = sl; - input_filename = sf; - } - else - cp_warning_at ("template `%#D' defined in file without #pragma interface", - decl); - } - /* A subroutine of the parser, to handle a component list. */ void ! grok_x_components (specs) ! tree specs; { tree t; --- 156,165 ---- return this_quals; } /* A subroutine of the parser, to handle a component list. */ void ! grok_x_components (tree specs) { tree t; *************** grok_x_components (specs) *** 225,236 **** appropriately. */ tree ! cp_build_parm_decl (name, type) ! tree name; ! tree type; { tree parm = build_decl (PARM_DECL, name, type); ! DECL_ARG_TYPE (parm) = type_passed_as (type); return parm; } --- 181,193 ---- appropriately. */ tree ! cp_build_parm_decl (tree name, tree type) { tree parm = build_decl (PARM_DECL, name, type); ! /* DECL_ARG_TYPE is only used by the back end and the back end never ! sees templates. */ ! if (!processing_template_decl) ! DECL_ARG_TYPE (parm) = type_passed_as (type); return parm; } *************** cp_build_parm_decl (name, type) *** 238,246 **** indicated NAME. */ tree ! build_artificial_parm (name, type) ! tree name; ! tree type; { tree parm = cp_build_parm_decl (name, type); DECL_ARTIFICIAL (parm) = 1; --- 195,201 ---- indicated NAME. */ tree ! build_artificial_parm (tree name, tree type) { tree parm = cp_build_parm_decl (name, type); DECL_ARTIFICIAL (parm) = 1; *************** build_artificial_parm (name, type) *** 264,271 **** VTT parm (if any), then the user-written parms. */ void ! maybe_retrofit_in_chrg (fn) ! tree fn; { tree basetype, arg_types, parms, parm, fntype; --- 219,225 ---- VTT parm (if any), then the user-written parms. */ void ! maybe_retrofit_in_chrg (tree fn) { tree basetype, arg_types, parms, parm, fntype; *************** maybe_retrofit_in_chrg (fn) *** 275,281 **** /* When processing templates we can't know, in general, whether or not we're going to have virtual baseclasses. */ ! if (uses_template_parms (fn)) return; /* We don't need an in-charge parameter for constructors that don't --- 229,235 ---- /* When processing templates we can't know, in general, whether or not we're going to have virtual baseclasses. */ ! if (processing_template_decl) return; /* We don't need an in-charge parameter for constructors that don't *************** maybe_retrofit_in_chrg (fn) *** 316,323 **** TREE_CHAIN (DECL_ARGUMENTS (fn)) = parms; /* And rebuild the function type. */ ! fntype = build_cplus_method_type (basetype, TREE_TYPE (TREE_TYPE (fn)), ! arg_types); if (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn))) fntype = build_exception_variant (fntype, TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn))); --- 270,277 ---- TREE_CHAIN (DECL_ARGUMENTS (fn)) = parms; /* And rebuild the function type. */ ! fntype = build_method_type_directly (basetype, TREE_TYPE (TREE_TYPE (fn)), ! arg_types); if (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn))) fntype = build_exception_variant (fntype, TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn))); *************** maybe_retrofit_in_chrg (fn) *** 348,357 **** QUALS are the qualifiers for the this pointer. */ void ! grokclassfn (ctype, function, flags, quals) ! tree ctype, function; ! enum overload_flags flags; ! tree quals; { tree fn_name = DECL_NAME (function); int this_quals = TYPE_UNQUALIFIED; --- 302,308 ---- QUALS are the qualifiers for the this pointer. */ void ! grokclassfn (tree ctype, tree function, enum overload_flags flags, tree quals) { tree fn_name = DECL_NAME (function); int this_quals = TYPE_UNQUALIFIED; *************** grokclassfn (ctype, function, flags, qua *** 385,395 **** qual_type = cp_build_qualified_type (type, this_quals); parm = build_artificial_parm (this_identifier, qual_type); c_apply_type_quals_to_decl (this_quals, parm); ! TREE_CHAIN (parm) = last_function_parms; ! last_function_parms = parm; } - DECL_ARGUMENTS (function) = last_function_parms; DECL_CONTEXT (function) = ctype; if (flags == DTOR_FLAG) --- 336,345 ---- qual_type = cp_build_qualified_type (type, this_quals); parm = build_artificial_parm (this_identifier, qual_type); c_apply_type_quals_to_decl (this_quals, parm); ! TREE_CHAIN (parm) = DECL_ARGUMENTS (function); ! DECL_ARGUMENTS (function) = parm; } DECL_CONTEXT (function) = ctype; if (flags == DTOR_FLAG) *************** grokclassfn (ctype, function, flags, qua *** 397,497 **** if (flags == DTOR_FLAG || DECL_CONSTRUCTOR_P (function)) maybe_retrofit_in_chrg (function); - - if (flags == DTOR_FLAG) - { - DECL_DESTRUCTOR_P (function) = 1; - TYPE_HAS_DESTRUCTOR (ctype) = 1; - } } /* Create an ARRAY_REF, checking for the user doing things backwards along the way. */ tree ! grok_array_decl (array_expr, index_exp) ! tree array_expr, index_exp; { ! tree type = TREE_TYPE (array_expr); ! tree p1, p2, i1, i2; ! if (type == error_mark_node || index_exp == error_mark_node) return error_mark_node; - if (processing_template_decl) - return build_min (ARRAY_REF, type ? TREE_TYPE (type) : NULL_TREE, - array_expr, index_exp); ! if (type == NULL_TREE) { ! /* Something has gone very wrong. Assume we are mistakenly reducing ! an expression instead of a declaration. */ ! error ("parser may be lost: is there a '{' missing somewhere?"); ! return NULL_TREE; } ! if (TREE_CODE (type) == OFFSET_TYPE ! || TREE_CODE (type) == REFERENCE_TYPE) ! type = TREE_TYPE (type); /* If they have an `operator[]', use that. */ if (IS_AGGR_TYPE (type) || IS_AGGR_TYPE (TREE_TYPE (index_exp))) ! return build_opfncall (ARRAY_REF, LOOKUP_NORMAL, ! array_expr, index_exp, NULL_TREE); ! ! /* Otherwise, create an ARRAY_REF for a pointer or array type. It ! is a little-known fact that, if `a' is an array and `i' is an ! int, you can write `i[a]', which means the same thing as `a[i]'. */ ! ! if (TREE_CODE (type) == ARRAY_TYPE) ! p1 = array_expr; else ! p1 = build_expr_type_conversion (WANT_POINTER, array_expr, 0); ! if (TREE_CODE (TREE_TYPE (index_exp)) == ARRAY_TYPE) ! p2 = index_exp; ! else ! p2 = build_expr_type_conversion (WANT_POINTER, index_exp, 0); ! i1 = build_expr_type_conversion (WANT_INT | WANT_ENUM, array_expr, 0); ! i2 = build_expr_type_conversion (WANT_INT | WANT_ENUM, index_exp, 0); ! if ((p1 && i2) && (i1 && p2)) ! error ("ambiguous conversion for array subscript"); ! if (p1 && i2) ! array_expr = p1, index_exp = i2; ! else if (i1 && p2) ! array_expr = p2, index_exp = i1; ! else ! { ! error ("invalid types `%T[%T]' for array subscript", ! type, TREE_TYPE (index_exp)); ! return error_mark_node; ! } ! if (array_expr == error_mark_node || index_exp == error_mark_node) ! error ("ambiguous conversion for array subscript"); ! return build_array_ref (array_expr, index_exp); } /* Given the cast expression EXP, checking out its validity. Either return an error_mark_node if there was an unavoidable error, return a cast to void for trying to delete a pointer w/ the value 0, or return the ! call to delete. If DOING_VEC is 1, we handle things differently ! for doing an array delete. If DOING_VEC is 2, they gave us the ! array size as an argument to delete. Implements ARM $5.3.4. This is called from the parser. */ tree ! delete_sanity (exp, size, doing_vec, use_global_delete) ! tree exp, size; ! int doing_vec, use_global_delete; { tree t, type; - /* For a regular vector delete (aka, no size argument) we will pass - this down as a NULL_TREE into build_vec_delete. */ - tree maxindex = NULL_TREE; if (exp == error_mark_node) return exp; --- 347,445 ---- if (flags == DTOR_FLAG || DECL_CONSTRUCTOR_P (function)) maybe_retrofit_in_chrg (function); } /* Create an ARRAY_REF, checking for the user doing things backwards along the way. */ tree ! grok_array_decl (tree array_expr, tree index_exp) { ! tree type; ! tree expr; ! tree orig_array_expr = array_expr; ! tree orig_index_exp = index_exp; ! if (error_operand_p (array_expr) || error_operand_p (index_exp)) return error_mark_node; ! if (processing_template_decl) { ! if (type_dependent_expression_p (array_expr) ! || type_dependent_expression_p (index_exp)) ! return build_min_nt (ARRAY_REF, array_expr, index_exp); ! array_expr = build_non_dependent_expr (array_expr); ! index_exp = build_non_dependent_expr (index_exp); } ! type = TREE_TYPE (array_expr); ! my_friendly_assert (type, 20030626); ! type = non_reference (type); /* If they have an `operator[]', use that. */ if (IS_AGGR_TYPE (type) || IS_AGGR_TYPE (TREE_TYPE (index_exp))) ! expr = build_new_op (ARRAY_REF, LOOKUP_NORMAL, ! array_expr, index_exp, NULL_TREE, ! /*overloaded_p=*/NULL); else ! { ! tree p1, p2, i1, i2; ! /* Otherwise, create an ARRAY_REF for a pointer or array type. ! It is a little-known fact that, if `a' is an array and `i' is ! an int, you can write `i[a]', which means the same thing as ! `a[i]'. */ ! if (TREE_CODE (type) == ARRAY_TYPE) ! p1 = array_expr; ! else ! p1 = build_expr_type_conversion (WANT_POINTER, array_expr, false); ! if (TREE_CODE (TREE_TYPE (index_exp)) == ARRAY_TYPE) ! p2 = index_exp; ! else ! p2 = build_expr_type_conversion (WANT_POINTER, index_exp, false); ! i1 = build_expr_type_conversion (WANT_INT | WANT_ENUM, array_expr, ! false); ! i2 = build_expr_type_conversion (WANT_INT | WANT_ENUM, index_exp, ! false); ! if ((p1 && i2) && (i1 && p2)) ! error ("ambiguous conversion for array subscript"); ! if (p1 && i2) ! array_expr = p1, index_exp = i2; ! else if (i1 && p2) ! array_expr = p2, index_exp = i1; ! else ! { ! error ("invalid types `%T[%T]' for array subscript", ! type, TREE_TYPE (index_exp)); ! return error_mark_node; ! } ! if (array_expr == error_mark_node || index_exp == error_mark_node) ! error ("ambiguous conversion for array subscript"); ! ! expr = build_array_ref (array_expr, index_exp); ! } ! if (processing_template_decl && expr != error_mark_node) ! return build_min_non_dep (ARRAY_REF, expr, ! orig_array_expr, orig_index_exp); ! return expr; } /* Given the cast expression EXP, checking out its validity. Either return an error_mark_node if there was an unavoidable error, return a cast to void for trying to delete a pointer w/ the value 0, or return the ! call to delete. If DOING_VEC is true, we handle things differently ! for doing an array delete. Implements ARM $5.3.4. This is called from the parser. */ tree ! delete_sanity (tree exp, tree size, bool doing_vec, int use_global_delete) { tree t, type; if (exp == error_mark_node) return exp; *************** delete_sanity (exp, size, doing_vec, use *** 504,514 **** return t; } - if (TREE_CODE (exp) == OFFSET_REF) - exp = resolve_offset_ref (exp); exp = convert_from_reference (exp); ! t = stabilize_reference (exp); ! t = build_expr_type_conversion (WANT_POINTER, t, 1); if (t == NULL_TREE || t == error_mark_node) { --- 452,465 ---- return t; } exp = convert_from_reference (exp); ! ! /* An array can't have been allocated by new, so complain. */ ! if (TREE_CODE (exp) == VAR_DECL ! && TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE) ! warning ("deleting array `%#D'", exp); ! ! t = build_expr_type_conversion (WANT_POINTER, exp, true); if (t == NULL_TREE || t == error_mark_node) { *************** delete_sanity (exp, size, doing_vec, use *** 517,528 **** return error_mark_node; } - if (doing_vec == 2) - { - maxindex = cp_build_binary_op (MINUS_EXPR, size, integer_one_node); - pedwarn ("anachronistic use of array size in vector delete"); - } - type = TREE_TYPE (t); /* As of Valley Forge, you can delete a pointer to const. */ --- 468,473 ---- *************** delete_sanity (exp, size, doing_vec, use *** 541,558 **** doing_vec = 0; } - /* An array can't have been allocated by new, so complain. */ - if (TREE_CODE (t) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL - && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == ARRAY_TYPE) - warning ("deleting array `%#D'", TREE_OPERAND (t, 0)); - /* Deleting a pointer with the value zero is valid and has no effect. */ if (integer_zerop (t)) return build1 (NOP_EXPR, void_type_node, t); if (doing_vec) ! return build_vec_delete (t, maxindex, sfk_deleting_destructor, use_global_delete); else return build_delete (type, t, sfk_deleting_destructor, --- 486,498 ---- doing_vec = 0; } /* Deleting a pointer with the value zero is valid and has no effect. */ if (integer_zerop (t)) return build1 (NOP_EXPR, void_type_node, t); if (doing_vec) ! return build_vec_delete (t, /*maxindex=*/NULL_TREE, ! sfk_deleting_destructor, use_global_delete); else return build_delete (type, t, sfk_deleting_destructor, *************** delete_sanity (exp, size, doing_vec, use *** 563,570 **** sort of thing that should be a member template. */ void ! check_member_template (tmpl) ! tree tmpl; { tree decl; --- 503,509 ---- sort of thing that should be a member template. */ void ! check_member_template (tree tmpl) { tree decl; *************** check_member_template (tmpl) *** 603,611 **** /* Return true iff TYPE is a valid Java parameter or return type. */ ! static int ! acceptable_java_type (type) ! tree type; { if (TREE_CODE (type) == VOID_TYPE || TYPE_FOR_JAVA (type)) return 1; --- 542,549 ---- /* Return true iff TYPE is a valid Java parameter or return type. */ ! static bool ! acceptable_java_type (tree type) { if (TREE_CODE (type) == VOID_TYPE || TYPE_FOR_JAVA (type)) return 1; *************** acceptable_java_type (type) *** 616,624 **** { tree args; int i; if (! TYPE_FOR_JAVA (type)) ! return 0; if (! CLASSTYPE_TEMPLATE_INFO (type)) ! return 1; args = CLASSTYPE_TI_ARGS (type); i = TREE_VEC_LENGTH (args); while (--i >= 0) --- 554,562 ---- { tree args; int i; if (! TYPE_FOR_JAVA (type)) ! return false; if (! CLASSTYPE_TEMPLATE_INFO (type)) ! return true; args = CLASSTYPE_TI_ARGS (type); i = TREE_VEC_LENGTH (args); while (--i >= 0) *************** acceptable_java_type (type) *** 627,677 **** if (TREE_CODE (type) == POINTER_TYPE) type = TREE_TYPE (type); if (! TYPE_FOR_JAVA (type)) ! return 0; } ! return 1; } } ! return 0; } ! /* For a METHOD in a Java class CTYPE, return 1 if the parameter and return types are valid Java types. ! Otherwise, print appropriate error messages, and return 0. */ ! int ! check_java_method (method) ! tree method; { ! int jerr = 0; tree arg_types = TYPE_ARG_TYPES (TREE_TYPE (method)); tree ret_type = TREE_TYPE (TREE_TYPE (method)); ! if (! acceptable_java_type (ret_type)) { error ("Java method '%D' has non-Java return type `%T'", method, ret_type); ! jerr++; } for (; arg_types != NULL_TREE; arg_types = TREE_CHAIN (arg_types)) { tree type = TREE_VALUE (arg_types); ! if (! acceptable_java_type (type)) { error ("Java method '%D' has non-Java parameter type `%T'", method, type); ! jerr++; } } ! return jerr ? 0 : 1; } /* Sanity check: report error if this function FUNCTION is not really a member of the class (CTYPE) it is supposed to belong to. ! CNAME is the same here as it is for grokclassfn above. */ tree ! check_classfn (ctype, function) ! tree ctype, function; { int ix; int is_template; --- 565,623 ---- if (TREE_CODE (type) == POINTER_TYPE) type = TREE_TYPE (type); if (! TYPE_FOR_JAVA (type)) ! return false; } ! return true; } } ! return false; } ! /* For a METHOD in a Java class CTYPE, return true if the parameter and return types are valid Java types. ! Otherwise, print appropriate error messages, and return false. */ ! bool ! check_java_method (tree method) { ! bool jerr = false; tree arg_types = TYPE_ARG_TYPES (TREE_TYPE (method)); tree ret_type = TREE_TYPE (TREE_TYPE (method)); ! ! if (!acceptable_java_type (ret_type)) { error ("Java method '%D' has non-Java return type `%T'", method, ret_type); ! jerr = true; } + + arg_types = TREE_CHAIN (arg_types); + if (DECL_HAS_IN_CHARGE_PARM_P (method)) + arg_types = TREE_CHAIN (arg_types); + if (DECL_HAS_VTT_PARM_P (method)) + arg_types = TREE_CHAIN (arg_types); + for (; arg_types != NULL_TREE; arg_types = TREE_CHAIN (arg_types)) { tree type = TREE_VALUE (arg_types); ! if (!acceptable_java_type (type)) { error ("Java method '%D' has non-Java parameter type `%T'", method, type); ! jerr = true; } } ! return !jerr; } /* Sanity check: report error if this function FUNCTION is not really a member of the class (CTYPE) it is supposed to belong to. ! CNAME is the same here as it is for grokclassfn above. ! TEMPLATE_HEADER_P is true when this declaration comes with a ! template header. */ tree ! check_classfn (tree ctype, tree function, bool template_header_p) { int ix; int is_template; *************** check_classfn (ctype, function) *** 694,700 **** /* OK, is this a definition of a member template? */ is_template = (TREE_CODE (function) == TEMPLATE_DECL ! || (processing_template_decl - template_class_depth (ctype))); ix = lookup_fnfields_1 (complete_type (ctype), DECL_CONSTRUCTOR_P (function) ? ctor_identifier : --- 640,646 ---- /* OK, is this a definition of a member template? */ is_template = (TREE_CODE (function) == TEMPLATE_DECL ! || template_header_p); ix = lookup_fnfields_1 (complete_type (ctype), DECL_CONSTRUCTOR_P (function) ? ctor_identifier : *************** check_classfn (ctype, function) *** 706,713 **** --- 652,661 ---- tree methods = CLASSTYPE_METHOD_VEC (ctype); tree fndecls, fndecl = 0; bool is_conv_op; + bool pop_p; const char *format = NULL; + pop_p = push_scope (ctype); for (fndecls = TREE_VEC_ELT (methods, ix); fndecls; fndecls = OVL_NEXT (fndecls)) { *************** check_classfn (ctype, function) *** 741,748 **** && (!DECL_TEMPLATE_SPECIALIZATION (function) || (DECL_TI_TEMPLATE (function) == DECL_TI_TEMPLATE (fndecl)))) ! return fndecl; } error ("prototype for `%#D' does not match any in class `%T'", function, ctype); is_conv_op = DECL_CONV_FN_P (fndecl); --- 689,700 ---- && (!DECL_TEMPLATE_SPECIALIZATION (function) || (DECL_TI_TEMPLATE (function) == DECL_TI_TEMPLATE (fndecl)))) ! break; } + if (pop_p) + pop_scope (ctype); + if (fndecls) + return OVL_CURRENT (fndecls); error ("prototype for `%#D' does not match any in class `%T'", function, ctype); is_conv_op = DECL_CONV_FN_P (fndecl); *************** check_classfn (ctype, function) *** 800,810 **** FLAGS is as for cp_finish_decl. */ void ! finish_static_data_member_decl (decl, init, asmspec_tree, flags) ! tree decl; ! tree init; ! tree asmspec_tree; ! int flags; { my_friendly_assert (TREE_PUBLIC (decl), 0); --- 752,759 ---- FLAGS is as for cp_finish_decl. */ void ! finish_static_data_member_decl (tree decl, tree init, tree asmspec_tree, ! int flags) { my_friendly_assert (TREE_PUBLIC (decl), 0); *************** finish_static_data_member_decl (decl, in *** 870,911 **** CHANGES TO CODE IN `start_method'. */ tree ! grokfield (declarator, declspecs, init, asmspec_tree, attrlist) ! tree declarator, declspecs, init, asmspec_tree, attrlist; { tree value; const char *asmspec = 0; int flags = LOOKUP_ONLYCONVERTING; - /* Convert () initializers to = initializers. */ - if (init == NULL_TREE && declarator != NULL_TREE - && TREE_CODE (declarator) == CALL_EXPR - && TREE_OPERAND (declarator, 0) - && (TREE_CODE (TREE_OPERAND (declarator, 0)) == IDENTIFIER_NODE - || TREE_CODE (TREE_OPERAND (declarator, 0)) == SCOPE_REF) - && parmlist_is_exprlist (CALL_DECLARATOR_PARMS (declarator))) - { - /* It's invalid to try to initialize a data member using a - functional notation, e.g.: - - struct S { - static int i (3); - }; - - Explain that to the user. */ - static int explained; - - error ("invalid data member initialization"); - if (!explained) - { - error ("(use `=' to initialize static data members)"); - explained = 1; - } - - declarator = TREE_OPERAND (declarator, 0); - flags = 0; - } - if (declspecs == NULL_TREE && TREE_CODE (declarator) == SCOPE_REF && TREE_CODE (TREE_OPERAND (declarator, 1)) == IDENTIFIER_NODE) --- 819,831 ---- CHANGES TO CODE IN `start_method'. */ tree ! grokfield (tree declarator, tree declspecs, tree init, tree asmspec_tree, ! tree attrlist) { tree value; const char *asmspec = 0; int flags = LOOKUP_ONLYCONVERTING; if (declspecs == NULL_TREE && TREE_CODE (declarator) == SCOPE_REF && TREE_CODE (TREE_OPERAND (declarator, 1)) == IDENTIFIER_NODE) *************** grokfield (declarator, declspecs, init, *** 925,934 **** init = NULL_TREE; value = grokdeclarator (declarator, declspecs, FIELD, init != 0, &attrlist); ! if (! value || value == error_mark_node) /* friend or constructor went bad. */ - return value; - if (TREE_TYPE (value) == error_mark_node) return error_mark_node; if (TREE_CODE (value) == TYPE_DECL && init) --- 845,852 ---- init = NULL_TREE; value = grokdeclarator (declarator, declspecs, FIELD, init != 0, &attrlist); ! if (! value || error_operand_p (value)) /* friend or constructor went bad. */ return error_mark_node; if (TREE_CODE (value) == TYPE_DECL && init) *************** grokfield (declarator, declspecs, init, *** 938,945 **** } /* Pass friendly classes back. */ ! if (TREE_CODE (value) == VOID_TYPE) ! return void_type_node; if (DECL_NAME (value) != NULL_TREE && IDENTIFIER_POINTER (DECL_NAME (value))[0] == '_' --- 856,869 ---- } /* Pass friendly classes back. */ ! if (value == void_type_node) ! return value; ! ! /* Pass friend decls back. */ ! if ((TREE_CODE (value) == FUNCTION_DECL ! || TREE_CODE (value) == TEMPLATE_DECL) ! && DECL_CONTEXT (value) != current_class_type) ! return value; if (DECL_NAME (value) != NULL_TREE && IDENTIFIER_POINTER (DECL_NAME (value))[0] == '_' *************** grokfield (declarator, declspecs, init, *** 953,961 **** DECL_NONLOCAL (value) = 1; DECL_CONTEXT (value) = current_class_type; - if (CLASS_TYPE_P (TREE_TYPE (value))) - CLASSTYPE_GOT_SEMICOLON (TREE_TYPE (value)) = 1; - if (processing_template_decl) value = push_template_decl (value); --- 877,882 ---- *************** grokfield (declarator, declspecs, init, *** 1021,1027 **** if (processing_template_decl && (TREE_CODE (value) == VAR_DECL || TREE_CODE (value) == FUNCTION_DECL)) ! value = push_template_decl (value); if (attrlist) cplus_decl_attributes (&value, attrlist, 0); --- 942,952 ---- if (processing_template_decl && (TREE_CODE (value) == VAR_DECL || TREE_CODE (value) == FUNCTION_DECL)) ! { ! value = push_template_decl (value); ! if (error_operand_p (value)) ! return error_mark_node; ! } if (attrlist) cplus_decl_attributes (&value, attrlist, 0); *************** grokfield (declarator, declspecs, init, *** 1050,1056 **** /* This must override the asm specifier which was placed by grokclassfn. Lay this out fresh. */ SET_DECL_RTL (value, NULL_RTX); ! SET_DECL_ASSEMBLER_NAME (value, get_identifier (asmspec)); } if (!DECL_FRIEND_P (value)) grok_special_member_properties (value); --- 975,981 ---- /* This must override the asm specifier which was placed by grokclassfn. Lay this out fresh. */ SET_DECL_RTL (value, NULL_RTX); ! change_decl_assembler_name (value, get_identifier (asmspec)); } if (!DECL_FRIEND_P (value)) grok_special_member_properties (value); *************** grokfield (declarator, declspecs, init, *** 1073,1083 **** WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node. */ tree ! grokbitfield (declarator, declspecs, width) ! tree declarator, declspecs, width; { ! register tree value = grokdeclarator (declarator, declspecs, BITFIELD, ! 0, NULL); if (! value) return NULL_TREE; /* friends went bad. */ --- 998,1006 ---- WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node. */ tree ! grokbitfield (tree declarator, tree declspecs, tree width) { ! tree value = grokdeclarator (declarator, declspecs, BITFIELD, 0, NULL); if (! value) return NULL_TREE; /* friends went bad. */ *************** grokbitfield (declarator, declspecs, wid *** 1127,1158 **** return value; } - /* Convert a conversion operator name to an identifier. SCOPE is the - scope of the conversion operator, if explicit. */ - - tree - grokoptypename (declspecs, declarator, scope) - tree declspecs, declarator; - tree scope; - { - tree t = grokdeclarator (declarator, declspecs, TYPENAME, 0, NULL); - - /* Resolve any TYPENAME_TYPEs that refer to SCOPE, before mangling - the name, so that we mangle the right thing. */ - if (scope && current_template_parms - && uses_template_parms (t) - && uses_template_parms (scope)) - { - tree args = current_template_args (); - - push_scope (scope); - t = tsubst (t, args, tf_error | tf_warning, NULL_TREE); - pop_scope (scope); - } - - return mangle_conv_op_name_for_type (t); - } - /* When a function is declared with an initializer, do the right thing. Currently, there are two possibilities: --- 1050,1055 ---- *************** grokoptypename (declspecs, declarator, s *** 1189,1197 **** */ static void ! grok_function_init (decl, init) ! tree decl; ! tree init; { /* An initializer for a function tells how this function should be inherited. */ --- 1086,1092 ---- */ static void ! grok_function_init (tree decl, tree init) { /* An initializer for a function tells how this function should be inherited. */ *************** grok_function_init (decl, init) *** 1206,1214 **** } void ! cplus_decl_attributes (decl, attributes, flags) ! tree *decl, attributes; ! int flags; { if (*decl == NULL_TREE || *decl == void_type_node) return; --- 1101,1107 ---- } void ! cplus_decl_attributes (tree *decl, tree attributes, int flags) { if (*decl == NULL_TREE || *decl == void_type_node) return; *************** cplus_decl_attributes (decl, attributes, *** 1222,1315 **** SET_IDENTIFIER_TYPE_VALUE (DECL_NAME (*decl), TREE_TYPE (*decl)); } - /* CONSTRUCTOR_NAME: - Return the name for the constructor (or destructor) for the - specified class. Argument can be RECORD_TYPE, TYPE_DECL, or - IDENTIFIER_NODE. When given a template, this routine doesn't - lose the specialization. */ - - tree - constructor_name_full (thing) - tree thing; - { - if (TREE_CODE (thing) == TEMPLATE_TYPE_PARM - || TREE_CODE (thing) == BOUND_TEMPLATE_TEMPLATE_PARM - || TREE_CODE (thing) == TYPENAME_TYPE) - thing = TYPE_NAME (thing); - else if (IS_AGGR_TYPE_CODE (TREE_CODE (thing))) - { - if (TYPE_WAS_ANONYMOUS (thing) && TYPE_HAS_CONSTRUCTOR (thing)) - thing = DECL_NAME (OVL_CURRENT (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (thing), 0))); - else - thing = TYPE_NAME (thing); - } - if (TREE_CODE (thing) == TYPE_DECL - || (TREE_CODE (thing) == TEMPLATE_DECL - && TREE_CODE (DECL_TEMPLATE_RESULT (thing)) == TYPE_DECL)) - thing = DECL_NAME (thing); - my_friendly_assert (TREE_CODE (thing) == IDENTIFIER_NODE, 197); - return thing; - } - - /* CONSTRUCTOR_NAME: - Return the name for the constructor (or destructor) for the - specified class. Argument can be RECORD_TYPE, TYPE_DECL, or - IDENTIFIER_NODE. When given a template, return the plain - unspecialized name. */ - - tree - constructor_name (thing) - tree thing; - { - tree t; - thing = constructor_name_full (thing); - t = IDENTIFIER_TEMPLATE (thing); - if (!t) - return thing; - return t; - } - - /* Returns TRUE if NAME is the name for the constructor for TYPE. */ - - bool - constructor_name_p (tree name, tree type) - { - return (name == constructor_name (type) - || name == constructor_name_full (type)); - } - - /* Defer the compilation of the FN until the end of compilation. */ void ! defer_fn (fn) ! tree fn; { if (DECL_DEFERRED_FN (fn)) return; DECL_DEFERRED_FN (fn) = 1; if (!deferred_fns) VARRAY_TREE_INIT (deferred_fns, 32, "deferred_fns"); VARRAY_PUSH_TREE (deferred_fns, fn); } ! /* Hunts through the global anonymous union ANON_DECL, building ! appropriate VAR_DECLs. Stores cleanups on the list of ELEMS, and ! returns a VAR_DECL whose size is the same as the size of the ! ANON_DECL, if one is available. ! ! FIXME: we should really handle anonymous unions by binding the names ! of the members to COMPONENT_REFs rather than this kludge. */ ! static tree ! build_anon_union_vars (anon_decl, elems, static_p, external_p) ! tree anon_decl; ! tree* elems; ! int static_p; ! int external_p; { ! tree type = TREE_TYPE (anon_decl); tree main_decl = NULL_TREE; tree field; --- 1115,1143 ---- SET_IDENTIFIER_TYPE_VALUE (DECL_NAME (*decl), TREE_TYPE (*decl)); } /* Defer the compilation of the FN until the end of compilation. */ void ! defer_fn (tree fn) { if (DECL_DEFERRED_FN (fn)) return; DECL_DEFERRED_FN (fn) = 1; + DECL_DEFER_OUTPUT (fn) = 1; if (!deferred_fns) VARRAY_TREE_INIT (deferred_fns, 32, "deferred_fns"); VARRAY_PUSH_TREE (deferred_fns, fn); } ! /* Walks through the namespace- or function-scope anonymous union OBJECT, ! building appropriate ALIAS_DECLs. Returns one of the fields for use in ! the mangled name. */ ! static tree ! build_anon_union_vars (tree object) { ! tree type = TREE_TYPE (object); tree main_decl = NULL_TREE; tree field; *************** build_anon_union_vars (anon_decl, elems, *** 1323,1334 **** field = TREE_CHAIN (field)) { tree decl; if (DECL_ARTIFICIAL (field)) continue; if (TREE_CODE (field) != FIELD_DECL) { ! cp_pedwarn_at ("`%#D' invalid; an anonymous union can only have non-static data members", field); continue; } --- 1151,1164 ---- field = TREE_CHAIN (field)) { tree decl; + tree ref; if (DECL_ARTIFICIAL (field)) continue; if (TREE_CODE (field) != FIELD_DECL) { ! cp_pedwarn_at ("\ ! `%#D' invalid; an anonymous union can only have non-static data members", field); continue; } *************** build_anon_union_vars (anon_decl, elems, *** 1338,1392 **** else if (TREE_PROTECTED (field)) cp_pedwarn_at ("protected member `%#D' in anonymous union", field); ! if (DECL_NAME (field) == NULL_TREE ! && ANON_AGGR_TYPE_P (TREE_TYPE (field))) ! { ! decl = build_anon_union_vars (field, elems, static_p, external_p); ! if (!decl) ! continue; ! } ! else if (DECL_NAME (field) == NULL_TREE) ! continue; else { ! decl = build_decl (VAR_DECL, DECL_NAME (field), TREE_TYPE (field)); ! /* tell `pushdecl' that this is not tentative. */ ! DECL_INITIAL (decl) = error_mark_node; TREE_PUBLIC (decl) = 0; ! TREE_STATIC (decl) = static_p; ! DECL_EXTERNAL (decl) = external_p; decl = pushdecl (decl); - DECL_INITIAL (decl) = NULL_TREE; - } - - /* Only write out one anon union element--choose the largest - one. We used to try to find one the same size as the union, - but that fails if the ABI forces us to align the union more - strictly. */ - if (main_decl == NULL_TREE - || tree_int_cst_lt (DECL_SIZE (main_decl), DECL_SIZE (decl))) - { - if (main_decl) - TREE_ASM_WRITTEN (main_decl) = 1; - main_decl = decl; } ! else ! /* ??? This causes there to be no debug info written out ! about this decl. */ ! TREE_ASM_WRITTEN (decl) = 1; ! ! if (DECL_NAME (field) == NULL_TREE ! && ANON_AGGR_TYPE_P (TREE_TYPE (field))) ! /* The remainder of the processing was already done in the ! recursive call. */ ! continue; ! /* If there's a cleanup to do, it belongs in the ! TREE_PURPOSE of the following TREE_LIST. */ ! *elems = tree_cons (NULL_TREE, decl, *elems); ! TREE_TYPE (*elems) = type; } ! return main_decl; } --- 1168,1197 ---- else if (TREE_PROTECTED (field)) cp_pedwarn_at ("protected member `%#D' in anonymous union", field); ! if (processing_template_decl) ! ref = build_min_nt (COMPONENT_REF, object, DECL_NAME (field)); else + ref = build_class_member_access_expr (object, field, NULL_TREE, + false); + + if (DECL_NAME (field)) { ! decl = build_decl (ALIAS_DECL, DECL_NAME (field), TREE_TYPE (field)); ! DECL_INITIAL (decl) = ref; TREE_PUBLIC (decl) = 0; ! TREE_STATIC (decl) = 0; ! DECL_EXTERNAL (decl) = 1; decl = pushdecl (decl); } ! else if (ANON_AGGR_TYPE_P (TREE_TYPE (field))) ! decl = build_anon_union_vars (ref); ! else ! decl = 0; ! if (main_decl == NULL_TREE) ! main_decl = decl; } ! return main_decl; } *************** build_anon_union_vars (anon_decl, elems, *** 1395,1408 **** is nonzero if this union is not declared static. */ void ! finish_anon_union (anon_union_decl) ! tree anon_union_decl; { tree type = TREE_TYPE (anon_union_decl); tree main_decl; ! int public_p = TREE_PUBLIC (anon_union_decl); ! int static_p = TREE_STATIC (anon_union_decl); ! int external_p = DECL_EXTERNAL (anon_union_decl); /* The VAR_DECL's context is the same as the TYPE's context. */ DECL_CONTEXT (anon_union_decl) = DECL_CONTEXT (TYPE_NAME (type)); --- 1200,1210 ---- is nonzero if this union is not declared static. */ void ! finish_anon_union (tree anon_union_decl) { tree type = TREE_TYPE (anon_union_decl); tree main_decl; ! bool public_p = TREE_PUBLIC (anon_union_decl); /* The VAR_DECL's context is the same as the TYPE's context. */ DECL_CONTEXT (anon_union_decl) = DECL_CONTEXT (TYPE_NAME (type)); *************** finish_anon_union (anon_union_decl) *** 1416,1483 **** return; } ! if (!processing_template_decl) { ! main_decl ! = build_anon_union_vars (anon_union_decl, ! &DECL_ANON_UNION_ELEMS (anon_union_decl), ! static_p, external_p); ! ! if (main_decl == NULL_TREE) ! { ! warning ("anonymous aggregate with no members"); ! return; ! } ! ! if (static_p) ! { ! make_decl_rtl (main_decl, 0); ! COPY_DECL_RTL (main_decl, anon_union_decl); ! expand_anon_union_decl (anon_union_decl, ! NULL_TREE, ! DECL_ANON_UNION_ELEMS (anon_union_decl)); ! return; ! } } ! add_decl_stmt (anon_union_decl); ! } ! ! /* Finish processing a builtin type TYPE. It's name is NAME, ! its fields are in the array FIELDS. LEN is the number of elements ! in FIELDS minus one, or put another way, it is the maximum subscript ! used in FIELDS. ! ! It is given the same alignment as ALIGN_TYPE. */ ! ! void ! finish_builtin_type (type, name, fields, len, align_type) ! tree type; ! const char *name; ! tree fields[]; ! int len; ! tree align_type; ! { ! register int i; ! ! TYPE_FIELDS (type) = fields[0]; ! for (i = 0; i < len; i++) { ! layout_type (TREE_TYPE (fields[i])); ! DECL_FIELD_CONTEXT (fields[i]) = type; ! TREE_CHAIN (fields[i]) = fields[i+1]; } ! DECL_FIELD_CONTEXT (fields[i]) = type; ! TYPE_ALIGN (type) = TYPE_ALIGN (align_type); ! TYPE_USER_ALIGN (type) = TYPE_USER_ALIGN (align_type); ! layout_type (type); ! #if 0 /* not yet, should get fixed properly later */ ! TYPE_NAME (type) = make_type_decl (get_identifier (name), type); ! #else ! TYPE_NAME (type) = build_decl (TYPE_DECL, get_identifier (name), type); ! #endif ! TYPE_STUB_DECL (type) = TYPE_NAME (type); ! layout_decl (TYPE_NAME (type), 0); } /* Auxiliary functions to make type signatures for --- 1218,1245 ---- return; } ! main_decl = build_anon_union_vars (anon_union_decl); ! if (main_decl == NULL_TREE) { ! warning ("anonymous union with no members"); ! return; } ! if (!processing_template_decl) { ! /* Use main_decl to set the mangled name. */ ! DECL_NAME (anon_union_decl) = DECL_NAME (main_decl); ! mangle_decl (anon_union_decl); ! DECL_NAME (anon_union_decl) = NULL_TREE; } ! ! pushdecl (anon_union_decl); ! if (building_stmt_tree () ! && at_function_scope_p ()) ! add_decl_stmt (anon_union_decl); ! else if (!processing_template_decl) ! rest_of_decl_compilation (anon_union_decl, NULL, ! toplevel_bindings_p (), at_eof); } /* Auxiliary functions to make type signatures for *************** finish_builtin_type (type, name, fields, *** 1485,1492 **** what compiler will be expecting. */ tree ! coerce_new_type (type) ! tree type; { int e = 0; tree args = TYPE_ARG_TYPES (type); --- 1247,1253 ---- what compiler will be expecting. */ tree ! coerce_new_type (tree type) { int e = 0; tree args = TYPE_ARG_TYPES (type); *************** coerce_new_type (type) *** 1508,1527 **** { case 2: args = tree_cons (NULL_TREE, size_type_node, args); ! /* FALLTHROUGH */ case 1: type = build_exception_variant (build_function_type (ptr_type_node, args), TYPE_RAISES_EXCEPTIONS (type)); ! /* FALLTHROUGH */ default:; } return type; } tree ! coerce_delete_type (type) ! tree type; { int e = 0; tree args = TYPE_ARG_TYPES (type); --- 1269,1287 ---- { case 2: args = tree_cons (NULL_TREE, size_type_node, args); ! /* Fall through. */ case 1: type = build_exception_variant (build_function_type (ptr_type_node, args), TYPE_RAISES_EXCEPTIONS (type)); ! /* Fall through. */ default:; } return type; } tree ! coerce_delete_type (tree type) { int e = 0; tree args = TYPE_ARG_TYPES (type); *************** coerce_delete_type (type) *** 1543,1554 **** { case 2: args = tree_cons (NULL_TREE, ptr_type_node, args); ! /* FALLTHROUGH */ case 1: type = build_exception_variant (build_function_type (void_type_node, args), TYPE_RAISES_EXCEPTIONS (type)); ! /* FALLTHROUGH */ default:; } --- 1303,1314 ---- { case 2: args = tree_cons (NULL_TREE, ptr_type_node, args); ! /* Fall through. */ case 1: type = build_exception_variant (build_function_type (void_type_node, args), TYPE_RAISES_EXCEPTIONS (type)); ! /* Fall through. */ default:; } *************** coerce_delete_type (type) *** 1556,1563 **** } static void ! mark_vtable_entries (decl) ! tree decl; { tree entries = CONSTRUCTOR_ELTS (DECL_INITIAL (decl)); --- 1316,1322 ---- } static void ! mark_vtable_entries (tree decl) { tree entries = CONSTRUCTOR_ELTS (DECL_INITIAL (decl)); *************** mark_vtable_entries (decl) *** 1565,1571 **** { tree fnaddr = TREE_VALUE (entries); tree fn; ! if (TREE_CODE (fnaddr) != ADDR_EXPR && TREE_CODE (fnaddr) != FDESC_EXPR) /* This entry is an offset: a virtual base class offset, a --- 1324,1332 ---- { tree fnaddr = TREE_VALUE (entries); tree fn; ! ! STRIP_NOPS (fnaddr); ! if (TREE_CODE (fnaddr) != ADDR_EXPR && TREE_CODE (fnaddr) != FDESC_EXPR) /* This entry is an offset: a virtual base class offset, a *************** mark_vtable_entries (decl) *** 1588,1595 **** linkage available. */ void ! comdat_linkage (decl) ! tree decl; { if (flag_weak) make_decl_one_only (decl); --- 1349,1355 ---- linkage available. */ void ! comdat_linkage (tree decl) { if (flag_weak) make_decl_one_only (decl); *************** comdat_linkage (decl) *** 1642,1649 **** instantiations; otherwise we get duplicate symbol errors. */ void ! maybe_make_one_only (decl) ! tree decl; { /* We used to say that this was not necessary on targets that support weak symbols, because the implicit instantiations will defer to the explicit --- 1402,1408 ---- instantiations; otherwise we get duplicate symbol errors. */ void ! maybe_make_one_only (tree decl) { /* We used to say that this was not necessary on targets that support weak symbols, because the implicit instantiations will defer to the explicit *************** maybe_make_one_only (decl) *** 1665,1675 **** { DECL_COMDAT (decl) = 1; /* Mark it needed so we don't forget to emit it. */ ! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) = 1; } } - /* Set TREE_PUBLIC and/or DECL_EXTERN on the vtable DECL, based on TYPE and other static flags. --- 1424,1433 ---- { DECL_COMDAT (decl) = 1; /* Mark it needed so we don't forget to emit it. */ ! mark_referenced (DECL_ASSEMBLER_NAME (decl)); } } /* Set TREE_PUBLIC and/or DECL_EXTERN on the vtable DECL, based on TYPE and other static flags. *************** maybe_make_one_only (decl) *** 1677,1685 **** it's public in this file or in another one. */ void ! import_export_vtable (decl, type, final) ! tree decl, type; ! int final; { if (DECL_INTERFACE_KNOWN (decl)) return; --- 1435,1441 ---- it's public in this file or in another one. */ void ! import_export_vtable (tree decl, tree type, int final) { if (DECL_INTERFACE_KNOWN (decl)) return; *************** import_export_vtable (decl, type, final) *** 1721,1728 **** using various heuristics. */ static void ! import_export_class (ctype) ! tree ctype; { /* -1 for imported, 1 for exported. */ int import_export = 0; --- 1477,1483 ---- using various heuristics. */ static void ! import_export_class (tree ctype) { /* -1 for imported, 1 for exported. */ int import_export = 0; *************** import_export_class (ctype) *** 1778,1828 **** CLASSTYPE_INTERFACE_ONLY (ctype) = (import_export < 0); } } - - /* We need to describe to the assembler the relationship between - a vtable and the vtable of the parent class. */ ! static void ! output_vtable_inherit (vars) ! tree vars; { ! tree parent; ! rtx child_rtx, parent_rtx; ! ! child_rtx = XEXP (DECL_RTL (vars), 0); /* strip the mem ref */ ! ! parent = binfo_for_vtable (vars); ! ! if (parent == TYPE_BINFO (DECL_CONTEXT (vars))) ! parent_rtx = const0_rtx; ! else if (parent) ! { ! parent = get_vtbl_decl_for_binfo (TYPE_BINFO (BINFO_TYPE (parent))); ! parent_rtx = XEXP (DECL_RTL (parent), 0); /* strip the mem ref */ ! } else ! abort (); ! ! assemble_vtable_inherit (child_rtx, parent_rtx); } /* If necessary, write out the vtables for the dynamic class CTYPE. ! Returns nonzero if any vtables were emitted. */ ! static int maybe_emit_vtables (tree ctype) { tree vtbl; tree primary_vtbl; /* If the vtables for this class have already been emitted there is nothing more to do. */ primary_vtbl = CLASSTYPE_VTABLES (ctype); ! if (TREE_ASM_WRITTEN (primary_vtbl)) ! return 0; /* Ignore dummy vtables made by get_vtable_decl. */ if (TREE_TYPE (primary_vtbl) == void_type_node) ! return 0; import_export_class (ctype); import_export_vtable (primary_vtbl, ctype, 1); --- 1533,1568 ---- CLASSTYPE_INTERFACE_ONLY (ctype) = (import_export < 0); } } ! /* Return true if VAR has already been provided to the back end; in that ! case VAR should not be modified further by the front end. */ ! static bool ! var_finalized_p (tree var) { ! if (flag_unit_at_a_time) ! return cgraph_varpool_node (var)->finalized; else ! return TREE_ASM_WRITTEN (var); } /* If necessary, write out the vtables for the dynamic class CTYPE. ! Returns true if any vtables were emitted. */ ! static bool maybe_emit_vtables (tree ctype) { tree vtbl; tree primary_vtbl; + bool needed = false; /* If the vtables for this class have already been emitted there is nothing more to do. */ primary_vtbl = CLASSTYPE_VTABLES (ctype); ! if (var_finalized_p (primary_vtbl)) ! return false; /* Ignore dummy vtables made by get_vtable_decl. */ if (TREE_TYPE (primary_vtbl) == void_type_node) ! return false; import_export_class (ctype); import_export_vtable (primary_vtbl, ctype, 1); *************** maybe_emit_vtables (tree ctype) *** 1831,1837 **** for (vtbl = CLASSTYPE_VTABLES (ctype); vtbl; vtbl = TREE_CHAIN (vtbl)) if (!DECL_EXTERNAL (vtbl) && DECL_NEEDED_P (vtbl)) break; - if (!vtbl) { /* If the references to this class' vtables are optimized away, --- 1571,1576 ---- *************** maybe_emit_vtables (tree ctype) *** 1840,1847 **** if (DECL_COMDAT (primary_vtbl) && CLASSTYPE_DEBUG_REQUESTED (ctype)) note_debug_info_needed (ctype); ! return 0; } /* The ABI requires that we emit all of the vtables if we emit any of them. */ --- 1579,1589 ---- if (DECL_COMDAT (primary_vtbl) && CLASSTYPE_DEBUG_REQUESTED (ctype)) note_debug_info_needed (ctype); ! return false; } + else if (TREE_PUBLIC (vtbl) && !DECL_COMDAT (vtbl)) + needed = true; + /* The ABI requires that we emit all of the vtables if we emit any of them. */ *************** maybe_emit_vtables (tree ctype) *** 1850,1857 **** /* Write it out. */ import_export_vtable (vtbl, ctype, 1); mark_vtable_entries (vtbl); if (TREE_TYPE (DECL_INITIAL (vtbl)) == 0) ! store_init_value (vtbl, DECL_INITIAL (vtbl)); if (write_symbols == DWARF_DEBUG || write_symbols == DWARF2_DEBUG) { --- 1592,1608 ---- /* Write it out. */ import_export_vtable (vtbl, ctype, 1); mark_vtable_entries (vtbl); + + /* If we know that DECL is needed, mark it as such for the varpool. */ + if (needed) + cgraph_varpool_mark_needed_node (cgraph_varpool_node (vtbl)); + if (TREE_TYPE (DECL_INITIAL (vtbl)) == 0) ! { ! /* It had better be all done at compile-time. */ ! if (store_init_value (vtbl, DECL_INITIAL (vtbl))) ! abort (); ! } if (write_symbols == DWARF_DEBUG || write_symbols == DWARF2_DEBUG) { *************** maybe_emit_vtables (tree ctype) *** 1885,1893 **** rest_of_decl_compilation (vtbl, NULL, 1, 1); - if (flag_vtable_gc) - output_vtable_inherit (vtbl); - /* Because we're only doing syntax-checking, we'll never end up actually marking the variable as written. */ if (flag_syntax_only) --- 1636,1641 ---- *************** maybe_emit_vtables (tree ctype) *** 1898,1912 **** info. */ note_debug_info_needed (ctype); ! return 1; } /* Determines the proper settings of TREE_PUBLIC and DECL_EXTERNAL for an inline function or template instantiation at end-of-file. */ void ! import_export_decl (decl) ! tree decl; { if (DECL_INTERFACE_KNOWN (decl)) return; --- 1646,1659 ---- info. */ note_debug_info_needed (ctype); ! return true; } /* Determines the proper settings of TREE_PUBLIC and DECL_EXTERNAL for an inline function or template instantiation at end-of-file. */ void ! import_export_decl (tree decl) { if (DECL_INTERFACE_KNOWN (decl)) return; *************** import_export_decl (decl) *** 1918,1924 **** if ((DECL_IMPLICIT_INSTANTIATION (decl) || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (decl)) && (flag_implicit_templates ! || (flag_implicit_inline_templates && DECL_DECLARED_INLINE_P (decl)))) { if (!TREE_PUBLIC (decl)) --- 1665,1672 ---- if ((DECL_IMPLICIT_INSTANTIATION (decl) || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (decl)) && (flag_implicit_templates ! || (flag_implicit_inline_templates ! && TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl)))) { if (!TREE_PUBLIC (decl)) *************** import_export_decl (decl) *** 1972,1981 **** typeinfo for TYPE should be in the runtime library. */ void ! import_export_tinfo (decl, type, is_in_library) ! tree decl; ! tree type; ! int is_in_library; { if (DECL_INTERFACE_KNOWN (decl)) return; --- 1720,1726 ---- typeinfo for TYPE should be in the runtime library. */ void ! import_export_tinfo (tree decl, tree type, bool is_in_library) { if (DECL_INTERFACE_KNOWN (decl)) return; *************** import_export_tinfo (decl, type, is_in_l *** 2013,2020 **** an array whose (innermost) elements have a non-trivial destructor. */ tree ! build_cleanup (decl) ! tree decl; { tree temp; tree type = TREE_TYPE (decl); --- 1758,1764 ---- an array whose (innermost) elements have a non-trivial destructor. */ tree ! build_cleanup (tree decl) { tree temp; tree type = TREE_TYPE (decl); *************** build_cleanup (decl) *** 2044,2051 **** which has static storage duration. */ tree ! get_guard (decl) ! tree decl; { tree sname; tree guard; --- 1788,1794 ---- which has static storage duration. */ tree ! get_guard (tree decl) { tree sname; tree guard; *************** get_guard (decl) *** 2080,2087 **** guarded entity is actually initialized. */ static tree ! get_guard_bits (guard) ! tree guard; { /* We only set the first byte of the guard, in order to leave room for a mutex in the high-order bits. */ --- 1823,1829 ---- guarded entity is actually initialized. */ static tree ! get_guard_bits (tree guard) { /* We only set the first byte of the guard, in order to leave room for a mutex in the high-order bits. */ *************** get_guard_bits (guard) *** 2100,2107 **** variable has already been initialized. */ tree ! get_guard_cond (guard) ! tree guard; { tree guard_value; --- 1842,1848 ---- variable has already been initialized. */ tree ! get_guard_cond (tree guard) { tree guard_value; *************** get_guard_cond (guard) *** 2117,2124 **** the variable being guarded has been initialized. */ tree ! set_guard (guard) ! tree guard; { tree guard_init; --- 1858,1864 ---- the variable being guarded has been initialized. */ tree ! set_guard (tree guard) { tree guard_init; *************** set_guard (guard) *** 2134,2141 **** or destructors. Subroutine of do_[cd]tors. */ static tree ! start_objects (method_type, initp) ! int method_type, initp; { tree fnname; tree body; --- 1874,1880 ---- or destructors. Subroutine of do_[cd]tors. */ static tree ! start_objects (int method_type, int initp) { tree fnname; tree body; *************** start_objects (method_type, initp) *** 2179,2189 **** DECL_GLOBAL_DTOR_P (current_function_decl) = 1; DECL_LANG_SPECIFIC (current_function_decl)->decl_flags.u2sel = 1; ! body = begin_compound_stmt (/*has_no_scope=*/0); /* We cannot allow these functions to be elided, even if they do not have external linkage. And, there's no point in deferring ! copmilation of thes functions; they're all going to have to be out anyhow. */ current_function_cannot_inline = "static constructors and destructors cannot be inlined"; --- 1918,1928 ---- DECL_GLOBAL_DTOR_P (current_function_decl) = 1; DECL_LANG_SPECIFIC (current_function_decl)->decl_flags.u2sel = 1; ! body = begin_compound_stmt (/*has_no_scope=*/false); /* We cannot allow these functions to be elided, even if they do not have external linkage. And, there's no point in deferring ! compilation of thes functions; they're all going to have to be out anyhow. */ current_function_cannot_inline = "static constructors and destructors cannot be inlined"; *************** start_objects (method_type, initp) *** 2195,2210 **** or destructors. Subroutine of do_[cd]tors. */ static void ! finish_objects (method_type, initp, body) ! int method_type, initp; ! tree body; { tree fn; /* Finish up. */ ! finish_compound_stmt (/*has_no_scope=*/0, body); fn = finish_function (0); ! expand_body (fn); /* When only doing semantic analysis, and no RTL generation, we can't call functions that directly emit assembly code; there is --- 1934,1947 ---- or destructors. Subroutine of do_[cd]tors. */ static void ! finish_objects (int method_type, int initp, tree body) { tree fn; /* Finish up. */ ! finish_compound_stmt (body); fn = finish_function (0); ! expand_or_defer_fn (fn); /* When only doing semantic analysis, and no RTL generation, we can't call functions that directly emit assembly code; there is *************** static splay_tree priority_info_map; *** 2263,2272 **** translation unit. */ static tree ! start_static_storage_duration_function () { - static unsigned ssdf_number; - tree parm_types; tree type; tree body; --- 2000,2007 ---- translation unit. */ static tree ! start_static_storage_duration_function (unsigned count) { tree parm_types; tree type; tree body; *************** start_static_storage_duration_function ( *** 2274,2287 **** /* Create the identifier for this function. It will be of the form SSDF_IDENTIFIER_. */ ! sprintf (id, "%s_%u", SSDF_IDENTIFIER, ssdf_number++); ! if (ssdf_number == 0) ! { ! /* Overflow occurred. That means there are at least 4 billion ! initialization functions. */ ! sorry ("too many initialization functions required"); ! abort (); ! } /* Create the parameters. */ parm_types = void_list_node; --- 2009,2015 ---- /* Create the identifier for this function. It will be of the form SSDF_IDENTIFIER_. */ ! sprintf (id, "%s_%u", SSDF_IDENTIFIER, count); /* Create the parameters. */ parm_types = void_list_node; *************** start_static_storage_duration_function ( *** 2334,2340 **** /* Put the function in the global scope. */ pushdecl (ssdf_decl); ! /* Start the function itself. This is equivalent to declarating the function as: static void __ssdf (int __initialize_p, init __priority_p); --- 2062,2068 ---- /* Put the function in the global scope. */ pushdecl (ssdf_decl); ! /* Start the function itself. This is equivalent to declaring the function as: static void __ssdf (int __initialize_p, init __priority_p); *************** start_static_storage_duration_function ( *** 2347,2353 **** SF_PRE_PARSED); /* Set up the scope of the outermost block in the function. */ ! body = begin_compound_stmt (/*has_no_scope=*/0); /* This function must not be deferred because we are depending on its compilation to tell us what is TREE_SYMBOL_REFERENCED. */ --- 2075,2081 ---- SF_PRE_PARSED); /* Set up the scope of the outermost block in the function. */ ! body = begin_compound_stmt (/*has_no_scope=*/false); /* This function must not be deferred because we are depending on its compilation to tell us what is TREE_SYMBOL_REFERENCED. */ *************** start_static_storage_duration_function ( *** 2362,2373 **** this point, no more such objects can be created. */ static void ! finish_static_storage_duration_function (body) ! tree body; { /* Close out the function. */ ! finish_compound_stmt (/*has_no_scope=*/0, body); ! expand_body (finish_function (0)); } /* Return the information about the indicated PRIORITY level. If no --- 2090,2100 ---- this point, no more such objects can be created. */ static void ! finish_static_storage_duration_function (tree body) { /* Close out the function. */ ! finish_compound_stmt (body); ! expand_or_defer_fn (finish_function (0)); } /* Return the information about the indicated PRIORITY level. If no *************** finish_static_storage_duration_function *** 2375,2382 **** appropriate prologue. */ static priority_info ! get_priority_info (priority) ! int priority; { priority_info pi; splay_tree_node n; --- 2102,2108 ---- appropriate prologue. */ static priority_info ! get_priority_info (int priority) { priority_info pi; splay_tree_node n; *************** get_priority_info (priority) *** 2387,2393 **** { /* Create a new priority information structure, and insert it into the map. */ ! pi = (priority_info) xmalloc (sizeof (struct priority_info_s)); pi->initializations_p = 0; pi->destructions_p = 0; splay_tree_insert (priority_info_map, --- 2113,2119 ---- { /* Create a new priority information structure, and insert it into the map. */ ! pi = xmalloc (sizeof (struct priority_info_s)); pi->initializations_p = 0; pi->destructions_p = 0; splay_tree_insert (priority_info_map, *************** get_priority_info (priority) *** 2405,2413 **** are destroying it. */ static tree ! start_static_initialization_or_destruction (decl, initp) ! tree decl; ! int initp; { tree guard_if_stmt = NULL_TREE; int priority; --- 2131,2137 ---- are destroying it. */ static tree ! start_static_initialization_or_destruction (tree decl, int initp) { tree guard_if_stmt = NULL_TREE; int priority; *************** start_static_initialization_or_destructi *** 2433,2440 **** where DECL was declared so that error-messages make sense, and so that the debugger will show somewhat sensible file and line information. */ ! input_filename = DECL_SOURCE_FILE (decl); ! lineno = DECL_SOURCE_LINE (decl); /* Because of: --- 2157,2163 ---- where DECL was declared so that error-messages make sense, and so that the debugger will show somewhat sensible file and line information. */ ! input_location = DECL_SOURCE_LOCATION (decl); /* Because of: *************** start_static_initialization_or_destructi *** 2529,2536 **** the initialization. */ static void ! finish_static_initialization_or_destruction (guard_if_stmt) ! tree guard_if_stmt; { finish_then_clause (guard_if_stmt); finish_if_stmt (); --- 2252,2258 ---- the initialization. */ static void ! finish_static_initialization_or_destruction (tree guard_if_stmt) { finish_then_clause (guard_if_stmt); finish_if_stmt (); *************** finish_static_initialization_or_destruct *** 2545,2553 **** static storage duration. The initialization is INIT. */ static void ! do_static_initialization (decl, init) ! tree decl; ! tree init; { tree guard_if_stmt; --- 2267,2273 ---- static storage duration. The initialization is INIT. */ static void ! do_static_initialization (tree decl, tree init) { tree guard_if_stmt; *************** do_static_initialization (decl, init) *** 2575,2582 **** destruction. */ static void ! do_static_destruction (decl) ! tree decl; { tree guard_if_stmt; --- 2295,2301 ---- destruction. */ static void ! do_static_destruction (tree decl) { tree guard_if_stmt; *************** do_static_destruction (decl) *** 2604,2611 **** i.e., the first variable should be initialized first. */ static tree ! prune_vars_needing_no_initialization (vars) ! tree *vars; { tree *var = vars; tree result = NULL_TREE; --- 2323,2329 ---- i.e., the first variable should be initialized first. */ static tree ! prune_vars_needing_no_initialization (tree *vars) { tree *var = vars; tree result = NULL_TREE; *************** prune_vars_needing_no_initialization (va *** 2657,2669 **** VARS. */ static void ! write_out_vars (vars) ! tree vars; { tree v; for (v = vars; v; v = TREE_CHAIN (v)) ! if (! TREE_ASM_WRITTEN (TREE_VALUE (v))) rest_of_decl_compilation (TREE_VALUE (v), 0, 1, 1); } --- 2375,2386 ---- VARS. */ static void ! write_out_vars (tree vars) { tree v; for (v = vars; v; v = TREE_CHAIN (v)) ! if (!var_finalized_p (TREE_VALUE (v))) rest_of_decl_compilation (TREE_VALUE (v), 0, 1, 1); } *************** write_out_vars (vars) *** 2672,2707 **** storage duration having the indicated PRIORITY. */ static void ! generate_ctor_or_dtor_function (constructor_p, priority) ! int constructor_p; ! int priority; { char function_key; tree arguments; tree body; size_t i; /* We use `I' to indicate initialization and `D' to indicate destruction. */ ! if (constructor_p) ! function_key = 'I'; ! else ! function_key = 'D'; ! /* Begin the function. */ ! body = start_objects (function_key, priority); /* Call the static storage duration function with appropriate arguments. */ if (ssdf_decls) for (i = 0; i < ssdf_decls->elements_used; ++i) { ! arguments = tree_cons (NULL_TREE, build_int_2 (priority, 0), ! NULL_TREE); ! arguments = tree_cons (NULL_TREE, build_int_2 (constructor_p, 0), ! arguments); ! finish_expr_stmt (build_function_call (VARRAY_TREE (ssdf_decls, i), ! arguments)); } /* If we're generating code for the DEFAULT_INIT_PRIORITY, throw in --- 2389,2433 ---- storage duration having the indicated PRIORITY. */ static void ! generate_ctor_or_dtor_function (bool constructor_p, int priority, ! location_t *locus) { char function_key; tree arguments; + tree fndecl; tree body; size_t i; + input_location = *locus; + locus->line++; + /* We use `I' to indicate initialization and `D' to indicate destruction. */ ! function_key = constructor_p ? 'I' : 'D'; ! /* We emit the function lazily, to avoid generating empty ! global constructors and destructors. */ ! body = NULL_TREE; /* Call the static storage duration function with appropriate arguments. */ if (ssdf_decls) for (i = 0; i < ssdf_decls->elements_used; ++i) { ! fndecl = VARRAY_TREE (ssdf_decls, i); ! ! /* Calls to pure or const functions will expand to nothing. */ ! if (! (flags_from_decl_or_type (fndecl) & (ECF_CONST | ECF_PURE))) ! { ! if (! body) ! body = start_objects (function_key, priority); ! ! arguments = tree_cons (NULL_TREE, build_int_2 (priority, 0), ! NULL_TREE); ! arguments = tree_cons (NULL_TREE, build_int_2 (constructor_p, 0), ! arguments); ! finish_expr_stmt (build_function_call (fndecl, arguments)); ! } } /* If we're generating code for the DEFAULT_INIT_PRIORITY, throw in *************** generate_ctor_or_dtor_function (construc *** 2714,2734 **** for (fns = constructor_p ? static_ctors : static_dtors; fns; fns = TREE_CHAIN (fns)) ! finish_expr_stmt (build_function_call (TREE_VALUE (fns), NULL_TREE)); } /* Close out the function. */ ! finish_objects (function_key, priority, body); } /* Generate constructor and destructor functions for the priority indicated by N. */ static int ! generate_ctor_and_dtor_functions_for_priority (n, data) ! splay_tree_node n; ! void *data ATTRIBUTE_UNUSED; { int priority = (int) n->key; priority_info pi = (priority_info) n->value; --- 2440,2470 ---- for (fns = constructor_p ? static_ctors : static_dtors; fns; fns = TREE_CHAIN (fns)) ! { ! fndecl = TREE_VALUE (fns); ! ! /* Calls to pure/const functions will expand to nothing. */ ! if (! (flags_from_decl_or_type (fndecl) & (ECF_CONST | ECF_PURE))) ! { ! if (! body) ! body = start_objects (function_key, priority); ! finish_expr_stmt (build_function_call (fndecl, NULL_TREE)); ! } ! } } /* Close out the function. */ ! if (body) ! finish_objects (function_key, priority, body); } /* Generate constructor and destructor functions for the priority indicated by N. */ static int ! generate_ctor_and_dtor_functions_for_priority (splay_tree_node n, void * data) { + location_t *locus = data; int priority = (int) n->key; priority_info pi = (priority_info) n->value; *************** generate_ctor_and_dtor_functions_for_pri *** 2736,2773 **** needed. */ if (pi->initializations_p || (priority == DEFAULT_INIT_PRIORITY && static_ctors)) ! generate_ctor_or_dtor_function (/*constructor_p=*/1, ! priority); if (pi->destructions_p || (priority == DEFAULT_INIT_PRIORITY && static_dtors)) ! generate_ctor_or_dtor_function (/*constructor_p=*/0, ! priority); /* Keep iterating. */ return 0; } /* This routine is called from the last rule in yyparse (). Its job is to create all the code needed to initialize and destroy the global aggregates. We do the destruction first, since that way we only need to reverse the decls once. */ void ! finish_file () { tree vars; ! int reconsider; size_t i; at_eof = 1; /* Bad parse errors. Just forget about it. */ if (! global_bindings_p () || current_class_type || decl_namespace_list) return; /* Otherwise, GDB can get confused, because in only knows about source for LINENO-1 lines. */ ! lineno -= 1; interface_unknown = 1; interface_only = 0; --- 2472,2544 ---- needed. */ if (pi->initializations_p || (priority == DEFAULT_INIT_PRIORITY && static_ctors)) ! generate_ctor_or_dtor_function (/*constructor_p=*/true, priority, locus); if (pi->destructions_p || (priority == DEFAULT_INIT_PRIORITY && static_dtors)) ! generate_ctor_or_dtor_function (/*constructor_p=*/false, priority, locus); /* Keep iterating. */ return 0; } + /* Called via LANGHOOK_CALLGRAPH_ANALYZE_EXPR. It is supposed to mark + decls referenced from frontend specific constructs; it will be called + only for language-specific tree nodes. + + Here we must deal with member pointers. */ + + tree + cxx_callgraph_analyze_expr (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, + tree from ATTRIBUTE_UNUSED) + { + tree t = *tp; + + if (flag_unit_at_a_time) + switch (TREE_CODE (t)) + { + case PTRMEM_CST: + if (TYPE_PTRMEMFUNC_P (TREE_TYPE (t))) + cgraph_mark_needed_node (cgraph_node (PTRMEM_CST_MEMBER (t))); + break; + case BASELINK: + if (TREE_CODE (BASELINK_FUNCTIONS (t)) == FUNCTION_DECL) + cgraph_mark_needed_node (cgraph_node (BASELINK_FUNCTIONS (t))); + break; + + default: + break; + } + + return NULL; + } + /* This routine is called from the last rule in yyparse (). Its job is to create all the code needed to initialize and destroy the global aggregates. We do the destruction first, since that way we only need to reverse the decls once. */ void ! finish_file (void) { tree vars; ! bool reconsider; size_t i; + location_t locus; + unsigned ssdf_count = 0; + locus = input_location; at_eof = 1; /* Bad parse errors. Just forget about it. */ if (! global_bindings_p () || current_class_type || decl_namespace_list) return; + if (pch_file) + c_common_write_pch (); + /* Otherwise, GDB can get confused, because in only knows about source for LINENO-1 lines. */ ! input_line -= 1; interface_unknown = 1; interface_only = 0; *************** finish_file () *** 2795,2843 **** do { tree t; ! reconsider = 0; /* If there are templates that we've put off instantiating, do them now. */ instantiate_pending_templates (); /* Write out virtual tables as required. Note that writing out ! the virtual table for a template class may cause the ! instantiation of members of that class. If we write out ! vtables then we remove the class from our list so we don't ! have to look at it again. */ ! while (keyed_classes != NULL_TREE ! && maybe_emit_vtables (TREE_VALUE (keyed_classes))) ! { ! reconsider = 1; ! keyed_classes = TREE_CHAIN (keyed_classes); ! } ! t = keyed_classes; if (t != NULL_TREE) ! { ! tree next = TREE_CHAIN (t); ! ! while (next) ! { ! if (maybe_emit_vtables (TREE_VALUE (next))) ! { ! reconsider = 1; ! TREE_CHAIN (t) = TREE_CHAIN (next); ! } ! else ! t = next; ! ! next = TREE_CHAIN (t); ! } ! } ! ! /* Write out needed type info variables. Writing out one variable ! might cause others to be needed. */ ! if (walk_globals (unemitted_tinfo_decl_p, emit_tinfo_decl, /*data=*/0)) ! reconsider = 1; /* The list of objects with static storage duration is built up in reverse order. We clear STATIC_AGGREGATES so that any new --- 2566,2640 ---- do { tree t; + size_t n_old, n_new; ! reconsider = false; /* If there are templates that we've put off instantiating, do them now. */ instantiate_pending_templates (); + ggc_collect (); /* Write out virtual tables as required. Note that writing out ! the virtual table for a template class may cause the ! instantiation of members of that class. If we write out ! vtables then we remove the class from our list so we don't ! have to look at it again. */ ! while (keyed_classes != NULL_TREE ! && maybe_emit_vtables (TREE_VALUE (keyed_classes))) ! { ! reconsider = true; ! keyed_classes = TREE_CHAIN (keyed_classes); ! } ! t = keyed_classes; if (t != NULL_TREE) ! { ! tree next = TREE_CHAIN (t); ! ! while (next) ! { ! if (maybe_emit_vtables (TREE_VALUE (next))) ! { ! reconsider = true; ! TREE_CHAIN (t) = TREE_CHAIN (next); ! } ! else ! t = next; ! ! next = TREE_CHAIN (t); ! } ! } ! ! /* Write out needed type info variables. We have to be careful ! looping through unemitted decls, because emit_tinfo_decl may ! cause other variables to be needed. We stick new elements ! (and old elements that we may need to reconsider) at the end ! of the array, then shift them back to the beginning once we're ! done. */ ! ! n_old = VARRAY_ACTIVE_SIZE (unemitted_tinfo_decls); ! for (i = 0; i < n_old; ++i) ! { ! tree tinfo_decl = VARRAY_TREE (unemitted_tinfo_decls, i); ! if (emit_tinfo_decl (tinfo_decl)) ! reconsider = true; ! else ! VARRAY_PUSH_TREE (unemitted_tinfo_decls, tinfo_decl); ! } ! ! /* The only elements we want to keep are the new ones. Copy ! them to the beginning of the array, then get rid of the ! leftovers. */ ! n_new = VARRAY_ACTIVE_SIZE (unemitted_tinfo_decls) - n_old; ! if (n_new) ! memmove (&VARRAY_TREE (unemitted_tinfo_decls, 0), ! &VARRAY_TREE (unemitted_tinfo_decls, n_old), ! n_new * sizeof (tree)); ! memset (&VARRAY_TREE (unemitted_tinfo_decls, n_new), ! 0, n_old * sizeof (tree)); ! VARRAY_ACTIVE_SIZE (unemitted_tinfo_decls) = n_new; /* The list of objects with static storage duration is built up in reverse order. We clear STATIC_AGGREGATES so that any new *************** finish_file () *** 2857,2863 **** out. That's a deficiency in the back-end. When this is fixed, these initialization functions could all become inline, with resulting performance improvements. */ ! tree ssdf_body = start_static_storage_duration_function (); /* Make sure the back end knows about all the variables. */ write_out_vars (vars); --- 2654,2665 ---- out. That's a deficiency in the back-end. When this is fixed, these initialization functions could all become inline, with resulting performance improvements. */ ! tree ssdf_body; ! ! /* Set the line and file, so that it is obviously not from ! the source file. */ ! input_location = locus; ! ssdf_body = start_static_storage_duration_function (ssdf_count); /* Make sure the back end knows about all the variables. */ write_out_vars (vars); *************** finish_file () *** 2884,2895 **** /* Finish up the static storage duration function for this round. */ finish_static_storage_duration_function (ssdf_body); /* All those initializations and finalizations might cause us to need more inline functions, more template instantiations, etc. */ ! reconsider = 1; } for (i = 0; i < deferred_fns_used; ++i) --- 2686,2700 ---- /* Finish up the static storage duration function for this round. */ + input_location = locus; finish_static_storage_duration_function (ssdf_body); /* All those initializations and finalizations might cause us to need more inline functions, more template instantiations, etc. */ ! reconsider = true; ! ssdf_count++; ! locus.line++; } for (i = 0; i < deferred_fns_used; ++i) *************** finish_file () *** 2909,2915 **** push_to_top_level (); synthesize_method (decl); pop_from_top_level (); ! reconsider = 1; } /* If the function has no body, avoid calling --- 2714,2720 ---- push_to_top_level (); synthesize_method (decl); pop_from_top_level (); ! reconsider = true; } /* If the function has no body, avoid calling *************** finish_file () *** 2922,2928 **** continue; import_export_decl (decl); ! /* We lie to the back-end, pretending that some functions are not defined when they really are. This keeps these functions from being put out unnecessarily. But, we must --- 2727,2733 ---- continue; import_export_decl (decl); ! /* We lie to the back-end, pretending that some functions are not defined when they really are. This keeps these functions from being put out unnecessarily. But, we must *************** finish_file () *** 2945,2985 **** if (!DECL_EXTERNAL (decl) && DECL_NEEDED_P (decl) && DECL_SAVED_TREE (decl) ! && !TREE_ASM_WRITTEN (decl)) { ! int saved_not_really_extern; ! ! /* When we call finish_function in expand_body, it will ! try to reset DECL_NOT_REALLY_EXTERN so we save and ! restore it here. */ ! saved_not_really_extern = DECL_NOT_REALLY_EXTERN (decl); /* Generate RTL for this function now that we know we need it. */ ! expand_body (decl); ! /* Undo the damage done by finish_function. */ ! DECL_EXTERNAL (decl) = 0; ! DECL_NOT_REALLY_EXTERN (decl) = saved_not_really_extern; /* If we're compiling -fsyntax-only pretend that this function has been written out so that we don't try to expand it again. */ if (flag_syntax_only) TREE_ASM_WRITTEN (decl) = 1; ! reconsider = 1; } } - if (deferred_fns_used - && wrapup_global_declarations (&VARRAY_TREE (deferred_fns, 0), - deferred_fns_used)) - reconsider = 1; if (walk_namespaces (wrapup_globals_for_namespace, /*data=*/0)) ! reconsider = 1; /* Static data members are just like namespace-scope globals. */ for (i = 0; i < pending_statics_used; ++i) { tree decl = VARRAY_TREE (pending_statics, i); ! if (TREE_ASM_WRITTEN (decl)) continue; import_export_decl (decl); if (DECL_NOT_REALLY_EXTERN (decl) && ! DECL_IN_AGGR_P (decl)) --- 2750,2782 ---- if (!DECL_EXTERNAL (decl) && DECL_NEEDED_P (decl) && DECL_SAVED_TREE (decl) ! && !TREE_ASM_WRITTEN (decl) ! && (!flag_unit_at_a_time ! || !cgraph_node (decl)->local.finalized)) { ! /* We will output the function; no longer consider it in this ! loop. */ ! DECL_DEFER_OUTPUT (decl) = 0; /* Generate RTL for this function now that we know we need it. */ ! expand_or_defer_fn (decl); /* If we're compiling -fsyntax-only pretend that this function has been written out so that we don't try to expand it again. */ if (flag_syntax_only) TREE_ASM_WRITTEN (decl) = 1; ! reconsider = true; } } if (walk_namespaces (wrapup_globals_for_namespace, /*data=*/0)) ! reconsider = true; /* Static data members are just like namespace-scope globals. */ for (i = 0; i < pending_statics_used; ++i) { tree decl = VARRAY_TREE (pending_statics, i); ! if (var_finalized_p (decl)) continue; import_export_decl (decl); if (DECL_NOT_REALLY_EXTERN (decl) && ! DECL_IN_AGGR_P (decl)) *************** finish_file () *** 2988,2998 **** if (pending_statics && wrapup_global_declarations (&VARRAY_TREE (pending_statics, 0), pending_statics_used)) ! reconsider = 1; } while (reconsider); ! /* All used inline functions must have a definition at this point. */ for (i = 0; i < deferred_fns_used; ++i) { tree decl = VARRAY_TREE (deferred_fns, i); --- 2785,2798 ---- if (pending_statics && wrapup_global_declarations (&VARRAY_TREE (pending_statics, 0), pending_statics_used)) ! reconsider = true; ! ! if (cgraph_assemble_pending_functions ()) ! reconsider = true; } while (reconsider); ! /* All used inline functions must have a definition at this point. */ for (i = 0; i < deferred_fns_used; ++i) { tree decl = VARRAY_TREE (deferred_fns, i); *************** finish_file () *** 3000,3009 **** if (TREE_USED (decl) && DECL_DECLARED_INLINE_P (decl) && !(TREE_ASM_WRITTEN (decl) || DECL_SAVED_TREE (decl) /* An explicit instantiation can be used to specify ! that the body is in another unit. It will have ! already verified there was a definition. */ || DECL_EXPLICIT_INSTANTIATION (decl))) ! cp_warning_at ("inline function `%D' used but never defined", decl); } /* We give C linkage to static constructors and destructors. */ --- 2800,2816 ---- if (TREE_USED (decl) && DECL_DECLARED_INLINE_P (decl) && !(TREE_ASM_WRITTEN (decl) || DECL_SAVED_TREE (decl) /* An explicit instantiation can be used to specify ! that the body is in another unit. It will have ! already verified there was a definition. */ || DECL_EXPLICIT_INSTANTIATION (decl))) ! { ! cp_warning_at ("inline function `%D' used but never defined", decl); ! /* This symbol is effectively an "extern" declaration now. ! This is not strictly necessary, but removes a duplicate ! warning. */ ! TREE_PUBLIC (decl) = 1; ! } ! } /* We give C linkage to static constructors and destructors. */ *************** finish_file () *** 3014,3028 **** if (priority_info_map) splay_tree_foreach (priority_info_map, generate_ctor_and_dtor_functions_for_priority, ! /*data=*/0); else { if (static_ctors) generate_ctor_or_dtor_function (/*constructor_p=*/true, ! DEFAULT_INIT_PRIORITY); if (static_dtors) generate_ctor_or_dtor_function (/*constructor_p=*/false, ! DEFAULT_INIT_PRIORITY); } /* We're done with the splay-tree now. */ --- 2821,2836 ---- if (priority_info_map) splay_tree_foreach (priority_info_map, generate_ctor_and_dtor_functions_for_priority, ! /*data=*/&locus); else { + if (static_ctors) generate_ctor_or_dtor_function (/*constructor_p=*/true, ! DEFAULT_INIT_PRIORITY, &locus); if (static_dtors) generate_ctor_or_dtor_function (/*constructor_p=*/false, ! DEFAULT_INIT_PRIORITY, &locus); } /* We're done with the splay-tree now. */ *************** finish_file () *** 3033,3038 **** --- 2841,2852 ---- linkage now. */ pop_lang_context (); + if (flag_unit_at_a_time) + { + cgraph_finalize_compilation_unit (); + cgraph_optimize (); + } + /* Now, issue warnings about static, but not defined, functions, etc., and emit debugging information. */ walk_namespaces (wrapup_globals_for_namespace, /*data=*/&reconsider); *************** finish_file () *** 3062,4817 **** dump_tree_statistics (); dump_time_statistics (); } } ! /* This is something of the form 'A()()()()()+1' that has turned out to be an ! expr. Since it was parsed like a type, we need to wade through and fix ! that. Unfortunately, since operator() is left-associative, we can't use ! tail recursion. In the above example, TYPE is `A', and DECL is ! `()()()()()'. ! ! Maybe this shouldn't be recursive, but how often will it actually be ! used? (jason) */ ! ! tree ! reparse_absdcl_as_expr (type, decl) ! tree type, decl; ! { ! /* do build_functional_cast (type, NULL_TREE) at bottom */ ! if (TREE_OPERAND (decl, 0) == NULL_TREE) ! return build_functional_cast (type, NULL_TREE); ! ! /* recurse */ ! decl = reparse_absdcl_as_expr (type, TREE_OPERAND (decl, 0)); ! ! return finish_call_expr (decl, NULL_TREE, /*disallow_virtual=*/false); ! } ! ! /* This is something of the form `int ((int)(int)(int)1)' that has turned ! out to be an expr. Since it was parsed like a type, we need to wade ! through and fix that. Since casts are right-associative, we are ! reversing the order, so we don't have to recurse. ! ! In the above example, DECL is the `(int)(int)(int)', and EXPR is the ! `1'. */ tree ! reparse_absdcl_as_casts (decl, expr) ! tree decl, expr; { ! tree type; ! int non_void_p = 0; ! ! if (TREE_CODE (expr) == CONSTRUCTOR ! && TREE_TYPE (expr) == 0) ! { ! type = groktypename (TREE_VALUE (CALL_DECLARATOR_PARMS (decl))); ! decl = TREE_OPERAND (decl, 0); ! ! if (processing_template_decl) ! TREE_TYPE (expr) = type; ! else ! { ! expr = digest_init (type, expr, (tree *) 0); ! if (TREE_CODE (type) == ARRAY_TYPE && !COMPLETE_TYPE_P (type)) ! { ! int failure = complete_array_type (type, expr, 1); ! my_friendly_assert (!failure, 78); ! } ! } ! } ! ! while (decl) ! { ! type = groktypename (TREE_VALUE (CALL_DECLARATOR_PARMS (decl))); ! decl = TREE_OPERAND (decl, 0); ! if (!VOID_TYPE_P (type)) ! non_void_p = 1; ! expr = build_c_cast (type, expr); ! } ! ! if (warn_old_style_cast && ! in_system_header ! && non_void_p && current_lang_name != lang_name_c) ! warning ("use of old-style cast"); ! ! return expr; ! } ! ! /* T is the parse tree for an expression. Return the expression after ! performing semantic analysis. */ ! tree ! build_expr_from_tree (t) ! tree t; ! { ! if (t == NULL_TREE || t == error_mark_node) ! return t; ! switch (TREE_CODE (t)) { ! case IDENTIFIER_NODE: ! return do_identifier (t, 0, NULL_TREE); ! ! case LOOKUP_EXPR: ! if (LOOKUP_EXPR_GLOBAL (t)) ! { ! tree token = TREE_OPERAND (t, 0); ! return do_scoped_id (token, IDENTIFIER_GLOBAL_VALUE (token)); ! } ! else ! return do_identifier (TREE_OPERAND (t, 0), 0, NULL_TREE); ! ! case TEMPLATE_ID_EXPR: ! { ! tree template; ! tree args; ! tree object; ! ! template = build_expr_from_tree (TREE_OPERAND (t, 0)); ! args = build_expr_from_tree (TREE_OPERAND (t, 1)); ! ! if (TREE_CODE (template) == COMPONENT_REF) ! { ! object = TREE_OPERAND (template, 0); ! template = TREE_OPERAND (template, 1); ! } ! else ! object = NULL_TREE; ! ! template = lookup_template_function (template, args); ! if (object) ! return build (COMPONENT_REF, TREE_TYPE (template), ! object, template); ! else ! return template; ! } ! ! case INDIRECT_REF: ! return build_x_indirect_ref ! (build_expr_from_tree (TREE_OPERAND (t, 0)), "unary *"); ! ! case CAST_EXPR: ! return build_functional_cast ! (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0))); ! ! case REINTERPRET_CAST_EXPR: ! return build_reinterpret_cast ! (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0))); ! ! case CONST_CAST_EXPR: ! return build_const_cast ! (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0))); ! ! case DYNAMIC_CAST_EXPR: ! return build_dynamic_cast ! (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0))); ! ! case STATIC_CAST_EXPR: ! return build_static_cast ! (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0))); ! ! case PREDECREMENT_EXPR: ! case PREINCREMENT_EXPR: ! case POSTDECREMENT_EXPR: ! case POSTINCREMENT_EXPR: ! case NEGATE_EXPR: ! case BIT_NOT_EXPR: ! case ABS_EXPR: ! case TRUTH_NOT_EXPR: ! case ADDR_EXPR: ! case CONVERT_EXPR: /* Unary + */ ! case REALPART_EXPR: ! case IMAGPART_EXPR: ! if (TREE_TYPE (t)) ! return t; ! return build_x_unary_op (TREE_CODE (t), ! build_expr_from_tree (TREE_OPERAND (t, 0))); ! ! case PLUS_EXPR: ! case MINUS_EXPR: ! case MULT_EXPR: ! case TRUNC_DIV_EXPR: ! case CEIL_DIV_EXPR: ! case FLOOR_DIV_EXPR: ! case ROUND_DIV_EXPR: ! case EXACT_DIV_EXPR: ! case BIT_AND_EXPR: ! case BIT_ANDTC_EXPR: ! case BIT_IOR_EXPR: ! case BIT_XOR_EXPR: ! case TRUNC_MOD_EXPR: ! case FLOOR_MOD_EXPR: ! case TRUTH_ANDIF_EXPR: ! case TRUTH_ORIF_EXPR: ! case TRUTH_AND_EXPR: ! case TRUTH_OR_EXPR: ! case RSHIFT_EXPR: ! case LSHIFT_EXPR: ! case RROTATE_EXPR: ! case LROTATE_EXPR: ! case EQ_EXPR: ! case NE_EXPR: ! case MAX_EXPR: ! case MIN_EXPR: ! case LE_EXPR: ! case GE_EXPR: ! case LT_EXPR: ! case GT_EXPR: ! case MEMBER_REF: ! return build_x_binary_op ! (TREE_CODE (t), ! build_expr_from_tree (TREE_OPERAND (t, 0)), ! build_expr_from_tree (TREE_OPERAND (t, 1))); ! ! case DOTSTAR_EXPR: ! return build_m_component_ref ! (build_expr_from_tree (TREE_OPERAND (t, 0)), ! build_expr_from_tree (TREE_OPERAND (t, 1))); ! ! case SCOPE_REF: ! return build_offset_ref (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)); ! ! case ARRAY_REF: ! if (TREE_OPERAND (t, 0) == NULL_TREE) ! /* new-type-id */ ! return build_nt (ARRAY_REF, NULL_TREE, ! build_expr_from_tree (TREE_OPERAND (t, 1))); ! return grok_array_decl (build_expr_from_tree (TREE_OPERAND (t, 0)), ! build_expr_from_tree (TREE_OPERAND (t, 1))); ! ! case SIZEOF_EXPR: ! case ALIGNOF_EXPR: ! { ! tree r = build_expr_from_tree (TREE_OPERAND (t, 0)); ! if (!TYPE_P (r)) ! return TREE_CODE (t) == SIZEOF_EXPR ? expr_sizeof (r) : c_alignof_expr (r); ! else ! return cxx_sizeof_or_alignof_type (r, TREE_CODE (t), true); ! } ! ! case MODOP_EXPR: ! return build_x_modify_expr ! (build_expr_from_tree (TREE_OPERAND (t, 0)), ! TREE_CODE (TREE_OPERAND (t, 1)), ! build_expr_from_tree (TREE_OPERAND (t, 2))); ! ! case ARROW_EXPR: ! return build_x_arrow ! (build_expr_from_tree (TREE_OPERAND (t, 0))); ! ! case NEW_EXPR: ! return build_new ! (build_expr_from_tree (TREE_OPERAND (t, 0)), ! build_expr_from_tree (TREE_OPERAND (t, 1)), ! build_expr_from_tree (TREE_OPERAND (t, 2)), ! NEW_EXPR_USE_GLOBAL (t)); ! ! case DELETE_EXPR: ! return delete_sanity ! (build_expr_from_tree (TREE_OPERAND (t, 0)), ! build_expr_from_tree (TREE_OPERAND (t, 1)), ! DELETE_EXPR_USE_VEC (t), DELETE_EXPR_USE_GLOBAL (t)); ! ! case COMPOUND_EXPR: ! if (TREE_OPERAND (t, 1) == NULL_TREE) ! return build_x_compound_expr ! (build_expr_from_tree (TREE_OPERAND (t, 0))); ! else ! abort (); ! ! case METHOD_CALL_EXPR: ! if (TREE_CODE (TREE_OPERAND (t, 0)) == SCOPE_REF) ! { ! tree ref = TREE_OPERAND (t, 0); ! tree name = TREE_OPERAND (ref, 1); ! ! if (TREE_CODE (name) == TEMPLATE_ID_EXPR) ! name = build_nt (TEMPLATE_ID_EXPR, ! TREE_OPERAND (name, 0), ! build_expr_from_tree (TREE_OPERAND (name, 1))); ! ! return build_scoped_method_call ! (build_expr_from_tree (TREE_OPERAND (t, 1)), ! build_expr_from_tree (TREE_OPERAND (ref, 0)), ! name, ! build_expr_from_tree (TREE_OPERAND (t, 2))); ! } ! else ! { ! tree fn = TREE_OPERAND (t, 0); ! ! /* We can get a TEMPLATE_ID_EXPR here on code like: ! ! x->f<2>(); ! ! so we must resolve that. However, we can also get things ! like a BIT_NOT_EXPR here, when referring to a destructor, ! and things like that are not correctly resolved by ! build_expr_from_tree. So, just use build_expr_from_tree ! when we really need it. */ ! if (TREE_CODE (fn) == TEMPLATE_ID_EXPR) ! fn = lookup_template_function ! (TREE_OPERAND (fn, 0), ! build_expr_from_tree (TREE_OPERAND (fn, 1))); ! ! return build_method_call ! (build_expr_from_tree (TREE_OPERAND (t, 1)), ! fn, ! build_expr_from_tree (TREE_OPERAND (t, 2)), ! NULL_TREE, LOOKUP_NORMAL); ! } ! ! case CALL_EXPR: ! if (TREE_CODE (TREE_OPERAND (t, 0)) == SCOPE_REF) ! { ! tree ref = TREE_OPERAND (t, 0); ! tree name = TREE_OPERAND (ref, 1); ! tree fn, scope, args; ! ! if (TREE_CODE (name) == TEMPLATE_ID_EXPR) ! name = build_nt (TEMPLATE_ID_EXPR, ! TREE_OPERAND (name, 0), ! build_expr_from_tree (TREE_OPERAND (name, 1))); ! ! scope = build_expr_from_tree (TREE_OPERAND (ref, 0)); ! args = build_expr_from_tree (TREE_OPERAND (t, 1)); ! fn = resolve_scoped_fn_name (scope, name); ! ! return build_call_from_tree (fn, args, 1); ! } ! else ! { ! tree name = TREE_OPERAND (t, 0); ! tree id; ! tree args = build_expr_from_tree (TREE_OPERAND (t, 1)); ! if (args != NULL_TREE && TREE_CODE (name) == LOOKUP_EXPR ! && !LOOKUP_EXPR_GLOBAL (name) ! && TREE_CODE ((id = TREE_OPERAND (name, 0))) == IDENTIFIER_NODE ! && (!current_class_type ! || !lookup_member (current_class_type, id, 0, 0))) ! { ! /* Do Koenig lookup if there are no class members. */ ! name = do_identifier (id, 0, args); ! } ! else if (TREE_CODE (name) == TEMPLATE_ID_EXPR ! || ! really_overloaded_fn (name)) ! name = build_expr_from_tree (name); ! ! if (TREE_CODE (name) == OFFSET_REF) ! return build_offset_ref_call_from_tree (name, args); ! if (TREE_CODE (name) == COMPONENT_REF) ! return finish_object_call_expr (TREE_OPERAND (name, 1), ! TREE_OPERAND (name, 0), ! args); ! name = convert_from_reference (name); ! return build_call_from_tree (name, args, ! /*disallow_virtual=*/false); ! } ! ! case COND_EXPR: ! return build_x_conditional_expr ! (build_expr_from_tree (TREE_OPERAND (t, 0)), ! build_expr_from_tree (TREE_OPERAND (t, 1)), ! build_expr_from_tree (TREE_OPERAND (t, 2))); ! ! case PSEUDO_DTOR_EXPR: ! return (finish_pseudo_destructor_call_expr ! (build_expr_from_tree (TREE_OPERAND (t, 0)), ! build_expr_from_tree (TREE_OPERAND (t, 1)), ! build_expr_from_tree (TREE_OPERAND (t, 2)))); ! ! case TREE_LIST: ! { ! tree purpose, value, chain; ! ! if (t == void_list_node) ! return t; ! ! purpose = TREE_PURPOSE (t); ! if (purpose) ! purpose = build_expr_from_tree (purpose); ! value = TREE_VALUE (t); ! if (value) ! value = build_expr_from_tree (value); ! chain = TREE_CHAIN (t); ! if (chain && chain != void_type_node) ! chain = build_expr_from_tree (chain); ! return tree_cons (purpose, value, chain); ! } ! ! case COMPONENT_REF: ! { ! tree object = build_expr_from_tree (TREE_OPERAND (t, 0)); ! return finish_class_member_access_expr (object, ! TREE_OPERAND (t, 1)); ! } ! ! case THROW_EXPR: ! return build_throw (build_expr_from_tree (TREE_OPERAND (t, 0))); ! ! case CONSTRUCTOR: ! { ! tree r; ! tree elts; ! tree type = TREE_TYPE (t); ! bool purpose_p; ! ! /* digest_init will do the wrong thing if we let it. */ ! if (type && TYPE_PTRMEMFUNC_P (type)) ! return t; ! ! r = NULL_TREE; ! /* We do not want to process the purpose of aggregate ! initializers as they are identifier nodes which will be ! looked up by digest_init. */ ! purpose_p = !(type && IS_AGGR_TYPE (type)); ! for (elts = CONSTRUCTOR_ELTS (t); elts; elts = TREE_CHAIN (elts)) ! { ! tree purpose = TREE_PURPOSE (elts); ! tree value = TREE_VALUE (elts); ! ! if (purpose && purpose_p) ! purpose = build_expr_from_tree (purpose); ! value = build_expr_from_tree (value); ! r = tree_cons (purpose, value, r); ! } ! ! r = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (r)); ! TREE_HAS_CONSTRUCTOR (r) = TREE_HAS_CONSTRUCTOR (t); ! ! if (type) ! return digest_init (type, r, 0); ! return r; ! } ! ! case TYPEID_EXPR: ! if (TYPE_P (TREE_OPERAND (t, 0))) ! return get_typeid (TREE_OPERAND (t, 0)); ! return build_typeid (build_expr_from_tree (TREE_OPERAND (t, 0))); ! ! case VAR_DECL: ! return convert_from_reference (t); ! ! case VA_ARG_EXPR: ! return build_va_arg (build_expr_from_tree (TREE_OPERAND (t, 0)), ! TREE_TYPE (t)); ! default: ! return t; } - } ! /* FN is an OFFSET_REF indicating the function to call in parse-tree ! form; it has not yet been semantically analyzed. ARGS are the ! arguments to the function. They have already been semantically ! analzyed. */ ! ! tree ! build_offset_ref_call_from_tree (tree fn, tree args) ! { ! tree object_addr; ! ! my_friendly_assert (TREE_CODE (fn) == OFFSET_REF, 20020725); ! ! /* A qualified name corresponding to a non-static member ! function or a pointer-to-member is represented as an ! OFFSET_REF. ! ! For both of these function calls, FN will be an OFFSET_REF. ! ! struct A { void f(); }; ! void A::f() { (A::f) (); } struct B { void g(); }; void (B::*p)(); void B::g() { (this->*p)(); } */ ! ! /* This code is not really correct (for example, it does not ! handle the case that `A::f' is overloaded), but it is ! historically how we have handled this situation. */ ! if (TREE_CODE (TREE_OPERAND (fn, 1)) == FIELD_DECL) ! fn = resolve_offset_ref (fn); ! else { ! object_addr = build_unary_op (ADDR_EXPR, TREE_OPERAND (fn, 0), 0); fn = TREE_OPERAND (fn, 1); fn = get_member_function_from_ptrfunc (&object_addr, fn); args = tree_cons (NULL_TREE, object_addr, args); } - return build_function_call (fn, args); - } - - /* FN indicates the function to call. Name resolution has been - performed on FN. ARGS are the arguments to the function. They - have already been semantically analyzed. DISALLOW_VIRTUAL is true - if the function call should be determined at compile time, even if - FN is virtual. */ - - tree - build_call_from_tree (tree fn, tree args, bool disallow_virtual) - { - tree template_args; - tree template_id; - tree f; - - /* Check to see that name lookup has already been performed. */ - my_friendly_assert (TREE_CODE (fn) != OFFSET_REF, 20020725); - my_friendly_assert (TREE_CODE (fn) != SCOPE_REF, 20020725); - - /* In the future all of this should be eliminated. Instead, - name-lookup for a member function should simply return a - baselink, instead of a FUNCTION_DECL, TEMPLATE_DECL, or - TEMPLATE_ID_EXPR. */ - - if (TREE_CODE (fn) == TEMPLATE_ID_EXPR) - { - template_id = fn; - template_args = TREE_OPERAND (fn, 1); - fn = TREE_OPERAND (fn, 0); - } - else - { - template_id = NULL_TREE; - template_args = NULL_TREE; - } - - f = (TREE_CODE (fn) == OVERLOAD) ? get_first_fn (fn) : fn; - /* Make sure we have a baselink (rather than simply a - FUNCTION_DECL) for a member function. */ - if (current_class_type - && ((TREE_CODE (f) == FUNCTION_DECL - && DECL_FUNCTION_MEMBER_P (f)) - || (DECL_FUNCTION_TEMPLATE_P (f) - && DECL_FUNCTION_MEMBER_P (f)))) - { - f = lookup_member (current_class_type, DECL_NAME (f), - /*protect=*/1, /*want_type=*/0); - if (f) - fn = f; - } - - if (template_id) - { - if (BASELINK_P (fn)) - BASELINK_FUNCTIONS (fn) = build_nt (TEMPLATE_ID_EXPR, - BASELINK_FUNCTIONS (fn), - template_args); - else - fn = template_id; - } - - return finish_call_expr (fn, args, disallow_virtual); - } - - /* This is something of the form `int (*a)++' that has turned out to be an - expr. It was only converted into parse nodes, so we need to go through - and build up the semantics. Most of the work is done by - build_expr_from_tree, above. - - In the above example, TYPE is `int' and DECL is `*a'. */ - - tree - reparse_decl_as_expr (type, decl) - tree type, decl; - { - decl = build_expr_from_tree (decl); - if (type) - return build_functional_cast (type, build_tree_list (NULL_TREE, decl)); - else - return decl; - } - - /* This is something of the form `int (*a)' that has turned out to be a - decl. It was only converted into parse nodes, so we need to do the - checking that make_{pointer,reference}_declarator do. */ - - tree - finish_decl_parsing (decl) - tree decl; - { - switch (TREE_CODE (decl)) - { - case IDENTIFIER_NODE: - return decl; - case INDIRECT_REF: - return make_pointer_declarator - (NULL_TREE, finish_decl_parsing (TREE_OPERAND (decl, 0))); - case ADDR_EXPR: - return make_reference_declarator - (NULL_TREE, finish_decl_parsing (TREE_OPERAND (decl, 0))); - case BIT_NOT_EXPR: - TREE_OPERAND (decl, 0) = finish_decl_parsing (TREE_OPERAND (decl, 0)); - return decl; - case SCOPE_REF: - push_nested_class (TREE_TYPE (TREE_OPERAND (decl, 0)), 3); - TREE_COMPLEXITY (decl) = current_class_depth; - return decl; - case ARRAY_REF: - TREE_OPERAND (decl, 0) = finish_decl_parsing (TREE_OPERAND (decl, 0)); - return decl; - case TREE_LIST: - /* For attribute handling. */ - TREE_VALUE (decl) = finish_decl_parsing (TREE_VALUE (decl)); - return decl; - case TEMPLATE_ID_EXPR: - return decl; - default: - abort (); - return NULL_TREE; - } - } - - /* Returns true if ROOT (a namespace, class, or function) encloses - CHILD. CHILD may be either a class type or a namespace. */ - - bool - is_ancestor (tree root, tree child) - { - my_friendly_assert ((TREE_CODE (root) == NAMESPACE_DECL - || TREE_CODE (root) == FUNCTION_DECL - || CLASS_TYPE_P (root)), 20030307); - my_friendly_assert ((TREE_CODE (child) == NAMESPACE_DECL - || TREE_CODE (root) == FUNCTION_DECL - || CLASS_TYPE_P (child)), - 20030307); - - /* The global namespace encloses everything. */ - if (root == global_namespace) - return true; - - while (true) - { - /* If we've run out of scopes, stop. */ - if (!child) - return false; - /* If we've reached the ROOT, it encloses CHILD. */ - if (root == child) - return true; - /* Go out one level. */ - if (TYPE_P (child)) - child = TYPE_NAME (child); - child = DECL_CONTEXT (child); - } - } - - /* Return the namespace that is the common ancestor - of two given namespaces. */ - - tree - namespace_ancestor (ns1, ns2) - tree ns1, ns2; - { - timevar_push (TV_NAME_LOOKUP); - if (is_ancestor (ns1, ns2)) - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, ns1); - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, - namespace_ancestor (CP_DECL_CONTEXT (ns1), ns2)); - } - - /* Insert used into the using list of user. Set indirect_flag if this - directive is not directly from the source. Also find the common - ancestor and let our users know about the new namespace */ - static void - add_using_namespace (user, used, indirect) - tree user; - tree used; - int indirect; - { - tree t; - timevar_push (TV_NAME_LOOKUP); - /* Using oneself is a no-op. */ - if (user == used) - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, (void)0); - my_friendly_assert (TREE_CODE (user) == NAMESPACE_DECL, 380); - my_friendly_assert (TREE_CODE (used) == NAMESPACE_DECL, 380); - /* Check if we already have this. */ - t = purpose_member (used, DECL_NAMESPACE_USING (user)); - if (t != NULL_TREE) - { - if (!indirect) - /* Promote to direct usage. */ - TREE_INDIRECT_USING (t) = 0; - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, (void)0); - } - - /* Add used to the user's using list. */ - DECL_NAMESPACE_USING (user) - = tree_cons (used, namespace_ancestor (user, used), - DECL_NAMESPACE_USING (user)); - - TREE_INDIRECT_USING (DECL_NAMESPACE_USING (user)) = indirect; - - /* Add user to the used's users list. */ - DECL_NAMESPACE_USERS (used) - = tree_cons (user, 0, DECL_NAMESPACE_USERS (used)); - - /* Recursively add all namespaces used. */ - for (t = DECL_NAMESPACE_USING (used); t; t = TREE_CHAIN (t)) - /* indirect usage */ - add_using_namespace (user, TREE_PURPOSE (t), 1); - - /* Tell everyone using us about the new used namespaces. */ - for (t = DECL_NAMESPACE_USERS (user); t; t = TREE_CHAIN (t)) - add_using_namespace (TREE_PURPOSE (t), used, 1); - timevar_pop (TV_NAME_LOOKUP); - } - - /* Combines two sets of overloaded functions into an OVERLOAD chain, removing - duplicates. The first list becomes the tail of the result. - - The algorithm is O(n^2). We could get this down to O(n log n) by - doing a sort on the addresses of the functions, if that becomes - necessary. */ - - static tree - merge_functions (s1, s2) - tree s1; - tree s2; - { - for (; s2; s2 = OVL_NEXT (s2)) - { - tree fn2 = OVL_CURRENT (s2); - tree fns1; - - for (fns1 = s1; fns1; fns1 = OVL_NEXT (fns1)) - { - tree fn1 = OVL_CURRENT (fns1); - - /* If the function from S2 is already in S1, there is no - need to add it again. For `extern "C"' functions, we - might have two FUNCTION_DECLs for the same function, in - different namespaces; again, we only need one of them. */ - if (fn1 == fn2 - || (DECL_EXTERN_C_P (fn1) && DECL_EXTERN_C_P (fn2) - && DECL_NAME (fn1) == DECL_NAME (fn2))) - break; - } - - /* If we exhausted all of the functions in S1, FN2 is new. */ - if (!fns1) - s1 = build_overload (fn2, s1); - } - return s1; - } - - /* This should return an error not all definitions define functions. - It is not an error if we find two functions with exactly the - same signature, only if these are selected in overload resolution. - old is the current set of bindings, new the freshly-found binding. - XXX Do we want to give *all* candidates in case of ambiguity? - XXX In what way should I treat extern declarations? - XXX I don't want to repeat the entire duplicate_decls here */ - - static cxx_binding * - ambiguous_decl (tree name, cxx_binding *old, cxx_binding *new, int flags) - { - tree val, type; - my_friendly_assert (old != NULL, 393); - /* Copy the value. */ - val = BINDING_VALUE (new); - if (val) - switch (TREE_CODE (val)) - { - case TEMPLATE_DECL: - /* If we expect types or namespaces, and not templates, - or this is not a template class. */ - if (LOOKUP_QUALIFIERS_ONLY (flags) - && !DECL_CLASS_TEMPLATE_P (val)) - val = NULL_TREE; - break; - case TYPE_DECL: - if (LOOKUP_NAMESPACES_ONLY (flags)) - val = NULL_TREE; - break; - case NAMESPACE_DECL: - if (LOOKUP_TYPES_ONLY (flags)) - val = NULL_TREE; - break; - case FUNCTION_DECL: - /* Ignore built-in functions that are still anticipated. */ - if (LOOKUP_QUALIFIERS_ONLY (flags) || DECL_ANTICIPATED (val)) - val = NULL_TREE; - break; - default: - if (LOOKUP_QUALIFIERS_ONLY (flags)) - val = NULL_TREE; - } - - if (!BINDING_VALUE (old)) - BINDING_VALUE (old) = val; - else if (val && val != BINDING_VALUE (old)) - { - if (is_overloaded_fn (BINDING_VALUE (old)) - && is_overloaded_fn (val)) - { - BINDING_VALUE (old) = merge_functions (BINDING_VALUE (old), - val); - } - else - { - /* Some declarations are functions, some are not. */ - if (flags & LOOKUP_COMPLAIN) - { - /* If we've already given this error for this lookup, - BINDING_VALUE (old) is error_mark_node, so let's not - repeat ourselves. */ - if (BINDING_VALUE (old) != error_mark_node) - { - error ("use of `%D' is ambiguous", name); - cp_error_at (" first declared as `%#D' here", - BINDING_VALUE (old)); - } - cp_error_at (" also declared as `%#D' here", val); - } - BINDING_VALUE (old) = error_mark_node; - } - } - /* ... and copy the type. */ - type = BINDING_TYPE (new); - if (LOOKUP_NAMESPACES_ONLY (flags)) - type = NULL_TREE; - if (!BINDING_TYPE (old)) - BINDING_TYPE (old) = type; - else if (type && BINDING_TYPE (old) != type) - { - if (flags & LOOKUP_COMPLAIN) - { - error ("`%D' denotes an ambiguous type",name); - cp_error_at (" first type here", BINDING_TYPE (old)); - cp_error_at (" other type here", type); - } - } - return old; - } - - /* Subroutine of unualified_namespace_lookup: - Add the bindings of NAME in used namespaces to VAL. - We are currently looking for names in namespace SCOPE, so we - look through USINGS for using-directives of namespaces - which have SCOPE as a common ancestor with the current scope. - Returns zero on errors. */ - - bool - lookup_using_namespace (tree name, cxx_binding *val, tree usings, - tree scope, int flags, tree *spacesp) - { - tree iter; - cxx_binding *val1; - timevar_push (TV_NAME_LOOKUP); - /* Iterate over all used namespaces in current, searching for using - directives of scope. */ - for (iter = usings; iter; iter = TREE_CHAIN (iter)) - if (TREE_VALUE (iter) == scope) - { - if (spacesp) - *spacesp = tree_cons (TREE_PURPOSE (iter), NULL_TREE, - *spacesp); - val1 = cxx_scope_find_binding_for_name (TREE_PURPOSE (iter), name); - /* Resolve possible ambiguities. */ - if (val1) - val = ambiguous_decl (name, val, val1, flags); - } - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, - BINDING_VALUE (val) != error_mark_node); - } - - /* [namespace.qual] - Accepts the NAME to lookup and its qualifying SCOPE. - Returns the name/type pair found into the cxx_binding *RESULT, - or 0 on error. */ - - bool - qualified_lookup_using_namespace (tree name, tree scope, cxx_binding *result, - int flags) - { - /* Maintain a list of namespaces visited... */ - tree seen = NULL_TREE; - /* ... and a list of namespace yet to see. */ - tree todo = NULL_TREE; - tree usings; - timevar_push (TV_NAME_LOOKUP); - /* Look through namespace aliases. */ - scope = ORIGINAL_NAMESPACE (scope); - while (scope && result->value != error_mark_node) - { - cxx_binding *b = cxx_scope_find_binding_for_name (scope, name); - /* Record SCOPE and resolve declaration ambiguities if NAME was - bound in SCOPE. */ - if (b) - { - seen = tree_cons (scope, NULL_TREE, seen); - result = ambiguous_decl (name, result, b, flags); - } - if (!BINDING_VALUE (result) && !BINDING_TYPE (result)) - /* Consider using directives. */ - for (usings = DECL_NAMESPACE_USING (scope); usings; - usings = TREE_CHAIN (usings)) - /* If this was a real directive, and we have not seen it. */ - if (!TREE_INDIRECT_USING (usings) - && !purpose_member (TREE_PURPOSE (usings), seen)) - todo = tree_cons (TREE_PURPOSE (usings), NULL_TREE, todo); - if (todo) - { - scope = TREE_PURPOSE (todo); - todo = TREE_CHAIN (todo); - } - else - scope = NULL_TREE; /* If there never was a todo list. */ - } - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, result->value != error_mark_node); - } - - /* [namespace.memdef]/2 */ - - /* Set the context of a declaration to scope. Complain if we are not - outside scope. */ - - void - set_decl_namespace (decl, scope, friendp) - tree decl; - tree scope; - int friendp; - { - tree old; - - /* Get rid of namespace aliases. */ - scope = ORIGINAL_NAMESPACE (scope); - - /* It is ok for friends to be qualified in parallel space. */ - if (!friendp && !is_ancestor (current_namespace, scope)) - error ("declaration of `%D' not in a namespace surrounding `%D'", - decl, scope); - DECL_CONTEXT (decl) = FROB_CONTEXT (scope); - if (scope != current_namespace) - { - /* See whether this has been declared in the namespace. */ - old = namespace_binding (DECL_NAME (decl), scope); - if (!old) - /* No old declaration at all. */ - goto complain; - /* A template can be explicitly specialized in any namespace. */ - if (processing_explicit_instantiation) - return; - if (!is_overloaded_fn (decl)) - /* Don't compare non-function decls with decls_match here, - since it can't check for the correct constness at this - point. pushdecl will find those errors later. */ - return; - /* Since decl is a function, old should contain a function decl. */ - if (!is_overloaded_fn (old)) - goto complain; - if (processing_template_decl || processing_specialization) - /* We have not yet called push_template_decl to turn the - FUNCTION_DECL into a TEMPLATE_DECL, so the declarations - won't match. But, we'll check later, when we construct the - template. */ - return; - for (; old; old = OVL_NEXT (old)) - if (decls_match (decl, OVL_CURRENT (old))) - return; - } - else - return; - complain: - error ("`%D' should have been declared inside `%D'", - decl, scope); - } - - /* Compute the namespace where a declaration is defined. */ - - static tree - decl_namespace (decl) - tree decl; - { - timevar_push (TV_NAME_LOOKUP); - if (TYPE_P (decl)) - decl = TYPE_STUB_DECL (decl); - while (DECL_CONTEXT (decl)) - { - decl = DECL_CONTEXT (decl); - if (TREE_CODE (decl) == NAMESPACE_DECL) - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); - if (TYPE_P (decl)) - decl = TYPE_STUB_DECL (decl); - my_friendly_assert (DECL_P (decl), 390); - } - - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, global_namespace); - } - - /* Return the namespace where the current declaration is declared. */ - - tree - current_decl_namespace () - { - tree result; - /* If we have been pushed into a different namespace, use it. */ - if (decl_namespace_list) - return TREE_PURPOSE (decl_namespace_list); - - if (current_class_type) - result = decl_namespace (TYPE_STUB_DECL (current_class_type)); - else if (current_function_decl) - result = decl_namespace (current_function_decl); - else - result = current_namespace; - return result; - } - - /* Temporarily set the namespace for the current declaration. */ - - void - push_decl_namespace (decl) - tree decl; - { - if (TREE_CODE (decl) != NAMESPACE_DECL) - decl = decl_namespace (decl); - decl_namespace_list = tree_cons (ORIGINAL_NAMESPACE (decl), - NULL_TREE, decl_namespace_list); - } - - void - pop_decl_namespace () - { - decl_namespace_list = TREE_CHAIN (decl_namespace_list); - } - - /* Enter a class or namespace scope. */ - - void - push_scope (t) - tree t; - { - if (TREE_CODE (t) == NAMESPACE_DECL) - push_decl_namespace (t); - else if (CLASS_TYPE_P (t)) - pushclass (t, 2); - } - - /* Leave scope pushed by push_scope. */ - - void - pop_scope (t) - tree t; - { - if (TREE_CODE (t) == NAMESPACE_DECL) - pop_decl_namespace (); - else if (CLASS_TYPE_P (t)) - popclass (); - } - - /* [basic.lookup.koenig] */ - /* A nonzero return value in the functions below indicates an error. */ - - struct arg_lookup - { - tree name; - tree namespaces; - tree classes; - tree functions; - }; - - static int arg_assoc PARAMS ((struct arg_lookup*, tree)); - static int arg_assoc_args PARAMS ((struct arg_lookup*, tree)); - static int arg_assoc_type PARAMS ((struct arg_lookup*, tree)); - static int add_function PARAMS ((struct arg_lookup *, tree)); - static int arg_assoc_namespace PARAMS ((struct arg_lookup *, tree)); - static int arg_assoc_class PARAMS ((struct arg_lookup *, tree)); - static int arg_assoc_template_arg PARAMS ((struct arg_lookup*, tree)); - - /* Add a function to the lookup structure. - Returns 1 on error. */ - - static int - add_function (k, fn) - struct arg_lookup *k; - tree fn; - { - /* We used to check here to see if the function was already in the list, - but that's O(n^2), which is just too expensive for function lookup. - Now we deal with the occasional duplicate in joust. In doing this, we - assume that the number of duplicates will be small compared to the - total number of functions being compared, which should usually be the - case. */ - - /* We must find only functions, or exactly one non-function. */ - if (!k->functions) - k->functions = fn; - else if (fn == k->functions) - ; - else if (is_overloaded_fn (k->functions) && is_overloaded_fn (fn)) - k->functions = build_overload (fn, k->functions); - else - { - tree f1 = OVL_CURRENT (k->functions); - tree f2 = fn; - if (is_overloaded_fn (f1)) - { - fn = f1; f1 = f2; f2 = fn; - } - cp_error_at ("`%D' is not a function,", f1); - cp_error_at (" conflict with `%D'", f2); - error (" in call to `%D'", k->name); - return 1; - } - - return 0; - } - - /* Add functions of a namespace to the lookup structure. - Returns 1 on error. */ - - static int - arg_assoc_namespace (k, scope) - struct arg_lookup *k; - tree scope; - { - tree value; - - if (purpose_member (scope, k->namespaces)) - return 0; - k->namespaces = tree_cons (scope, NULL_TREE, k->namespaces); - - value = namespace_binding (k->name, scope); - if (!value) - return 0; - - for (; value; value = OVL_NEXT (value)) - if (add_function (k, OVL_CURRENT (value))) - return 1; - - return 0; - } - - /* Adds everything associated with a template argument to the lookup - structure. Returns 1 on error. */ - - static int - arg_assoc_template_arg (k, arg) - struct arg_lookup* k; - tree arg; - { - /* [basic.lookup.koenig] - - If T is a template-id, its associated namespaces and classes are - ... the namespaces and classes associated with the types of the - template arguments provided for template type parameters - (excluding template template parameters); the namespaces in which - any template template arguments are defined; and the classes in - which any member templates used as template template arguments - are defined. [Note: non-type template arguments do not - contribute to the set of associated namespaces. ] */ - - /* Consider first template template arguments. */ - if (TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM - || TREE_CODE (arg) == UNBOUND_CLASS_TEMPLATE) - return 0; - else if (TREE_CODE (arg) == TEMPLATE_DECL) - { - tree ctx = CP_DECL_CONTEXT (arg); - - /* It's not a member template. */ - if (TREE_CODE (ctx) == NAMESPACE_DECL) - return arg_assoc_namespace (k, ctx); - /* Otherwise, it must be member template. */ - else - return arg_assoc_class (k, ctx); - } - /* It's not a template template argument, but it is a type template - argument. */ - else if (TYPE_P (arg)) - return arg_assoc_type (k, arg); - /* It's a non-type template argument. */ - else - return 0; - } - - /* Adds everything associated with class to the lookup structure. - Returns 1 on error. */ - - static int - arg_assoc_class (k, type) - struct arg_lookup* k; - tree type; - { - tree list, friends, context; - int i; - - /* Backend build structures, such as __builtin_va_list, aren't - affected by all this. */ - if (!CLASS_TYPE_P (type)) - return 0; - - if (purpose_member (type, k->classes)) - return 0; - k->classes = tree_cons (type, NULL_TREE, k->classes); - - context = decl_namespace (TYPE_MAIN_DECL (type)); - if (arg_assoc_namespace (k, context)) - return 1; - - /* Process baseclasses. */ - for (i = 0; i < CLASSTYPE_N_BASECLASSES (type); i++) - if (arg_assoc_class (k, TYPE_BINFO_BASETYPE (type, i))) - return 1; - - /* Process friends. */ - for (list = DECL_FRIENDLIST (TYPE_MAIN_DECL (type)); list; - list = TREE_CHAIN (list)) - if (k->name == TREE_PURPOSE (list)) - for (friends = TREE_VALUE (list); friends; - friends = TREE_CHAIN (friends)) - /* Only interested in global functions with potentially hidden - (i.e. unqualified) declarations. */ - if (TREE_PURPOSE (friends) == error_mark_node && TREE_VALUE (friends) - && CP_DECL_CONTEXT (TREE_VALUE (friends)) == context) - if (add_function (k, TREE_VALUE (friends))) - return 1; - - /* Process template arguments. */ - if (CLASSTYPE_TEMPLATE_INFO (type)) - { - list = INNERMOST_TEMPLATE_ARGS (CLASSTYPE_TI_ARGS (type)); - for (i = 0; i < TREE_VEC_LENGTH (list); ++i) - arg_assoc_template_arg (k, TREE_VEC_ELT (list, i)); - } - - return 0; - } - - /* Adds everything associated with a given type. - Returns 1 on error. */ - - static int - arg_assoc_type (k, type) - struct arg_lookup *k; - tree type; - { - switch (TREE_CODE (type)) - { - case VOID_TYPE: - case INTEGER_TYPE: - case REAL_TYPE: - case COMPLEX_TYPE: - case VECTOR_TYPE: - case CHAR_TYPE: - case BOOLEAN_TYPE: - return 0; - case RECORD_TYPE: - if (TYPE_PTRMEMFUNC_P (type)) - return arg_assoc_type (k, TYPE_PTRMEMFUNC_FN_TYPE (type)); - return arg_assoc_class (k, type); - case POINTER_TYPE: - case REFERENCE_TYPE: - case ARRAY_TYPE: - return arg_assoc_type (k, TREE_TYPE (type)); - case UNION_TYPE: - case ENUMERAL_TYPE: - return arg_assoc_namespace (k, decl_namespace (TYPE_MAIN_DECL (type))); - case OFFSET_TYPE: - /* Pointer to member: associate class type and value type. */ - if (arg_assoc_type (k, TYPE_OFFSET_BASETYPE (type))) - return 1; - return arg_assoc_type (k, TREE_TYPE (type)); - case METHOD_TYPE: - /* The basetype is referenced in the first arg type, so just - fall through. */ - case FUNCTION_TYPE: - /* Associate the parameter types. */ - if (arg_assoc_args (k, TYPE_ARG_TYPES (type))) - return 1; - /* Associate the return type. */ - return arg_assoc_type (k, TREE_TYPE (type)); - case TEMPLATE_TYPE_PARM: - case BOUND_TEMPLATE_TEMPLATE_PARM: - return 0; - case TYPENAME_TYPE: - return 0; - case LANG_TYPE: - if (type == unknown_type_node) - return 0; - /* else fall through */ - default: - abort (); - } - return 0; - } - - /* Adds everything associated with arguments. Returns 1 on error. */ - - static int - arg_assoc_args (k, args) - struct arg_lookup* k; - tree args; - { - for (; args; args = TREE_CHAIN (args)) - if (arg_assoc (k, TREE_VALUE (args))) - return 1; - return 0; - } - - /* Adds everything associated with a given tree_node. Returns 1 on error. */ - - static int - arg_assoc (k, n) - struct arg_lookup* k; - tree n; - { - if (n == error_mark_node) - return 0; - - if (TYPE_P (n)) - return arg_assoc_type (k, n); - - if (! type_unknown_p (n)) - return arg_assoc_type (k, TREE_TYPE (n)); - - if (TREE_CODE (n) == ADDR_EXPR) - n = TREE_OPERAND (n, 0); - if (TREE_CODE (n) == COMPONENT_REF) - n = TREE_OPERAND (n, 1); - if (TREE_CODE (n) == OFFSET_REF) - n = TREE_OPERAND (n, 1); - while (TREE_CODE (n) == TREE_LIST) - n = TREE_VALUE (n); - if (TREE_CODE (n) == BASELINK) - n = BASELINK_FUNCTIONS (n); - - if (TREE_CODE (n) == FUNCTION_DECL) - return arg_assoc_type (k, TREE_TYPE (n)); - if (TREE_CODE (n) == TEMPLATE_ID_EXPR) - { - /* [basic.lookup.koenig] - - If T is a template-id, its associated namespaces and classes - are the namespace in which the template is defined; for - member templates, the member template's class... */ - tree template = TREE_OPERAND (n, 0); - tree args = TREE_OPERAND (n, 1); - tree ctx; - tree arg; - - if (TREE_CODE (template) == COMPONENT_REF) - template = TREE_OPERAND (template, 1); - - /* First, the template. There may actually be more than one if - this is an overloaded function template. But, in that case, - we only need the first; all the functions will be in the same - namespace. */ - template = OVL_CURRENT (template); - - ctx = CP_DECL_CONTEXT (template); - - if (TREE_CODE (ctx) == NAMESPACE_DECL) - { - if (arg_assoc_namespace (k, ctx) == 1) - return 1; - } - /* It must be a member template. */ - else if (arg_assoc_class (k, ctx) == 1) - return 1; - - /* Now the arguments. */ - for (arg = args; arg != NULL_TREE; arg = TREE_CHAIN (arg)) - if (arg_assoc_template_arg (k, TREE_VALUE (arg)) == 1) - return 1; - } - else - { - my_friendly_assert (TREE_CODE (n) == OVERLOAD, 980715); - - for (; n; n = OVL_CHAIN (n)) - if (arg_assoc_type (k, TREE_TYPE (OVL_FUNCTION (n)))) - return 1; - } - - return 0; - } - - /* Performs Koenig lookup depending on arguments, where fns - are the functions found in normal lookup. */ - - tree - lookup_arg_dependent (name, fns, args) - tree name; - tree fns; - tree args; - { - struct arg_lookup k; - tree fn = NULL_TREE; - - if (fns == error_mark_node) - fns = NULL_TREE; - - timevar_push (TV_NAME_LOOKUP); - k.name = name; - k.functions = fns; - k.classes = NULL_TREE; - - /* Note that we've already looked at some namespaces during normal - unqualified lookup, unless we found a decl in function scope. */ - if (fns) - fn = OVL_CURRENT (fns); - if (fn && TREE_CODE (fn) == FUNCTION_DECL && DECL_LOCAL_FUNCTION_P (fn)) - k.namespaces = NULL_TREE; - else - unqualified_namespace_lookup (name, 0, &k.namespaces); - - arg_assoc_args (&k, args); - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, k.functions); - } - - /* Process a namespace-alias declaration. */ - - void - do_namespace_alias (alias, namespace) - tree alias, namespace; - { - if (TREE_CODE (namespace) != NAMESPACE_DECL) - { - /* The parser did not find it, so it's not there. */ - error ("unknown namespace `%D'", namespace); - return; - } - - namespace = ORIGINAL_NAMESPACE (namespace); - - /* Build the alias. */ - alias = build_lang_decl (NAMESPACE_DECL, alias, void_type_node); - DECL_NAMESPACE_ALIAS (alias) = namespace; - pushdecl (alias); - } - - /* Check a non-member using-declaration. Return the name and scope - being used, and the USING_DECL, or NULL_TREE on failure. */ - - static tree - validate_nonmember_using_decl (decl, scope, name) - tree decl; - tree *scope; - tree *name; - { - if (TREE_CODE (decl) == SCOPE_REF) - { - *scope = TREE_OPERAND (decl, 0); - *name = TREE_OPERAND (decl, 1); - - if (!processing_template_decl) - { - /* [namespace.udecl] - A using-declaration for a class member shall be a - member-declaration. */ - if(TREE_CODE (*scope) != NAMESPACE_DECL) - { - if (TYPE_P (*scope)) - error ("`%T' is not a namespace", *scope); - else - error ("`%D' is not a namespace", *scope); - return NULL_TREE; - } - - /* 7.3.3/5 - A using-declaration shall not name a template-id. */ - if (TREE_CODE (*name) == TEMPLATE_ID_EXPR) - { - *name = TREE_OPERAND (*name, 0); - error ("a using-declaration cannot specify a template-id. Try `using %D'", *name); - return NULL_TREE; - } - } - } - else if (TREE_CODE (decl) == IDENTIFIER_NODE - || TREE_CODE (decl) == TYPE_DECL - || TREE_CODE (decl) == TEMPLATE_DECL) - { - *scope = global_namespace; - *name = decl; - } - else if (TREE_CODE (decl) == NAMESPACE_DECL) - { - error ("namespace `%D' not allowed in using-declaration", decl); - return NULL_TREE; - } - else - abort (); - if (DECL_P (*name)) - *name = DECL_NAME (*name); - /* Make a USING_DECL. */ - return push_using_decl (*scope, *name); - } - - /* Process local and global using-declarations. */ - - static void - do_nonmember_using_decl (scope, name, oldval, oldtype, newval, newtype) - tree scope, name; - tree oldval, oldtype; - tree *newval, *newtype; - { - cxx_binding decls; - - *newval = *newtype = NULL_TREE; - cxx_binding_clear (&decls); - if (!qualified_lookup_using_namespace (name, scope, &decls, 0)) - /* Lookup error */ - return; - - if (!decls.value && !decls.type) - { - error ("`%D' not declared", name); - return; - } - - /* Check for using functions. */ - if (decls.value && is_overloaded_fn (decls.value)) - { - tree tmp, tmp1; - - if (oldval && !is_overloaded_fn (oldval)) - { - if (!DECL_IMPLICIT_TYPEDEF_P (oldval)) - error ("`%D' is already declared in this scope", name); - oldval = NULL_TREE; - } - - *newval = oldval; - for (tmp = decls.value; tmp; tmp = OVL_NEXT (tmp)) - { - tree new_fn = OVL_CURRENT (tmp); - - /* [namespace.udecl] - - If a function declaration in namespace scope or block - scope has the same name and the same parameter types as a - function introduced by a using declaration the program is - ill-formed. */ - for (tmp1 = oldval; tmp1; tmp1 = OVL_NEXT (tmp1)) - { - tree old_fn = OVL_CURRENT (tmp1); - - if (new_fn == old_fn) - /* The function already exists in the current namespace. */ - break; - else if (OVL_USED (tmp1)) - continue; /* this is a using decl */ - else if (compparms (TYPE_ARG_TYPES (TREE_TYPE (new_fn)), - TYPE_ARG_TYPES (TREE_TYPE (old_fn)))) - { - /* There was already a non-using declaration in - this scope with the same parameter types. If both - are the same extern "C" functions, that's ok. */ - if (decls_match (new_fn, old_fn)) - { - /* If the OLD_FN was a builtin, there is now a - real declaration. */ - if (DECL_ANTICIPATED (old_fn)) - DECL_ANTICIPATED (old_fn) = 0; - break; - } - else if (!DECL_ANTICIPATED (old_fn)) - { - /* If the OLD_FN was really declared, the - declarations don't match. */ - error ("`%D' is already declared in this scope", name); - break; - } - - /* If the OLD_FN was not really there, just ignore - it and keep going. */ - } - } - - /* If we broke out of the loop, there's no reason to add - this function to the using declarations for this - scope. */ - if (tmp1) - continue; - - *newval = build_overload (OVL_CURRENT (tmp), *newval); - if (TREE_CODE (*newval) != OVERLOAD) - *newval = ovl_cons (*newval, NULL_TREE); - OVL_USED (*newval) = 1; - } - } - else - { - *newval = decls.value; - if (oldval && !decls_match (*newval, oldval)) - error ("`%D' is already declared in this scope", name); - } - - *newtype = decls.type; - if (oldtype && *newtype && !same_type_p (oldtype, *newtype)) - { - error ("using declaration `%D' introduced ambiguous type `%T'", - name, oldtype); - return; - } - } - - /* Process a using-declaration not appearing in class or local scope. */ - - void - do_toplevel_using_decl (decl) - tree decl; - { - tree scope, name; - tree oldval, oldtype, newval, newtype; - cxx_binding *binding; - - decl = validate_nonmember_using_decl (decl, &scope, &name); - if (decl == NULL_TREE) - return; - - /* A multiple using-declaration is valid, so we call binding_for_name, - not just cxx_binding_make. */ - binding = binding_for_name (name, current_namespace); - - oldval = BINDING_VALUE (binding); - oldtype = BINDING_TYPE (binding); - - do_nonmember_using_decl (scope, name, oldval, oldtype, &newval, &newtype); - - /* Copy declarations found. */ - if (newval) - BINDING_VALUE (binding) = newval; - if (newtype) - BINDING_TYPE (binding) = newtype; - return; - } - - /* Process a using-declaration at function scope. */ - - void - do_local_using_decl (decl) - tree decl; - { - tree scope, name; - tree oldval, oldtype, newval, newtype; - - decl = validate_nonmember_using_decl (decl, &scope, &name); - if (decl == NULL_TREE) - return; - - if (building_stmt_tree () - && at_function_scope_p ()) - add_decl_stmt (decl); - - oldval = lookup_name_current_level (name); - oldtype = lookup_type_current_level (name); - - do_nonmember_using_decl (scope, name, oldval, oldtype, &newval, &newtype); - - if (newval) - { - if (is_overloaded_fn (newval)) - { - tree fn, term; - - /* We only need to push declarations for those functions - that were not already bound in the current level. - The old value might be NULL_TREE, it might be a single - function, or an OVERLOAD. */ - if (oldval && TREE_CODE (oldval) == OVERLOAD) - term = OVL_FUNCTION (oldval); - else - term = oldval; - for (fn = newval; fn && OVL_CURRENT (fn) != term; - fn = OVL_NEXT (fn)) - push_overloaded_decl (OVL_CURRENT (fn), - PUSH_LOCAL | PUSH_USING); - } - else - push_local_binding (name, newval, PUSH_USING); - } - if (newtype) - set_identifier_type_value (name, newtype); - } - - tree - do_class_using_decl (decl) - tree decl; - { - tree name, value; - - if (TREE_CODE (decl) != SCOPE_REF - || !TYPE_P (TREE_OPERAND (decl, 0))) - { - error ("using-declaration for non-member at class scope"); - return NULL_TREE; - } - name = TREE_OPERAND (decl, 1); - if (TREE_CODE (name) == BIT_NOT_EXPR) - { - error ("using-declaration for destructor"); - return NULL_TREE; - } - else if (TREE_CODE (name) == TEMPLATE_ID_EXPR) - { - name = TREE_OPERAND (name, 0); - error ("a using-declaration cannot specify a template-id. Try `using %T::%D'", TREE_OPERAND (decl, 0), name); - return NULL_TREE; - } - if (TREE_CODE (name) == TYPE_DECL || TREE_CODE (name) == TEMPLATE_DECL) - name = DECL_NAME (name); - else if (BASELINK_P (name)) - { - name = BASELINK_FUNCTIONS (name); - if (TREE_CODE (name) == TEMPLATE_ID_EXPR) - name = TREE_OPERAND (name, 0); - name = DECL_NAME (get_first_fn (name)); - } - - my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 980716); ! value = build_lang_decl (USING_DECL, name, void_type_node); ! DECL_INITIAL (value) = TREE_OPERAND (decl, 0); ! return value; } - - /* Process a using-directive. */ - - void - do_using_directive (namespace) - tree namespace; - { - if (building_stmt_tree ()) - add_stmt (build_stmt (USING_STMT, namespace)); - /* using namespace A::B::C; */ - if (TREE_CODE (namespace) == SCOPE_REF) - namespace = TREE_OPERAND (namespace, 1); - if (TREE_CODE (namespace) == IDENTIFIER_NODE) - { - /* Lookup in lexer did not find a namespace. */ - if (!processing_template_decl) - error ("namespace `%T' undeclared", namespace); - return; - } - if (TREE_CODE (namespace) != NAMESPACE_DECL) - { - if (!processing_template_decl) - error ("`%T' is not a namespace", namespace); - return; - } - namespace = ORIGINAL_NAMESPACE (namespace); - if (!toplevel_bindings_p ()) - push_using_directive (namespace); - else - /* direct usage */ - add_using_namespace (current_namespace, namespace, 0); - } void ! check_default_args (x) ! tree x; { tree arg = TYPE_ARG_TYPES (TREE_TYPE (x)); ! int saw_def = 0, i = 0 - (TREE_CODE (TREE_TYPE (x)) == METHOD_TYPE); for (; arg && arg != void_list_node; arg = TREE_CHAIN (arg), ++i) { if (TREE_PURPOSE (arg)) ! saw_def = 1; else if (saw_def) { cp_error_at ("default argument missing for parameter %P of `%+#D'", --- 2876,2953 ---- dump_tree_statistics (); dump_time_statistics (); } + input_location = locus; } ! /* FN is an OFFSET_REF, DOTSTAR_EXPR or MEMBER_REF indicating the ! function to call in parse-tree form; it has not yet been ! semantically analyzed. ARGS are the arguments to the function. ! They have already been semantically analyzed. */ tree ! build_offset_ref_call_from_tree (tree fn, tree args) { ! tree orig_fn; ! tree orig_args; ! tree expr; ! tree object; ! orig_fn = fn; ! orig_args = args; ! object = TREE_OPERAND (fn, 0); ! if (processing_template_decl) { ! my_friendly_assert (TREE_CODE (fn) == DOTSTAR_EXPR ! || TREE_CODE (fn) == MEMBER_REF, ! 20030708); ! if (type_dependent_expression_p (fn) ! || any_type_dependent_arguments_p (args)) ! return build_min_nt (CALL_EXPR, fn, args); ! /* Transform the arguments and add the implicit "this" ! parameter. That must be done before the FN is transformed ! because we depend on the form of FN. */ ! args = build_non_dependent_args (args); ! if (TREE_CODE (fn) == DOTSTAR_EXPR) ! object = build_unary_op (ADDR_EXPR, object, 0); ! object = build_non_dependent_expr (object); ! args = tree_cons (NULL_TREE, object, args); ! /* Now that the arguments are done, transform FN. */ ! fn = build_non_dependent_expr (fn); } ! /* A qualified name corresponding to a bound pointer-to-member is ! represented as an OFFSET_REF: struct B { void g(); }; void (B::*p)(); void B::g() { (this->*p)(); } */ ! if (TREE_CODE (fn) == OFFSET_REF) { ! tree object_addr = build_unary_op (ADDR_EXPR, object, 0); fn = TREE_OPERAND (fn, 1); fn = get_member_function_from_ptrfunc (&object_addr, fn); args = tree_cons (NULL_TREE, object_addr, args); } ! expr = build_function_call (fn, args); ! if (processing_template_decl && expr != error_mark_node) ! return build_min_non_dep (CALL_EXPR, expr, orig_fn, orig_args); ! return expr; } void ! check_default_args (tree x) { tree arg = TYPE_ARG_TYPES (TREE_TYPE (x)); ! bool saw_def = false; ! int i = 0 - (TREE_CODE (TREE_TYPE (x)) == METHOD_TYPE); for (; arg && arg != void_list_node; arg = TREE_CHAIN (arg), ++i) { if (TREE_PURPOSE (arg)) ! saw_def = true; else if (saw_def) { cp_error_at ("default argument missing for parameter %P of `%+#D'", *************** check_default_args (x) *** 4822,4829 **** } void ! mark_used (decl) ! tree decl; { TREE_USED (decl) = 1; if (processing_template_decl || skip_evaluation) --- 2958,2964 ---- } void ! mark_used (tree decl) { TREE_USED (decl) = 1; if (processing_template_decl || skip_evaluation) *************** mark_used (decl) *** 4840,4845 **** --- 2975,2981 ---- if (TREE_CODE (decl) == FUNCTION_DECL && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl) && DECL_ARTIFICIAL (decl) + && !DECL_THUNK_P (decl) && ! DECL_INITIAL (decl) /* Kludge: don't synthesize for default args. */ && current_function_decl) *************** mark_used (decl) *** 4857,4863 **** if ((DECL_NON_THUNK_FUNCTION_P (decl) || TREE_CODE (decl) == VAR_DECL) && DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl) && (!DECL_EXPLICIT_INSTANTIATION (decl) ! || (TREE_CODE (decl) == FUNCTION_DECL && DECL_INLINE (decl)))) { bool defer; --- 2993,3001 ---- if ((DECL_NON_THUNK_FUNCTION_P (decl) || TREE_CODE (decl) == VAR_DECL) && DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl) && (!DECL_EXPLICIT_INSTANTIATION (decl) ! || (TREE_CODE (decl) == FUNCTION_DECL ! && DECL_INLINE (DECL_TEMPLATE_RESULT ! (template_for_substitution (decl)))))) { bool defer; *************** mark_used (decl) *** 4868,4880 **** However, if instantiating this function might help us mark the current function TREE_NOTHROW, we go ahead and ! instantiate it now. */ defer = (!flag_exceptions || TREE_CODE (decl) != FUNCTION_DECL /* If the called function can't throw, we don't need to generate its body to find that out. */ || TREE_NOTHROW (decl) || !cfun /* If we already know the current function can't throw, then we don't need to work hard to prove it. */ || TREE_NOTHROW (current_function_decl) --- 3006,3025 ---- However, if instantiating this function might help us mark the current function TREE_NOTHROW, we go ahead and ! instantiate it now. ! ! This is not needed for unit-at-a-time since we reorder the functions ! in topological order anyway. ! */ defer = (!flag_exceptions + || flag_unit_at_a_time + || !optimize || TREE_CODE (decl) != FUNCTION_DECL /* If the called function can't throw, we don't need to generate its body to find that out. */ || TREE_NOTHROW (decl) || !cfun + || !current_function_decl /* If we already know the current function can't throw, then we don't need to work hard to prove it. */ || TREE_NOTHROW (current_function_decl) *************** mark_used (decl) *** 4887,5082 **** } } - /* Helper function for class_head_decl and class_head_defn - nonterminals. AGGR is the class, union or struct tag. SCOPE is the - explicit scope used (NULL for no scope resolution). ID is the - name. DEFN_P is true, if this is a definition of the class and - NEW_TYPE_P is set to nonzero, if we push into the scope containing - the to be defined aggregate. - - Return a TYPE_DECL for the type declared by ID in SCOPE. */ - - tree - handle_class_head (tag_kind, scope, id, attributes, defn_p, new_type_p) - enum tag_types tag_kind; - tree scope, id, attributes; - int defn_p; - int *new_type_p; - { - tree decl = NULL_TREE; - tree type; - tree current = current_scope (); - bool xrefd_p = false; - - if (current == NULL_TREE) - current = current_namespace; - - *new_type_p = 0; - - if (scope) - { - if (TREE_CODE (id) == TYPE_DECL) - /* We must bash typedefs back to the main decl of the - type. Otherwise we become confused about scopes. */ - decl = TYPE_MAIN_DECL (TREE_TYPE (id)); - else if (DECL_CLASS_TEMPLATE_P (id)) - decl = DECL_TEMPLATE_RESULT (id); - else - { - if (TYPE_P (scope)) - { - /* According to the suggested resolution of core issue - 180, 'typename' is assumed after a class-key. */ - decl = make_typename_type (scope, id, tf_error); - if (decl != error_mark_node) - decl = TYPE_MAIN_DECL (decl); - else - decl = NULL_TREE; - } - else if (scope == current) - { - /* We've been given AGGR SCOPE::ID, when we're already - inside SCOPE. Be nice about it. */ - if (pedantic) - pedwarn ("extra qualification `%T::' on member `%D' ignored", - scope, id); - } - else - error ("`%T' does not have a class or union named `%D'", - scope, id); - } - } - - if (!decl) - { - decl = xref_tag (tag_kind, id, attributes, !defn_p); - if (decl == error_mark_node) - return error_mark_node; - decl = TYPE_MAIN_DECL (decl); - xrefd_p = true; - } - - type = TREE_TYPE (decl); - - if (!TYPE_BINFO (type)) - { - error ("`%T' is not a class or union type", decl); - return error_mark_node; - } - - /* When `A' is a template class, using `class A' without template - argument is invalid unless - - we are inside the scope of the template class `A' or one of its - specialization. - - we are declaring the template class `A' itself. */ - if (TREE_CODE (type) == RECORD_TYPE - && CLASSTYPE_IS_TEMPLATE (type) - && processing_template_decl <= template_class_depth (current) - && ! is_base_of_enclosing_class (type, current_class_type)) - { - error ("template argument is required for `%T'", type); - return error_mark_node; - } - - if (defn_p) - { - /* For a definition, we want to enter the containing scope - before looking up any base classes etc. Only do so, if this - is different to the current scope. */ - tree context = CP_DECL_CONTEXT (decl); - - if (IMPLICIT_TYPENAME_P (context)) - context = TREE_TYPE (context); - - /* If that scope does not contain the scope in which the - class was originally declared, the program is invalid. */ - if (current && !is_ancestor (current, context)) - { - error ("declaration of `%D' in `%D' which does not " - "enclose `%D'", decl, current, CP_DECL_CONTEXT (decl)); - return NULL_TREE; - } - - *new_type_p = (current != context - && TREE_CODE (context) != TEMPLATE_TYPE_PARM - && TREE_CODE (context) != BOUND_TEMPLATE_TEMPLATE_PARM); - if (*new_type_p) - push_scope (context); - - if (TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE) - /* It is valid to define a class with a different class key, - and this changes the default member access. */ - CLASSTYPE_DECLARED_CLASS (TREE_TYPE (decl)) - = (tag_kind == class_type); - - if (!xrefd_p && PROCESSING_REAL_TEMPLATE_DECL_P ()) - decl = push_template_decl (decl); - } - else - { - /* For elaborated type specifier in declaration like - - class A::B *a; - - we get an implicit typename here. Let's remove its - implicitness so that we don't issue any implicit - typename warning later. Note that when defn_p is true, - implicitness is still required by begin_class_definition. */ - if (IMPLICIT_TYPENAME_P (type)) - decl = TYPE_STUB_DECL (build_typename_type (TYPE_CONTEXT (type), - TYPE_IDENTIFIER (type), - TYPENAME_TYPE_FULLNAME (type), - NULL_TREE)); - } - - return decl; - } - - /* Like handle_class_head but for a definition of a class specialization. - DECL is a TYPE_DECL node representing the class. NEW_TYPE_P is set to - nonzero, if we push into the scope containing the to be defined - aggregate. - - Return a TYPE_DECL for the type declared by ID in SCOPE. */ - - tree - handle_class_head_apparent_template (decl, new_type_p) - tree decl; - int *new_type_p; - { - tree context; - tree current; - - if (decl == error_mark_node) - return decl; - - current = current_scope (); - if (current == NULL_TREE) - current = current_namespace; - - *new_type_p = 0; - - /* For a definition, we want to enter the containing scope - before looking up any base classes etc. Only do so, if this - is different to the current scope. */ - context = CP_DECL_CONTEXT (decl); - - if (IMPLICIT_TYPENAME_P (context)) - context = TREE_TYPE (context); - - *new_type_p = (current != context - && TREE_CODE (context) != TEMPLATE_TYPE_PARM - && TREE_CODE (context) != BOUND_TEMPLATE_TEMPLATE_PARM); - if (*new_type_p) - push_scope (context); - - if (TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE) - /* We might be specializing a template with a different - class-key. */ - CLASSTYPE_DECLARED_CLASS (TREE_TYPE (decl)) - = (current_aggr == class_type_node); - - return decl; - } - #include "gt-cp-decl2.h" --- 3032,3035 ---- diff -Nrc3pad gcc-3.3.3/gcc/cp/decl.c gcc-3.4.0/gcc/cp/decl.c *** gcc-3.3.3/gcc/cp/decl.c 2004-01-30 00:42:22.000000000 +0000 --- gcc-3.4.0/gcc/cp/decl.c 2004-04-01 20:47:21.000000000 +0000 *************** *** 1,27 **** ! /* Process declarations and variables for C compiler. Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, ! 2001, 2002, 2003 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) ! This file is part of GNU CC. ! GNU CC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ! /* Process declarations and symbol lookup for C front end. Also constructs types; the standard scalar types at initialization, and structure, union, array and enum types when they are declared. */ --- 1,27 ---- ! /* Process declarations and variables for C++ compiler. Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, ! 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) ! This file is part of GCC. ! GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ! /* Process declarations and symbol lookup for C++ front end. Also constructs types; the standard scalar types at initialization, and structure, union, array and enum types when they are declared. */ *************** Boston, MA 02111-1307, USA. */ *** 30,35 **** --- 30,37 ---- #include "config.h" #include "system.h" + #include "coretypes.h" + #include "tm.h" #include "tree.h" #include "rtl.h" #include "expr.h" *************** Boston, MA 02111-1307, USA. */ *** 42,48 **** #include "except.h" #include "toplev.h" #include "hashtab.h" - #include "ggc.h" #include "tm_p.h" #include "target.h" #include "c-common.h" --- 44,49 ---- *************** Boston, MA 02111-1307, USA. */ *** 50,153 **** #include "diagnostic.h" #include "debug.h" #include "timevar.h" - #include "input.h" ! static tree grokparms PARAMS ((tree)); ! static const char *redeclaration_error_message PARAMS ((tree, tree)); ! static void push_binding_level PARAMS ((struct cp_binding_level *, int, ! int)); ! static void pop_binding_level PARAMS ((void)); ! static void suspend_binding_level PARAMS ((void)); ! static void resume_binding_level PARAMS ((struct cp_binding_level *)); ! static struct cp_binding_level *make_binding_level PARAMS ((void)); ! static void declare_namespace_level PARAMS ((void)); ! static int decl_jump_unsafe PARAMS ((tree)); ! static void storedecls PARAMS ((tree)); ! static void require_complete_types_for_parms PARAMS ((tree)); ! static int ambi_op_p PARAMS ((enum tree_code)); ! static int unary_op_p PARAMS ((enum tree_code)); ! static cxx_saved_binding *store_bindings (tree, cxx_saved_binding *); ! static tree lookup_tag_reverse PARAMS ((tree, tree)); ! static tree lookup_name_real PARAMS ((tree, int, int, int)); ! static void push_local_name PARAMS ((tree)); ! static void warn_extern_redeclared_static PARAMS ((tree, tree)); ! static tree grok_reference_init PARAMS ((tree, tree, tree, tree *)); ! static tree grokfndecl PARAMS ((tree, tree, tree, tree, int, ! enum overload_flags, tree, ! tree, int, int, int, int, int, int, tree)); ! static tree grokvardecl PARAMS ((tree, tree, RID_BIT_TYPE *, int, int, tree)); ! static tree follow_tag_typedef PARAMS ((tree)); ! static tree lookup_tag PARAMS ((enum tree_code, tree, ! struct cp_binding_level *, int)); ! static void set_identifier_type_value_with_scope ! PARAMS ((tree, tree, struct cp_binding_level *)); ! static void record_unknown_type PARAMS ((tree, const char *)); ! static tree builtin_function_1 PARAMS ((const char *, tree, tree, int, ! enum built_in_class, const char *, ! tree)); ! static tree build_library_fn_1 PARAMS ((tree, enum tree_code, tree)); ! static int member_function_or_else PARAMS ((tree, tree, enum overload_flags)); ! static void bad_specifiers PARAMS ((tree, const char *, int, int, int, int, ! int)); ! static tree maybe_process_template_type_declaration PARAMS ((tree, int, struct cp_binding_level*)); ! static void check_for_uninitialized_const_var PARAMS ((tree)); ! static hashval_t typename_hash PARAMS ((const void *)); ! static int typename_compare PARAMS ((const void *, const void *)); ! static void push_binding PARAMS ((tree, tree, struct cp_binding_level*)); ! static int add_binding PARAMS ((tree, tree)); ! static void pop_binding PARAMS ((tree, tree)); ! static tree local_variable_p_walkfn PARAMS ((tree *, int *, void *)); ! static cxx_binding *find_binding (tree, tree, cxx_binding *); ! static tree select_decl (cxx_binding *, int); ! static int lookup_flags PARAMS ((int, int)); ! static tree qualify_lookup PARAMS ((tree, int)); ! static tree record_builtin_java_type PARAMS ((const char *, int)); ! static const char *tag_name PARAMS ((enum tag_types code)); ! static void find_class_binding_level PARAMS ((void)); ! static struct cp_binding_level *innermost_nonclass_level PARAMS ((void)); ! static void warn_about_implicit_typename_lookup PARAMS ((tree, tree)); ! static int walk_namespaces_r PARAMS ((tree, walk_namespaces_fn, void *)); ! static int walk_globals_r PARAMS ((tree, void *)); ! static int walk_vtables_r PARAMS ((tree, void*)); ! static void add_decl_to_level PARAMS ((tree, struct cp_binding_level *)); ! static tree make_label_decl PARAMS ((tree, int)); ! static void use_label PARAMS ((tree)); ! static void check_previous_goto_1 PARAMS ((tree, struct cp_binding_level *, tree, ! const char *, int)); ! static void check_previous_goto PARAMS ((struct named_label_use_list *)); ! static void check_switch_goto PARAMS ((struct cp_binding_level *)); ! static void check_previous_gotos PARAMS ((tree)); ! static void pop_label PARAMS ((tree, tree)); ! static void pop_labels PARAMS ((tree)); ! static void maybe_deduce_size_from_array_init PARAMS ((tree, tree)); ! static void layout_var_decl PARAMS ((tree)); ! static void maybe_commonize_var PARAMS ((tree)); static tree check_initializer (tree, tree, int, tree *); ! static void make_rtl_for_nonlocal_decl PARAMS ((tree, tree, const char *)); ! static void save_function_data PARAMS ((tree)); ! static void check_function_type PARAMS ((tree, tree)); ! static void begin_constructor_body PARAMS ((void)); ! static void finish_constructor_body PARAMS ((void)); ! static void begin_destructor_body PARAMS ((void)); ! static void finish_destructor_body PARAMS ((void)); ! static tree create_array_type_for_decl PARAMS ((tree, tree, tree)); ! static tree get_atexit_node PARAMS ((void)); ! static tree get_dso_handle_node PARAMS ((void)); ! static tree start_cleanup_fn PARAMS ((void)); ! static void end_cleanup_fn PARAMS ((void)); ! static tree cp_make_fname_decl PARAMS ((tree, int)); ! static void initialize_predefined_identifiers PARAMS ((void)); ! static tree check_special_function_return_type ! PARAMS ((special_function_kind, tree, tree)); ! static tree push_cp_library_fn PARAMS ((enum tree_code, tree)); ! static tree build_cp_library_fn PARAMS ((tree, enum tree_code, tree)); ! static void store_parm_decls PARAMS ((tree)); ! static int cp_missing_noreturn_ok_p PARAMS ((tree)); static void initialize_local_var (tree, tree); static void expand_static_init (tree, tree); static tree next_initializable_field (tree); static tree reshape_init (tree, tree *); /* Erroneous argument lists can use this *IFF* they do not modify it. */ tree error_mark_list; --- 51,125 ---- #include "diagnostic.h" #include "debug.h" #include "timevar.h" ! static tree grokparms (tree, tree *); ! static const char *redeclaration_error_message (tree, tree); ! static int decl_jump_unsafe (tree); ! static void require_complete_types_for_parms (tree); ! static int ambi_op_p (enum tree_code); ! static int unary_op_p (enum tree_code); ! static void push_local_name (tree); ! static tree grok_reference_init (tree, tree, tree, tree *); ! static tree grokfndecl (tree, tree, tree, tree, tree, int, ! enum overload_flags, tree, ! tree, int, int, int, int, int, int, tree); ! static tree grokvardecl (tree, tree, RID_BIT_TYPE *, int, int, tree); ! static void record_unknown_type (tree, const char *); ! static tree builtin_function_1 (const char *, tree, tree, int, ! enum built_in_class, const char *, ! tree); ! static tree build_library_fn_1 (tree, enum tree_code, tree); ! static int member_function_or_else (tree, tree, enum overload_flags); ! static void bad_specifiers (tree, const char *, int, int, int, int, ! int); ! static void check_for_uninitialized_const_var (tree); ! static hashval_t typename_hash (const void *); ! static int typename_compare (const void *, const void *); ! static tree local_variable_p_walkfn (tree *, int *, void *); ! static tree record_builtin_java_type (const char *, int); ! static const char *tag_name (enum tag_types code); ! static int walk_namespaces_r (tree, walk_namespaces_fn, void *); ! static int walk_globals_r (tree, void*); ! static int walk_vtables_r (tree, void*); ! static tree make_label_decl (tree, int); ! static void use_label (tree); ! static void check_previous_goto_1 (tree, struct cp_binding_level *, tree, ! const location_t *); ! static void check_previous_goto (struct named_label_use_list *); ! static void check_switch_goto (struct cp_binding_level *); ! static void check_previous_gotos (tree); ! static void pop_label (tree, tree); ! static void pop_labels (tree); ! static void maybe_deduce_size_from_array_init (tree, tree); ! static void layout_var_decl (tree); ! static void maybe_commonize_var (tree); static tree check_initializer (tree, tree, int, tree *); ! static void make_rtl_for_nonlocal_decl (tree, tree, const char *); ! static void save_function_data (tree); ! static void check_function_type (tree, tree); ! static void begin_constructor_body (void); ! static void finish_constructor_body (void); ! static void begin_destructor_body (void); ! static void finish_destructor_body (void); ! static tree create_array_type_for_decl (tree, tree, tree); ! static tree get_atexit_node (void); ! static tree get_dso_handle_node (void); ! static tree start_cleanup_fn (void); ! static void end_cleanup_fn (void); ! static tree cp_make_fname_decl (tree, int); ! static void initialize_predefined_identifiers (void); ! static tree check_special_function_return_type ! (special_function_kind, tree, tree); ! static tree push_cp_library_fn (enum tree_code, tree); ! static tree build_cp_library_fn (tree, enum tree_code, tree); ! static void store_parm_decls (tree); ! static int cp_missing_noreturn_ok_p (tree); static void initialize_local_var (tree, tree); static void expand_static_init (tree, tree); static tree next_initializable_field (tree); static tree reshape_init (tree, tree *); + static tree build_typename_type (tree, tree, tree); /* Erroneous argument lists can use this *IFF* they do not modify it. */ tree error_mark_list; *************** tree error_mark_list; *** 168,174 **** tree ptm_desc_type_node; tree base_desc_type_node; ! tree class_type_node, record_type_node, union_type_node, enum_type_node; tree unknown_type_node; Array type `vtable_entry_type[]' --- 140,146 ---- tree ptm_desc_type_node; tree base_desc_type_node; ! tree class_type_node; tree unknown_type_node; Array type `vtable_entry_type[]' *************** tree cp_global_trees[CPTI_MAX]; *** 202,211 **** /* Indicates that there is a type value in some namespace, although that is not necessarily in scope at the moment. */ ! static GTY(()) tree global_type_node; ! /* Expect only namespace names now. */ ! static int only_namespace_names; /* Used only for jumps to as-yet undefined labels, since jumps to defined labels can have their validity checked immediately. */ --- 174,183 ---- /* Indicates that there is a type value in some namespace, although that is not necessarily in scope at the moment. */ ! tree global_type_node; ! /* The node that holds the "name" of the global scope. */ ! tree global_scope_name; /* Used only for jumps to as-yet undefined labels, since jumps to defined labels can have their validity checked immediately. */ *************** struct named_label_use_list GTY(()) *** 215,222 **** struct cp_binding_level *binding_level; tree names_in_scope; tree label_decl; ! const char *filename_o_goto; ! int lineno_o_goto; struct named_label_use_list *next; }; --- 187,193 ---- struct cp_binding_level *binding_level; tree names_in_scope; tree label_decl; ! location_t o_goto_locus; struct named_label_use_list *next; }; *************** tree static_aggregates; *** 236,244 **** tree integer_two_node, integer_three_node; - /* Similar, for last_function_parm_tags. */ - tree last_function_parms; - /* A list of all LABEL_DECLs in the function that have names. Here so we can clear out their names' definitions at the end of the function, and so we can check the validity of jumps to these labels. */ --- 207,212 ---- *************** struct named_label_list GTY(()) *** 257,266 **** #define named_labels cp_function_chain->x_named_labels - /* The name of the anonymous namespace, throughout this translation - unit. */ - tree anonymous_namespace_name; - /* The number of function bodies which we are currently processing. (Zero if we are at namespace scope, one inside the body of a function, two inside the body of a function in a local class, etc.) */ --- 225,230 ---- *************** int adding_implicit_members = 0; *** 288,957 **** bool have_extern_spec; - /* Compute the chain index of a binding_entry given the HASH value of its - name and the total COUNT of chains. COUNT is assumed to be a power - of 2. */ - #define ENTRY_INDEX(HASH, COUNT) (((HASH) >> 3) & ((COUNT) - 1)) - - /* A free list of "binding_entry"s awaiting for re-use. */ - static GTY((deletable(""))) binding_entry free_binding_entry; - - /* Create a binding_entry object for (NAME, TYPE). */ - static inline binding_entry - binding_entry_make (tree name, tree type) - { - binding_entry entry; - - if (free_binding_entry) - { - entry = free_binding_entry; - free_binding_entry = entry->chain; - } - else - entry = ggc_alloc (sizeof (struct binding_entry_s)); - - entry->name = name; - entry->type = type; - - return entry; - } - - /* Put ENTRY back on the free list. */ - static inline void - binding_entry_free (binding_entry entry) - { - entry->chain = free_binding_entry; - free_binding_entry = entry; - } - - /* The datatype used to implement the mapping from names to types at - a given scope. */ - struct binding_table_s GTY(()) - { - /* Array of chains of "binding_entry"s */ - binding_entry * GTY((length ("%h.chain_count"))) chain; - - /* The number of chains in this table. This is the length of the - the member "chaiin" considered as an array. */ - size_t chain_count; - - /* Number of "binding_entry"s in this table. */ - size_t entry_count; - }; - - /* These macros indicate the initial chains count for binding_table. */ - #define SCOPE_DEFAULT_HT_SIZE (1 << 3) - #define CLASS_SCOPE_HT_SIZE (1 << 3) - #define NAMESPACE_ORDINARY_HT_SIZE (1 << 5) - #define NAMESPACE_STD_HT_SIZE (1 << 8) - #define GLOBAL_SCOPE_HT_SIZE (1 << 8) - - /* Construct TABLE with an initial CHAIN_COUNT. */ - static inline void - binding_table_construct (binding_table table, size_t chain_count) - { - table->chain_count = chain_count; - table->entry_count = 0; - table->chain = ggc_alloc_cleared - (table->chain_count * sizeof (binding_entry)); - } - - /* Free TABLE by making its entries ready for reuse. */ - static inline void - binding_table_free (binding_table table) - { - size_t i; - if (table == NULL) - return; - - for (i = 0; i < table->chain_count; ++i) - { - while (table->chain[i] != NULL) - { - binding_entry entry = table->chain[i]; - table->chain[i] = entry->chain; - binding_entry_free (entry); - } - } - table->entry_count = 0; - } - - /* Allocate a table with CHAIN_COUNT, assumed to be a power of two. */ - static inline binding_table - binding_table_new (size_t chain_count) - { - binding_table table = ggc_alloc (sizeof (struct binding_table_s)); - binding_table_construct (table, chain_count); - return table; - } - - /* Expand TABLE to twice its current chain_count. */ - static void - binding_table_expand (binding_table table) - { - const size_t old_chain_count = table->chain_count; - const size_t old_entry_count = table->entry_count; - const size_t new_chain_count = 2 * old_chain_count; - binding_entry *old_chains = table->chain; - size_t i; - - binding_table_construct (table, new_chain_count); - for (i = 0; i < old_chain_count; ++i) - { - binding_entry entry = old_chains[i]; - for (; entry != NULL; entry = old_chains[i]) - { - const unsigned int hash = IDENTIFIER_HASH_VALUE (entry->name); - const size_t j = ENTRY_INDEX (hash, new_chain_count); - - old_chains[i] = entry->chain; - entry->chain = table->chain[j]; - table->chain[j] = entry; - } - } - table->entry_count = old_entry_count; - } - - /* Insert a binding for NAME to TYPe into TABLE. */ - static inline void - binding_table_insert (binding_table table, tree name, tree type) - { - const unsigned int hash = IDENTIFIER_HASH_VALUE (name); - const size_t i = ENTRY_INDEX (hash, table->chain_count); - binding_entry entry = binding_entry_make (name, type); - - entry->chain = table->chain[i]; - table->chain[i] = entry; - ++table->entry_count; - - if (3 * table->chain_count < 5 * table->entry_count) - binding_table_expand (table); - } - - /* Return the binding_entry, if any, that maps NAME. */ - binding_entry - binding_table_find (binding_table table, tree name) - { - const unsigned int hash = IDENTIFIER_HASH_VALUE (name); - binding_entry entry = table->chain[ENTRY_INDEX (hash, table->chain_count)]; - - while (entry != NULL && entry->name != name) - entry = entry->chain; - - return entry; - } - - /* Return the binding_entry, if any, that maps name to an anonymous type. */ - static inline tree - binding_table_find_anon_type (binding_table table, tree name) - { - const unsigned int hash = IDENTIFIER_HASH_VALUE (name); - binding_entry entry = table->chain[ENTRY_INDEX (hash, table->chain_count)]; - - while (entry != NULL && TYPE_IDENTIFIER (entry->type) != name) - entry = entry->chain; - - return entry ? entry->type : NULL; - } - - /* Return the binding_entry, if any, that has TYPE as target. If NAME - is non-null, then set the domain and rehash that entry. */ - static inline binding_entry - binding_table_reverse_maybe_remap (binding_table table, tree type, tree name) - { - const size_t chain_count = table->chain_count; - binding_entry entry = NULL; - binding_entry *p = NULL; - size_t i; - - for (i = 0; i < chain_count && entry == NULL; ++i) - { - p = &table->chain[i]; - while (*p != NULL && entry == NULL) - if ((*p)->type == type) - entry = *p; - else - p = &(*p)->chain; - } - - if (entry != NULL && name != NULL && entry->name != name) - { - /* Remove the bucket from the previous chain. */ - *p = (*p)->chain; - - /* Remap the name type to type. */ - i = ENTRY_INDEX (IDENTIFIER_HASH_VALUE (name), chain_count); - entry->chain = table->chain[i]; - entry->name = name; - table->chain[i] = entry; - } - - return entry; - } - - /* Remove from TABLE all entries that map to anonymous enums or - class-types. */ - static void - binding_table_remove_anonymous_types (binding_table table) - { - const size_t chain_count = table->chain_count; - size_t i; - - for (i = 0; i < chain_count; ++i) - { - binding_entry *p = &table->chain[i]; - - while (*p != NULL) - if (ANON_AGGRNAME_P ((*p)->name)) - { - binding_entry e = *p; - *p = (*p)->chain; - --table->entry_count; - binding_entry_free (e); - } - else - p = &(*p)->chain; - } - } - - /* Apply PROC -- with DATA -- to all entries in TABLE. */ - void - binding_table_foreach (binding_table table, bt_foreach_proc proc, void *data) - { - const size_t chain_count = table->chain_count; - size_t i; - - for (i = 0; i < chain_count; ++i) - { - binding_entry entry = table->chain[i]; - for (; entry != NULL; entry = entry->chain) - proc (entry, data); - } - } - - - /* For each binding contour we allocate a binding_level structure - which records the names defined in that contour. - Contours include: - 0) the global one - 1) one for each function definition, - where internal declarations of the parameters appear. - 2) one for each compound statement, - to record its declarations. - - The current meaning of a name can be found by searching the levels - from the current one out to the global one. - - Off to the side, may be the class_binding_level. This exists only - to catch class-local declarations. It is otherwise nonexistent. - - Also there may be binding levels that catch cleanups that must be - run when exceptions occur. Thus, to see whether a name is bound in - the current scope, it is not enough to look in the - CURRENT_BINDING_LEVEL. You should use lookup_name_current_level - instead. */ - - /* Note that the information in the `names' component of the global contour - is duplicated in the IDENTIFIER_GLOBAL_VALUEs of all identifiers. */ - - struct cp_binding_level GTY(()) - { - /* A chain of _DECL nodes for all variables, constants, functions, - and typedef types. These are in the reverse of the order - supplied. There may be OVERLOADs on this list, too, but they - are wrapped in TREE_LISTs; the TREE_VALUE is the OVERLOAD. */ - tree names; - - /* Count of elements in names chain. */ - size_t names_size; - - /* A chain of NAMESPACE_DECL nodes. */ - tree namespaces; - - /* An array of static functions and variables (for namespaces only) */ - varray_type static_decls; - - /* A chain of VTABLE_DECL nodes. */ - tree vtables; - - /* A dictionary for looking up enums or class-types names. */ - binding_table type_decls; - - /* A list of USING_DECL nodes. */ - tree usings; - - /* A list of used namespaces. PURPOSE is the namespace, - VALUE the common ancestor with this binding_level's namespace. */ - tree using_directives; - - /* If this binding level is the binding level for a class, then - class_shadowed is a TREE_LIST. The TREE_PURPOSE of each node - is the name of an entity bound in the class. The TREE_TYPE is - the DECL bound by this name in the class. */ - tree class_shadowed; - - /* Similar to class_shadowed, but for IDENTIFIER_TYPE_VALUE, and - is used for all binding levels. In addition the TREE_VALUE is the - IDENTIFIER_TYPE_VALUE before we entered the class. */ - tree type_shadowed; - - /* A TREE_LIST. Each TREE_VALUE is the LABEL_DECL for a local - label in this scope. The TREE_PURPOSE is the previous value of - the IDENTIFIER_LABEL VALUE. */ - tree shadowed_labels; - - /* For each level (except not the global one), - a chain of BLOCK nodes for all the levels - that were entered and exited one level down. */ - tree blocks; - - /* The _TYPE node for this level, if parm_flag == 2. */ - tree this_class; - - /* The binding level which this one is contained in (inherits from). */ - struct cp_binding_level *level_chain; - - /* List of VAR_DECLS saved from a previous for statement. - These would be dead in ISO-conforming code, but might - be referenced in ARM-era code. These are stored in a - TREE_LIST; the TREE_VALUE is the actual declaration. */ - tree dead_vars_from_for; - - /* 1 for the level that holds the parameters of a function. - 2 for the level that holds a class declaration. */ - unsigned parm_flag : 2; - - /* 1 means make a BLOCK for this level regardless of all else. - 2 for temporary binding contours created by the compiler. */ - unsigned keep : 2; - - /* Nonzero if this level "doesn't exist" for tags. */ - unsigned tag_transparent : 1; - - /* Nonzero if this level can safely have additional - cleanup-needing variables added to it. */ - unsigned more_cleanups_ok : 1; - unsigned have_cleanups : 1; - - /* Nonzero if this scope is for storing the decls for template - parameters and generic decls; these decls will be discarded and - replaced with a TEMPLATE_DECL. */ - unsigned template_parms_p : 1; - - /* Nonzero if this scope corresponds to the `<>' in a - `template <>' clause. Whenever this flag is set, - TEMPLATE_PARMS_P will be set as well. */ - unsigned template_spec_p : 1; - - /* This is set for a namespace binding level. */ - unsigned namespace_p : 1; - - /* True if this level is that of a for-statement where we need to - worry about ambiguous (ARM or ISO) scope rules. */ - unsigned is_for_scope : 1; - - /* True if this level corresponds to a TRY block. Currently this - information is only available while building the tree structure. */ - unsigned is_try_scope : 1; - - /* True if this level corresponds to a CATCH block. Currently this - information is only available while building the tree structure. */ - unsigned is_catch_scope : 1; - - /* Three bits left for this word. */ - - /* Binding depth at which this level began. */ - unsigned binding_depth; - }; - - #define NULL_BINDING_LEVEL ((struct cp_binding_level *) NULL) - - /* True if SCOPE designates the global scope binding contour. */ - #define global_scope_p(SCOPE) \ - ((SCOPE) == NAMESPACE_LEVEL (global_namespace)) - - /* The binding level currently in effect. */ - - #define current_binding_level \ - (cfun && cp_function_chain->bindings \ - ? cp_function_chain->bindings \ - : scope_chain->bindings) - - /* The binding level of the current class, if any. */ - - #define class_binding_level scope_chain->class_bindings - - /* A chain of binding_level structures awaiting reuse. */ - - static GTY((deletable (""))) struct cp_binding_level *free_binding_level; - - /* Nonzero means unconditionally make a BLOCK for the next level pushed. */ - - static int keep_next_level_flag; - /* A TREE_LIST of VAR_DECLs. The TREE_PURPOSE is a RECORD_TYPE or UNION_TYPE; the TREE_VALUE is a VAR_DECL with that type. At the time the VAR_DECL was declared, the type was incomplete. */ static GTY(()) tree incomplete_vars; - - #ifndef ENABLE_SCOPE_CHECKING - # define ENABLE_SCOPE_CHECKING 0 - #else - # define ENABLE_SCOPE_CHECKING 1 - #endif - - static unsigned binding_depth = 0; - static int is_class_level = 0; - - static void - indent (unsigned depth) - { - unsigned i; - - for (i = 0; i < depth * 2; i++) - putc (' ', stderr); - } - - static tree pushdecl_with_scope PARAMS ((tree, struct cp_binding_level *)); - - static void - push_binding_level (newlevel, tag_transparent, keep) - struct cp_binding_level *newlevel; - int tag_transparent, keep; - { - /* Add this level to the front of the chain (stack) of levels that - are active. */ - memset ((char*) newlevel, 0, sizeof (struct cp_binding_level)); - newlevel->level_chain = current_binding_level; - current_binding_level = newlevel; - newlevel->tag_transparent = tag_transparent; - newlevel->more_cleanups_ok = 1; - - newlevel->keep = keep; - if (ENABLE_SCOPE_CHECKING) - { - newlevel->binding_depth = binding_depth; - indent (binding_depth); - verbatim ("push %s level %p line %d\n", - (is_class_level) ? "class" : "block", - (void *) newlevel, lineno); - is_class_level = 0; - binding_depth++; - } - } - - /* Find the innermost enclosing class scope, and reset - CLASS_BINDING_LEVEL appropriately. */ - - static void - find_class_binding_level () - { - struct cp_binding_level *level = current_binding_level; - - while (level && level->parm_flag != 2) - level = level->level_chain; - if (level && level->parm_flag == 2) - class_binding_level = level; - else - class_binding_level = 0; - } - - static void - pop_binding_level () - { - if (NAMESPACE_LEVEL (global_namespace)) - /* Cannot pop a level, if there are none left to pop. */ - my_friendly_assert (!global_scope_p (current_binding_level), 20030527); - /* Pop the current level, and free the structure for reuse. */ - if (ENABLE_SCOPE_CHECKING) - { - indent (--binding_depth); - verbatim ("pop %s level %p line %d\n", - (is_class_level) ? "class" : "block", - (void *) current_binding_level, lineno); - if (is_class_level != (current_binding_level == class_binding_level)) - { - indent (binding_depth); - verbatim ("XXX is_class_level != (current_binding_level " - "== class_binding_level)\n"); - } - is_class_level = 0; - } - { - register struct cp_binding_level *level = current_binding_level; - current_binding_level = current_binding_level->level_chain; - level->level_chain = free_binding_level; - if (level->parm_flag != 2) - binding_table_free (level->type_decls); - else - level->type_decls = NULL; - my_friendly_assert (!ENABLE_SCOPE_CHECKING - || level->binding_depth == binding_depth, 20030529); - free_binding_level = level; - find_class_binding_level (); - } - } - - static void - suspend_binding_level () - { - if (class_binding_level) - current_binding_level = class_binding_level; - - if (NAMESPACE_LEVEL (global_namespace)) - my_friendly_assert (!global_scope_p (current_binding_level), 20030527); - /* Suspend the current level. */ - if (ENABLE_SCOPE_CHECKING) - { - indent (--binding_depth); - verbatim("suspend %s level %p line %d\n", - (is_class_level) ? "class" : "block", - (void *) current_binding_level, lineno); - if (is_class_level != (current_binding_level == class_binding_level)) - { - indent (binding_depth); - verbatim ("XXX is_class_level != (current_binding_level " - "== class_binding_level)\n"); - } - is_class_level = 0; - } - current_binding_level = current_binding_level->level_chain; - find_class_binding_level (); - } - - static void - resume_binding_level (b) - struct cp_binding_level *b; - { - /* Resuming binding levels is meant only for namespaces, - and those cannot nest into classes. */ - my_friendly_assert(!class_binding_level, 386); - /* Also, resuming a non-directly nested namespace is a no-no. */ - my_friendly_assert(b->level_chain == current_binding_level, 386); - current_binding_level = b; - if (ENABLE_SCOPE_CHECKING) - { - b->binding_depth = binding_depth; - indent (binding_depth); - verbatim ("resume %s level %p line %d\n", - (is_class_level) ? "class" : "block", (void *) b, lineno); - is_class_level = 0; - binding_depth++; - } - } - /* Create a new `struct cp_binding_level'. */ - - static - struct cp_binding_level * - make_binding_level () - { - /* NOSTRICT */ - return (struct cp_binding_level *) ggc_alloc (sizeof (struct cp_binding_level)); - } - - /* Nonzero if we are currently in the global binding level. */ - - int - global_bindings_p () - { - return global_scope_p (current_binding_level); - } - - /* Return the innermost binding level that is not for a class scope. */ - - static struct cp_binding_level * - innermost_nonclass_level () - { - struct cp_binding_level *b; - - b = current_binding_level; - while (b->parm_flag == 2) - b = b->level_chain; - - return b; - } - - /* Nonzero if we are currently in a toplevel binding level. This - means either the global binding level or a namespace in a toplevel - binding level. Since there are no non-toplevel namespace levels, - this really means any namespace or template parameter level. We - also include a class whose context is toplevel. */ - - int - toplevel_bindings_p () - { - struct cp_binding_level *b = innermost_nonclass_level (); - - return b->namespace_p || b->template_parms_p; - } - - /* Nonzero if this is a namespace scope, or if we are defining a class - which is itself at namespace scope, or whose enclosing class is - such a class, etc. */ - - int - namespace_bindings_p () - { - struct cp_binding_level *b = innermost_nonclass_level (); - - return b->namespace_p; - } - - /* If KEEP is nonzero, make a BLOCK node for the next binding level, - unconditionally. Otherwise, use the normal logic to decide whether - or not to create a BLOCK. */ - - void - keep_next_level (keep) - int keep; - { - keep_next_level_flag = keep; - } - - /* Nonzero if the current level needs to have a BLOCK made. */ - - int - kept_level_p () - { - return (current_binding_level->blocks != NULL_TREE - || current_binding_level->keep - || current_binding_level->names != NULL_TREE - || (current_binding_level->type_decls != NULL - && !current_binding_level->tag_transparent)); - } - - /* Returns the kind of the innermost scope. */ - - bool - innermost_scope_is_class_p () - { - return current_binding_level->parm_flag == 2; - } - - static void - declare_namespace_level () - { - current_binding_level->namespace_p = 1; - } - - /* Returns nonzero if this scope was created to store template - parameters. */ - - int - template_parm_scope_p () - { - return current_binding_level->template_parms_p; - } - /* Returns the kind of template specialization we are currently processing, given that it's declaration contained N_CLASS_SCOPES explicit scope qualifications. */ tmpl_spec_kind ! current_tmpl_spec_kind (n_class_scopes) ! int n_class_scopes; { int n_template_parm_scopes = 0; int seen_specialization_p = 0; --- 252,269 ---- bool have_extern_spec; /* A TREE_LIST of VAR_DECLs. The TREE_PURPOSE is a RECORD_TYPE or UNION_TYPE; the TREE_VALUE is a VAR_DECL with that type. At the time the VAR_DECL was declared, the type was incomplete. */ static GTY(()) tree incomplete_vars; /* Returns the kind of template specialization we are currently processing, given that it's declaration contained N_CLASS_SCOPES explicit scope qualifications. */ tmpl_spec_kind ! current_tmpl_spec_kind (int n_class_scopes) { int n_template_parm_scopes = 0; int seen_specialization_p = 0; *************** current_tmpl_spec_kind (n_class_scopes) *** 959,965 **** struct cp_binding_level *b; /* Scan through the template parameter scopes. */ ! for (b = current_binding_level; b->template_parms_p; b = b->level_chain) { /* If we see a specialization scope inside a parameter scope, then something is wrong. That corresponds to a declaration --- 271,279 ---- struct cp_binding_level *b; /* Scan through the template parameter scopes. */ ! for (b = current_binding_level; ! b->kind == sk_template_parms; ! b = b->level_chain) { /* If we see a specialization scope inside a parameter scope, then something is wrong. That corresponds to a declaration *************** current_tmpl_spec_kind (n_class_scopes) *** 970,976 **** which is always invalid since [temp.expl.spec] forbids the specialization of a class member template if the enclosing class templates are not explicitly specialized as well. */ ! if (b->template_spec_p) { if (n_template_parm_scopes == 0) innermost_specialization_p = 1; --- 284,290 ---- which is always invalid since [temp.expl.spec] forbids the specialization of a class member template if the enclosing class templates are not explicitly specialized as well. */ ! if (b->explicit_spec_p) { if (n_template_parm_scopes == 0) innermost_specialization_p = 1; *************** current_tmpl_spec_kind (n_class_scopes) *** 1034,1472 **** return innermost_specialization_p ? tsk_expl_spec : tsk_template; } - void - set_class_shadows (shadows) - tree shadows; - { - class_binding_level->class_shadowed = shadows; - } - - /* Enter a new binding level. - If TAG_TRANSPARENT is nonzero, do so only for the name space of variables, - not for that of tags. */ - - void - pushlevel (tag_transparent) - int tag_transparent; - { - struct cp_binding_level *newlevel; - - if (cfun && !doing_semantic_analysis_p ()) - return; - - /* Reuse or create a struct for this binding level. */ - if (!ENABLE_SCOPE_CHECKING && free_binding_level) - { - newlevel = free_binding_level; - free_binding_level = free_binding_level->level_chain; - } - else - newlevel = make_binding_level (); - - push_binding_level (newlevel, tag_transparent, keep_next_level_flag); - keep_next_level_flag = 0; - } - - /* We're defining an object of type TYPE. If it needs a cleanup, but - we're not allowed to add any more objects with cleanups to the current - scope, create a new binding level. */ - - void - maybe_push_cleanup_level (type) - tree type; - { - if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type) - && current_binding_level->more_cleanups_ok == 0) - { - keep_next_level (2); - pushlevel (1); - clear_last_expr (); - add_scope_stmt (/*begin_p=*/1, /*partial_p=*/1); - } - } - - /* Enter a new scope. The KIND indicates what kind of scope is being - created. */ - - void - begin_scope (sk) - scope_kind sk; - { - pushlevel (0); - - switch (sk) - { - case sk_template_spec: - current_binding_level->template_spec_p = 1; - /* Fall through. */ - - case sk_template_parms: - current_binding_level->template_parms_p = 1; - break; - - default: - abort (); - } - } - /* Exit the current scope. */ void ! finish_scope () { poplevel (0, 0, 0); } - void - note_level_for_for () - { - current_binding_level->is_for_scope = 1; - } - - /* Record that the current binding level represents a try block. */ - - void - note_level_for_try () - { - current_binding_level->is_try_scope = 1; - } - - /* Record that the current binding level represents a catch block. */ - - void - note_level_for_catch () - { - current_binding_level->is_catch_scope = 1; - } - - /* For a binding between a name and an entity at a block scope, - this is the `struct cp_binding_level' for the block. */ - #define BINDING_LEVEL(NODE) ((NODE)->scope.level) - - /* A free list of "cxx_binding"s, connected by their PREVIOUS. */ - - static GTY((deletable (""))) cxx_binding *free_bindings; - - /* Make DECL the innermost binding for ID. The LEVEL is the binding - level at which this declaration is being bound. */ - - static void - push_binding (id, decl, level) - tree id; - tree decl; - struct cp_binding_level* level; - { - cxx_binding *binding; - - if (free_bindings) - { - binding = free_bindings; - free_bindings = binding->previous; - } - else - binding = cxx_binding_make (); - - /* Now, fill in the binding information. */ - BINDING_VALUE (binding) = decl; - BINDING_TYPE (binding) = NULL_TREE; - BINDING_LEVEL (binding) = level; - INHERITED_VALUE_BINDING_P (binding) = 0; - LOCAL_BINDING_P (binding) = (level != class_binding_level); - BINDING_HAS_LEVEL_P (binding) = 1; - - /* And put it on the front of the list of bindings for ID. */ - binding->previous = IDENTIFIER_BINDING (id); - IDENTIFIER_BINDING (id) = binding; - } - - /* ID is already bound in the current scope. But, DECL is an - additional binding for ID in the same scope. This is the `struct - stat' hack whereby a non-typedef class-name or enum-name can be - bound at the same level as some other kind of entity. It's the - responsibility of the caller to check that inserting this name is - valid here. Returns nonzero if the new binding was successful. */ - static int - add_binding (id, decl) - tree id; - tree decl; - { - cxx_binding *binding = IDENTIFIER_BINDING (id); - int ok = 1; - - timevar_push (TV_NAME_LOOKUP); - if (TREE_CODE (decl) == TYPE_DECL && DECL_ARTIFICIAL (decl)) - /* The new name is the type name. */ - BINDING_TYPE (binding) = decl; - else if (!BINDING_VALUE (binding)) - /* This situation arises when push_class_level_binding moves an - inherited type-binding out of the way to make room for a new - value binding. */ - BINDING_VALUE (binding) = decl; - else if (TREE_CODE (BINDING_VALUE (binding)) == TYPE_DECL - && DECL_ARTIFICIAL (BINDING_VALUE (binding))) - { - /* The old binding was a type name. It was placed in - BINDING_VALUE because it was thought, at the point it was - declared, to be the only entity with such a name. Move the - type name into the type slot; it is now hidden by the new - binding. */ - BINDING_TYPE (binding) = BINDING_VALUE (binding); - BINDING_VALUE (binding) = decl; - INHERITED_VALUE_BINDING_P (binding) = 0; - } - else if (TREE_CODE (BINDING_VALUE (binding)) == TYPE_DECL - && TREE_CODE (decl) == TYPE_DECL - && DECL_NAME (decl) == DECL_NAME (BINDING_VALUE (binding)) - && (same_type_p (TREE_TYPE (decl), - TREE_TYPE (BINDING_VALUE (binding))) - /* If either type involves template parameters, we must - wait until instantiation. */ - || uses_template_parms (TREE_TYPE (decl)) - || uses_template_parms (TREE_TYPE (BINDING_VALUE (binding))))) - /* We have two typedef-names, both naming the same type to have - the same name. This is OK because of: - - [dcl.typedef] - - In a given scope, a typedef specifier can be used to redefine - the name of any type declared in that scope to refer to the - type to which it already refers. */ - ok = 0; - /* There can be two block-scope declarations of the same variable, - so long as they are `extern' declarations. However, there cannot - be two declarations of the same static data member: - - [class.mem] - - A member shall not be declared twice in the - member-specification. */ - else if (TREE_CODE (decl) == VAR_DECL - && TREE_CODE (BINDING_VALUE (binding)) == VAR_DECL - && DECL_EXTERNAL (decl) - && DECL_EXTERNAL (BINDING_VALUE (binding)) - && !DECL_CLASS_SCOPE_P (decl)) - { - duplicate_decls (decl, BINDING_VALUE (binding)); - ok = 0; - } - else - { - error ("declaration of `%#D'", decl); - cp_error_at ("conflicts with previous declaration `%#D'", - BINDING_VALUE (binding)); - ok = 0; - } - - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, ok); - } - - /* Add DECL to the list of things declared in B. */ - - static void - add_decl_to_level (decl, b) - tree decl; - struct cp_binding_level *b; - { - if (TREE_CODE (decl) == NAMESPACE_DECL - && !DECL_NAMESPACE_ALIAS (decl)) - { - TREE_CHAIN (decl) = b->namespaces; - b->namespaces = decl; - } - else if (TREE_CODE (decl) == VAR_DECL && DECL_VIRTUAL_P (decl)) - { - TREE_CHAIN (decl) = b->vtables; - b->vtables = decl; - } - else - { - /* We build up the list in reverse order, and reverse it later if - necessary. */ - TREE_CHAIN (decl) = b->names; - b->names = decl; - b->names_size++; - - /* If appropriate, add decl to separate list of statics */ - if (b->namespace_p) - if ((TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)) - || (TREE_CODE (decl) == FUNCTION_DECL - && (!TREE_PUBLIC (decl) || DECL_DECLARED_INLINE_P (decl)))) - VARRAY_PUSH_TREE (b->static_decls, decl); - } - } - - /* Bind DECL to ID in the current_binding_level, assumed to be a local - binding level. If PUSH_USING is set in FLAGS, we know that DECL - doesn't really belong to this binding level, that it got here - through a using-declaration. */ - - void - push_local_binding (id, decl, flags) - tree id; - tree decl; - int flags; - { - struct cp_binding_level *b; - - /* Skip over any local classes. This makes sense if we call - push_local_binding with a friend decl of a local class. */ - b = current_binding_level; - while (b->parm_flag == 2) - b = b->level_chain; - - if (lookup_name_current_level (id)) - { - /* Supplement the existing binding. */ - if (!add_binding (id, decl)) - /* It didn't work. Something else must be bound at this - level. Do not add DECL to the list of things to pop - later. */ - return; - } - else - /* Create a new binding. */ - push_binding (id, decl, b); - - if (TREE_CODE (decl) == OVERLOAD || (flags & PUSH_USING)) - /* We must put the OVERLOAD into a TREE_LIST since the - TREE_CHAIN of an OVERLOAD is already used. Similarly for - decls that got here through a using-declaration. */ - decl = build_tree_list (NULL_TREE, decl); - - /* And put DECL on the list of things declared by the current - binding level. */ - add_decl_to_level (decl, b); - } - - /* Bind DECL to ID in the class_binding_level. Returns nonzero if the - binding was successful. */ - - int - push_class_binding (id, decl) - tree id; - tree decl; - { - int result = 1; - cxx_binding *binding = IDENTIFIER_BINDING (id); - tree context; - - timevar_push (TV_NAME_LOOKUP); - /* Note that we declared this value so that we can issue an error if - this is an invalid redeclaration of a name already used for some - other purpose. */ - note_name_declared_in_class (id, decl); - - if (binding && BINDING_LEVEL (binding) == class_binding_level) - /* Supplement the existing binding. */ - result = add_binding (id, decl); - else - /* Create a new binding. */ - push_binding (id, decl, class_binding_level); - - /* Update the IDENTIFIER_CLASS_VALUE for this ID to be the - class-level declaration. Note that we do not use DECL here - because of the possibility of the `struct stat' hack; if DECL is - a class-name or enum-name we might prefer a field-name, or some - such. */ - IDENTIFIER_CLASS_VALUE (id) = BINDING_VALUE (IDENTIFIER_BINDING (id)); - - /* If this is a binding from a base class, mark it as such. */ - binding = IDENTIFIER_BINDING (id); - if (BINDING_VALUE (binding) == decl && TREE_CODE (decl) != TREE_LIST) - { - /* Any implicit typename must be from a base-class. The - context for an implicit typename declaration is always - the derived class in which the lookup was done, so the checks - based on the context of DECL below will not trigger. */ - if (IMPLICIT_TYPENAME_TYPE_DECL_P (decl)) - INHERITED_VALUE_BINDING_P (binding) = 1; - else - { - if (TREE_CODE (decl) == OVERLOAD) - context = CP_DECL_CONTEXT (OVL_CURRENT (decl)); - else - { - my_friendly_assert (DECL_P (decl), 0); - context = context_for_name_lookup (decl); - } - - if (is_properly_derived_from (current_class_type, context)) - INHERITED_VALUE_BINDING_P (binding) = 1; - else - INHERITED_VALUE_BINDING_P (binding) = 0; - } - } - else if (BINDING_VALUE (binding) == decl) - /* We only encounter a TREE_LIST when push_class_decls detects an - ambiguity. Such an ambiguity can be overridden by a definition - in this class. */ - INHERITED_VALUE_BINDING_P (binding) = 1; - - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, result); - } - - /* Remove the binding for DECL which should be the innermost binding - for ID. */ - - static void - pop_binding (id, decl) - tree id; - tree decl; - { - cxx_binding *binding; - - if (id == NULL_TREE) - /* It's easiest to write the loops that call this function without - checking whether or not the entities involved have names. We - get here for such an entity. */ - return; - - /* Get the innermost binding for ID. */ - binding = IDENTIFIER_BINDING (id); - - /* The name should be bound. */ - my_friendly_assert (binding != NULL, 0); - - /* The DECL will be either the ordinary binding or the type - binding for this identifier. Remove that binding. */ - if (BINDING_VALUE (binding) == decl) - BINDING_VALUE (binding) = NULL_TREE; - else if (BINDING_TYPE (binding) == decl) - BINDING_TYPE (binding) = NULL_TREE; - else - abort (); - - if (!BINDING_VALUE (binding) && !BINDING_TYPE (binding)) - { - /* We're completely done with the innermost binding for this - identifier. Unhook it from the list of bindings. */ - IDENTIFIER_BINDING (id) = binding->previous; - - /* Add it to the free list. */ - binding->previous = free_bindings; - free_bindings = binding; - - /* Clear the BINDING_LEVEL so the garbage collector doesn't walk - it. */ - BINDING_LEVEL (binding) = NULL; - } - } - /* When a label goes out of scope, check to see if that label was used in a valid manner, and issue any appropriate warnings or errors. */ static void ! pop_label (label, old_value) ! tree label; ! tree old_value; { ! if (!processing_template_decl && doing_semantic_analysis_p ()) { if (DECL_INITIAL (label) == NULL_TREE) { cp_error_at ("label `%D' used but not defined", label); /* Avoid crashing later. */ ! define_label (input_filename, 1, DECL_NAME (label)); } else if (warn_unused_label && !TREE_USED (label)) cp_warning_at ("label `%D' defined but not used", label); --- 348,378 ---- return innermost_specialization_p ? tsk_expl_spec : tsk_template; } /* Exit the current scope. */ void ! finish_scope (void) { poplevel (0, 0, 0); } /* When a label goes out of scope, check to see if that label was used in a valid manner, and issue any appropriate warnings or errors. */ static void ! pop_label (tree label, tree old_value) { ! if (!processing_template_decl) { if (DECL_INITIAL (label) == NULL_TREE) { + location_t location; + cp_error_at ("label `%D' used but not defined", label); + location.file = input_filename; + location.line = 0; /* Avoid crashing later. */ ! define_label (location, DECL_NAME (label)); } else if (warn_unused_label && !TREE_USED (label)) cp_warning_at ("label `%D' defined but not used", label); *************** pop_label (label, old_value) *** 1480,1487 **** function. */ static void ! pop_labels (block) ! tree block; { struct named_label_list *link; --- 386,392 ---- function. */ static void ! pop_labels (tree block) { struct named_label_list *link; *************** pop_labels (block) *** 1515,1526 **** them into the BLOCK. */ tree ! poplevel (keep, reverse, functionbody) ! int keep; ! int reverse; ! int functionbody; { ! register tree link; /* The chain of decls was accumulated in reverse order. Put it into forward order, just for cleanliness. */ tree decls; --- 420,428 ---- them into the BLOCK. */ tree ! poplevel (int keep, int reverse, int functionbody) { ! tree link; /* The chain of decls was accumulated in reverse order. Put it into forward order, just for cleanliness. */ tree decls; *************** poplevel (keep, reverse, functionbody) *** 1530,1545 **** tree block = NULL_TREE; tree decl; int leaving_for_scope; timevar_push (TV_NAME_LOOKUP); ! if (cfun && !doing_semantic_analysis_p ()) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); ! ! my_friendly_assert (current_binding_level->parm_flag != 2, ! 19990916); ! real_functionbody = (current_binding_level->keep == 2 ? ((functionbody = 0), tmp) : functionbody); subblocks = functionbody >= 0 ? current_binding_level->blocks : 0; --- 432,444 ---- tree block = NULL_TREE; tree decl; int leaving_for_scope; + scope_kind kind; timevar_push (TV_NAME_LOOKUP); ! my_friendly_assert (current_binding_level->kind != sk_class, 19990916); ! real_functionbody = (current_binding_level->kind == sk_cleanup ? ((functionbody = 0), tmp) : functionbody); subblocks = functionbody >= 0 ? current_binding_level->blocks : 0; *************** poplevel (keep, reverse, functionbody) *** 1551,1557 **** rather than the end. This hack is no longer used. */ my_friendly_assert (keep == 0 || keep == 1, 0); ! if (current_binding_level->keep == 1) keep = 1; /* Any uses of undefined labels, and any defined labels, now operate --- 450,456 ---- rather than the end. This hack is no longer used. */ my_friendly_assert (keep == 0 || keep == 1, 0); ! if (current_binding_level->keep) keep = 1; /* Any uses of undefined labels, and any defined labels, now operate *************** poplevel (keep, reverse, functionbody) *** 1568,1576 **** if (labels->binding_level == current_binding_level) { tree decl; ! if (current_binding_level->is_try_scope) labels->in_try_scope = 1; ! if (current_binding_level->is_catch_scope) labels->in_catch_scope = 1; for (decl = labels->names_in_scope; decl; decl = TREE_CHAIN (decl)) --- 467,475 ---- if (labels->binding_level == current_binding_level) { tree decl; ! if (current_binding_level->kind == sk_try) labels->in_try_scope = 1; ! if (current_binding_level->kind == sk_catch) labels->in_catch_scope = 1; for (decl = labels->names_in_scope; decl; decl = TREE_CHAIN (decl)) *************** poplevel (keep, reverse, functionbody) *** 1649,1658 **** /* We still support the old for-scope rules, whereby the variables in a for-init statement were in scope after the for-statement ! ended. We only use the new rules in flag_new_for_scope is nonzero. */ leaving_for_scope ! = current_binding_level->is_for_scope && flag_new_for_scope == 1; /* Remove declarations for all the DECLs in this level. */ for (link = decls; link; link = TREE_CHAIN (link)) --- 548,557 ---- /* We still support the old for-scope rules, whereby the variables in a for-init statement were in scope after the for-statement ! ended. We only use the new rules if flag_new_for_scope is nonzero. */ leaving_for_scope ! = current_binding_level->kind == sk_for && flag_new_for_scope == 1; /* Remove declarations for all the DECLs in this level. */ for (link = decls; link; link = TREE_CHAIN (link)) *************** poplevel (keep, reverse, functionbody) *** 1670,1677 **** ns_binding = NULL_TREE; if (outer_binding ! && (BINDING_LEVEL (outer_binding) ! == current_binding_level->level_chain)) /* We have something like: int i; --- 569,575 ---- ns_binding = NULL_TREE; if (outer_binding ! && outer_binding->scope == current_binding_level->level_chain) /* We have something like: int i; *************** poplevel (keep, reverse, functionbody) *** 1681,1690 **** keep the binding of the inner `i' in this case. */ pop_binding (DECL_NAME (link), link); else if ((outer_binding ! && (TREE_CODE (BINDING_VALUE (outer_binding)) ! == TYPE_DECL)) ! || (ns_binding ! && TREE_CODE (ns_binding) == TYPE_DECL)) /* Here, we have something like: typedef int I; --- 579,586 ---- keep the binding of the inner `i' in this case. */ pop_binding (DECL_NAME (link), link); else if ((outer_binding ! && (TREE_CODE (outer_binding->value) == TYPE_DECL)) ! || (ns_binding && TREE_CODE (ns_binding) == TYPE_DECL)) /* Here, we have something like: typedef int I; *************** poplevel (keep, reverse, functionbody) *** 1702,1712 **** there only for backward compatibility. */ DECL_DEAD_FOR_LOCAL (link) = 1; ! /* Keep track of what should of have happenned when we popped the binding. */ ! if (outer_binding && BINDING_VALUE (outer_binding)) ! DECL_SHADOWED_FOR_VAR (link) ! = BINDING_VALUE (outer_binding); /* Add it to the list of dead variables in the next outermost binding to that we can remove these when we --- 598,607 ---- there only for backward compatibility. */ DECL_DEAD_FOR_LOCAL (link) = 1; ! /* Keep track of what should have happened when we popped the binding. */ ! if (outer_binding && outer_binding->value) ! DECL_SHADOWED_FOR_VAR (link) = outer_binding->value; /* Add it to the list of dead variables in the next outermost binding to that we can remove these when we *************** poplevel (keep, reverse, functionbody) *** 1717,1725 **** dead_vars_from_for); /* Although we don't pop the cxx_binding, we do clear ! its BINDING_LEVEL since the level is going away now. */ ! BINDING_LEVEL (IDENTIFIER_BINDING (DECL_NAME (link))) ! = 0; } } else --- 612,619 ---- dead_vars_from_for); /* Although we don't pop the cxx_binding, we do clear ! its SCOPE since the scope is going away now. */ ! IDENTIFIER_BINDING (DECL_NAME (link))->scope = NULL; } } else *************** poplevel (keep, reverse, functionbody) *** 1784,1792 **** pop_labels (block); } ! tmp = current_binding_level->keep; ! pop_binding_level (); if (functionbody) DECL_INITIAL (current_function_decl) = block; else if (block) --- 678,686 ---- pop_labels (block); } ! kind = current_binding_level->kind; ! leave_scope (); if (functionbody) DECL_INITIAL (current_function_decl) = block; else if (block) *************** poplevel (keep, reverse, functionbody) *** 1809,1815 **** TREE_USED (block) = 1; /* Take care of compiler's internal binding structures. */ ! if (tmp == 2) { tree scope_stmts; --- 703,709 ---- TREE_USED (block) = 1; /* Take care of compiler's internal binding structures. */ ! if (kind == sk_cleanup) { tree scope_stmts; *************** poplevel (keep, reverse, functionbody) *** 1832,1839 **** so that the block can be reinserted where appropriate. */ void ! delete_block (block) ! tree block; { tree t; if (current_binding_level->blocks == block) --- 726,732 ---- so that the block can be reinserted where appropriate. */ void ! delete_block (tree block) { tree t; if (current_binding_level->blocks == block) *************** delete_block (block) *** 1856,1863 **** to handle the BLOCK node inside the BIND_EXPR. */ void ! insert_block (block) ! tree block; { TREE_USED (block) = 1; current_binding_level->blocks --- 749,755 ---- to handle the BLOCK node inside the BIND_EXPR. */ void ! insert_block (tree block) { TREE_USED (block) = 1; current_binding_level->blocks *************** insert_block (block) *** 1868,2007 **** (the one we are currently in). */ void ! set_block (block) ! tree block ATTRIBUTE_UNUSED; { /* The RTL expansion machinery requires us to provide this callback, but it is not applicable in function-at-a-time mode. */ - my_friendly_assert (cfun && !doing_semantic_analysis_p (), 20000911); - } - - /* Do a pushlevel for class declarations. */ - - void - pushlevel_class () - { - register struct cp_binding_level *newlevel; - - /* Reuse or create a struct for this binding level. */ - if (!ENABLE_SCOPE_CHECKING && free_binding_level) - { - newlevel = free_binding_level; - free_binding_level = free_binding_level->level_chain; - } - else - newlevel = make_binding_level (); - - if (ENABLE_SCOPE_CHECKING) - is_class_level = 1; - - push_binding_level (newlevel, 0, 0); - - class_binding_level = current_binding_level; - class_binding_level->parm_flag = 2; - class_binding_level->this_class = current_class_type; - } - - /* ...and a poplevel for class declarations. */ - - void - poplevel_class () - { - register struct cp_binding_level *level = class_binding_level; - tree shadowed; - - timevar_push (TV_NAME_LOOKUP); - - my_friendly_assert (level != 0, 354); - - /* If we're leaving a toplevel class, don't bother to do the setting - of IDENTIFIER_CLASS_VALUE to NULL_TREE, since first of all this slot - shouldn't even be used when current_class_type isn't set, and second, - if we don't touch it here, we're able to use the cache effect if the - next time we're entering a class scope, it is the same class. */ - if (current_class_depth != 1) - { - struct cp_binding_level* b; - - /* Clear out our IDENTIFIER_CLASS_VALUEs. */ - for (shadowed = level->class_shadowed; - shadowed; - shadowed = TREE_CHAIN (shadowed)) - IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (shadowed)) = NULL_TREE; - - /* Find the next enclosing class, and recreate - IDENTIFIER_CLASS_VALUEs appropriate for that class. */ - b = level->level_chain; - while (b && b->parm_flag != 2) - b = b->level_chain; - - if (b) - for (shadowed = b->class_shadowed; - shadowed; - shadowed = TREE_CHAIN (shadowed)) - { - cxx_binding *binding; - - binding = IDENTIFIER_BINDING (TREE_PURPOSE (shadowed)); - while (binding && BINDING_LEVEL (binding) != b) - binding = binding->previous; - - if (binding) - IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (shadowed)) - = BINDING_VALUE (binding); - } - } - else - /* Remember to save what IDENTIFIER's were bound in this scope so we - can recover from cache misses. */ - { - previous_class_type = current_class_type; - previous_class_values = class_binding_level->class_shadowed; - } - for (shadowed = level->type_shadowed; - shadowed; - shadowed = TREE_CHAIN (shadowed)) - SET_IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (shadowed), TREE_VALUE (shadowed)); - - /* Remove the bindings for all of the class-level declarations. */ - for (shadowed = level->class_shadowed; - shadowed; - shadowed = TREE_CHAIN (shadowed)) - pop_binding (TREE_PURPOSE (shadowed), TREE_TYPE (shadowed)); - - /* Now, pop out of the binding level which we created up in the - `pushlevel_class' routine. */ - if (ENABLE_SCOPE_CHECKING) - is_class_level = 1; - - pop_binding_level (); - - timevar_pop (TV_NAME_LOOKUP); - } - - /* We are entering the scope of a class. Clear IDENTIFIER_CLASS_VALUE - for any names in enclosing classes. */ - - void - clear_identifier_class_values () - { - tree t; - - if (!class_binding_level) - return; - - for (t = class_binding_level->class_shadowed; - t; - t = TREE_CHAIN (t)) - IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (t)) = NULL_TREE; } /* Returns nonzero if T is a virtual function table. */ int ! vtable_decl_p (t, data) ! tree t; ! void *data ATTRIBUTE_UNUSED; { return (TREE_CODE (t) == VAR_DECL && DECL_VIRTUAL_P (t)); } --- 760,775 ---- (the one we are currently in). */ void ! set_block (tree block ATTRIBUTE_UNUSED ) { /* The RTL expansion machinery requires us to provide this callback, but it is not applicable in function-at-a-time mode. */ } /* Returns nonzero if T is a virtual function table. */ int ! vtable_decl_p (tree t, void* data ATTRIBUTE_UNUSED ) { return (TREE_CODE (t) == VAR_DECL && DECL_VIRTUAL_P (t)); } *************** vtable_decl_p (t, data) *** 2010,2033 **** functions. */ int ! vtype_decl_p (t, data) ! tree t; ! void *data ATTRIBUTE_UNUSED; { return (TREE_CODE (t) == TYPE_DECL && TREE_CODE (TREE_TYPE (t)) == RECORD_TYPE && TYPE_POLYMORPHIC_P (TREE_TYPE (t))); } - /* Return the declarations that are members of the namespace NS. */ - - tree - cp_namespace_decls (ns) - tree ns; - { - return NAMESPACE_LEVEL (ns)->names; - } - struct walk_globals_data { walk_globals_pred p; walk_globals_fn f; --- 778,790 ---- functions. */ int ! vtype_decl_p (tree t, void *data ATTRIBUTE_UNUSED ) { return (TREE_CODE (t) == TYPE_DECL && TREE_CODE (TREE_TYPE (t)) == RECORD_TYPE && TYPE_POLYMORPHIC_P (TREE_TYPE (t))); } struct walk_globals_data { walk_globals_pred p; walk_globals_fn f; *************** struct walk_globals_data { *** 2039,2047 **** to F returns a nonzero value, return a nonzero value. */ static int ! walk_vtables_r (namespace, data) ! tree namespace; ! void *data; { struct walk_globals_data* wgd = (struct walk_globals_data *) data; walk_globals_fn f = wgd->f; --- 796,802 ---- to F returns a nonzero value, return a nonzero value. */ static int ! walk_vtables_r (tree namespace, void* data) { struct walk_globals_data* wgd = (struct walk_globals_data *) data; walk_globals_fn f = wgd->f; *************** walk_vtables_r (namespace, data) *** 2058,2068 **** /* Walk the vtable declarations. Whenever one is found for which P returns nonzero, call F with its address. If any call to F returns a nonzero value, return a nonzero value. */ ! int ! walk_vtables (p, f, data) ! walk_globals_pred p; ! walk_globals_fn f; ! void *data; { struct walk_globals_data wgd; wgd.p = p; --- 813,820 ---- /* Walk the vtable declarations. Whenever one is found for which P returns nonzero, call F with its address. If any call to F returns a nonzero value, return a nonzero value. */ ! bool ! walk_vtables (walk_globals_pred p, walk_globals_fn f, void *data) { struct walk_globals_data wgd; wgd.p = p; *************** walk_vtables (p, f, data) *** 2076,2085 **** itself, calling F for each. The DATA is passed to F as well. */ static int ! walk_namespaces_r (namespace, f, data) ! tree namespace; ! walk_namespaces_fn f; ! void *data; { int result = 0; tree current = NAMESPACE_LEVEL (namespace)->namespaces; --- 828,834 ---- itself, calling F for each. The DATA is passed to F as well. */ static int ! walk_namespaces_r (tree namespace, walk_namespaces_fn f, void* data) { int result = 0; tree current = NAMESPACE_LEVEL (namespace)->namespaces; *************** walk_namespaces_r (namespace, f, data) *** 2096,2104 **** F as well. */ int ! walk_namespaces (f, data) ! walk_namespaces_fn f; ! void *data; { return walk_namespaces_r (global_namespace, f, data); } --- 845,851 ---- F as well. */ int ! walk_namespaces (walk_namespaces_fn f, void* data) { return walk_namespaces_r (global_namespace, f, data); } *************** walk_namespaces (f, data) *** 2108,2116 **** to F returns a nonzero value, return a nonzero value. */ static int ! walk_globals_r (namespace, data) ! tree namespace; ! void *data; { struct walk_globals_data* wgd = (struct walk_globals_data *) data; walk_globals_pred p = wgd->p; --- 855,861 ---- to F returns a nonzero value, return a nonzero value. */ static int ! walk_globals_r (tree namespace, void* data) { struct walk_globals_data* wgd = (struct walk_globals_data *) data; walk_globals_pred p = wgd->p; *************** walk_globals_r (namespace, data) *** 2138,2151 **** } /* Walk the global declarations. Whenever one is found for which P ! returns nonzero, call F with its address. If any call to F ! returns a nonzero value, return a nonzero value. */ ! int ! walk_globals (p, f, data) ! walk_globals_pred p; ! walk_globals_fn f; ! void *data; { struct walk_globals_data wgd; wgd.p = p; --- 883,893 ---- } /* Walk the global declarations. Whenever one is found for which P ! returns true, call F with its address. If any call to F ! returns true, return true. */ ! bool ! walk_globals (walk_globals_pred p, walk_globals_fn f, void *data) { struct walk_globals_data wgd; wgd.p = p; *************** walk_globals (p, f, data) *** 2160,2168 **** wrapup_global_declarations for this NAMESPACE. */ int ! wrapup_globals_for_namespace (namespace, data) ! tree namespace; ! void *data; { struct cp_binding_level *level = NAMESPACE_LEVEL (namespace); varray_type statics = level->static_decls; --- 902,908 ---- wrapup_global_declarations for this NAMESPACE. */ int ! wrapup_globals_for_namespace (tree namespace, void* data) { struct cp_binding_level *level = NAMESPACE_LEVEL (namespace); varray_type statics = level->static_decls; *************** wrapup_globals_for_namespace (namespace, *** 2181,2921 **** } - /* For debugging. */ - static int no_print_functions = 0; - static int no_print_builtins = 0; - - /* Called from print_binding_level through binding_table_foreach to - print the content of binding ENTRY. DATA is a pointer to line offset - marker. */ - static void - bt_print_entry (binding_entry entry, void *data) - { - int *p = (int *) data; - int len; - - if (entry->name == NULL) - len = 3; - else if (entry->name == TYPE_IDENTIFIER (entry->type)) - len = 2; - else - len = 4; - - *p += len; - - if (*p > 5) - { - fprintf (stderr, "\n\t"); - *p = len; - } - if (entry->name == NULL) - { - print_node_brief (stderr, "type, 0); - fprintf (stderr, ">"); - } - else if (entry->name == TYPE_IDENTIFIER (entry->type)) - print_node_brief (stderr, "", entry->type, 0); - else - { - print_node_brief (stderr, "name, 0); - print_node_brief (stderr, "", entry->type, 0); - fprintf (stderr, ">"); - } - } - - void - print_binding_level (lvl) - struct cp_binding_level *lvl; - { - tree t; - int i = 0, len; - fprintf (stderr, " blocks="); - fprintf (stderr, HOST_PTR_PRINTF, lvl->blocks); - if (lvl->tag_transparent) - fprintf (stderr, " tag-transparent"); - if (lvl->more_cleanups_ok) - fprintf (stderr, " more-cleanups-ok"); - if (lvl->have_cleanups) - fprintf (stderr, " have-cleanups"); - fprintf (stderr, "\n"); - if (lvl->names) - { - fprintf (stderr, " names:\t"); - /* We can probably fit 3 names to a line? */ - for (t = lvl->names; t; t = TREE_CHAIN (t)) - { - if (no_print_functions && (TREE_CODE (t) == FUNCTION_DECL)) - continue; - if (no_print_builtins - && (TREE_CODE (t) == TYPE_DECL) - && (!strcmp (DECL_SOURCE_FILE (t),""))) - continue; - - /* Function decls tend to have longer names. */ - if (TREE_CODE (t) == FUNCTION_DECL) - len = 3; - else - len = 2; - i += len; - if (i > 6) - { - fprintf (stderr, "\n\t"); - i = len; - } - print_node_brief (stderr, "", t, 0); - if (t == error_mark_node) - break; - } - if (i) - fprintf (stderr, "\n"); - } - if (lvl->type_decls) - { - fprintf (stderr, " tags:\t"); - i = 0; - binding_table_foreach (lvl->type_decls, bt_print_entry, &i); - if (i) - fprintf (stderr, "\n"); - } - if (lvl->class_shadowed) - { - fprintf (stderr, " class-shadowed:"); - for (t = lvl->class_shadowed; t; t = TREE_CHAIN (t)) - { - fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t))); - } - fprintf (stderr, "\n"); - } - if (lvl->type_shadowed) - { - fprintf (stderr, " type-shadowed:"); - for (t = lvl->type_shadowed; t; t = TREE_CHAIN (t)) - { - fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t))); - } - fprintf (stderr, "\n"); - } - } - - void - print_other_binding_stack (stack) - struct cp_binding_level *stack; - { - struct cp_binding_level *level; - for (level = stack; !global_scope_p (level); level = level->level_chain) - { - fprintf (stderr, "binding level "); - fprintf (stderr, HOST_PTR_PRINTF, level); - fprintf (stderr, "\n"); - print_binding_level (level); - } - } - - void - print_binding_stack () - { - struct cp_binding_level *b; - fprintf (stderr, "current_binding_level="); - fprintf (stderr, HOST_PTR_PRINTF, current_binding_level); - fprintf (stderr, "\nclass_binding_level="); - fprintf (stderr, HOST_PTR_PRINTF, class_binding_level); - fprintf (stderr, "\nNAMESPACE_LEVEL (global_namespace)="); - fprintf (stderr, HOST_PTR_PRINTF, - (void *) NAMESPACE_LEVEL (global_namespace)); - fprintf (stderr, "\n"); - if (class_binding_level) - { - for (b = class_binding_level; b; b = b->level_chain) - if (b == current_binding_level) - break; - if (b) - b = class_binding_level; - else - b = current_binding_level; - } - else - b = current_binding_level; - print_other_binding_stack (b); - fprintf (stderr, "global:\n"); - print_binding_level (NAMESPACE_LEVEL (global_namespace)); - } - - /* Namespace binding access routines. */ - - /* Check whether the a binding for the name to scope is known. - Returns the binding found, or NULL. */ - - static inline cxx_binding * - find_binding (tree name, tree scope, cxx_binding *front) - { - cxx_binding *iter; - cxx_binding *prev = NULL; - - timevar_push (TV_NAME_LOOKUP); - - for (iter = front; iter; iter = iter->previous) - { - if (BINDING_SCOPE (iter) == scope) - { - /* Move binding found to the front of the list, so - subsequent lookups will find it faster. */ - if (prev) - { - prev->previous = iter->previous; - iter->previous = front; - IDENTIFIER_NAMESPACE_BINDINGS (name) = iter; - } - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, iter); - } - prev = iter; - } - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL); - } - - /* Return the binding for NAME in SCOPE, if any. Otherwise, return NULL. */ - cxx_binding * - cxx_scope_find_binding_for_name (tree scope, tree name) - { - cxx_binding *b = IDENTIFIER_NAMESPACE_BINDINGS (name); - if (b) - { - scope = ORIGINAL_NAMESPACE (scope); - /* Fold-in case where NAME is used only once. */ - if (scope == BINDING_SCOPE (b) && b->previous == NULL) - return b; - return find_binding (name, scope, b); - } - return b; - } - - - /* Always returns a binding for name in scope. - If no binding is found, make a new one. */ - - cxx_binding * - binding_for_name (tree name, tree scope) - { - cxx_binding *result; - - scope = ORIGINAL_NAMESPACE (scope); - result = cxx_scope_find_binding_for_name (scope, name); - if (result) - return result; - /* Not found, make a new one. */ - result = cxx_binding_make (); - result->previous = IDENTIFIER_NAMESPACE_BINDINGS (name); - BINDING_TYPE (result) = NULL_TREE; - BINDING_VALUE (result) = NULL_TREE; - BINDING_SCOPE (result) = scope; - result->is_local = false; - result->value_is_inherited = false; - result->has_level = false; - IDENTIFIER_NAMESPACE_BINDINGS (name) = result; - return result; - } - - /* Return the binding value for name in scope. */ - - tree - namespace_binding (tree name, tree scope) - { - cxx_binding *b = - cxx_scope_find_binding_for_name (scope ? scope : global_namespace, name); - - return b ? b->value : NULL_TREE; - } - - /* Set the binding value for name in scope. */ - - void - set_namespace_binding (name, scope, val) - tree name; - tree scope; - tree val; - { - cxx_binding *b; - - timevar_push (TV_NAME_LOOKUP); - if (scope == NULL_TREE) - scope = global_namespace; - - b = binding_for_name (name, scope); - BINDING_VALUE (b) = val; - timevar_pop (TV_NAME_LOOKUP); - } - - /* Push into the scope of the NAME namespace. If NAME is NULL_TREE, then we - select a name that is unique to this compilation unit. */ - - void - push_namespace (name) - tree name; - { - tree d = NULL_TREE; - int need_new = 1; - int implicit_use = 0; - int global = 0; - - timevar_push (TV_NAME_LOOKUP); - - if (!global_namespace) - { - /* This must be ::. */ - my_friendly_assert (name == get_identifier ("::"), 377); - global = 1; - } - else if (!name) - { - /* The name of anonymous namespace is unique for the translation - unit. */ - if (!anonymous_namespace_name) - anonymous_namespace_name = get_file_function_name ('N'); - name = anonymous_namespace_name; - d = IDENTIFIER_NAMESPACE_VALUE (name); - if (d) - /* Reopening anonymous namespace. */ - need_new = 0; - implicit_use = 1; - } - else - { - /* Check whether this is an extended namespace definition. */ - d = IDENTIFIER_NAMESPACE_VALUE (name); - if (d != NULL_TREE && TREE_CODE (d) == NAMESPACE_DECL) - { - need_new = 0; - if (DECL_NAMESPACE_ALIAS (d)) - { - error ("namespace alias `%D' not allowed here, assuming `%D'", - d, DECL_NAMESPACE_ALIAS (d)); - d = DECL_NAMESPACE_ALIAS (d); - } - } - } - - if (need_new) - { - /* Make a new namespace, binding the name to it. */ - d = build_lang_decl (NAMESPACE_DECL, name, void_type_node); - /* The global namespace is not pushed, and the global binding - level is set elsewhere. */ - if (!global) - { - DECL_CONTEXT (d) = FROB_CONTEXT (current_namespace); - d = pushdecl (d); - pushlevel (0); - declare_namespace_level (); - NAMESPACE_LEVEL (d) = current_binding_level; - current_binding_level->type_decls = - binding_table_new (name == std_identifier - ? NAMESPACE_STD_HT_SIZE - : NAMESPACE_ORDINARY_HT_SIZE); - VARRAY_TREE_INIT (current_binding_level->static_decls, - name != std_identifier ? 10 : 200, - "Static declarations"); - } - } - else - resume_binding_level (NAMESPACE_LEVEL (d)); - - if (implicit_use) - do_using_directive (d); - /* Enter the name space. */ - current_namespace = d; - - timevar_pop (TV_NAME_LOOKUP); - } - - /* Pop from the scope of the current namespace. */ - - void - pop_namespace () - { - my_friendly_assert (current_namespace != global_namespace, 20010801); - current_namespace = CP_DECL_CONTEXT (current_namespace); - /* The binding level is not popped, as it might be re-opened later. */ - suspend_binding_level (); - } - - /* Push into the scope of the namespace NS, even if it is deeply - nested within another namespace. */ - - void - push_nested_namespace (ns) - tree ns; - { - if (ns == global_namespace) - push_to_top_level (); - else - { - push_nested_namespace (CP_DECL_CONTEXT (ns)); - push_namespace (DECL_NAME (ns)); - } - } - - /* Pop back from the scope of the namespace NS, which was previously - entered with push_nested_namespace. */ - - void - pop_nested_namespace (ns) - tree ns; - { - timevar_push (TV_NAME_LOOKUP); - while (ns != global_namespace) - { - pop_namespace (); - ns = CP_DECL_CONTEXT (ns); - } - - pop_from_top_level (); - timevar_pop (TV_NAME_LOOKUP); - } - - - /* Allocate storage for saving a C++ binding. */ - #define cxx_saved_binding_make() \ - (ggc_alloc (sizeof (cxx_saved_binding))) - - struct cxx_saved_binding GTY(()) - { - /* Link that chains saved C++ bindings for a given name into a stack. */ - cxx_saved_binding *previous; - /* The name of the current binding. */ - tree identifier; - /* The binding we're saving. */ - cxx_binding *binding; - tree class_value; - tree real_type_value; - }; - - /* Subroutines for reverting temporarily to top-level for instantiation - of templates and such. We actually need to clear out the class- and - local-value slots of all identifiers, so that only the global values - are at all visible. Simply setting current_binding_level to the global - scope isn't enough, because more binding levels may be pushed. */ - struct saved_scope *scope_chain; - - static cxx_saved_binding * - store_bindings (tree names, cxx_saved_binding *old_bindings) - { - tree t; - cxx_saved_binding *search_bindings = old_bindings; - - timevar_push (TV_NAME_LOOKUP); - for (t = names; t; t = TREE_CHAIN (t)) - { - tree id; - cxx_saved_binding *saved; - cxx_saved_binding *t1; - - if (TREE_CODE (t) == TREE_LIST) - id = TREE_PURPOSE (t); - else - id = DECL_NAME (t); - - if (!id - /* Note that we may have an IDENTIFIER_CLASS_VALUE even when - we have no IDENTIFIER_BINDING if we have left the class - scope, but cached the class-level declarations. */ - || !(IDENTIFIER_BINDING (id) || IDENTIFIER_CLASS_VALUE (id))) - continue; - - for (t1 = search_bindings; t1; t1 = t1->previous) - if (t1->identifier == id) - goto skip_it; - - my_friendly_assert (TREE_CODE (id) == IDENTIFIER_NODE, 135); - saved = cxx_saved_binding_make (); - saved->previous = old_bindings; - saved->identifier = id; - saved->binding = IDENTIFIER_BINDING (id); - saved->class_value = IDENTIFIER_CLASS_VALUE (id);; - saved->real_type_value = REAL_IDENTIFIER_TYPE_VALUE (id); - IDENTIFIER_BINDING (id) = NULL; - IDENTIFIER_CLASS_VALUE (id) = NULL_TREE; - old_bindings = saved; - skip_it: - ; - } - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, old_bindings); - } - - void - maybe_push_to_top_level (pseudo) - int pseudo; - { - struct saved_scope *s; - struct cp_binding_level *b; - cxx_saved_binding *old_bindings; - int need_pop; - - timevar_push (TV_NAME_LOOKUP); - - s = (struct saved_scope *) ggc_alloc_cleared (sizeof (struct saved_scope)); - - b = scope_chain ? current_binding_level : 0; - - /* If we're in the middle of some function, save our state. */ - if (cfun) - { - need_pop = 1; - push_function_context_to (NULL_TREE); - } - else - need_pop = 0; - - old_bindings = NULL; - if (scope_chain && previous_class_type) - old_bindings = store_bindings (previous_class_values, old_bindings); - - /* Have to include the global scope, because class-scope decls - aren't listed anywhere useful. */ - for (; b; b = b->level_chain) - { - tree t; - - /* Template IDs are inserted into the global level. If they were - inserted into namespace level, finish_file wouldn't find them - when doing pending instantiations. Therefore, don't stop at - namespace level, but continue until :: . */ - if (global_scope_p (b) || (pseudo && b->template_parms_p)) - break; - - old_bindings = store_bindings (b->names, old_bindings); - /* We also need to check class_shadowed to save class-level type - bindings, since pushclass doesn't fill in b->names. */ - if (b->parm_flag == 2) - old_bindings = store_bindings (b->class_shadowed, old_bindings); - - /* Unwind type-value slots back to top level. */ - for (t = b->type_shadowed; t; t = TREE_CHAIN (t)) - SET_IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (t), TREE_VALUE (t)); - } - s->prev = scope_chain; - s->old_bindings = old_bindings; - s->bindings = b; - s->need_pop_function_context = need_pop; - s->function_decl = current_function_decl; - s->last_parms = last_function_parms; - - scope_chain = s; - current_function_decl = NULL_TREE; - VARRAY_TREE_INIT (current_lang_base, 10, "current_lang_base"); - current_lang_name = lang_name_cplusplus; - current_namespace = global_namespace; - timevar_pop (TV_NAME_LOOKUP); - } - - void - push_to_top_level () - { - maybe_push_to_top_level (0); - } - - void - pop_from_top_level () - { - struct saved_scope *s = scope_chain; - cxx_saved_binding *saved; - - timevar_push (TV_NAME_LOOKUP); - - /* Clear out class-level bindings cache. */ - if (previous_class_type) - invalidate_class_lookup_cache (); - - current_lang_base = 0; - - scope_chain = s->prev; - for (saved = s->old_bindings; saved; saved = saved->previous) - { - tree id = saved->identifier; - - IDENTIFIER_BINDING (id) = saved->binding; - IDENTIFIER_CLASS_VALUE (id) = saved->class_value; - SET_IDENTIFIER_TYPE_VALUE (id, saved->real_type_value); - } - - /* If we were in the middle of compiling a function, restore our - state. */ - if (s->need_pop_function_context) - pop_function_context_from (NULL_TREE); - current_function_decl = s->function_decl; - last_function_parms = s->last_parms; - - timevar_pop (TV_NAME_LOOKUP); - } - - /* Push a definition of struct, union or enum tag "name". - into binding_level "b". "type" should be the type node, - We assume that the tag "name" is not already defined. - - Note that the definition may really be just a forward reference. - In that case, the TYPE_SIZE will be a NULL_TREE. - - C++ gratuitously puts all these tags in the name space. */ - - /* When setting the IDENTIFIER_TYPE_VALUE field of an identifier ID, - record the shadowed value for this binding contour. TYPE is - the type that ID maps to. */ - - static void - set_identifier_type_value_with_scope (id, type, b) - tree id; - tree type; - struct cp_binding_level *b; - { - if (!b->namespace_p) - { - /* Shadow the marker, not the real thing, so that the marker - gets restored later. */ - tree old_type_value = REAL_IDENTIFIER_TYPE_VALUE (id); - b->type_shadowed - = tree_cons (id, old_type_value, b->type_shadowed); - } - else - { - cxx_binding *binding = binding_for_name (id, current_namespace); - BINDING_TYPE (binding) = type; - /* Store marker instead of real type. */ - type = global_type_node; - } - SET_IDENTIFIER_TYPE_VALUE (id, type); - } - - /* As set_identifier_type_value_with_scope, but using current_binding_level. */ - - void - set_identifier_type_value (id, type) - tree id; - tree type; - { - set_identifier_type_value_with_scope (id, type, current_binding_level); - } - - /* Return the type associated with id. */ - - tree - identifier_type_value (id) - tree id; - { - timevar_push (TV_NAME_LOOKUP); - /* There is no type with that name, anywhere. */ - if (REAL_IDENTIFIER_TYPE_VALUE (id) == NULL_TREE) - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); - /* This is not the type marker, but the real thing. */ - if (REAL_IDENTIFIER_TYPE_VALUE (id) != global_type_node) - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, REAL_IDENTIFIER_TYPE_VALUE (id)); - /* Have to search for it. It must be on the global level, now. - Ask lookup_name not to return non-types. */ - id = lookup_name_real (id, 2, 1, 0); - if (id) - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, TREE_TYPE (id)); - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); - } - - /* Pop off extraneous binding levels left over due to syntax errors. - - We don't pop past namespaces, as they might be valid. */ - - void - pop_everything () - { - if (ENABLE_SCOPE_CHECKING) - verbatim ("XXX entering pop_everything ()\n"); - while (!toplevel_bindings_p ()) - { - if (current_binding_level->parm_flag == 2) - pop_nested_class (); - else - poplevel (0, 0, 0); - } - if (ENABLE_SCOPE_CHECKING) - verbatim ("XXX leaving pop_everything ()\n"); - } - - /* The type TYPE is being declared. If it is a class template, or a - specialization of a class template, do any processing required and - perform error-checking. If IS_FRIEND is nonzero, this TYPE is - being declared a friend. B is the binding level at which this TYPE - should be bound. - - Returns the TYPE_DECL for TYPE, which may have been altered by this - processing. */ - - static tree - maybe_process_template_type_declaration (type, globalize, b) - tree type; - int globalize; - struct cp_binding_level* b; - { - tree decl = TYPE_NAME (type); - - if (processing_template_parmlist) - /* You can't declare a new template type in a template parameter - list. But, you can declare a non-template type: - - template struct S; - - is a forward-declaration of `A'. */ - ; - else - { - maybe_check_template_type (type); - - my_friendly_assert (IS_AGGR_TYPE (type) - || TREE_CODE (type) == ENUMERAL_TYPE, 0); - - - if (processing_template_decl) - { - /* This may change after the call to - push_template_decl_real, but we want the original value. */ - tree name = DECL_NAME (decl); - - decl = push_template_decl_real (decl, globalize); - /* If the current binding level is the binding level for the - template parameters (see the comment in - begin_template_parm_list) and the enclosing level is a class - scope, and we're not looking at a friend, push the - declaration of the member class into the class scope. In the - friend case, push_template_decl will already have put the - friend into global scope, if appropriate. */ - if (TREE_CODE (type) != ENUMERAL_TYPE - && !globalize && b->template_parms_p - && b->level_chain->parm_flag == 2) - { - finish_member_declaration (CLASSTYPE_TI_TEMPLATE (type)); - /* Put this tag on the list of tags for the class, since - that won't happen below because B is not the class - binding level, but is instead the pseudo-global level. */ - if (b->level_chain->type_decls == NULL) - b->level_chain->type_decls = - binding_table_new (SCOPE_DEFAULT_HT_SIZE); - binding_table_insert (b->level_chain->type_decls, name, type); - if (!COMPLETE_TYPE_P (current_class_type)) - { - maybe_add_class_template_decl_list (current_class_type, - type, /*friend_p=*/0); - CLASSTYPE_NESTED_UDTS (current_class_type) = - b->level_chain->type_decls; - } - } - } - } - - return decl; - } - /* In C++, you don't have to write `struct S' to refer to `S'; you can just use `S'. We accomplish this by creating a TYPE_DECL as if the user had written `typedef struct S S'. Create and return the TYPE_DECL for TYPE. */ tree ! create_implicit_typedef (name, type) ! tree name; ! tree type; { tree decl; --- 921,933 ---- } /* In C++, you don't have to write `struct S' to refer to `S'; you can just use `S'. We accomplish this by creating a TYPE_DECL as if the user had written `typedef struct S S'. Create and return the TYPE_DECL for TYPE. */ tree ! create_implicit_typedef (tree name, tree type) { tree decl; *************** create_implicit_typedef (name, type) *** 2933,2946 **** /* Remember a local name for name-mangling purposes. */ static void ! push_local_name (decl) ! tree decl; { size_t i, nelts; tree t, name; timevar_push (TV_NAME_LOOKUP); - if (!local_names) VARRAY_TREE_INIT (local_names, 8, "local_names"); --- 945,956 ---- /* Remember a local name for name-mangling purposes. */ static void ! push_local_name (tree decl) { size_t i, nelts; tree t, name; timevar_push (TV_NAME_LOOKUP); if (!local_names) VARRAY_TREE_INIT (local_names, 8, "local_names"); *************** push_local_name (decl) *** 2961,3139 **** DECL_DISCRIMINATOR (decl) = 1; VARRAY_TREE (local_names, i) = decl; ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, (void)0); } } VARRAY_PUSH_TREE (local_names, decl); timevar_pop (TV_NAME_LOOKUP); } - - /* Push a tag name NAME for struct/class/union/enum type TYPE. - Normally put it into the inner-most non-tag-transparent scope, - but if GLOBALIZE is true, put it in the inner-most non-class scope. - The latter is needed for implicit declarations. */ - - void - pushtag (name, type, globalize) - tree name, type; - int globalize; - { - register struct cp_binding_level *b; - - timevar_push (TV_NAME_LOOKUP); - - b = current_binding_level; - while (b->tag_transparent - || (b->parm_flag == 2 - && (globalize - /* We may be defining a new type in the initializer - of a static member variable. We allow this when - not pedantic, and it is particularly useful for - type punning via an anonymous union. */ - || COMPLETE_TYPE_P (b->this_class)))) - b = b->level_chain; - - if (b->type_decls == NULL) - b->type_decls = binding_table_new (SCOPE_DEFAULT_HT_SIZE); - binding_table_insert (b->type_decls, name, type); - - if (name) - { - /* Do C++ gratuitous typedefing. */ - if (IDENTIFIER_TYPE_VALUE (name) != type) - { - register tree d = NULL_TREE; - int in_class = 0; - tree context = TYPE_CONTEXT (type); - - if (! context) - { - tree cs = current_scope (); - - if (! globalize) - context = cs; - else if (cs != NULL_TREE && TYPE_P (cs)) - /* When declaring a friend class of a local class, we want - to inject the newly named class into the scope - containing the local class, not the namespace scope. */ - context = decl_function_context (get_type_decl (cs)); - } - if (!context) - context = current_namespace; - - if ((b->template_parms_p && b->level_chain->parm_flag == 2) - || b->parm_flag == 2) - in_class = 1; - - if (current_lang_name == lang_name_java) - TYPE_FOR_JAVA (type) = 1; - - d = create_implicit_typedef (name, type); - DECL_CONTEXT (d) = FROB_CONTEXT (context); - if (! in_class) - set_identifier_type_value_with_scope (name, type, b); - - d = maybe_process_template_type_declaration (type, - globalize, b); - - if (b->parm_flag == 2) - { - if (!PROCESSING_REAL_TEMPLATE_DECL_P ()) - /* Put this TYPE_DECL on the TYPE_FIELDS list for the - class. But if it's a member template class, we - want the TEMPLATE_DECL, not the TYPE_DECL, so this - is done later. */ - finish_member_declaration (d); - else - pushdecl_class_level (d); - } - else - d = pushdecl_with_scope (d, b); - - /* FIXME what if it gets a name from typedef? */ - if (ANON_AGGRNAME_P (name)) - DECL_IGNORED_P (d) = 1; - - TYPE_CONTEXT (type) = DECL_CONTEXT (d); - - /* If this is a local class, keep track of it. We need this - information for name-mangling, and so that it is possible to find - all function definitions in a translation unit in a convenient - way. (It's otherwise tricky to find a member function definition - it's only pointed to from within a local class.) */ - if (TYPE_CONTEXT (type) - && TREE_CODE (TYPE_CONTEXT (type)) == FUNCTION_DECL - && !processing_template_decl) - VARRAY_PUSH_TREE (local_classes, type); - } - if (b->parm_flag == 2) - { - if (!COMPLETE_TYPE_P (current_class_type)) - { - maybe_add_class_template_decl_list (current_class_type, - type, /*friend_p=*/0); - CLASSTYPE_NESTED_UDTS (current_class_type) = b->type_decls; - } - } - } - - if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL) - /* Use the canonical TYPE_DECL for this node. */ - TYPE_STUB_DECL (type) = TYPE_NAME (type); - else - { - /* Create a fake NULL-named TYPE_DECL node whose TREE_TYPE - will be the tagged type we just added to the current - binding level. This fake NULL-named TYPE_DECL node helps - dwarfout.c to know when it needs to output a - representation of a tagged type, and it also gives us a - convenient place to record the "scope start" address for - the tagged type. */ - - tree d = build_decl (TYPE_DECL, NULL_TREE, type); - TYPE_STUB_DECL (type) = pushdecl_with_scope (d, b); - } - - timevar_pop (TV_NAME_LOOKUP); - } - - /* Counter used to create anonymous type names. */ - - static int anon_cnt = 0; - - /* Return an IDENTIFIER which can be used as a name for - anonymous structs and unions. */ - - tree - make_anon_name () - { - char buf[32]; - - sprintf (buf, ANON_AGGRNAME_FORMAT, anon_cnt++); - return get_identifier (buf); - } - - /* Clear the TREE_PURPOSE slot of tags which have anonymous typenames. - This keeps dbxout from getting confused. */ - - void - clear_anon_tags () - { - register struct cp_binding_level *b; - static int last_cnt = 0; - - /* Fast out if no new anon names were declared. */ - if (last_cnt == anon_cnt) - return; - - b = current_binding_level; - while (b->tag_transparent) - b = b->level_chain; - if (b->type_decls != NULL) - binding_table_remove_anonymous_types (b->type_decls); - last_cnt = anon_cnt; - } /* Subroutine of duplicate_decls: return truthvalue of whether or not types of these decls match. --- 971,984 ---- DECL_DISCRIMINATOR (decl) = 1; VARRAY_TREE (local_names, i) = decl; ! timevar_pop (TV_NAME_LOOKUP); ! return; } } VARRAY_PUSH_TREE (local_names, decl); timevar_pop (TV_NAME_LOOKUP); } /* Subroutine of duplicate_decls: return truthvalue of whether or not types of these decls match. *************** clear_anon_tags () *** 3143,3150 **** `const int&'. */ int ! decls_match (newdecl, olddecl) ! tree newdecl, olddecl; { int types_match; --- 988,994 ---- `const int&'. */ int ! decls_match (tree newdecl, tree olddecl) { int types_match; *************** decls_match (newdecl, olddecl) *** 3206,3221 **** } else if (TREE_CODE (newdecl) == TEMPLATE_DECL) { - if (!comp_template_parms (DECL_TEMPLATE_PARMS (newdecl), - DECL_TEMPLATE_PARMS (olddecl))) - return 0; - if (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) != TREE_CODE (DECL_TEMPLATE_RESULT (olddecl))) return 0; if (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == TYPE_DECL) ! types_match = 1; else types_match = decls_match (DECL_TEMPLATE_RESULT (olddecl), DECL_TEMPLATE_RESULT (newdecl)); --- 1050,1066 ---- } else if (TREE_CODE (newdecl) == TEMPLATE_DECL) { if (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) != TREE_CODE (DECL_TEMPLATE_RESULT (olddecl))) return 0; + if (!comp_template_parms (DECL_TEMPLATE_PARMS (newdecl), + DECL_TEMPLATE_PARMS (olddecl))) + return 0; + if (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == TYPE_DECL) ! types_match = same_type_p (TREE_TYPE (DECL_TEMPLATE_RESULT (olddecl)), ! TREE_TYPE (DECL_TEMPLATE_RESULT (newdecl))); else types_match = decls_match (DECL_TEMPLATE_RESULT (olddecl), DECL_TEMPLATE_RESULT (newdecl)); *************** decls_match (newdecl, olddecl) *** 3246,3254 **** Don't complain about built-in functions, since they are beyond the user's control. */ ! static void ! warn_extern_redeclared_static (newdecl, olddecl) ! tree newdecl, olddecl; { static const char *const explicit_extern_static_warning = "`%D' was declared `extern' and later `static'"; --- 1091,1098 ---- Don't complain about built-in functions, since they are beyond the user's control. */ ! void ! warn_extern_redeclared_static (tree newdecl, tree olddecl) { static const char *const explicit_extern_static_warning = "`%D' was declared `extern' and later `static'"; *************** warn_extern_redeclared_static (newdecl, *** 3259,3265 **** if (TREE_CODE (newdecl) == TYPE_DECL || TREE_CODE (newdecl) == TEMPLATE_DECL ! || TREE_CODE (newdecl) == CONST_DECL) return; /* Don't get confused by static member functions; that's a different --- 1103,1110 ---- if (TREE_CODE (newdecl) == TYPE_DECL || TREE_CODE (newdecl) == TEMPLATE_DECL ! || TREE_CODE (newdecl) == CONST_DECL ! || TREE_CODE (newdecl) == NAMESPACE_DECL) return; /* Don't get confused by static member functions; that's a different *************** warn_extern_redeclared_static (newdecl, *** 3285,3307 **** cp_pedwarn_at ("previous declaration of `%D'", olddecl); } ! /* Handle when a new declaration NEWDECL has the same name as an old ! one OLDDECL in the same binding contour. Prints an error message ! if appropriate. ! If safely possible, alter OLDDECL to look like NEWDECL, and return 1. ! Otherwise, return 0. */ ! int ! duplicate_decls (newdecl, olddecl) ! tree newdecl, olddecl; { unsigned olddecl_uid = DECL_UID (olddecl); int olddecl_friend = 0, types_match = 0; int new_defines_function = 0; if (newdecl == olddecl) ! return 1; types_match = decls_match (newdecl, olddecl); --- 1130,1151 ---- cp_pedwarn_at ("previous declaration of `%D'", olddecl); } ! /* If NEWDECL is a redeclaration of OLDDECL, merge the declarations. ! If the redeclaration is invalid, a diagnostic is issued, and the ! error_mark_node is returned. Otherwise, OLDDECL is returned. ! If NEWDECL is not a redeclaration of OLDDECL, NULL_TREE is ! returned. */ ! tree ! duplicate_decls (tree newdecl, tree olddecl) { unsigned olddecl_uid = DECL_UID (olddecl); int olddecl_friend = 0, types_match = 0; int new_defines_function = 0; if (newdecl == olddecl) ! return olddecl; types_match = decls_match (newdecl, olddecl); *************** duplicate_decls (newdecl, olddecl) *** 3331,3349 **** && DECL_UNINLINABLE (olddecl) && lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl))) { ! warning_with_decl (newdecl, ! "function `%s' redeclared as inline"); ! warning_with_decl (olddecl, ! "previous declaration of function `%s' with attribute noinline"); } else if (DECL_DECLARED_INLINE_P (olddecl) && DECL_UNINLINABLE (newdecl) && lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl))) { ! warning_with_decl (newdecl, ! "function `%s' redeclared with attribute noinline"); ! warning_with_decl (olddecl, ! "previous declaration of function `%s' was inline"); } } --- 1175,1192 ---- && DECL_UNINLINABLE (olddecl) && lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl))) { ! warning ("%Jfunction '%D' redeclared as inline", newdecl, newdecl); ! warning ("%Jprevious declaration of '%D' with attribute noinline", ! olddecl, olddecl); } else if (DECL_DECLARED_INLINE_P (olddecl) && DECL_UNINLINABLE (newdecl) && lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl))) { ! warning ("%Jfunction '%D' redeclared with attribute noinline", ! newdecl, newdecl); ! warning ("%Jprevious declaration of '%D' was inline", ! olddecl, olddecl); } } *************** duplicate_decls (newdecl, olddecl) *** 3355,3361 **** { /* Avoid warnings redeclaring anticipated built-ins. */ if (DECL_ANTICIPATED (olddecl)) ! return 0; /* If you declare a built-in or predefined function name as static, the old definition is overridden, but optionally warn this was a --- 1198,1204 ---- { /* Avoid warnings redeclaring anticipated built-ins. */ if (DECL_ANTICIPATED (olddecl)) ! return NULL_TREE; /* If you declare a built-in or predefined function name as static, the old definition is overridden, but optionally warn this was a *************** duplicate_decls (newdecl, olddecl) *** 3367,3373 **** DECL_BUILT_IN (olddecl) ? "built-in" : "library", olddecl); /* Discard the old built-in function. */ ! return 0; } /* If the built-in is not ansi, then programs can override it even globally without an error. */ --- 1210,1216 ---- DECL_BUILT_IN (olddecl) ? "built-in" : "library", olddecl); /* Discard the old built-in function. */ ! return NULL_TREE; } /* If the built-in is not ansi, then programs can override it even globally without an error. */ *************** duplicate_decls (newdecl, olddecl) *** 3380,3386 **** error ("conflicts with built-in declaration `%#D'", olddecl); } ! return 0; } else if (!types_match) { --- 1223,1229 ---- error ("conflicts with built-in declaration `%#D'", olddecl); } ! return NULL_TREE; } else if (!types_match) { *************** duplicate_decls (newdecl, olddecl) *** 3407,3426 **** } else /* Discard the old built-in function. */ ! return 0; /* Replace the old RTL to avoid problems with inlining. */ SET_DECL_RTL (olddecl, DECL_RTL (newdecl)); } /* Even if the types match, prefer the new declarations type ! for anitipated built-ins, for exception lists, etc... */ else if (DECL_ANTICIPATED (olddecl)) { tree type = TREE_TYPE (newdecl); tree attribs = (*targetm.merge_type_attributes) (TREE_TYPE (olddecl), type); ! type = build_type_attribute_variant (type, attribs); TREE_TYPE (newdecl) = TREE_TYPE (olddecl) = type; } --- 1250,1269 ---- } else /* Discard the old built-in function. */ ! return NULL_TREE; /* Replace the old RTL to avoid problems with inlining. */ SET_DECL_RTL (olddecl, DECL_RTL (newdecl)); } /* Even if the types match, prefer the new declarations type ! for anticipated built-ins, for exception lists, etc... */ else if (DECL_ANTICIPATED (olddecl)) { tree type = TREE_TYPE (newdecl); tree attribs = (*targetm.merge_type_attributes) (TREE_TYPE (olddecl), type); ! type = cp_build_type_attribute_variant (type, attribs); TREE_TYPE (newdecl) = TREE_TYPE (olddecl) = type; } *************** duplicate_decls (newdecl, olddecl) *** 3459,3472 **** get shadowed, and know that if we need to find a TYPE_DECL for a given name, we can look in the IDENTIFIER_TYPE_VALUE slot of the identifier. */ ! return 0; } if ((TREE_CODE (newdecl) == FUNCTION_DECL && DECL_FUNCTION_TEMPLATE_P (olddecl)) || (TREE_CODE (olddecl) == FUNCTION_DECL && DECL_FUNCTION_TEMPLATE_P (newdecl))) ! return 0; error ("`%#D' redeclared as different kind of symbol", newdecl); if (TREE_CODE (olddecl) == TREE_LIST) --- 1302,1315 ---- get shadowed, and know that if we need to find a TYPE_DECL for a given name, we can look in the IDENTIFIER_TYPE_VALUE slot of the identifier. */ ! return NULL_TREE; } if ((TREE_CODE (newdecl) == FUNCTION_DECL && DECL_FUNCTION_TEMPLATE_P (olddecl)) || (TREE_CODE (olddecl) == FUNCTION_DECL && DECL_FUNCTION_TEMPLATE_P (newdecl))) ! return NULL_TREE; error ("`%#D' redeclared as different kind of symbol", newdecl); if (TREE_CODE (olddecl) == TREE_LIST) *************** duplicate_decls (newdecl, olddecl) *** 3476,3489 **** /* New decl is completely inconsistent with the old one => tell caller to replace the old one. */ ! return 0; } else if (!types_match) { if (CP_DECL_CONTEXT (newdecl) != CP_DECL_CONTEXT (olddecl)) /* These are certainly not duplicate declarations; they're from different scopes. */ ! return 0; if (TREE_CODE (newdecl) == TEMPLATE_DECL) { --- 1319,1332 ---- /* New decl is completely inconsistent with the old one => tell caller to replace the old one. */ ! return NULL_TREE; } else if (!types_match) { if (CP_DECL_CONTEXT (newdecl) != CP_DECL_CONTEXT (olddecl)) /* These are certainly not duplicate declarations; they're from different scopes. */ ! return NULL_TREE; if (TREE_CODE (newdecl) == TEMPLATE_DECL) { *************** duplicate_decls (newdecl, olddecl) *** 3511,3517 **** error ("new declaration `%#D'", newdecl); cp_error_at ("ambiguates old declaration `%#D'", olddecl); } ! return 0; } if (TREE_CODE (newdecl) == FUNCTION_DECL) { --- 1354,1360 ---- error ("new declaration `%#D'", newdecl); cp_error_at ("ambiguates old declaration `%#D'", olddecl); } ! return NULL_TREE; } if (TREE_CODE (newdecl) == FUNCTION_DECL) { *************** duplicate_decls (newdecl, olddecl) *** 3528,3544 **** cp_error_at ("ambiguates old declaration `%#D'", olddecl); } else ! return 0; } /* Already complained about this, so don't do so again. */ else if (current_class_type == NULL_TREE ! || !DECL_ASSEMBLER_NAME_SET_P (newdecl) ! || (IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (newdecl)) ! != current_class_type)) { ! error ("conflicting types for `%#D'", newdecl); ! cp_error_at ("previous declaration as `%#D'", olddecl); } } else if (TREE_CODE (newdecl) == FUNCTION_DECL --- 1371,1387 ---- cp_error_at ("ambiguates old declaration `%#D'", olddecl); } else ! return NULL_TREE; } /* Already complained about this, so don't do so again. */ else if (current_class_type == NULL_TREE ! || IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (newdecl)) != current_class_type) { ! error ("conflicting declaration '%#D'", newdecl); ! cp_error_at ("'%D' has a previous declaration as `%#D'", ! olddecl, olddecl); ! return NULL_TREE; } } else if (TREE_CODE (newdecl) == FUNCTION_DECL *************** duplicate_decls (newdecl, olddecl) *** 3558,3564 **** can occur if we instantiate a template class, and then specialize one of its methods. This situation is valid, but the declarations must be merged in the usual way. */ ! return 0; else if (TREE_CODE (newdecl) == FUNCTION_DECL && ((DECL_TEMPLATE_INSTANTIATION (olddecl) && !DECL_USE_TEMPLATE (newdecl)) --- 1401,1407 ---- can occur if we instantiate a template class, and then specialize one of its methods. This situation is valid, but the declarations must be merged in the usual way. */ ! return NULL_TREE; else if (TREE_CODE (newdecl) == FUNCTION_DECL && ((DECL_TEMPLATE_INSTANTIATION (olddecl) && !DECL_USE_TEMPLATE (newdecl)) *************** duplicate_decls (newdecl, olddecl) *** 3566,3577 **** && !DECL_USE_TEMPLATE (olddecl)))) /* One of the declarations is a template instantiation, and the other is not a template at all. That's OK. */ ! return 0; else if (TREE_CODE (newdecl) == NAMESPACE_DECL && DECL_NAMESPACE_ALIAS (newdecl) && DECL_NAMESPACE_ALIAS (newdecl) == DECL_NAMESPACE_ALIAS (olddecl)) ! /* Redeclaration of namespace alias, ignore it. */ ! return 1; else { const char *errmsg = redeclaration_error_message (newdecl, olddecl); --- 1409,1428 ---- && !DECL_USE_TEMPLATE (olddecl)))) /* One of the declarations is a template instantiation, and the other is not a template at all. That's OK. */ ! return NULL_TREE; else if (TREE_CODE (newdecl) == NAMESPACE_DECL && DECL_NAMESPACE_ALIAS (newdecl) && DECL_NAMESPACE_ALIAS (newdecl) == DECL_NAMESPACE_ALIAS (olddecl)) ! /* In [namespace.alias] we have: ! ! In a declarative region, a namespace-alias-definition can be ! used to redefine a namespace-alias declared in that declarative ! region to refer only to the namespace to which it already ! refers. ! ! Therefore, if we encounter a second alias directive for the same ! alias, we can just ignore the second directive. */ ! return olddecl; else { const char *errmsg = redeclaration_error_message (newdecl, olddecl); *************** duplicate_decls (newdecl, olddecl) *** 3583,3589 **** && namespace_bindings_p ()) ? "`%#D' previously defined here" : "`%#D' previously declared here", olddecl); ! return 0; } else if (TREE_CODE (olddecl) == FUNCTION_DECL && DECL_INITIAL (olddecl) != NULL_TREE --- 1434,1440 ---- && namespace_bindings_p ()) ? "`%#D' previously defined here" : "`%#D' previously declared here", olddecl); ! return error_mark_node; } else if (TREE_CODE (olddecl) == FUNCTION_DECL && DECL_INITIAL (olddecl) != NULL_TREE *************** duplicate_decls (newdecl, olddecl) *** 3592,3598 **** { /* Prototype decl follows defn w/o prototype. */ cp_warning_at ("prototype for `%#D'", newdecl); ! cp_warning_at ("follows non-prototype definition here", olddecl); } else if (TREE_CODE (olddecl) == FUNCTION_DECL && DECL_LANGUAGE (newdecl) != DECL_LANGUAGE (olddecl)) --- 1443,1449 ---- { /* Prototype decl follows defn w/o prototype. */ cp_warning_at ("prototype for `%#D'", newdecl); ! warning ("%Jfollows non-prototype definition here", olddecl); } else if (TREE_CODE (olddecl) == FUNCTION_DECL && DECL_LANGUAGE (newdecl) != DECL_LANGUAGE (olddecl)) *************** duplicate_decls (newdecl, olddecl) *** 3647,3656 **** && ! DECL_DECLARED_INLINE_P (olddecl) && TREE_ADDRESSABLE (olddecl) && warn_inline) { ! warning ("`%#D' was used before it was declared inline", ! newdecl); ! cp_warning_at ("previous non-inline declaration here", ! olddecl); } } } --- 1498,1505 ---- && ! DECL_DECLARED_INLINE_P (olddecl) && TREE_ADDRESSABLE (olddecl) && warn_inline) { ! warning ("`%#D' was used before it was declared inline", newdecl); ! warning ("%Jprevious non-inline declaration here", olddecl); } } } *************** duplicate_decls (newdecl, olddecl) *** 3665,3671 **** if (TREE_CODE (olddecl) == TYPE_DECL && (DECL_IMPLICIT_TYPEDEF_P (olddecl) || DECL_IMPLICIT_TYPEDEF_P (newdecl))) ! return 0; /* If new decl is `static' and an `extern' was seen previously, warn about it. */ --- 1514,1520 ---- if (TREE_CODE (olddecl) == TYPE_DECL && (DECL_IMPLICIT_TYPEDEF_P (olddecl) || DECL_IMPLICIT_TYPEDEF_P (newdecl))) ! return NULL_TREE; /* If new decl is `static' and an `extern' was seen previously, warn about it. */ *************** duplicate_decls (newdecl, olddecl) *** 3711,3724 **** /* Deal with C++: must preserve virtual function table size. */ if (TREE_CODE (olddecl) == TYPE_DECL) { ! register tree newtype = TREE_TYPE (newdecl); ! register tree oldtype = TREE_TYPE (olddecl); if (newtype != error_mark_node && oldtype != error_mark_node && TYPE_LANG_SPECIFIC (newtype) && TYPE_LANG_SPECIFIC (oldtype)) CLASSTYPE_FRIEND_CLASSES (newtype) = CLASSTYPE_FRIEND_CLASSES (oldtype); ! \ DECL_ORIGINAL_TYPE (newdecl) = DECL_ORIGINAL_TYPE (olddecl); } --- 1560,1573 ---- /* Deal with C++: must preserve virtual function table size. */ if (TREE_CODE (olddecl) == TYPE_DECL) { ! tree newtype = TREE_TYPE (newdecl); ! tree oldtype = TREE_TYPE (olddecl); if (newtype != error_mark_node && oldtype != error_mark_node && TYPE_LANG_SPECIFIC (newtype) && TYPE_LANG_SPECIFIC (oldtype)) CLASSTYPE_FRIEND_CLASSES (newtype) = CLASSTYPE_FRIEND_CLASSES (oldtype); ! DECL_ORIGINAL_TYPE (newdecl) = DECL_ORIGINAL_TYPE (olddecl); } *************** duplicate_decls (newdecl, olddecl) *** 3742,3747 **** --- 1591,1599 ---- DECL_SOURCE_LOCATION (olddecl) = DECL_SOURCE_LOCATION (DECL_TEMPLATE_RESULT (olddecl)) = DECL_SOURCE_LOCATION (newdecl); + if (DECL_FUNCTION_TEMPLATE_P (newdecl)) + DECL_ARGUMENTS (DECL_TEMPLATE_RESULT (olddecl)) + = DECL_ARGUMENTS (DECL_TEMPLATE_RESULT (newdecl)); } if (DECL_FUNCTION_TEMPLATE_P (newdecl)) *************** duplicate_decls (newdecl, olddecl) *** 3752,3758 **** |= DECL_DECLARED_INLINE_P (DECL_TEMPLATE_RESULT (newdecl)); } ! return 1; } if (types_match) --- 1604,1610 ---- |= DECL_DECLARED_INLINE_P (DECL_TEMPLATE_RESULT (newdecl)); } ! return olddecl; } if (types_match) *************** duplicate_decls (newdecl, olddecl) *** 3773,3778 **** --- 1625,1632 ---- { DECL_THIS_EXTERN (newdecl) |= DECL_THIS_EXTERN (olddecl); DECL_INITIALIZED_P (newdecl) |= DECL_INITIALIZED_P (olddecl); + DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (newdecl) + |= DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (olddecl); } /* Do this after calling `merge_types' so that default *************** duplicate_decls (newdecl, olddecl) *** 3828,3834 **** if (CAN_HAVE_FULL_LANG_DECL_P (newdecl) && DECL_LANG_SPECIFIC (newdecl) && DECL_LANG_SPECIFIC (olddecl)) ! DECL_SAVED_TREE (newdecl) = DECL_SAVED_TREE (olddecl); } /* Merge the section attribute. --- 1682,1691 ---- if (CAN_HAVE_FULL_LANG_DECL_P (newdecl) && DECL_LANG_SPECIFIC (newdecl) && DECL_LANG_SPECIFIC (olddecl)) ! { ! DECL_SAVED_TREE (newdecl) = DECL_SAVED_TREE (olddecl); ! DECL_SAVED_INSNS (newdecl) = DECL_SAVED_INSNS (olddecl); ! } } /* Merge the section attribute. *************** duplicate_decls (newdecl, olddecl) *** 3842,3849 **** { DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (newdecl) |= DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (olddecl); ! DECL_NO_LIMIT_STACK (newdecl) ! |= DECL_NO_LIMIT_STACK (olddecl); /* Keep the old RTL. */ COPY_DECL_RTL (olddecl, newdecl); } --- 1699,1710 ---- { DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (newdecl) |= DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (olddecl); ! DECL_NO_LIMIT_STACK (newdecl) |= DECL_NO_LIMIT_STACK (olddecl); ! TREE_THIS_VOLATILE (newdecl) |= TREE_THIS_VOLATILE (olddecl); ! TREE_READONLY (newdecl) |= TREE_READONLY (olddecl); ! TREE_NOTHROW (newdecl) |= TREE_NOTHROW (olddecl); ! DECL_IS_MALLOC (newdecl) |= DECL_IS_MALLOC (olddecl); ! DECL_IS_PURE (newdecl) |= DECL_IS_PURE (olddecl); /* Keep the old RTL. */ COPY_DECL_RTL (olddecl, newdecl); } *************** duplicate_decls (newdecl, olddecl) *** 3921,3927 **** { /* If newdecl is not a specialization, then it is not a template-related function at all. And that means that we ! shoud have exited above, returning 0. */ my_friendly_assert (DECL_TEMPLATE_SPECIALIZATION (newdecl), 0); --- 1782,1788 ---- { /* If newdecl is not a specialization, then it is not a template-related function at all. And that means that we ! should have exited above, returning 0. */ my_friendly_assert (DECL_TEMPLATE_SPECIALIZATION (newdecl), 0); *************** duplicate_decls (newdecl, olddecl) *** 3992,3999 **** regardless of declaration matches. */ SET_DECL_RTL (newdecl, DECL_RTL (olddecl)); } - else - DECL_NUM_STMTS (newdecl) = DECL_NUM_STMTS (olddecl); DECL_RESULT (newdecl) = DECL_RESULT (olddecl); /* Don't clear out the arguments if we're redefining a function. */ --- 1853,1858 ---- *************** duplicate_decls (newdecl, olddecl) *** 4010,4015 **** --- 1869,1887 ---- DECL_COMMON (newdecl) = DECL_COMMON (olddecl); COPY_DECL_ASSEMBLER_NAME (olddecl, newdecl); + /* If either declaration has a nondefault visibility, use it. */ + if (DECL_VISIBILITY (olddecl) != VISIBILITY_DEFAULT) + { + if (DECL_VISIBILITY (newdecl) != VISIBILITY_DEFAULT + && DECL_VISIBILITY (newdecl) != DECL_VISIBILITY (olddecl)) + { + warning ("%J'%D': visibility attribute ignored because it", + newdecl, newdecl); + warning ("%Jconflicts with previous declaration here", olddecl); + } + DECL_VISIBILITY (newdecl) = DECL_VISIBILITY (olddecl); + } + if (TREE_CODE (newdecl) == FUNCTION_DECL) { int function_size; *************** duplicate_decls (newdecl, olddecl) *** 4021,4056 **** function_size - sizeof (struct tree_common)); if (DECL_TEMPLATE_INSTANTIATION (newdecl)) ! { ! /* If newdecl is a template instantiation, it is possible that ! the following sequence of events has occurred: ! ! o A friend function was declared in a class template. The ! class template was instantiated. ! ! o The instantiation of the friend declaration was ! recorded on the instantiation list, and is newdecl. ! o Later, however, instantiate_class_template called pushdecl ! on the newdecl to perform name injection. But, pushdecl in ! turn called duplicate_decls when it discovered that another ! declaration of a global function with the same name already ! existed. ! o Here, in duplicate_decls, we decided to clobber newdecl. ! If we're going to do that, we'd better make sure that ! olddecl, and not newdecl, is on the list of ! instantiations so that if we try to do the instantiation ! again we won't get the clobbered declaration. */ ! tree tmpl = DECL_TI_TEMPLATE (newdecl); ! tree decls = DECL_TEMPLATE_SPECIALIZATIONS (tmpl); ! for (; decls; decls = TREE_CHAIN (decls)) ! if (TREE_VALUE (decls) == newdecl) ! TREE_VALUE (decls) = olddecl; ! } } else { --- 1893,1922 ---- function_size - sizeof (struct tree_common)); if (DECL_TEMPLATE_INSTANTIATION (newdecl)) ! /* If newdecl is a template instantiation, it is possible that ! the following sequence of events has occurred: ! o A friend function was declared in a class template. The ! class template was instantiated. ! o The instantiation of the friend declaration was ! recorded on the instantiation list, and is newdecl. ! o Later, however, instantiate_class_template called pushdecl ! on the newdecl to perform name injection. But, pushdecl in ! turn called duplicate_decls when it discovered that another ! declaration of a global function with the same name already ! existed. ! o Here, in duplicate_decls, we decided to clobber newdecl. ! If we're going to do that, we'd better make sure that ! olddecl, and not newdecl, is on the list of ! instantiations so that if we try to do the instantiation ! again we won't get the clobbered declaration. */ ! reregister_specialization (newdecl, ! DECL_TI_TEMPLATE (newdecl), ! olddecl); } else { *************** duplicate_decls (newdecl, olddecl) *** 4069,5010 **** DECL_ATTRIBUTES (olddecl) = DECL_ATTRIBUTES (newdecl); /* If OLDDECL had its DECL_RTL instantiated, re-invoke make_decl_rtl ! so that encode_section_info has a chance to look at the new decl ! flags and attributes. */ ! if (DECL_RTL_SET_P (olddecl) && (TREE_CODE (olddecl) == FUNCTION_DECL || (TREE_CODE (olddecl) == VAR_DECL && TREE_STATIC (olddecl)))) make_decl_rtl (olddecl, NULL); ! return 1; ! } ! ! /* Record a decl-node X as belonging to the current lexical scope. ! Check for errors (such as an incompatible declaration for the same ! name already seen in the same scope). ! ! Returns either X or an old decl for the same name. ! If an old decl is returned, it may have been smashed ! to agree with what X says. */ ! ! tree ! pushdecl (x) ! tree x; ! { ! register tree t; ! register tree name; ! int need_new_binding; ! ! timevar_push (TV_NAME_LOOKUP); ! ! /* We shouldn't be calling pushdecl when we're generating RTL for a ! function that we already did semantic analysis on previously. */ ! my_friendly_assert (!cfun || doing_semantic_analysis_p (), ! 19990913); ! ! need_new_binding = 1; ! ! if (DECL_TEMPLATE_PARM_P (x)) ! /* Template parameters have no context; they are not X::T even ! when declared within a class or namespace. */ ! ; ! else ! { ! if (current_function_decl && x != current_function_decl ! /* A local declaration for a function doesn't constitute ! nesting. */ ! && !(TREE_CODE (x) == FUNCTION_DECL && !DECL_INITIAL (x)) ! /* A local declaration for an `extern' variable is in the ! scope of the current namespace, not the current ! function. */ ! && !(TREE_CODE (x) == VAR_DECL && DECL_EXTERNAL (x)) ! && !DECL_CONTEXT (x)) ! DECL_CONTEXT (x) = current_function_decl; ! ! /* If this is the declaration for a namespace-scope function, ! but the declaration itself is in a local scope, mark the ! declaration. */ ! if (TREE_CODE (x) == FUNCTION_DECL ! && DECL_NAMESPACE_SCOPE_P (x) ! && current_function_decl ! && x != current_function_decl) ! DECL_LOCAL_FUNCTION_P (x) = 1; ! } ! ! name = DECL_NAME (x); ! if (name) ! { ! int different_binding_level = 0; ! ! if (TREE_CODE (name) == TEMPLATE_ID_EXPR) ! name = TREE_OPERAND (name, 0); ! ! /* In case this decl was explicitly namespace-qualified, look it ! up in its namespace context. */ ! if ((DECL_CONTEXT (x) && TREE_CODE (DECL_CONTEXT (x)) == NAMESPACE_DECL) ! && namespace_bindings_p ()) ! t = namespace_binding (name, DECL_CONTEXT (x)); ! else ! t = lookup_name_current_level (name); ! ! /* [basic.link] If there is a visible declaration of an entity ! with linkage having the same name and type, ignoring entities ! declared outside the innermost enclosing namespace scope, the ! block scope declaration declares that same entity and ! receives the linkage of the previous declaration. */ ! if (! t && current_function_decl && x != current_function_decl ! && (TREE_CODE (x) == FUNCTION_DECL || TREE_CODE (x) == VAR_DECL) ! && DECL_EXTERNAL (x)) ! { ! /* Look in block scope. */ ! t = IDENTIFIER_VALUE (name); ! /* Or in the innermost namespace. */ ! if (! t) ! t = namespace_binding (name, DECL_CONTEXT (x)); ! /* Does it have linkage? Note that if this isn't a DECL, it's an ! OVERLOAD, which is OK. */ ! if (t && DECL_P (t) && ! (TREE_STATIC (t) || DECL_EXTERNAL (t))) ! t = NULL_TREE; ! if (t) ! different_binding_level = 1; ! } ! ! /* If we are declaring a function, and the result of name-lookup ! was an OVERLOAD, look for an overloaded instance that is ! actually the same as the function we are declaring. (If ! there is one, we have to merge our declaration with the ! previous declaration.) */ ! if (t && TREE_CODE (t) == OVERLOAD) ! { ! tree match; ! ! if (TREE_CODE (x) == FUNCTION_DECL) ! for (match = t; match; match = OVL_NEXT (match)) ! { ! if (decls_match (OVL_CURRENT (match), x)) ! break; ! } ! else ! /* Just choose one. */ ! match = t; ! ! if (match) ! t = OVL_CURRENT (match); ! else ! t = NULL_TREE; ! } ! ! if (t == error_mark_node) ! { ! /* error_mark_node is 0 for a while during initialization! */ ! t = NULL_TREE; ! cp_error_at ("`%#D' used prior to declaration", x); ! } ! else if (t != NULL_TREE) ! { ! if (different_binding_level) ! { ! if (decls_match (x, t)) ! /* The standard only says that the local extern ! inherits linkage from the previous decl; in ! particular, default args are not shared. It would ! be nice to propagate inlining info, though. FIXME. */ ! TREE_PUBLIC (x) = TREE_PUBLIC (t); ! } ! else if (TREE_CODE (t) == PARM_DECL) ! { ! if (DECL_CONTEXT (t) == NULL_TREE) ! /* This is probaby caused by too many errors, but calling ! abort will say that if errors have occurred. */ ! abort (); ! ! /* Check for duplicate params. */ ! if (duplicate_decls (x, t)) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); ! } ! else if ((DECL_EXTERN_C_FUNCTION_P (x) ! || DECL_FUNCTION_TEMPLATE_P (x)) ! && is_overloaded_fn (t)) ! /* Don't do anything just yet. */; ! else if (t == wchar_decl_node) ! { ! if (pedantic && ! DECL_IN_SYSTEM_HEADER (x)) ! pedwarn ("redeclaration of `wchar_t' as `%T'", ! TREE_TYPE (x)); ! ! /* Throw away the redeclaration. */ ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); ! } ! else if (TREE_CODE (t) != TREE_CODE (x)) ! { ! if (duplicate_decls (x, t)) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); ! } ! else if (duplicate_decls (x, t)) ! { ! if (TREE_CODE (t) == TYPE_DECL) ! SET_IDENTIFIER_TYPE_VALUE (name, TREE_TYPE (t)); ! else if (TREE_CODE (t) == FUNCTION_DECL) ! check_default_args (t); ! ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); ! } ! else if (DECL_MAIN_P (x)) ! { ! /* A redeclaration of main, but not a duplicate of the ! previous one. ! ! [basic.start.main] ! ! This function shall not be overloaded. */ ! cp_error_at ("invalid redeclaration of `%D'", t); ! error ("as `%D'", x); ! /* We don't try to push this declaration since that ! causes a crash. */ ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, x); ! } ! } ! ! check_template_shadow (x); ! ! /* If this is a function conjured up by the backend, massage it ! so it looks friendly. */ ! if (DECL_NON_THUNK_FUNCTION_P (x) && ! DECL_LANG_SPECIFIC (x)) ! { ! retrofit_lang_decl (x); ! SET_DECL_LANGUAGE (x, lang_c); ! } ! ! if (DECL_NON_THUNK_FUNCTION_P (x) && ! DECL_FUNCTION_MEMBER_P (x)) ! { ! t = push_overloaded_decl (x, PUSH_LOCAL); ! if (t != x) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); ! if (!namespace_bindings_p ()) ! /* We do not need to create a binding for this name; ! push_overloaded_decl will have already done so if ! necessary. */ ! need_new_binding = 0; ! } ! else if (DECL_FUNCTION_TEMPLATE_P (x) && DECL_NAMESPACE_SCOPE_P (x)) ! { ! t = push_overloaded_decl (x, PUSH_GLOBAL); ! if (t == x) ! add_decl_to_level (x, NAMESPACE_LEVEL (CP_DECL_CONTEXT (t))); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); ! } ! ! /* If declaring a type as a typedef, copy the type (unless we're ! at line 0), and install this TYPE_DECL as the new type's typedef ! name. See the extensive comment in ../c-decl.c (pushdecl). */ ! if (TREE_CODE (x) == TYPE_DECL) ! { ! tree type = TREE_TYPE (x); ! if (DECL_SOURCE_LINE (x) == 0) ! { ! if (TYPE_NAME (type) == 0) ! TYPE_NAME (type) = x; ! } ! else if (type != error_mark_node && TYPE_NAME (type) != x ! /* We don't want to copy the type when all we're ! doing is making a TYPE_DECL for the purposes of ! inlining. */ ! && (!TYPE_NAME (type) ! || TYPE_NAME (type) != DECL_ABSTRACT_ORIGIN (x))) ! { ! DECL_ORIGINAL_TYPE (x) = type; ! type = build_type_copy (type); ! TYPE_STUB_DECL (type) = TYPE_STUB_DECL (DECL_ORIGINAL_TYPE (x)); ! TYPE_NAME (type) = x; ! TREE_TYPE (x) = type; ! } ! ! if (type != error_mark_node ! && TYPE_NAME (type) ! && TYPE_IDENTIFIER (type)) ! set_identifier_type_value_with_scope (DECL_NAME (x), type, ! current_binding_level); ! ! } ! ! /* Multiple external decls of the same identifier ought to match. ! ! We get warnings about inline functions where they are defined. ! We get warnings about other functions from push_overloaded_decl. ! ! Avoid duplicate warnings where they are used. */ ! if (TREE_PUBLIC (x) && TREE_CODE (x) != FUNCTION_DECL) ! { ! tree decl; ! ! decl = IDENTIFIER_NAMESPACE_VALUE (name); ! if (decl && TREE_CODE (decl) == OVERLOAD) ! decl = OVL_FUNCTION (decl); ! ! if (decl && decl != error_mark_node ! && (DECL_EXTERNAL (decl) || TREE_PUBLIC (decl)) ! /* If different sort of thing, we already gave an error. */ ! && TREE_CODE (decl) == TREE_CODE (x) ! && !same_type_p (TREE_TYPE (x), TREE_TYPE (decl))) ! { ! pedwarn ("type mismatch with previous external decl", x); ! cp_pedwarn_at ("previous external decl of `%#D'", decl); ! } ! } ! ! /* This name is new in its binding level. ! Install the new declaration and return it. */ ! if (namespace_bindings_p ()) ! { ! /* Install a global value. */ ! ! /* If the first global decl has external linkage, ! warn if we later see static one. */ ! if (IDENTIFIER_GLOBAL_VALUE (name) == NULL_TREE && TREE_PUBLIC (x)) ! TREE_PUBLIC (name) = 1; ! ! /* Bind the name for the entity. */ ! if (!(TREE_CODE (x) == TYPE_DECL && DECL_ARTIFICIAL (x) ! && t != NULL_TREE) ! && (TREE_CODE (x) == TYPE_DECL ! || TREE_CODE (x) == VAR_DECL ! || TREE_CODE (x) == NAMESPACE_DECL ! || TREE_CODE (x) == CONST_DECL ! || TREE_CODE (x) == TEMPLATE_DECL)) ! SET_IDENTIFIER_NAMESPACE_VALUE (name, x); ! ! /* Don't forget if the function was used via an implicit decl. */ ! if (IDENTIFIER_IMPLICIT_DECL (name) ! && TREE_USED (IDENTIFIER_IMPLICIT_DECL (name))) ! TREE_USED (x) = 1; ! ! /* Don't forget if its address was taken in that way. */ ! if (IDENTIFIER_IMPLICIT_DECL (name) ! && TREE_ADDRESSABLE (IDENTIFIER_IMPLICIT_DECL (name))) ! TREE_ADDRESSABLE (x) = 1; ! ! /* Warn about mismatches against previous implicit decl. */ ! if (IDENTIFIER_IMPLICIT_DECL (name) != NULL_TREE ! /* If this real decl matches the implicit, don't complain. */ ! && ! (TREE_CODE (x) == FUNCTION_DECL ! && TREE_TYPE (TREE_TYPE (x)) == integer_type_node)) ! warning ! ("`%D' was previously implicitly declared to return `int'", x); ! ! /* If new decl is `static' and an `extern' was seen previously, ! warn about it. */ ! if (x != NULL_TREE && t != NULL_TREE && decls_match (x, t)) ! warn_extern_redeclared_static (x, t); ! } ! else ! { ! /* Here to install a non-global value. */ ! tree oldlocal = IDENTIFIER_VALUE (name); ! tree oldglobal = IDENTIFIER_NAMESPACE_VALUE (name); ! ! if (need_new_binding) ! { ! push_local_binding (name, x, 0); ! /* Because push_local_binding will hook X on to the ! current_binding_level's name list, we don't want to ! do that again below. */ ! need_new_binding = 0; ! } ! ! /* If this is a TYPE_DECL, push it into the type value slot. */ ! if (TREE_CODE (x) == TYPE_DECL) ! set_identifier_type_value_with_scope (name, TREE_TYPE (x), ! current_binding_level); ! ! /* Clear out any TYPE_DECL shadowed by a namespace so that ! we won't think this is a type. The C struct hack doesn't ! go through namespaces. */ ! if (TREE_CODE (x) == NAMESPACE_DECL) ! set_identifier_type_value_with_scope (name, NULL_TREE, ! current_binding_level); ! ! if (oldlocal) ! { ! tree d = oldlocal; ! ! while (oldlocal ! && TREE_CODE (oldlocal) == VAR_DECL ! && DECL_DEAD_FOR_LOCAL (oldlocal)) ! oldlocal = DECL_SHADOWED_FOR_VAR (oldlocal); ! ! if (oldlocal == NULL_TREE) ! oldlocal = IDENTIFIER_NAMESPACE_VALUE (DECL_NAME (d)); ! } ! ! /* If this is an extern function declaration, see if we ! have a global definition or declaration for the function. */ ! if (oldlocal == NULL_TREE ! && DECL_EXTERNAL (x) ! && oldglobal != NULL_TREE ! && TREE_CODE (x) == FUNCTION_DECL ! && TREE_CODE (oldglobal) == FUNCTION_DECL) ! { ! /* We have one. Their types must agree. */ ! if (decls_match (x, oldglobal)) ! /* OK */; ! else ! { ! warning ("extern declaration of `%#D' doesn't match", x); ! cp_warning_at ("global declaration `%#D'", oldglobal); ! } ! } ! /* If we have a local external declaration, ! and no file-scope declaration has yet been seen, ! then if we later have a file-scope decl it must not be static. */ ! if (oldlocal == NULL_TREE ! && oldglobal == NULL_TREE ! && DECL_EXTERNAL (x) ! && TREE_PUBLIC (x)) ! TREE_PUBLIC (name) = 1; ! ! /* Warn if shadowing an argument at the top level of the body. */ ! if (oldlocal != NULL_TREE && !DECL_EXTERNAL (x) ! /* Inline decls shadow nothing. */ ! && !DECL_FROM_INLINE (x) ! && TREE_CODE (oldlocal) == PARM_DECL ! /* Don't check the `this' parameter. */ ! && !DECL_ARTIFICIAL (oldlocal)) ! { ! bool err = false; ! ! /* Don't complain if it's from an enclosing function. */ ! if (DECL_CONTEXT (oldlocal) == current_function_decl ! && TREE_CODE (x) != PARM_DECL) ! { ! /* Go to where the parms should be and see if we find ! them there. */ ! struct cp_binding_level *b = current_binding_level->level_chain; ! ! /* ARM $8.3 */ ! if (b->parm_flag == 1) ! { ! error ("declaration of `%#D' shadows a parameter", ! name); ! err = true; ! } ! } ! ! if (warn_shadow && !err) ! shadow_warning ("a parameter", name, oldlocal); ! } ! ! /* Maybe warn if shadowing something else. */ ! else if (warn_shadow && !DECL_EXTERNAL (x) ! /* No shadow warnings for internally generated vars. */ ! && ! DECL_ARTIFICIAL (x) ! /* No shadow warnings for vars made for inlining. */ ! && ! DECL_FROM_INLINE (x)) ! { ! if (IDENTIFIER_CLASS_VALUE (name) != NULL_TREE ! && current_class_ptr ! && !TREE_STATIC (name)) ! warning ("declaration of `%s' shadows a member of `this'", ! IDENTIFIER_POINTER (name)); ! else if (oldlocal != NULL_TREE ! && TREE_CODE (oldlocal) == VAR_DECL) ! shadow_warning ("a previous local", name, oldlocal); ! else if (oldglobal != NULL_TREE ! && TREE_CODE (oldglobal) == VAR_DECL) ! /* XXX shadow warnings in outer-more namespaces */ ! shadow_warning ("a global declaration", name, oldglobal); ! } ! } ! ! if (TREE_CODE (x) == FUNCTION_DECL) ! check_default_args (x); ! ! if (TREE_CODE (x) == VAR_DECL) ! maybe_register_incomplete_var (x); ! } ! ! if (need_new_binding) ! add_decl_to_level (x, ! DECL_NAMESPACE_SCOPE_P (x) ! ? NAMESPACE_LEVEL (CP_DECL_CONTEXT (x)) ! : current_binding_level); ! ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, x); ! } ! ! /* Same as pushdecl, but define X in binding-level LEVEL. We rely on the ! caller to set DECL_CONTEXT properly. */ ! ! static tree ! pushdecl_with_scope (x, level) ! tree x; ! struct cp_binding_level *level; ! { ! register struct cp_binding_level *b; ! tree function_decl = current_function_decl; ! ! timevar_push (TV_NAME_LOOKUP); ! ! current_function_decl = NULL_TREE; ! if (level->parm_flag == 2) ! { ! b = class_binding_level; ! class_binding_level = level; ! pushdecl_class_level (x); ! class_binding_level = b; ! } ! else ! { ! b = current_binding_level; ! current_binding_level = level; ! x = pushdecl (x); ! current_binding_level = b; ! } ! current_function_decl = function_decl; ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, x); ! } ! ! /* Like pushdecl, only it places X in the current namespace, ! if appropriate. */ ! ! tree ! pushdecl_namespace_level (x) ! tree x; ! { ! register struct cp_binding_level *b = current_binding_level; ! register tree t; ! ! timevar_push (TV_NAME_LOOKUP); ! t = pushdecl_with_scope (x, NAMESPACE_LEVEL (current_namespace)); ! ! /* Now, the type_shadowed stack may screw us. Munge it so it does ! what we want. */ ! if (TREE_CODE (x) == TYPE_DECL) ! { ! tree name = DECL_NAME (x); ! tree newval; ! tree *ptr = (tree *)0; ! for (; !global_scope_p (b); b = b->level_chain) ! { ! tree shadowed = b->type_shadowed; ! for (; shadowed; shadowed = TREE_CHAIN (shadowed)) ! if (TREE_PURPOSE (shadowed) == name) ! { ! ptr = &TREE_VALUE (shadowed); ! /* Can't break out of the loop here because sometimes ! a binding level will have duplicate bindings for ! PT names. It's gross, but I haven't time to fix it. */ ! } ! } ! newval = TREE_TYPE (x); ! if (ptr == (tree *)0) ! { ! /* @@ This shouldn't be needed. My test case "zstring.cc" trips ! up here if this is changed to an assertion. --KR */ ! SET_IDENTIFIER_TYPE_VALUE (name, newval); ! } ! else ! { ! *ptr = newval; ! } ! } ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); ! } ! ! /* Like pushdecl, only it places X in the global scope if appropriate. ! Calls cp_finish_decl to register the variable, initializing it with ! *INIT, if INIT is non-NULL. */ ! ! static tree ! pushdecl_top_level_1 (tree x, tree *init) ! { ! timevar_push (TV_NAME_LOOKUP); ! push_to_top_level (); ! x = pushdecl_namespace_level (x); ! if (init) ! cp_finish_decl (x, *init, NULL_TREE, 0); ! pop_from_top_level (); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, x); ! } ! ! /* Like pushdecl, only it places X in the global scope if appropriate. */ ! ! tree ! pushdecl_top_level (tree x) ! { ! return pushdecl_top_level_1 (x, NULL); ! } ! ! /* Like pushdecl, only it places X in the global scope if ! appropriate. Calls cp_finish_decl to register the variable, ! initializing it with INIT. */ ! ! tree ! pushdecl_top_level_and_finish (tree x, tree init) ! { ! return pushdecl_top_level_1 (x, &init); ! } ! ! /* Make the declaration of X appear in CLASS scope. */ ! ! bool ! pushdecl_class_level (x) ! tree x; ! { ! tree name; ! bool is_valid = true; ! ! timevar_push (TV_NAME_LOOKUP); ! /* Get the name of X. */ ! if (TREE_CODE (x) == OVERLOAD) ! name = DECL_NAME (get_first_fn (x)); ! else ! name = DECL_NAME (x); ! ! if (name) ! { ! is_valid = push_class_level_binding (name, x); ! if (TREE_CODE (x) == TYPE_DECL) ! set_identifier_type_value (name, TREE_TYPE (x)); ! } ! else if (ANON_AGGR_TYPE_P (TREE_TYPE (x))) ! { ! /* If X is an anonymous aggregate, all of its members are ! treated as if they were members of the class containing the ! aggregate, for naming purposes. */ ! tree f; ! ! for (f = TYPE_FIELDS (TREE_TYPE (x)); f; f = TREE_CHAIN (f)) ! { ! push_srcloc (DECL_SOURCE_FILE (f), DECL_SOURCE_LINE (f)); ! if (!pushdecl_class_level (f)) ! is_valid = false; ! pop_srcloc (); ! } ! } ! timevar_pop (TV_NAME_LOOKUP); ! ! return is_valid; ! } ! ! /* Enter DECL into the symbol table, if that's appropriate. Returns ! DECL, or a modified version thereof. */ ! ! tree ! maybe_push_decl (decl) ! tree decl; ! { ! tree type = TREE_TYPE (decl); ! ! /* Add this decl to the current binding level, but not if it comes ! from another scope, e.g. a static member variable. TEM may equal ! DECL or it may be a previous decl of the same name. */ ! if (decl == error_mark_node ! || (TREE_CODE (decl) != PARM_DECL ! && DECL_CONTEXT (decl) != NULL_TREE ! /* Definitions of namespace members outside their namespace are ! possible. */ ! && TREE_CODE (DECL_CONTEXT (decl)) != NAMESPACE_DECL) ! || (TREE_CODE (decl) == TEMPLATE_DECL && !namespace_bindings_p ()) ! || TREE_CODE (type) == UNKNOWN_TYPE ! /* The declaration of a template specialization does not affect ! the functions available for overload resolution, so we do not ! call pushdecl. */ ! || (TREE_CODE (decl) == FUNCTION_DECL ! && DECL_TEMPLATE_SPECIALIZATION (decl))) ! return decl; ! else ! return pushdecl (decl); ! } ! ! /* Make the declaration(s) of X appear in CLASS scope under the name ! NAME. Returns true if the binding is valid. */ ! ! bool ! push_class_level_binding (tree name, tree x) ! { ! cxx_binding *binding; ! ! timevar_push (TV_NAME_LOOKUP); ! /* The class_binding_level will be NULL if x is a template ! parameter name in a member template. */ ! if (!class_binding_level) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, true); ! ! /* Make sure that this new member does not have the same name ! as a template parameter. */ ! if (TYPE_BEING_DEFINED (current_class_type)) ! check_template_shadow (x); ! ! /* If this declaration shadows a declaration from an enclosing ! class, then we will need to restore IDENTIFIER_CLASS_VALUE when ! we leave this class. Record the shadowed declaration here. */ ! binding = IDENTIFIER_BINDING (name); ! if (binding ! && ((TREE_CODE (x) == OVERLOAD ! && BINDING_VALUE (binding) ! && is_overloaded_fn (BINDING_VALUE (binding))) ! || INHERITED_VALUE_BINDING_P (binding))) ! { ! tree shadow; ! tree old_decl; ! ! /* If the old binding was from a base class, and was for a tag ! name, slide it over to make room for the new binding. The ! old binding is still visible if explicitly qualified with a ! class-key. */ ! if (INHERITED_VALUE_BINDING_P (binding) ! && BINDING_VALUE (binding) ! && TREE_CODE (BINDING_VALUE (binding)) == TYPE_DECL ! && DECL_ARTIFICIAL (BINDING_VALUE (binding)) ! && !(TREE_CODE (x) == TYPE_DECL && DECL_ARTIFICIAL (x))) ! { ! old_decl = BINDING_TYPE (binding); ! BINDING_TYPE (binding) = BINDING_VALUE (binding); ! BINDING_VALUE (binding) = NULL_TREE; ! INHERITED_VALUE_BINDING_P (binding) = 0; ! } ! else ! old_decl = BINDING_VALUE (binding); ! ! /* Find the previous binding of name on the class-shadowed ! list, and update it. */ ! for (shadow = class_binding_level->class_shadowed; ! shadow; ! shadow = TREE_CHAIN (shadow)) ! if (TREE_PURPOSE (shadow) == name ! && TREE_TYPE (shadow) == old_decl) ! { ! BINDING_VALUE (binding) = x; ! INHERITED_VALUE_BINDING_P (binding) = 0; ! TREE_TYPE (shadow) = x; ! IDENTIFIER_CLASS_VALUE (name) = x; ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, true); ! } ! } ! ! /* If we didn't replace an existing binding, put the binding on the ! stack of bindings for the identifier, and update the shadowed list. */ ! if (push_class_binding (name, x)) ! { ! class_binding_level->class_shadowed ! = tree_cons (name, NULL, ! class_binding_level->class_shadowed); ! /* Record the value we are binding NAME to so that we can know ! what to pop later. */ ! TREE_TYPE (class_binding_level->class_shadowed) = x; ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, true); ! } ! ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, false); ! } ! ! /* Insert another USING_DECL into the current binding level, returning ! this declaration. If this is a redeclaration, do nothing, and ! return NULL_TREE if this not in namespace scope (in namespace ! scope, a using decl might extend any previous bindings). */ ! ! tree ! push_using_decl (scope, name) ! tree scope; ! tree name; ! { ! tree decl; ! ! timevar_push (TV_NAME_LOOKUP); ! ! my_friendly_assert (TREE_CODE (scope) == NAMESPACE_DECL, 383); ! my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 384); ! for (decl = current_binding_level->usings; decl; decl = TREE_CHAIN (decl)) ! if (DECL_INITIAL (decl) == scope && DECL_NAME (decl) == name) ! break; ! if (decl) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, ! namespace_bindings_p () ? decl : NULL_TREE); ! decl = build_lang_decl (USING_DECL, name, void_type_node); ! DECL_INITIAL (decl) = scope; ! TREE_CHAIN (decl) = current_binding_level->usings; ! current_binding_level->usings = decl; ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); ! } ! ! /* Add namespace to using_directives. Return NULL_TREE if nothing was ! changed (i.e. there was already a directive), or the fresh ! TREE_LIST otherwise. */ ! ! tree ! push_using_directive (used) ! tree used; ! { ! tree ud = current_binding_level->using_directives; ! tree iter, ancestor; ! ! timevar_push (TV_NAME_LOOKUP); ! ! /* Check if we already have this. */ ! if (purpose_member (used, ud) != NULL_TREE) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); ! ! ancestor = namespace_ancestor (current_decl_namespace (), used); ! ud = current_binding_level->using_directives; ! ud = tree_cons (used, ancestor, ud); ! current_binding_level->using_directives = ud; ! ! /* Recursively add all namespaces used. */ ! for (iter = DECL_NAMESPACE_USING (used); iter; iter = TREE_CHAIN (iter)) ! push_using_directive (TREE_PURPOSE (iter)); ! ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, ud); ! } ! ! /* DECL is a FUNCTION_DECL for a non-member function, which may have ! other definitions already in place. We get around this by making ! the value of the identifier point to a list of all the things that ! want to be referenced by that name. It is then up to the users of ! that name to decide what to do with that list. ! ! DECL may also be a TEMPLATE_DECL, with a FUNCTION_DECL in its ! DECL_TEMPLATE_RESULT. It is dealt with the same way. ! ! FLAGS is a bitwise-or of the following values: ! PUSH_LOCAL: Bind DECL in the current scope, rather than at ! namespace scope. ! PUSH_USING: DECL is being pushed as the result of a using ! declaration. ! ! The value returned may be a previous declaration if we guessed wrong ! about what language DECL should belong to (C or C++). Otherwise, ! it's always DECL (and never something that's not a _DECL). */ ! ! tree ! push_overloaded_decl (decl, flags) ! tree decl; ! int flags; ! { ! tree name = DECL_NAME (decl); ! tree old; ! tree new_binding; ! int doing_global = (namespace_bindings_p () || !(flags & PUSH_LOCAL)); ! ! timevar_push (TV_NAME_LOOKUP); ! ! if (doing_global) ! old = namespace_binding (name, DECL_CONTEXT (decl)); ! else ! old = lookup_name_current_level (name); ! ! if (old) ! { ! if (TREE_CODE (old) == TYPE_DECL && DECL_ARTIFICIAL (old)) ! { ! tree t = TREE_TYPE (old); ! if (IS_AGGR_TYPE (t) && warn_shadow ! && (! DECL_IN_SYSTEM_HEADER (decl) ! || ! DECL_IN_SYSTEM_HEADER (old))) ! warning ("`%#D' hides constructor for `%#T'", decl, t); ! old = NULL_TREE; ! } ! else if (is_overloaded_fn (old)) ! { ! tree tmp; ! ! for (tmp = old; tmp; tmp = OVL_NEXT (tmp)) ! { ! tree fn = OVL_CURRENT (tmp); ! ! if (TREE_CODE (tmp) == OVERLOAD && OVL_USED (tmp) ! && !(flags & PUSH_USING) ! && compparms (TYPE_ARG_TYPES (TREE_TYPE (fn)), ! TYPE_ARG_TYPES (TREE_TYPE (decl)))) ! error ("`%#D' conflicts with previous using declaration `%#D'", ! decl, fn); ! ! if (duplicate_decls (decl, fn)) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, fn); ! } ! } ! else if (old == error_mark_node) ! /* Ignore the undefined symbol marker. */ ! old = NULL_TREE; ! else ! { ! cp_error_at ("previous non-function declaration `%#D'", old); ! error ("conflicts with function declaration `%#D'", decl); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); ! } ! } ! ! if (old || TREE_CODE (decl) == TEMPLATE_DECL ! /* If it's a using declaration, we always need to build an OVERLOAD, ! because it's the only way to remember that the declaration comes ! from 'using', and have the lookup behave correctly. */ ! || (flags & PUSH_USING)) ! { ! if (old && TREE_CODE (old) != OVERLOAD) ! new_binding = ovl_cons (decl, ovl_cons (old, NULL_TREE)); ! else ! new_binding = ovl_cons (decl, old); ! if (flags & PUSH_USING) ! OVL_USED (new_binding) = 1; ! } ! else ! /* NAME is not ambiguous. */ ! new_binding = decl; ! ! if (doing_global) ! set_namespace_binding (name, current_namespace, new_binding); ! else ! { ! /* We only create an OVERLOAD if there was a previous binding at ! this level, or if decl is a template. In the former case, we ! need to remove the old binding and replace it with the new ! binding. We must also run through the NAMES on the binding ! level where the name was bound to update the chain. */ ! ! if (TREE_CODE (new_binding) == OVERLOAD && old) ! { ! tree *d; ! ! for (d = &BINDING_LEVEL (IDENTIFIER_BINDING (name))->names; ! *d; ! d = &TREE_CHAIN (*d)) ! if (*d == old ! || (TREE_CODE (*d) == TREE_LIST ! && TREE_VALUE (*d) == old)) ! { ! if (TREE_CODE (*d) == TREE_LIST) ! /* Just replace the old binding with the new. */ ! TREE_VALUE (*d) = new_binding; ! else ! /* Build a TREE_LIST to wrap the OVERLOAD. */ ! *d = tree_cons (NULL_TREE, new_binding, ! TREE_CHAIN (*d)); ! ! /* And update the cxx_binding node. */ ! BINDING_VALUE (IDENTIFIER_BINDING (name)) ! = new_binding; ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); ! } ! ! /* We should always find a previous binding in this case. */ ! abort (); ! } ! ! /* Install the new binding. */ ! push_local_binding (name, new_binding, flags); ! } ! ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); } /* Generate an implicit declaration for identifier FUNCTIONID as a function of type int (). Print a warning if appropriate. */ tree ! implicitly_declare (functionid) ! tree functionid; { ! register tree decl; /* We used to reuse an old implicit decl here, but this loses with inline functions because it can clobber --- 1935,1958 ---- DECL_ATTRIBUTES (olddecl) = DECL_ATTRIBUTES (newdecl); /* If OLDDECL had its DECL_RTL instantiated, re-invoke make_decl_rtl ! so that encode_section_info has a chance to look at the new decl ! flags and attributes. */ ! if (DECL_RTL_SET_P (olddecl) && (TREE_CODE (olddecl) == FUNCTION_DECL || (TREE_CODE (olddecl) == VAR_DECL && TREE_STATIC (olddecl)))) make_decl_rtl (olddecl, NULL); ! return olddecl; } /* Generate an implicit declaration for identifier FUNCTIONID as a function of type int (). Print a warning if appropriate. */ tree ! implicitly_declare (tree functionid) { ! tree decl; /* We used to reuse an old implicit decl here, but this loses with inline functions because it can clobber *************** implicitly_declare (functionid) *** 5038,5045 **** where the identifier should go. */ static const char * ! redeclaration_error_message (newdecl, olddecl) ! tree newdecl, olddecl; { if (TREE_CODE (newdecl) == TYPE_DECL) { --- 1986,1992 ---- where the identifier should go. */ static const char * ! redeclaration_error_message (tree newdecl, tree olddecl) { if (TREE_CODE (newdecl) == TYPE_DECL) { *************** redeclaration_error_message (newdecl, ol *** 5081,5096 **** } else if (TREE_CODE (newdecl) == TEMPLATE_DECL) { ! if ((TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == FUNCTION_DECL ! && (DECL_TEMPLATE_RESULT (newdecl) ! != DECL_TEMPLATE_RESULT (olddecl)) ! && DECL_INITIAL (DECL_TEMPLATE_RESULT (newdecl)) ! && DECL_INITIAL (DECL_TEMPLATE_RESULT (olddecl))) ! || (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == TYPE_DECL ! && COMPLETE_TYPE_P (TREE_TYPE (newdecl)) ! && COMPLETE_TYPE_P (TREE_TYPE (olddecl)))) return "redefinition of `%#D'"; ! return 0; } else if (toplevel_bindings_p () || DECL_NAMESPACE_SCOPE_P (newdecl)) { --- 2028,2058 ---- } else if (TREE_CODE (newdecl) == TEMPLATE_DECL) { ! tree nt, ot; ! ! if (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == TYPE_DECL) ! { ! if (COMPLETE_TYPE_P (TREE_TYPE (newdecl)) ! && COMPLETE_TYPE_P (TREE_TYPE (olddecl))) ! return "redefinition of `%#D'"; ! return NULL; ! } ! ! if (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) != FUNCTION_DECL ! || (DECL_TEMPLATE_RESULT (newdecl) ! == DECL_TEMPLATE_RESULT (olddecl))) ! return NULL; ! ! nt = DECL_TEMPLATE_RESULT (newdecl); ! if (DECL_TEMPLATE_INFO (nt)) ! nt = DECL_TEMPLATE_RESULT (template_for_substitution (nt)); ! ot = DECL_TEMPLATE_RESULT (olddecl); ! if (DECL_TEMPLATE_INFO (ot)) ! ot = DECL_TEMPLATE_RESULT (template_for_substitution (ot)); ! if (DECL_INITIAL (nt) && DECL_INITIAL (ot)) return "redefinition of `%#D'"; ! ! return NULL; } else if (toplevel_bindings_p () || DECL_NAMESPACE_SCOPE_P (newdecl)) { *************** redeclaration_error_message (newdecl, ol *** 5115,5130 **** /* Create a new label, named ID. */ static tree ! make_label_decl (id, local_p) ! tree id; ! int local_p; { tree decl; decl = build_decl (LABEL_DECL, id, void_type_node); - if (expanding_p) - /* Make sure every label has an rtx. */ - label_rtx (decl); DECL_CONTEXT (decl) = current_function_decl; DECL_MODE (decl) = VOIDmode; --- 2077,2087 ---- /* Create a new label, named ID. */ static tree ! make_label_decl (tree id, int local_p) { tree decl; decl = build_decl (LABEL_DECL, id, void_type_node); DECL_CONTEXT (decl) = current_function_decl; DECL_MODE (decl) = VOIDmode; *************** make_label_decl (id, local_p) *** 5132,5139 **** /* Say where one reference is to the label, for the sake of the error if it is not defined. */ ! DECL_SOURCE_LINE (decl) = lineno; ! DECL_SOURCE_FILE (decl) = input_filename; /* Record the fact that this identifier is bound to this label. */ SET_IDENTIFIER_LABEL_VALUE (id, decl); --- 2089,2095 ---- /* Say where one reference is to the label, for the sake of the error if it is not defined. */ ! DECL_SOURCE_LOCATION (decl) = input_location; /* Record the fact that this identifier is bound to this label. */ SET_IDENTIFIER_LABEL_VALUE (id, decl); *************** make_label_decl (id, local_p) *** 5147,5167 **** this use is valid. */ static void ! use_label (decl) ! tree decl; { if (named_label_uses == NULL || named_label_uses->names_in_scope != current_binding_level->names || named_label_uses->label_decl != decl) { struct named_label_use_list *new_ent; ! new_ent = ((struct named_label_use_list *) ! ggc_alloc (sizeof (struct named_label_use_list))); new_ent->label_decl = decl; new_ent->names_in_scope = current_binding_level->names; new_ent->binding_level = current_binding_level; ! new_ent->lineno_o_goto = lineno; ! new_ent->filename_o_goto = input_filename; new_ent->next = named_label_uses; named_label_uses = new_ent; } --- 2103,2120 ---- this use is valid. */ static void ! use_label (tree decl) { if (named_label_uses == NULL || named_label_uses->names_in_scope != current_binding_level->names || named_label_uses->label_decl != decl) { struct named_label_use_list *new_ent; ! new_ent = ggc_alloc (sizeof (struct named_label_use_list)); new_ent->label_decl = decl; new_ent->names_in_scope = current_binding_level->names; new_ent->binding_level = current_binding_level; ! new_ent->o_goto_locus = input_location; new_ent->next = named_label_uses; named_label_uses = new_ent; } *************** use_label (decl) *** 5172,5185 **** labels, and complain about them at the end of a function.) */ tree ! lookup_label (id) ! tree id; { tree decl; struct named_label_list *ent; timevar_push (TV_NAME_LOOKUP); - /* You can't use labels at global scope. */ if (current_function_decl == NULL_TREE) { --- 2125,2136 ---- labels, and complain about them at the end of a function.) */ tree ! lookup_label (tree id) { tree decl; struct named_label_list *ent; timevar_push (TV_NAME_LOOKUP); /* You can't use labels at global scope. */ if (current_function_decl == NULL_TREE) { *************** lookup_label (id) *** 5196,5203 **** /* Record this label on the list of labels used in this function. We do this before calling make_label_decl so that we get the IDENTIFIER_LABEL_VALUE before the new label is declared. */ ! ent = ((struct named_label_list *) ! ggc_alloc_cleared (sizeof (struct named_label_list))); ent->old_value = IDENTIFIER_LABEL_VALUE (id); ent->next = named_labels; named_labels = ent; --- 2147,2153 ---- /* Record this label on the list of labels used in this function. We do this before calling make_label_decl so that we get the IDENTIFIER_LABEL_VALUE before the new label is declared. */ ! ent = ggc_alloc_cleared (sizeof (struct named_label_list)); ent->old_value = IDENTIFIER_LABEL_VALUE (id); ent->next = named_labels; named_labels = ent; *************** lookup_label (id) *** 5214,5221 **** /* Declare a local label named ID. */ tree ! declare_local_label (id) ! tree id; { tree decl; --- 2164,2170 ---- /* Declare a local label named ID. */ tree ! declare_local_label (tree id) { tree decl; *************** declare_local_label (id) *** 5237,5244 **** DECL. Returns 2 if it's also a real problem. */ static int ! decl_jump_unsafe (decl) ! tree decl; { if (TREE_CODE (decl) != VAR_DECL || TREE_STATIC (decl)) return 0; --- 2186,2192 ---- DECL. Returns 2 if it's also a real problem. */ static int ! decl_jump_unsafe (tree decl) { if (TREE_CODE (decl) != VAR_DECL || TREE_STATIC (decl)) return 0; *************** decl_jump_unsafe (decl) *** 5262,5273 **** context; FILE and LINE are the source position of the jump or 0. */ static void ! check_previous_goto_1 (decl, level, names, file, line) ! tree decl; ! struct cp_binding_level *level; ! tree names; ! const char *file; ! int line; { int identified = 0; int saw_eh = 0; --- 2210,2218 ---- context; FILE and LINE are the source position of the jump or 0. */ static void ! check_previous_goto_1 (tree decl, ! struct cp_binding_level* level, ! tree names, const location_t *locus) { int identified = 0; int saw_eh = 0; *************** check_previous_goto_1 (decl, level, name *** 5290,5297 **** else pedwarn ("jump to case label"); ! if (file) ! pedwarn_with_file_and_line (file, line, " from here"); identified = 1; } --- 2235,2242 ---- else pedwarn ("jump to case label"); ! if (locus) ! pedwarn ("%H from here", locus); identified = 1; } *************** check_previous_goto_1 (decl, level, name *** 5305,5311 **** if (b == level) break; ! if ((b->is_try_scope || b->is_catch_scope) && ! saw_eh) { if (! identified) { --- 2250,2256 ---- if (b == level) break; ! if ((b->kind == sk_try || b->kind == sk_catch) && ! saw_eh) { if (! identified) { *************** check_previous_goto_1 (decl, level, name *** 5314,5324 **** else pedwarn ("jump to case label"); ! if (file) ! pedwarn_with_file_and_line (file, line, " from here"); identified = 1; } ! if (b->is_try_scope) error (" enters try block"); else error (" enters catch block"); --- 2259,2269 ---- else pedwarn ("jump to case label"); ! if (locus) ! pedwarn ("%H from here", locus); identified = 1; } ! if (b->kind == sk_try) error (" enters try block"); else error (" enters catch block"); *************** check_previous_goto_1 (decl, level, name *** 5328,5354 **** } static void ! check_previous_goto (use) ! struct named_label_use_list *use; { check_previous_goto_1 (use->label_decl, use->binding_level, ! use->names_in_scope, use->filename_o_goto, ! use->lineno_o_goto); } static void ! check_switch_goto (level) ! struct cp_binding_level *level; { ! check_previous_goto_1 (NULL_TREE, level, level->names, NULL, 0); } /* Check that any previously seen jumps to a newly defined label DECL are OK. Called by define_label. */ static void ! check_previous_gotos (decl) ! tree decl; { struct named_label_use_list **usep; --- 2273,2295 ---- } static void ! check_previous_goto (struct named_label_use_list* use) { check_previous_goto_1 (use->label_decl, use->binding_level, ! use->names_in_scope, &use->o_goto_locus); } static void ! check_switch_goto (struct cp_binding_level* level) { ! check_previous_goto_1 (NULL_TREE, level, level->names, NULL); } /* Check that any previously seen jumps to a newly defined label DECL are OK. Called by define_label. */ static void ! check_previous_gotos (tree decl) { struct named_label_use_list **usep; *************** check_previous_gotos (decl) *** 5372,5379 **** finish_goto_stmt. */ void ! check_goto (decl) ! tree decl; { int identified = 0; tree bad; --- 2313,2319 ---- finish_goto_stmt. */ void ! check_goto (tree decl) { int identified = 0; tree bad; *************** check_goto (decl) *** 5415,5421 **** if (u > 1 && DECL_ARTIFICIAL (b)) /* Can't skip init of __exception_info. */ ! cp_error_at (" enters catch block", b); else if (u > 1) cp_error_at (" skips initialization of `%#D'", b); else --- 2355,2361 ---- if (u > 1 && DECL_ARTIFICIAL (b)) /* Can't skip init of __exception_info. */ ! error ("%J enters catch block", b); else if (u > 1) cp_error_at (" skips initialization of `%#D'", b); else *************** check_goto (decl) *** 5432,5455 **** Return the LABEL_DECL node for the label. */ tree ! define_label (filename, line, name) ! const char *filename; ! int line; ! tree name; { tree decl = lookup_label (name); struct named_label_list *ent; ! register struct cp_binding_level *p; timevar_push (TV_NAME_LOOKUP); - for (ent = named_labels; ent; ent = ent->next) if (ent->label_decl == decl) break; /* After labels, make any new cleanups in the function go into their own new (temporary) binding contour. */ ! for (p = current_binding_level; !(p->parm_flag); p = p->level_chain) p->more_cleanups_ok = 0; if (name == get_identifier ("wchar_t")) --- 2372,2393 ---- Return the LABEL_DECL node for the label. */ tree ! define_label (location_t location, tree name) { tree decl = lookup_label (name); struct named_label_list *ent; ! struct cp_binding_level *p; timevar_push (TV_NAME_LOOKUP); for (ent = named_labels; ent; ent = ent->next) if (ent->label_decl == decl) break; /* After labels, make any new cleanups in the function go into their own new (temporary) binding contour. */ ! for (p = current_binding_level; ! p->kind != sk_function_parms; ! p = p->level_chain) p->more_cleanups_ok = 0; if (name == get_identifier ("wchar_t")) *************** define_label (filename, line, name) *** 5462,5469 **** /* Mark label as having been defined. */ DECL_INITIAL (decl) = error_mark_node; /* Say where in the source. */ ! DECL_SOURCE_FILE (decl) = filename; ! DECL_SOURCE_LINE (decl) = line; if (ent) { ent->names_in_scope = current_binding_level->names; --- 2400,2406 ---- /* Mark label as having been defined. */ DECL_INITIAL (decl) = error_mark_node; /* Say where in the source. */ ! DECL_SOURCE_LOCATION (decl) = location; if (ent) { ent->names_in_scope = current_binding_level->names; *************** static struct cp_switch *switch_stack; *** 5502,5512 **** SWITCH_STMT is the switch statement being parsed. */ void ! push_switch (switch_stmt) ! tree switch_stmt; { ! struct cp_switch *p ! = (struct cp_switch *) xmalloc (sizeof (struct cp_switch)); p->level = current_binding_level; p->next = switch_stack; p->switch_stmt = switch_stmt; --- 2439,2447 ---- SWITCH_STMT is the switch statement being parsed. */ void ! push_switch (tree switch_stmt) { ! struct cp_switch *p = xmalloc (sizeof (struct cp_switch)); p->level = current_binding_level; p->next = switch_stack; p->switch_stmt = switch_stmt; *************** push_switch (switch_stmt) *** 5515,5521 **** } void ! pop_switch () { struct cp_switch *cs; --- 2450,2456 ---- } void ! pop_switch (void) { struct cp_switch *cs; *************** pop_switch () *** 5529,5552 **** is a bad place for one. */ tree ! finish_case_label (low_value, high_value) ! tree low_value; ! tree high_value; { tree cond, r; ! register struct cp_binding_level *p; ! ! if (! switch_stack) ! { ! if (high_value) ! error ("case label not within a switch statement"); ! else if (low_value) ! error ("case label `%E' not within a switch statement", ! low_value); ! else ! error ("`default' label not within a switch statement"); ! return NULL_TREE; ! } if (processing_template_decl) { --- 2464,2473 ---- is a bad place for one. */ tree ! finish_case_label (tree low_value, tree high_value) { tree cond, r; ! struct cp_binding_level *p; if (processing_template_decl) { *************** finish_case_label (low_value, high_value *** 5564,5899 **** cond = TREE_VALUE (cond); r = c_add_case_label (switch_stack->cases, cond, low_value, high_value); - if (r == error_mark_node) - r = NULL_TREE; check_switch_goto (switch_stack->level); /* After labels, make any new cleanups in the function go into their own new (temporary) binding contour. */ ! for (p = current_binding_level; !(p->parm_flag); p = p->level_chain) p->more_cleanups_ok = 0; return r; } - /* Return the list of declarations of the current level. - Note that this list is in reverse order unless/until - you nreverse it; and when you do nreverse it, you must - store the result back using `storedecls' or you will lose. */ - - tree - getdecls () - { - return current_binding_level->names; - } - - /* Store the list of declarations of the current level. - This is done for the parameter declarations of a function being defined, - after they are modified in the light of any missing parameters. */ - - static void - storedecls (decls) - tree decls; - { - current_binding_level->names = decls; - } - - /* Set the current binding TABLE for type declarations.. This is a - temporary workaround of the fact that the data structure classtypes - does not currently carry its allocated cxx_scope structure. */ - void - cxx_remember_type_decls (binding_table table) - { - current_binding_level->type_decls = table; - } - - - /* Return the type that should be used when TYPE's name is preceded - by a tag such as 'struct' or 'union', or null if the name cannot - be used in this way. - - For example, when processing the third line of: - - struct A; - typedef struct A A; - struct A; - - lookup of A will find the typedef. Given A's typedef, this function - will return the type associated with "struct A". For the tag to be - anything other than TYPE, TYPE must be a typedef whose original type - has the same name and context as TYPE itself. - - It is not valid for a typedef of an anonymous type to be used with - an explicit tag: - - typedef struct { ... } B; - struct B; - - Return null for this case. */ - - static tree - follow_tag_typedef (type) - tree type; - { - tree original; - - original = original_type (type); - if (! TYPE_NAME (original)) - return NULL_TREE; - if (TYPE_IDENTIFIER (original) == TYPE_IDENTIFIER (type) - && (CP_DECL_CONTEXT (TYPE_NAME (original)) - == CP_DECL_CONTEXT (TYPE_NAME (type))) - && !(CLASS_TYPE_P (original) && TYPE_WAS_ANONYMOUS (original))) - return original; - else - return NULL_TREE; - } - - /* Given NAME, an IDENTIFIER_NODE, - return the structure (or union or enum) definition for that name. - Searches binding levels from BINDING_LEVEL up to the global level. - If THISLEVEL_ONLY is nonzero, searches only the specified context - (but skips any tag-transparent contexts to find one that is - meaningful for tags). - FORM says which kind of type the caller wants; - it is RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE. - If the wrong kind of type is found, and it's not a template, an error is - reported. */ - - static tree - lookup_tag (form, name, binding_level, thislevel_only) - enum tree_code form; - tree name; - struct cp_binding_level *binding_level; - int thislevel_only; - { - register struct cp_binding_level *level; - /* Nonzero if, we should look past a template parameter level, even - if THISLEVEL_ONLY. */ - int allow_template_parms_p = 1; - bool type_is_anonymous = ANON_AGGRNAME_P (name); - - timevar_push (TV_NAME_LOOKUP); - - for (level = binding_level; level; level = level->level_chain) - { - register tree tail; - if (type_is_anonymous && level->type_decls != NULL) - { - tree type = binding_table_find_anon_type (level->type_decls, name); - /* There's no need for error checking here, because - anon names are unique throughout the compilation. */ - if (type != NULL) - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, type); - } - else if (level->namespace_p) - /* Do namespace lookup. */ - for (tail = current_namespace; 1; tail = CP_DECL_CONTEXT (tail)) - { - cxx_binding *binding = - cxx_scope_find_binding_for_name (tail, name); - tree old; - - /* If we just skipped past a template parameter level, - even though THISLEVEL_ONLY, and we find a template - class declaration, then we use the _TYPE node for the - template. See the example below. */ - if (thislevel_only && !allow_template_parms_p - && binding && BINDING_VALUE (binding) - && DECL_CLASS_TEMPLATE_P (BINDING_VALUE (binding))) - old = TREE_TYPE (BINDING_VALUE (binding)); - else if (binding) - old = BINDING_TYPE (binding); - else - old = NULL; - - if (old) - { - /* We've found something at this binding level. If it is - a typedef, extract the tag it refers to. Lookup fails - if the typedef doesn't refer to a taggable type. */ - old = follow_tag_typedef (old); - if (!old) - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); - if (TREE_CODE (old) != form - && (form == ENUMERAL_TYPE - || TREE_CODE (old) == ENUMERAL_TYPE)) - { - error ("`%#D' redeclared as %C", old, form); - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); - } - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, old); - } - if (thislevel_only || tail == global_namespace) - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); - } - else if (level->type_decls != NULL) - { - binding_entry entry = binding_table_find (level->type_decls, name); - if (entry != NULL) - { - enum tree_code code = TREE_CODE (entry->type); - - if (code != form - && (form == ENUMERAL_TYPE || code == ENUMERAL_TYPE)) - { - /* Definition isn't the kind we were looking for. */ - error ("`%#D' redeclared as %C", entry->type, form); - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); - } - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, entry->type); - } - } - if (thislevel_only && ! level->tag_transparent) - { - if (level->template_parms_p && allow_template_parms_p) - { - /* We must deal with cases like this: - - template struct S; - template struct S {}; - - When looking up `S', for the second declaration, we - would like to find the first declaration. But, we - are in the pseudo-global level created for the - template parameters, rather than the (surrounding) - namespace level. Thus, we keep going one more level, - even though THISLEVEL_ONLY is nonzero. */ - allow_template_parms_p = 0; - continue; - } - else - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); - } - } - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); - } - - #if 0 - void - set_current_level_tags_transparency (tags_transparent) - int tags_transparent; - { - current_binding_level->tag_transparent = tags_transparent; - } - #endif - - /* Given a type, find the tag that was defined for it and return the tag name. - Otherwise return 0. However, the value can never be 0 - in the cases in which this is used. - - C++: If NAME is nonzero, this is the new name to install. This is - done when replacing anonymous tags with real tag names. */ - - static tree - lookup_tag_reverse (type, name) - tree type; - tree name; - { - register struct cp_binding_level *level; - - timevar_push (TV_NAME_LOOKUP); - - for (level = current_binding_level; level; level = level->level_chain) - { - binding_entry entry = level->type_decls == NULL - ? NULL - : binding_table_reverse_maybe_remap (level->type_decls, type, name); - if (entry) - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, entry->name); - } - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); - } - - /* Look up NAME in the NAMESPACE. */ - - tree - lookup_namespace_name (namespace, name) - tree namespace, name; - { - tree val; - tree template_id = NULL_TREE; - cxx_binding binding; - - timevar_push (TV_NAME_LOOKUP); - - my_friendly_assert (TREE_CODE (namespace) == NAMESPACE_DECL, 370); - - if (TREE_CODE (name) == NAMESPACE_DECL) - /* This happens for A::B when B is a namespace. */ - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, name); - else if (TREE_CODE (name) == TEMPLATE_DECL) - { - /* This happens for A::B where B is a template, and there are no - template arguments. */ - error ("invalid use of `%D'", name); - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); - } - - namespace = ORIGINAL_NAMESPACE (namespace); - - if (TREE_CODE (name) == TEMPLATE_ID_EXPR) - { - template_id = name; - name = TREE_OPERAND (name, 0); - if (TREE_CODE (name) == OVERLOAD) - name = DECL_NAME (OVL_CURRENT (name)); - else if (DECL_P (name)) - name = DECL_NAME (name); - } - - my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 373); - - cxx_binding_clear (&binding); - if (!qualified_lookup_using_namespace (name, namespace, &binding, 0)) - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); - - if (binding.value) - { - val = binding.value; - - if (template_id) - { - if (DECL_CLASS_TEMPLATE_P (val)) - val = lookup_template_class (val, - TREE_OPERAND (template_id, 1), - /*in_decl=*/NULL_TREE, - /*context=*/NULL_TREE, - /*entering_scope=*/0, - tf_error | tf_warning); - else if (DECL_FUNCTION_TEMPLATE_P (val) - || TREE_CODE (val) == OVERLOAD) - val = lookup_template_function (val, - TREE_OPERAND (template_id, 1)); - else - { - error ("`%D::%D' is not a template", - namespace, name); - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); - } - } - - /* If we have a single function from a using decl, pull it out. */ - if (TREE_CODE (val) == OVERLOAD && ! really_overloaded_fn (val)) - val = OVL_FUNCTION (val); - - /* Ignore built-in functions that haven't been prototyped yet. */ - if (!val || !DECL_P(val) - || !DECL_LANG_SPECIFIC(val) - || !DECL_ANTICIPATED (val)) - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, val); - } - - error ("`%D' undeclared in namespace `%D'", name, namespace); - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); - } - /* Hash a TYPENAME_TYPE. K is really of type `tree'. */ static hashval_t ! typename_hash (k) ! const void * k; { hashval_t hash; tree t = (tree) k; --- 2485,2507 ---- cond = TREE_VALUE (cond); r = c_add_case_label (switch_stack->cases, cond, low_value, high_value); check_switch_goto (switch_stack->level); /* After labels, make any new cleanups in the function go into their own new (temporary) binding contour. */ ! for (p = current_binding_level; ! p->kind != sk_function_parms; ! p = p->level_chain) p->more_cleanups_ok = 0; return r; } /* Hash a TYPENAME_TYPE. K is really of type `tree'. */ static hashval_t ! typename_hash (const void* k) { hashval_t hash; tree t = (tree) k; *************** typename_hash (k) *** 5907,5915 **** /* Compare two TYPENAME_TYPEs. K1 and K2 are really of type `tree'. */ static int ! typename_compare (k1, k2) ! const void * k1; ! const void * k2; { tree t1; tree t2; --- 2515,2521 ---- /* Compare two TYPENAME_TYPEs. K1 and K2 are really of type `tree'. */ static int ! typename_compare (const void * k1, const void * k2) { tree t1; tree t2; *************** typename_compare (k1, k2) *** 5939,5954 **** static GTY ((param_is (union tree_node))) htab_t typename_htab; ! tree ! build_typename_type (context, name, fullname, base_type) ! tree context; ! tree name; ! tree fullname; ! tree base_type; { tree t; tree d; ! PTR *e; if (typename_htab == NULL) { --- 2545,2556 ---- static GTY ((param_is (union tree_node))) htab_t typename_htab; ! static tree ! build_typename_type (tree context, tree name, tree fullname) { tree t; tree d; ! void **e; if (typename_htab == NULL) { *************** build_typename_type (context, name, full *** 5960,5966 **** t = make_aggr_type (TYPENAME_TYPE); TYPE_CONTEXT (t) = FROB_CONTEXT (context); TYPENAME_TYPE_FULLNAME (t) = fullname; - TREE_TYPE (t) = base_type; /* Build the corresponding TYPE_DECL. */ d = build_decl (TYPE_DECL, name, t); --- 2562,2567 ---- *************** build_typename_type (context, name, full *** 5987,5998 **** complain about errors, otherwise be quiet. */ tree ! make_typename_type (context, name, complain) ! tree context, name; ! tsubst_flags_t complain; { tree fullname; if (TYPE_P (name)) { if (!(TYPE_LANG_SPECIFIC (name) --- 2588,2602 ---- complain about errors, otherwise be quiet. */ tree ! make_typename_type (tree context, tree name, tsubst_flags_t complain) { tree fullname; + if (name == error_mark_node + || context == NULL_TREE + || context == error_mark_node) + return error_mark_node; + if (TYPE_P (name)) { if (!(TYPE_LANG_SPECIFIC (name) *************** make_typename_type (context, name, compl *** 6021,6029 **** error ("`%D' used without template parameters", name); return error_mark_node; } ! if (TREE_CODE (name) != IDENTIFIER_NODE) ! abort (); ! if (TREE_CODE (context) == NAMESPACE_DECL) { /* We can get here from typename_sub0 in the explicit_template_type --- 2625,2632 ---- error ("`%D' used without template parameters", name); return error_mark_node; } ! my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 20030802); ! if (TREE_CODE (context) == NAMESPACE_DECL) { /* We can get here from typename_sub0 in the explicit_template_type *************** make_typename_type (context, name, compl *** 6034,6047 **** return error_mark_node; } ! if (! uses_template_parms (context) || currently_open_class (context)) { if (TREE_CODE (fullname) == TEMPLATE_ID_EXPR) { tree tmpl = NULL_TREE; if (IS_AGGR_TYPE (context)) ! tmpl = lookup_field (context, name, 0, 0); if (!tmpl || !DECL_CLASS_TEMPLATE_P (tmpl)) { if (complain & tf_error) --- 2637,2650 ---- return error_mark_node; } ! if (!dependent_type_p (context) || currently_open_class (context)) { if (TREE_CODE (fullname) == TEMPLATE_ID_EXPR) { tree tmpl = NULL_TREE; if (IS_AGGR_TYPE (context)) ! tmpl = lookup_field (context, name, 0, false); if (!tmpl || !DECL_CLASS_TEMPLATE_P (tmpl)) { if (complain & tf_error) *************** make_typename_type (context, name, compl *** 6051,6068 **** } if (complain & tf_error) ! { ! if (complain & tf_parsing) ! type_access_control (context, tmpl); ! else ! enforce_access (context, tmpl); ! } return lookup_template_class (tmpl, TREE_OPERAND (fullname, 1), NULL_TREE, context, /*entering_scope=*/0, ! tf_error | tf_warning); } else { --- 2654,2666 ---- } if (complain & tf_error) ! perform_or_defer_access_check (TYPE_BINFO (context), tmpl); return lookup_template_class (tmpl, TREE_OPERAND (fullname, 1), NULL_TREE, context, /*entering_scope=*/0, ! tf_error | tf_warning | tf_user); } else { *************** make_typename_type (context, name, compl *** 6075,6081 **** return error_mark_node; } ! t = lookup_field (context, name, 0, 1); if (t) { if (TREE_CODE (t) != TYPE_DECL) --- 2673,2679 ---- return error_mark_node; } ! t = lookup_field (context, name, 0, true); if (t) { if (TREE_CODE (t) != TYPE_DECL) *************** make_typename_type (context, name, compl *** 6086,6110 **** } if (complain & tf_error) ! { ! if (complain & tf_parsing) ! type_access_control (context, t); ! else ! enforce_access (context, t); ! } if (DECL_ARTIFICIAL (t) || !(complain & tf_keep_type_decl)) t = TREE_TYPE (t); - if (IMPLICIT_TYPENAME_P (t)) - { - /* Lookup found an implicit typename that we had - injected into the current scope. Doing things - properly would have located the exact same type, - so there is no error here. We must remove the - implicitness so that we do not warn about it. */ - t = copy_node (t); - TREE_TYPE (t) = NULL_TREE; - } return t; } --- 2684,2693 ---- } if (complain & tf_error) ! perform_or_defer_access_check (TYPE_BINFO (context), t); if (DECL_ARTIFICIAL (t) || !(complain & tf_keep_type_decl)) t = TREE_TYPE (t); return t; } *************** make_typename_type (context, name, compl *** 6113,6126 **** /* If the CONTEXT is not a template type, then either the field is there now or its never going to be. */ ! if (!uses_template_parms (context)) { if (complain & tf_error) error ("no type named `%#T' in `%#T'", name, context); return error_mark_node; } ! return build_typename_type (context, name, fullname, NULL_TREE); } /* Resolve `CONTEXT::template NAME'. Returns an appropriate type, --- 2696,2709 ---- /* If the CONTEXT is not a template type, then either the field is there now or its never going to be. */ ! if (!dependent_type_p (context)) { if (complain & tf_error) error ("no type named `%#T' in `%#T'", name, context); return error_mark_node; } ! return build_typename_type (context, name, fullname); } /* Resolve `CONTEXT::template NAME'. Returns an appropriate type, *************** make_typename_type (context, name, compl *** 6130,6138 **** that occur. */ tree ! make_unbound_class_template (context, name, complain) ! tree context, name; ! tsubst_flags_t complain; { tree t; tree d; --- 2713,2719 ---- that occur. */ tree ! make_unbound_class_template (tree context, tree name, tsubst_flags_t complain) { tree t; tree d; *************** make_unbound_class_template (context, na *** 6144,6156 **** if (TREE_CODE (name) != IDENTIFIER_NODE) abort (); ! if (!uses_template_parms (context) || currently_open_class (context)) { tree tmpl = NULL_TREE; if (IS_AGGR_TYPE (context)) ! tmpl = lookup_field (context, name, 0, 0); if (!tmpl || !DECL_CLASS_TEMPLATE_P (tmpl)) { --- 2725,2737 ---- if (TREE_CODE (name) != IDENTIFIER_NODE) abort (); ! if (!dependent_type_p (context) || currently_open_class (context)) { tree tmpl = NULL_TREE; if (IS_AGGR_TYPE (context)) ! tmpl = lookup_field (context, name, 0, false); if (!tmpl || !DECL_CLASS_TEMPLATE_P (tmpl)) { *************** make_unbound_class_template (context, na *** 6160,6171 **** } if (complain & tf_error) ! { ! if (complain & tf_parsing) ! type_access_control (context, tmpl); ! else ! enforce_access (context, tmpl); ! } return tmpl; } --- 2741,2747 ---- } if (complain & tf_error) ! perform_or_defer_access_check (TYPE_BINFO (context), tmpl); return tmpl; } *************** make_unbound_class_template (context, na *** 6185,6778 **** return t; } ! /* Select the right _DECL from multiple choices. */ ! ! static tree ! select_decl (cxx_binding *binding, int flags) ! { ! tree val; ! ! timevar_push (TV_NAME_LOOKUP); ! ! val = BINDING_VALUE (binding); ! ! if (LOOKUP_NAMESPACES_ONLY (flags)) ! { ! /* We are not interested in types. */ ! if (val && TREE_CODE (val) == NAMESPACE_DECL) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, val); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); ! } ! ! /* If we could have a type and ! we have nothing or we need a type and have none. */ ! if (BINDING_TYPE (binding) ! && (!val || ((flags & LOOKUP_PREFER_TYPES) ! && TREE_CODE (val) != TYPE_DECL))) ! val = TYPE_STUB_DECL (BINDING_TYPE (binding)); ! /* Don't return non-types if we really prefer types. */ ! else if (val && LOOKUP_TYPES_ONLY (flags) && TREE_CODE (val) != TYPE_DECL ! && (TREE_CODE (val) != TEMPLATE_DECL ! || !DECL_CLASS_TEMPLATE_P (val))) ! val = NULL_TREE; ! ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, val); ! } ! ! /* Unscoped lookup of a global: iterate over current namespaces, ! considering using-directives. If SPACESP is non-NULL, store a list ! of the namespaces we've considered in it. */ ! ! tree ! unqualified_namespace_lookup (name, flags, spacesp) ! tree name; ! int flags; ! tree *spacesp; ! { ! tree initial = current_decl_namespace (); ! tree scope = initial; ! tree siter; ! struct cp_binding_level *level; ! tree val = NULL_TREE; ! cxx_binding binding; ! ! timevar_push (TV_NAME_LOOKUP); ! cxx_binding_clear (&binding); ! if (spacesp) ! *spacesp = NULL_TREE; ! ! for (; !val; scope = CP_DECL_CONTEXT (scope)) ! { ! cxx_binding *b; ! if (spacesp) ! *spacesp = tree_cons (scope, NULL_TREE, *spacesp); ! b = cxx_scope_find_binding_for_name (scope, name); ! ! /* Ignore anticipated built-in functions. */ ! if (b && BINDING_VALUE (b) && DECL_P (BINDING_VALUE (b)) ! && DECL_LANG_SPECIFIC (BINDING_VALUE (b)) ! && DECL_ANTICIPATED (BINDING_VALUE (b))) ! /* Keep binding cleared. */; ! else if (b) ! { ! /* Initialize binding for this context. */ ! binding.value = BINDING_VALUE (b); ! binding.type = BINDING_TYPE (b); ! } ! ! /* Add all _DECLs seen through local using-directives. */ ! for (level = current_binding_level; ! !level->namespace_p; ! level = level->level_chain) ! if (!lookup_using_namespace (name, &binding, level->using_directives, ! scope, flags, spacesp)) ! /* Give up because of error. */ ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); ! ! /* Add all _DECLs seen through global using-directives. */ ! /* XXX local and global using lists should work equally. */ ! siter = initial; ! while (1) ! { ! if (!lookup_using_namespace (name, &binding, ! DECL_NAMESPACE_USING (siter), ! scope, flags, spacesp)) ! /* Give up because of error. */ ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); ! if (siter == scope) break; ! siter = CP_DECL_CONTEXT (siter); ! } ! ! val = select_decl (&binding, flags); ! if (scope == global_namespace) ! break; ! } ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, val); ! } ! ! /* Combine prefer_type and namespaces_only into flags. */ ! ! static int ! lookup_flags (prefer_type, namespaces_only) ! int prefer_type, namespaces_only; ! { ! if (namespaces_only) ! return LOOKUP_PREFER_NAMESPACES; ! if (prefer_type > 1) ! return LOOKUP_PREFER_TYPES; ! if (prefer_type > 0) ! return LOOKUP_PREFER_BOTH; ! return 0; ! } ! ! /* Given a lookup that returned VAL, use FLAGS to decide if we want to ! ignore it or not. Subroutine of lookup_name_real. */ ! ! static tree ! qualify_lookup (val, flags) ! tree val; ! int flags; ! { ! if (val == NULL_TREE) ! return val; ! if ((flags & LOOKUP_PREFER_NAMESPACES) && TREE_CODE (val) == NAMESPACE_DECL) ! return val; ! if ((flags & LOOKUP_PREFER_TYPES) ! && (TREE_CODE (val) == TYPE_DECL ! || ((flags & LOOKUP_TEMPLATES_EXPECTED) ! && DECL_CLASS_TEMPLATE_P (val)))) ! return val; ! if (flags & (LOOKUP_PREFER_NAMESPACES | LOOKUP_PREFER_TYPES)) ! return NULL_TREE; ! return val; ! } ! ! /* Any other BINDING overrides an implicit TYPENAME. Warn about ! that. */ ! ! static void ! warn_about_implicit_typename_lookup (typename, binding) ! tree typename; ! tree binding; ! { ! tree subtype = TREE_TYPE (TREE_TYPE (typename)); ! tree name = DECL_NAME (typename); ! ! if (! (TREE_CODE (binding) == TEMPLATE_DECL ! && CLASS_TYPE_P (subtype) ! && CLASSTYPE_TEMPLATE_INFO (subtype) ! && CLASSTYPE_TI_TEMPLATE (subtype) == binding) ! && ! (TREE_CODE (binding) == TYPE_DECL ! && same_type_p (TREE_TYPE (binding), subtype))) ! { ! warning ("lookup of `%D' finds `%#D'", ! name, binding); ! warning (" instead of `%D' from dependent base class", ! typename); ! warning (" (use `typename %T::%D' if that's what you meant)", ! constructor_name (current_class_type), name); ! } ! } ! ! /* Check to see whether or not DECL is a variable that would have been ! in scope under the ARM, but is not in scope under the ANSI/ISO ! standard. If so, issue an error message. If name lookup would ! work in both cases, but return a different result, this function ! returns the result of ANSI/ISO lookup. Otherwise, it returns ! DECL. */ ! ! tree ! check_for_out_of_scope_variable (tree decl) ! { ! tree shadowed; ! ! /* We only care about out of scope variables. */ ! if (!(TREE_CODE (decl) == VAR_DECL && DECL_DEAD_FOR_LOCAL (decl))) ! return decl; ! ! shadowed = DECL_SHADOWED_FOR_VAR (decl); ! while (shadowed != NULL_TREE && TREE_CODE (shadowed) == VAR_DECL ! && DECL_DEAD_FOR_LOCAL (shadowed)) ! shadowed = DECL_SHADOWED_FOR_VAR (shadowed); ! if (!shadowed) ! shadowed = IDENTIFIER_NAMESPACE_VALUE (DECL_NAME (decl)); ! if (shadowed) ! { ! if (!DECL_ERROR_REPORTED (decl)) ! { ! warning ("name lookup of `%D' changed", ! DECL_NAME (decl)); ! cp_warning_at (" matches this `%D' under ISO standard rules", ! shadowed); ! cp_warning_at (" matches this `%D' under old rules", decl); ! DECL_ERROR_REPORTED (decl) = 1; ! } ! return shadowed; ! } ! ! /* If we have already complained about this declaration, there's no ! need to do it again. */ ! if (DECL_ERROR_REPORTED (decl)) ! return decl; ! ! DECL_ERROR_REPORTED (decl) = 1; ! if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (decl))) ! { ! error ("name lookup of `%D' changed for new ISO `for' scoping", ! DECL_NAME (decl)); ! cp_error_at (" cannot use obsolete binding at `%D' because it has a destructor", decl); ! return error_mark_node; ! } ! else ! { ! pedwarn ("name lookup of `%D' changed for new ISO `for' scoping", ! DECL_NAME (decl)); ! cp_pedwarn_at (" using obsolete binding at `%D'", decl); ! } ! ! return decl; ! } ! ! /* Look up NAME in the current binding level and its superiors in the ! namespace of variables, functions and typedefs. Return a ..._DECL ! node of some kind representing its definition if there is only one ! such declaration, or return a TREE_LIST with all the overloaded ! definitions if there are many, or return 0 if it is undefined. ! ! If PREFER_TYPE is > 0, we prefer TYPE_DECLs or namespaces. ! If PREFER_TYPE is > 1, we reject non-type decls (e.g. namespaces). ! If PREFER_TYPE is -2, we're being called from yylex(). (UGLY) ! Otherwise we prefer non-TYPE_DECLs. ! ! If NONCLASS is nonzero, we don't look for the NAME in class scope, ! using IDENTIFIER_CLASS_VALUE. */ ! ! static tree ! lookup_name_real (name, prefer_type, nonclass, namespaces_only) ! tree name; ! int prefer_type, nonclass, namespaces_only; ! { ! tree t; ! tree val = NULL_TREE; ! int yylex = 0; ! tree from_obj = NULL_TREE; ! int flags; ! int val_is_implicit_typename = 0; ! cxx_binding *iter; ! ! timevar_push (TV_NAME_LOOKUP); ! ! /* Hack: copy flag set by parser, if set. */ ! if (only_namespace_names) ! namespaces_only = 1; ! ! if (prefer_type == -2) ! { ! extern int looking_for_typename; ! tree type = NULL_TREE; ! ! yylex = 1; ! prefer_type = looking_for_typename; ! ! flags = lookup_flags (prefer_type, namespaces_only); ! /* If the next thing is '<', class templates are types. */ ! if (looking_for_template) ! flags |= LOOKUP_TEMPLATES_EXPECTED; ! ! if (got_scope) ! type = got_scope; ! else if (got_object != error_mark_node) ! type = got_object; ! ! if (type) ! { ! if (type == error_mark_node) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); ! if (IMPLICIT_TYPENAME_P (type)) ! type = TREE_TYPE (type); ! ! if (TYPE_P (type)) ! type = complete_type (type); ! ! if (TREE_CODE (type) == VOID_TYPE) ! type = global_namespace; ! if (TREE_CODE (type) == NAMESPACE_DECL) ! { ! cxx_binding b; ! cxx_binding_clear (&b); ! flags |= LOOKUP_COMPLAIN; ! if (!qualified_lookup_using_namespace (name, type, &b, flags)) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); ! val = select_decl (&b, flags); ! } ! else if (! IS_AGGR_TYPE (type) ! || TREE_CODE (type) == TEMPLATE_TYPE_PARM ! || TREE_CODE (type) == BOUND_TEMPLATE_TEMPLATE_PARM ! || TREE_CODE (type) == TYPENAME_TYPE) ! /* Someone else will give an error about this if needed. */ ! val = NULL_TREE; ! else if (type == current_class_type) ! val = IDENTIFIER_CLASS_VALUE (name); ! else ! { ! val = lookup_member (type, name, 0, prefer_type); ! if (!uses_template_parms (type)) ! type_access_control (type, val); ! ! /* Restore the containing TYPENAME_TYPE if we looked ! through it before. */ ! if (got_scope && got_scope != type ! && val && TREE_CODE (val) == TYPE_DECL ! && TREE_CODE (TREE_TYPE (val)) == TYPENAME_TYPE) ! { ! val = TREE_TYPE (val); ! val = build_typename_type (got_scope, name, ! TYPENAME_TYPE_FULLNAME (val), ! TREE_TYPE (val)); ! val = TYPE_STUB_DECL (val); ! } ! } ! } ! else ! val = NULL_TREE; ! ! if (got_scope) ! goto done; ! else if (got_object && val) ! { ! from_obj = val; ! val = NULL_TREE; ! } ! } ! else ! { ! flags = lookup_flags (prefer_type, namespaces_only); ! /* If we're not parsing, we need to complain. */ ! flags |= LOOKUP_COMPLAIN; ! } ! ! /* Conversion operators are handled specially because ordinary ! unqualified name lookup will not find template conversion ! operators. */ ! if (IDENTIFIER_TYPENAME_P (name)) ! { ! struct cp_binding_level *level; ! ! for (level = current_binding_level; ! level && !level->namespace_p; ! level = level->level_chain) ! { ! tree class_type; ! tree operators; ! ! /* A conversion operator can only be declared in a class ! scope. */ ! if (level->parm_flag != 2) ! continue; ! ! /* Lookup the conversion operator in the class. */ ! class_type = level->this_class; ! operators = lookup_fnfields (class_type, name, /*protect=*/0); ! if (operators) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, operators); ! } ! ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); ! } ! ! /* First, look in non-namespace scopes. */ ! ! if (current_class_type == NULL_TREE) ! nonclass = 1; ! ! for (iter = IDENTIFIER_BINDING (name); iter; iter = iter->previous) ! { ! tree binding; ! ! if (!LOCAL_BINDING_P (iter) && nonclass) ! /* We're not looking for class-scoped bindings, so keep going. */ ! continue; ! ! /* If this is the kind of thing we're looking for, we're done. */ ! if (qualify_lookup (BINDING_VALUE (iter), flags)) ! binding = BINDING_VALUE (iter); ! else if ((flags & LOOKUP_PREFER_TYPES) ! && qualify_lookup (BINDING_TYPE (iter), flags)) ! binding = BINDING_TYPE (iter); ! else ! binding = NULL_TREE; ! ! /* Handle access control on types from enclosing or base classes. */ ! if (binding && ! yylex ! && BINDING_LEVEL (iter) && BINDING_LEVEL (iter)->parm_flag == 2) ! type_access_control (BINDING_LEVEL (iter)->this_class, binding); ! ! if (binding ! && (!val || !IMPLICIT_TYPENAME_TYPE_DECL_P (binding))) ! { ! if (val_is_implicit_typename && !yylex) ! warn_about_implicit_typename_lookup (val, binding); ! val = binding; ! val_is_implicit_typename ! = IMPLICIT_TYPENAME_TYPE_DECL_P (val); ! if (!val_is_implicit_typename) ! break; ! } ! } ! ! /* The name might be from an enclosing class of the current scope. */ ! if (!val && !nonclass && current_class_type) ! val = qualify_lookup (lookup_nested_field (name, !yylex), flags); ! ! /* Now lookup in namespace scopes. */ ! if (!val || val_is_implicit_typename) ! { ! t = unqualified_namespace_lookup (name, flags, 0); ! if (t) ! { ! if (val_is_implicit_typename && !yylex) ! warn_about_implicit_typename_lookup (val, t); ! val = t; ! } ! } ! ! done: ! if (val) ! { ! /* This should only warn about types used in qualified-ids. */ ! if (from_obj && from_obj != val) ! { ! if (looking_for_typename && TREE_CODE (from_obj) == TYPE_DECL ! && TREE_CODE (val) == TYPE_DECL ! && ! same_type_p (TREE_TYPE (from_obj), TREE_TYPE (val))) ! pedwarn ("\ ! lookup of `%D' in the scope of `%#T' (`%#D') \ ! does not match lookup in the current scope (`%#D')", ! name, got_object, from_obj, val); ! ! /* We don't change val to from_obj if got_object depends on ! template parms because that breaks implicit typename for ! destructor calls. */ ! if (! uses_template_parms (got_object)) ! val = from_obj; ! } ! ! /* If we have a single function from a using decl, pull it out. */ ! if (TREE_CODE (val) == OVERLOAD && ! really_overloaded_fn (val)) ! val = OVL_FUNCTION (val); ! } ! else if (from_obj) ! val = from_obj; ! ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, val); ! } ! ! tree ! lookup_name_nonclass (name) ! tree name; ! { ! return lookup_name_real (name, 0, 1, 0); ! } ! ! tree ! lookup_function_nonclass (name, args) ! tree name; ! tree args; ! { ! return lookup_arg_dependent (name, lookup_name_nonclass (name), args); ! } ! ! tree ! lookup_name_namespace_only (name) ! tree name; ! { ! /* type-or-namespace, nonclass, namespace_only */ ! return lookup_name_real (name, 1, 1, 1); ! } ! ! tree ! lookup_name (name, prefer_type) ! tree name; ! int prefer_type; ! { ! return lookup_name_real (name, prefer_type, 0, 0); ! } ! ! /* Similar to `lookup_name' but look only in the innermost non-class ! binding level. */ ! ! tree ! lookup_name_current_level (name) ! tree name; ! { ! struct cp_binding_level *b; ! tree t = NULL_TREE; ! ! timevar_push (TV_NAME_LOOKUP); ! ! b = current_binding_level; ! while (b->parm_flag == 2) ! b = b->level_chain; ! ! if (b->namespace_p) ! { ! t = IDENTIFIER_NAMESPACE_VALUE (name); ! ! /* extern "C" function() */ ! if (t != NULL_TREE && TREE_CODE (t) == TREE_LIST) ! t = TREE_VALUE (t); ! } ! else if (IDENTIFIER_BINDING (name) ! && LOCAL_BINDING_P (IDENTIFIER_BINDING (name))) ! { ! while (1) ! { ! if (BINDING_LEVEL (IDENTIFIER_BINDING (name)) == b) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, IDENTIFIER_VALUE (name)); ! if (b->keep == 2) ! b = b->level_chain; ! else ! break; ! } ! } ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); ! } ! /* Like lookup_name_current_level, but for types. */ tree ! lookup_type_current_level (name) ! tree name; ! { ! register tree t = NULL_TREE; ! ! timevar_push (TV_NAME_LOOKUP); ! ! my_friendly_assert (! current_binding_level->namespace_p, 980716); ! ! if (REAL_IDENTIFIER_TYPE_VALUE (name) != NULL_TREE ! && REAL_IDENTIFIER_TYPE_VALUE (name) != global_type_node) ! { ! struct cp_binding_level *b = current_binding_level; ! while (1) ! { ! if (purpose_member (name, b->type_shadowed)) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, ! REAL_IDENTIFIER_TYPE_VALUE (name)); ! if (b->keep == 2) ! b = b->level_chain; ! else ! break; ! } ! } ! ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); ! } ! ! void ! begin_only_namespace_names () { ! only_namespace_names = 1; } - void - end_only_namespace_names () - { - only_namespace_names = 0; - } - /* Push the declarations of builtin types into the namespace. ! RID_INDEX is the index of the builtin type ! in the array RID_POINTERS. NAME is the name used when looking ! up the builtin type. TYPE is the _TYPE node for the builtin type. */ void ! record_builtin_type (rid_index, name, type) ! enum rid rid_index; ! const char *name; ! tree type; { tree rname = NULL_TREE, tname = NULL_TREE; tree tdecl = NULL_TREE; --- 2761,2789 ---- return t; } ! ! /* A chain of TYPE_DECLs for the builtin types. */ ! static GTY(()) tree builtin_type_decls; ! /* Return a chain of TYPE_DECLs for the builtin types. */ tree ! cxx_builtin_type_decls (void) { ! return builtin_type_decls; } /* Push the declarations of builtin types into the namespace. ! RID_INDEX is the index of the builtin type in the array ! RID_POINTERS. NAME is the name used when looking up the builtin ! type. TYPE is the _TYPE node for the builtin type. */ void ! record_builtin_type (enum rid rid_index, ! const char* name, ! tree type) { tree rname = NULL_TREE, tname = NULL_TREE; tree tdecl = NULL_TREE; *************** record_builtin_type (rid_index, name, ty *** 6782,6809 **** if (name) tname = get_identifier (name); ! TYPE_BUILT_IN (type) = 1; ! if (tname) { ! tdecl = pushdecl (build_decl (TYPE_DECL, tname, type)); ! set_identifier_type_value (tname, NULL_TREE); ! if ((int) rid_index < (int) RID_MAX) ! /* Built-in types live in the global namespace. */ ! SET_IDENTIFIER_GLOBAL_VALUE (tname, tdecl); } ! if (rname != NULL_TREE) { ! if (tname != NULL_TREE) ! { ! set_identifier_type_value (rname, NULL_TREE); ! SET_IDENTIFIER_GLOBAL_VALUE (rname, tdecl); ! } ! else { ! tdecl = pushdecl (build_decl (TYPE_DECL, rname, type)); ! set_identifier_type_value (rname, NULL_TREE); } } } --- 2793,2826 ---- if (name) tname = get_identifier (name); ! /* The calls to SET_IDENTIFIER_GLOBAL_VALUE below should be ! eliminated. Built-in types should not be looked up name; their ! names are keywords that the parser can recognize. However, there ! is code in c-common.c that uses identifier_global_value to look ! up built-in types by name. */ if (tname) { ! tdecl = build_decl (TYPE_DECL, tname, type); ! DECL_ARTIFICIAL (tdecl) = 1; ! SET_IDENTIFIER_GLOBAL_VALUE (tname, tdecl); } ! if (rname) { ! if (!tdecl) { ! tdecl = build_decl (TYPE_DECL, rname, type); ! DECL_ARTIFICIAL (tdecl) = 1; } + SET_IDENTIFIER_GLOBAL_VALUE (rname, tdecl); + } + + if (!TYPE_NAME (type)) + TYPE_NAME (type) = tdecl; + + if (tdecl) + { + TREE_CHAIN (tdecl) = builtin_type_decls; + builtin_type_decls = tdecl; } } *************** record_builtin_type (rid_index, name, ty *** 6813,6821 **** * otherwise it is the negative of the size of one of the other types. */ static tree ! record_builtin_java_type (name, size) ! const char *name; ! int size; { tree type, decl; if (size > 0) --- 2830,2836 ---- * otherwise it is the negative of the size of one of the other types. */ static tree ! record_builtin_java_type (const char* name, int size) { tree type, decl; if (size > 0) *************** record_builtin_java_type (name, size) *** 6846,6854 **** /* Push a type into the namespace so that the back-ends ignore it. */ static void ! record_unknown_type (type, name) ! tree type; ! const char *name; { tree decl = pushdecl (build_decl (TYPE_DECL, get_identifier (name), type)); /* Make sure the "unknown type" typedecl gets ignored for debug info. */ --- 2861,2867 ---- /* Push a type into the namespace so that the back-ends ignore it. */ static void ! record_unknown_type (tree type, const char* name) { tree decl = pushdecl (build_decl (TYPE_DECL, get_identifier (name), type)); /* Make sure the "unknown type" typedecl gets ignored for debug info. */ *************** typedef struct predefined_identifier *** 6876,6882 **** /* Create all the predefined identifiers. */ static void ! initialize_predefined_identifiers () { const predefined_identifier *pid; --- 2889,2895 ---- /* Create all the predefined identifiers. */ static void ! initialize_predefined_identifiers (void) { const predefined_identifier *pid; *************** initialize_predefined_identifiers () *** 6899,6904 **** --- 2912,2918 ---- { VTABLE_PFN_NAME, &pfn_identifier, 0 }, { "_vptr", &vptr_identifier, 0 }, { "__vtt_parm", &vtt_parm_identifier, 0 }, + { "::", &global_scope_name, 0 }, { "std", &std_identifier, 0 }, { NULL, NULL, 0 } }; *************** initialize_predefined_identifiers () *** 6917,6923 **** Make definitions for built-in primitive functions. */ void ! cxx_init_decl_processing () { tree void_ftype; tree void_ftype_ptr; --- 2931,2937 ---- Make definitions for built-in primitive functions. */ void ! cxx_init_decl_processing (void) { tree void_ftype; tree void_ftype_ptr; *************** cxx_init_decl_processing () *** 6931,6940 **** /* Create the global variables. */ push_to_top_level (); /* Enter the global namespace. */ my_friendly_assert (global_namespace == NULL_TREE, 375); ! push_namespace (get_identifier ("::")); ! global_namespace = current_namespace; current_lang_name = NULL_TREE; /* Adjust various flags based on command-line settings. */ --- 2945,2958 ---- /* Create the global variables. */ push_to_top_level (); + current_function_decl = NULL_TREE; + current_binding_level = NULL; /* Enter the global namespace. */ my_friendly_assert (global_namespace == NULL_TREE, 375); ! global_namespace = build_lang_decl (NAMESPACE_DECL, global_scope_name, ! void_type_node); ! begin_scope (sk_namespace, global_namespace); ! current_lang_name = NULL_TREE; /* Adjust various flags based on command-line settings. */ *************** cxx_init_decl_processing () *** 6960,6985 **** /* Initially, C. */ current_lang_name = lang_name_c; - current_function_decl = NULL_TREE; - current_binding_level = NULL_BINDING_LEVEL; - free_binding_level = NULL_BINDING_LEVEL; - build_common_tree_nodes (flag_signed_char); error_mark_list = build_tree_list (error_mark_node, error_mark_node); TREE_TYPE (error_mark_list) = error_mark_node; - /* Make the binding_level structure for global names. */ - pushlevel (0); - current_binding_level->type_decls = binding_table_new (GLOBAL_SCOPE_HT_SIZE); - /* The global level is the namespace level of ::. */ - NAMESPACE_LEVEL (global_namespace) = current_binding_level; - declare_namespace_level (); - - VARRAY_TREE_INIT (current_binding_level->static_decls, - 200, - "Static declarations"); - /* Create the `std' namespace. */ push_namespace (std_identifier); std_node = current_namespace; --- 2978,2988 ---- *************** cxx_init_decl_processing () *** 7001,7016 **** integer_three_node = build_int_2 (3, 0); TREE_TYPE (integer_three_node) = integer_type_node; - boolean_type_node = make_unsigned_type (BOOL_TYPE_SIZE); - TREE_SET_CODE (boolean_type_node, BOOLEAN_TYPE); - TYPE_MAX_VALUE (boolean_type_node) = build_int_2 (1, 0); - TREE_TYPE (TYPE_MAX_VALUE (boolean_type_node)) = boolean_type_node; - TYPE_PRECISION (boolean_type_node) = 1; record_builtin_type (RID_BOOL, "bool", boolean_type_node); ! boolean_false_node = build_int_2 (0, 0); ! TREE_TYPE (boolean_false_node) = boolean_type_node; ! boolean_true_node = build_int_2 (1, 0); ! TREE_TYPE (boolean_true_node) = boolean_type_node; empty_except_spec = build_tree_list (NULL_TREE, NULL_TREE); --- 3004,3013 ---- integer_three_node = build_int_2 (3, 0); TREE_TYPE (integer_three_node) = integer_type_node; record_builtin_type (RID_BOOL, "bool", boolean_type_node); ! truthvalue_type_node = boolean_type_node; ! truthvalue_false_node = boolean_false_node; ! truthvalue_true_node = boolean_true_node; empty_except_spec = build_tree_list (NULL_TREE, NULL_TREE); *************** cxx_init_decl_processing () *** 7075,7088 **** current_lang_name = lang_name_cplusplus; { ! tree bad_alloc_type_node, newtype, deltype; tree ptr_ftype_sizetype; push_namespace (std_identifier); ! bad_alloc_type_node ! = xref_tag (class_type, get_identifier ("bad_alloc"), ! /*attributes=*/NULL_TREE, 1); pop_namespace (); ptr_ftype_sizetype = build_function_type (ptr_type_node, tree_cons (NULL_TREE, --- 3072,3093 ---- current_lang_name = lang_name_cplusplus; { ! tree bad_alloc_id; ! tree bad_alloc_type_node; ! tree bad_alloc_decl; ! tree newtype, deltype; tree ptr_ftype_sizetype; push_namespace (std_identifier); ! bad_alloc_id = get_identifier ("bad_alloc"); ! bad_alloc_type_node = make_aggr_type (RECORD_TYPE); ! TYPE_CONTEXT (bad_alloc_type_node) = current_namespace; ! bad_alloc_decl ! = create_implicit_typedef (bad_alloc_id, bad_alloc_type_node); ! DECL_CONTEXT (bad_alloc_decl) = current_namespace; ! TYPE_STUB_DECL (bad_alloc_type_node) = bad_alloc_decl; pop_namespace (); + ptr_ftype_sizetype = build_function_type (ptr_type_node, tree_cons (NULL_TREE, *************** cxx_init_decl_processing () *** 7125,7136 **** } /* Generate an initializer for a function naming variable from ! NAME. NAME may be NULL, in which case we generate a special ! ERROR_MARK node which should be replaced later. */ tree ! cp_fname_init (name) ! const char *name; { tree domain = NULL_TREE; tree type; --- 3130,3140 ---- } /* Generate an initializer for a function naming variable from ! NAME. NAME may be NULL, to indicate a dependent name. TYPE_P is ! filled in with the type of the init. */ tree ! cp_fname_init (const char* name, tree *type_p) { tree domain = NULL_TREE; tree type; *************** cp_fname_init (name) *** 7147,7158 **** type = build_qualified_type (char_type_node, TYPE_QUAL_CONST); type = build_cplus_array_type (type, domain); if (init) TREE_TYPE (init) = type; else ! /* We don't know the value until instantiation time. Make ! something which will be digested now, but replaced later. */ ! init = build (ERROR_MARK, type); return init; } --- 3151,3162 ---- type = build_qualified_type (char_type_node, TYPE_QUAL_CONST); type = build_cplus_array_type (type, domain); + *type_p = type; + if (init) TREE_TYPE (init) = type; else ! init = error_mark_node; return init; } *************** cp_fname_init (name) *** 7164,7179 **** lazily at the point of first use, so we musn't push the decl now. */ static tree ! cp_make_fname_decl (id, type_dep) ! tree id; ! int type_dep; { const char *const name = (type_dep && processing_template_decl ! ? NULL : fname_as_string (type_dep)); ! tree init = cp_fname_init (name); ! tree decl = build_decl (VAR_DECL, id, TREE_TYPE (init)); ! /* As we don't push the decl here, we must set the context. */ DECL_CONTEXT (decl) = current_function_decl; DECL_PRETTY_FUNCTION_P (decl) = type_dep; --- 3168,3182 ---- lazily at the point of first use, so we musn't push the decl now. */ static tree ! cp_make_fname_decl (tree id, int type_dep) { const char *const name = (type_dep && processing_template_decl ! ? NULL : fname_as_string (type_dep)); ! tree type; ! tree init = cp_fname_init (name, &type); ! tree decl = build_decl (VAR_DECL, id, type); ! /* As we're using pushdecl_with_scope, we must set the context. */ DECL_CONTEXT (decl) = current_function_decl; DECL_PRETTY_FUNCTION_P (decl) = type_dep; *************** cp_make_fname_decl (id, type_dep) *** 7184,7190 **** TREE_USED (decl) = 1; ! cp_finish_decl (decl, init, NULL_TREE, LOOKUP_ONLYCONVERTING); return decl; } --- 3187,3202 ---- TREE_USED (decl) = 1; ! if (current_function_decl) ! { ! struct cp_binding_level *b = current_binding_level; ! while (b->level_chain->kind != sk_function_parms) ! b = b->level_chain; ! pushdecl_with_scope (decl, b); ! cp_finish_decl (decl, init, NULL_TREE, LOOKUP_ONLYCONVERTING); ! } ! else ! pushdecl_top_level_and_finish (decl, init); return decl; } *************** cp_make_fname_decl (id, type_dep) *** 7202,7215 **** list. */ static tree ! builtin_function_1 (name, type, context, code, class, libname, attrs) ! const char *name; ! tree type; ! tree context; ! int code; ! enum built_in_class class; ! const char *libname; ! tree attrs; { tree decl = build_library_fn_1 (get_identifier (name), ERROR_MARK, type); DECL_BUILT_IN_CLASS (decl) = class; --- 3214,3226 ---- list. */ static tree ! builtin_function_1 (const char* name, ! tree type, ! tree context, ! int code, ! enum built_in_class class, ! const char* libname, ! tree attrs) { tree decl = build_library_fn_1 (get_identifier (name), ERROR_MARK, type); DECL_BUILT_IN_CLASS (decl) = class; *************** builtin_function_1 (name, type, context, *** 7241,7247 **** /* Entry point for the benefit of c_common_nodes_and_builtins. ! Make a defintion for a builtin function named NAME and whose data type is TYPE. TYPE should be a function type with argument types. This function places the anticipated declaration in the global namespace and additionally in the std namespace if appropriate. --- 3252,3258 ---- /* Entry point for the benefit of c_common_nodes_and_builtins. ! Make a definition for a builtin function named NAME and whose data type is TYPE. TYPE should be a function type with argument types. This function places the anticipated declaration in the global namespace and additionally in the std namespace if appropriate. *************** builtin_function_1 (name, type, context, *** 7256,7268 **** list. */ tree ! builtin_function (name, type, code, class, libname, attrs) ! const char *name; ! tree type; ! int code; ! enum built_in_class class; ! const char *libname; ! tree attrs; { /* All builtins that don't begin with an '_' should additionally go in the 'std' namespace. */ --- 3267,3278 ---- list. */ tree ! builtin_function (const char* name, ! tree type, ! int code, ! enum built_in_class class, ! const char* libname, ! tree attrs) { /* All builtins that don't begin with an '_' should additionally go in the 'std' namespace. */ *************** builtin_function (name, type, code, clas *** 7281,7290 **** function. Not called directly. */ static tree ! build_library_fn_1 (name, operator_code, type) ! tree name; ! enum tree_code operator_code; ! tree type; { tree fn = build_lang_decl (FUNCTION_DECL, name, type); DECL_EXTERNAL (fn) = 1; --- 3291,3297 ---- function. Not called directly. */ static tree ! build_library_fn_1 (tree name, enum tree_code operator_code, tree type) { tree fn = build_lang_decl (FUNCTION_DECL, name, type); DECL_EXTERNAL (fn) = 1; *************** build_library_fn_1 (name, operator_code, *** 7301,7309 **** callers should unset TREE_NOTHROW. */ tree ! build_library_fn (name, type) ! tree name; ! tree type; { return build_library_fn_1 (name, ERROR_MARK, type); } --- 3308,3314 ---- callers should unset TREE_NOTHROW. */ tree ! build_library_fn (tree name, tree type) { return build_library_fn_1 (name, ERROR_MARK, type); } *************** build_library_fn (name, type) *** 7311,7320 **** /* Returns the _DECL for a library function with C++ linkage. */ static tree ! build_cp_library_fn (name, operator_code, type) ! tree name; ! enum tree_code operator_code; ! tree type; { tree fn = build_library_fn_1 (name, operator_code, type); TREE_NOTHROW (fn) = TYPE_NOTHROW_P (type); --- 3316,3322 ---- /* Returns the _DECL for a library function with C++ linkage. */ static tree ! build_cp_library_fn (tree name, enum tree_code operator_code, tree type) { tree fn = build_library_fn_1 (name, operator_code, type); TREE_NOTHROW (fn) = TYPE_NOTHROW_P (type); *************** build_cp_library_fn (name, operator_code *** 7328,7336 **** IDENTIFIER_NODE. */ tree ! build_library_fn_ptr (name, type) ! const char *name; ! tree type; { return build_library_fn (get_identifier (name), type); } --- 3330,3336 ---- IDENTIFIER_NODE. */ tree ! build_library_fn_ptr (const char* name, tree type) { return build_library_fn (get_identifier (name), type); } *************** build_library_fn_ptr (name, type) *** 7339,7347 **** IDENTIFIER_NODE. */ tree ! build_cp_library_fn_ptr (name, type) ! const char *name; ! tree type; { return build_cp_library_fn (get_identifier (name), ERROR_MARK, type); } --- 3339,3345 ---- IDENTIFIER_NODE. */ tree ! build_cp_library_fn_ptr (const char* name, tree type) { return build_cp_library_fn (get_identifier (name), ERROR_MARK, type); } *************** build_cp_library_fn_ptr (name, type) *** 7350,7357 **** be able to find it via IDENTIFIER_GLOBAL_VALUE. */ tree ! push_library_fn (name, type) ! tree name, type; { tree fn = build_library_fn (name, type); pushdecl_top_level (fn); --- 3348,3354 ---- be able to find it via IDENTIFIER_GLOBAL_VALUE. */ tree ! push_library_fn (tree name, tree type) { tree fn = build_library_fn (name, type); pushdecl_top_level (fn); *************** push_library_fn (name, type) *** 7362,7370 **** will be found by normal lookup. */ static tree ! push_cp_library_fn (operator_code, type) ! enum tree_code operator_code; ! tree type; { tree fn = build_cp_library_fn (ansi_opname (operator_code), operator_code, --- 3359,3365 ---- will be found by normal lookup. */ static tree ! push_cp_library_fn (enum tree_code operator_code, tree type) { tree fn = build_cp_library_fn (ansi_opname (operator_code), operator_code, *************** push_cp_library_fn (operator_code, type) *** 7377,7384 **** a FUNCTION_TYPE. */ tree ! push_void_library_fn (name, parmtypes) ! tree name, parmtypes; { tree type = build_function_type (void_type_node, parmtypes); return push_library_fn (name, type); --- 3372,3378 ---- a FUNCTION_TYPE. */ tree ! push_void_library_fn (tree name, tree parmtypes) { tree type = build_function_type (void_type_node, parmtypes); return push_library_fn (name, type); *************** push_void_library_fn (name, parmtypes) *** 7388,7415 **** and does not return. Used for __throw_foo and the like. */ tree ! push_throw_library_fn (name, type) ! tree name, type; { tree fn = push_library_fn (name, type); TREE_THIS_VOLATILE (fn) = 1; TREE_NOTHROW (fn) = 0; return fn; } - - /* Apply default attributes to a function, if a system function with default - attributes. */ - - void - cxx_insert_default_attributes (decl) - tree decl; - { - if (!DECL_EXTERN_C_FUNCTION_P (decl)) - return; - if (!TREE_PUBLIC (decl)) - return; - c_common_insert_default_attributes (decl); - } /* When we call finish_struct for an anonymous union, we create default copy constructors and such. But, an anonymous union --- 3382,3394 ---- and does not return. Used for __throw_foo and the like. */ tree ! push_throw_library_fn (tree name, tree type) { tree fn = push_library_fn (name, type); TREE_THIS_VOLATILE (fn) = 1; TREE_NOTHROW (fn) = 0; return fn; } /* When we call finish_struct for an anonymous union, we create default copy constructors and such. But, an anonymous union *************** cxx_insert_default_attributes (decl) *** 7422,7433 **** union type.) */ void ! fixup_anonymous_aggr (t) ! tree t; { tree *q; ! /* Wipe out memory of synthesized methods */ TYPE_HAS_CONSTRUCTOR (t) = 0; TYPE_HAS_DEFAULT_CONSTRUCTOR (t) = 0; TYPE_HAS_INIT_REF (t) = 0; --- 3401,3411 ---- union type.) */ void ! fixup_anonymous_aggr (tree t) { tree *q; ! /* Wipe out memory of synthesized methods. */ TYPE_HAS_CONSTRUCTOR (t) = 0; TYPE_HAS_DEFAULT_CONSTRUCTOR (t) = 0; TYPE_HAS_INIT_REF (t) = 0; *************** fixup_anonymous_aggr (t) *** 7448,7454 **** /* ISO C++ 9.5.3. Anonymous unions may not have function members. */ if (TYPE_METHODS (t)) ! cp_error_at ("an anonymous union cannot have function members", t); /* Anonymous aggregates cannot have fields with ctors, dtors or complex assignment operators (because they cannot have these methods themselves). --- 3426,3433 ---- /* ISO C++ 9.5.3. Anonymous unions may not have function members. */ if (TYPE_METHODS (t)) ! error ("%Jan anonymous union cannot have function members", ! TYPE_MAIN_DECL (t)); /* Anonymous aggregates cannot have fields with ctors, dtors or complex assignment operators (because they cannot have these methods themselves). *************** fixup_anonymous_aggr (t) *** 7479,7508 **** } /* Make sure that a declaration with no declarator is well-formed, i.e. ! just defines a tagged type or anonymous union. ! Returns the type defined, if any. */ tree ! check_tag_decl (declspecs) ! tree declspecs; { int found_type = 0; int saw_friend = 0; int saw_typedef = 0; tree ob_modifier = NULL_TREE; ! register tree link; ! register tree t = NULL_TREE; for (link = declspecs; link; link = TREE_CHAIN (link)) { ! register tree value = TREE_VALUE (link); ! if (TYPE_P (value) ! || TREE_CODE (value) == TYPE_DECL || (TREE_CODE (value) == IDENTIFIER_NODE ! && IDENTIFIER_GLOBAL_VALUE (value) ! && TREE_CODE (IDENTIFIER_GLOBAL_VALUE (value)) == TYPE_DECL)) { ++found_type; --- 3458,3489 ---- } /* Make sure that a declaration with no declarator is well-formed, i.e. ! just declares a tagged type or anonymous union. ! Returns the type declared; or NULL_TREE if none. */ tree ! check_tag_decl (tree declspecs) { int found_type = 0; int saw_friend = 0; int saw_typedef = 0; tree ob_modifier = NULL_TREE; ! tree link; ! /* If a class, struct, or enum type is declared by the DECLSPECS ! (i.e, if a class-specifier, enum-specifier, or non-typename ! elaborated-type-specifier appears in the DECLSPECS), ! DECLARED_TYPE is set to the corresponding type. */ ! tree declared_type = NULL_TREE; ! bool error_p = false; for (link = declspecs; link; link = TREE_CHAIN (link)) { ! tree value = TREE_VALUE (link); ! if (TYPE_P (value) || TREE_CODE (value) == TYPE_DECL || (TREE_CODE (value) == IDENTIFIER_NODE ! && is_typename_at_global_scope (value))) { ++found_type; *************** check_tag_decl (declspecs) *** 7518,7524 **** || TREE_CODE (value) == ENUMERAL_TYPE)) { my_friendly_assert (TYPE_MAIN_DECL (value) != NULL_TREE, 261); ! t = value; } } else if (value == ridpointers[(int) RID_TYPEDEF]) --- 3499,3505 ---- || TREE_CODE (value) == ENUMERAL_TYPE)) { my_friendly_assert (TYPE_MAIN_DECL (value) != NULL_TREE, 261); ! declared_type = value; } } else if (value == ridpointers[(int) RID_TYPEDEF]) *************** check_tag_decl (declspecs) *** 7542,7558 **** || value == ridpointers[(int) RID_EXPLICIT] || value == ridpointers[(int) RID_THREAD]) ob_modifier = value; } if (found_type > 1) error ("multiple types in one declaration"); ! if (t == NULL_TREE && ! saw_friend) pedwarn ("declaration does not declare anything"); - /* Check for an anonymous union. */ ! else if (t && IS_AGGR_TYPE_CODE (TREE_CODE (t)) ! && TYPE_ANONYMOUS_P (t)) { /* 7/3 In a simple-declaration, the optional init-declarator-list can be omitted only when declaring a class (clause 9) or --- 3523,3540 ---- || value == ridpointers[(int) RID_EXPLICIT] || value == ridpointers[(int) RID_THREAD]) ob_modifier = value; + else if (value == error_mark_node) + error_p = true; } if (found_type > 1) error ("multiple types in one declaration"); ! if (declared_type == NULL_TREE && ! saw_friend && !error_p) pedwarn ("declaration does not declare anything"); /* Check for an anonymous union. */ ! else if (declared_type && IS_AGGR_TYPE_CODE (TREE_CODE (declared_type)) ! && TYPE_ANONYMOUS_P (declared_type)) { /* 7/3 In a simple-declaration, the optional init-declarator-list can be omitted only when declaring a class (clause 9) or *************** check_tag_decl (declspecs) *** 7576,7584 **** return NULL_TREE; } /* Anonymous unions are objects, so they can have specifiers. */; ! SET_ANON_AGGR_TYPE_P (t); ! if (TREE_CODE (t) != UNION_TYPE && pedantic && ! in_system_header) pedwarn ("ISO C++ prohibits anonymous structs"); } --- 3558,3567 ---- return NULL_TREE; } /* Anonymous unions are objects, so they can have specifiers. */; ! SET_ANON_AGGR_TYPE_P (declared_type); ! if (TREE_CODE (declared_type) != UNION_TYPE && pedantic ! && !in_system_header) pedwarn ("ISO C++ prohibits anonymous structs"); } *************** check_tag_decl (declspecs) *** 7597,7603 **** ob_modifier); } ! return t; } /* Called when a declaration is seen that contains no names to declare. --- 3580,3586 ---- ob_modifier); } ! return declared_type; } /* Called when a declaration is seen that contains no names to declare. *************** check_tag_decl (declspecs) *** 7609,7631 **** Otherwise, it is an error. C++: may have to grok the declspecs to learn about static, ! complain for anonymous unions. */ ! void ! shadow_tag (declspecs) ! tree declspecs; { tree t = check_tag_decl (declspecs); ! if (t) ! maybe_process_partial_specialization (t); /* This is where the variables in an anonymous union are declared. An anonymous union declaration looks like: union { ... } ; because there is no declarator after the union, the parser sends that declaration here. */ ! if (t && ANON_AGGR_TYPE_P (t)) { fixup_anonymous_aggr (t); --- 3592,3617 ---- Otherwise, it is an error. C++: may have to grok the declspecs to learn about static, ! complain for anonymous unions. ! Returns the TYPE declared -- or NULL_TREE if none. */ ! ! tree ! shadow_tag (tree declspecs) { tree t = check_tag_decl (declspecs); ! if (!t) ! return NULL_TREE; ! ! maybe_process_partial_specialization (t); /* This is where the variables in an anonymous union are declared. An anonymous union declaration looks like: union { ... } ; because there is no declarator after the union, the parser sends that declaration here. */ ! if (ANON_AGGR_TYPE_P (t)) { fixup_anonymous_aggr (t); *************** shadow_tag (declspecs) *** 7636,7648 **** finish_anon_union (decl); } } } /* Decode a "typename", such as "int **", returning a ..._TYPE node. */ tree ! groktypename (typename) ! tree typename; { tree specs, attrs; tree type; --- 3622,3635 ---- finish_anon_union (decl); } } + + return t; } /* Decode a "typename", such as "int **", returning a ..._TYPE node. */ tree ! groktypename (tree typename) { tree specs, attrs; tree type; *************** groktypename (typename) *** 7672,7691 **** grokfield and not through here. */ tree ! start_decl (declarator, declspecs, initialized, attributes, prefix_attributes) ! tree declarator, declspecs; ! int initialized; ! tree attributes, prefix_attributes; { tree decl; ! register tree type, tem; tree context; - #if 0 - /* See code below that used this. */ - int init_written = initialized; - #endif - /* This should only be done once on the top most decl. */ if (have_extern_spec) { --- 3659,3674 ---- grokfield and not through here. */ tree ! start_decl (tree declarator, ! tree declspecs, ! int initialized, ! tree attributes, ! tree prefix_attributes) { tree decl; ! tree type, tem; tree context; /* This should only be done once on the top most decl. */ if (have_extern_spec) { *************** start_decl (declarator, declspecs, initi *** 7775,7799 **** && DECL_DECLARED_INLINE_P (decl) && DECL_UNINLINABLE (decl) && lookup_attribute ("noinline", DECL_ATTRIBUTES (decl))) ! warning_with_decl (decl, ! "inline function `%s' given attribute noinline"); if (context && COMPLETE_TYPE_P (complete_type (context))) { ! push_nested_class (context, 2); if (TREE_CODE (decl) == VAR_DECL) { ! tree field = lookup_field (context, DECL_NAME (decl), 0, 0); if (field == NULL_TREE || TREE_CODE (field) != VAR_DECL) error ("`%#D' is not a static member of `%#T'", decl, context); else { if (DECL_CONTEXT (field) != context) { ! pedwarn ("ISO C++ does not permit `%T::%D' to be defined as `%T::%D'", ! DECL_CONTEXT (field), DECL_NAME (decl), ! context, DECL_NAME (decl)); DECL_CONTEXT (decl) = DECL_CONTEXT (field); } /* Static data member are tricky; an in-class initialization --- 3758,3782 ---- && DECL_DECLARED_INLINE_P (decl) && DECL_UNINLINABLE (decl) && lookup_attribute ("noinline", DECL_ATTRIBUTES (decl))) ! warning ("%Jinline function '%D' given attribute noinline", decl, decl); if (context && COMPLETE_TYPE_P (complete_type (context))) { ! push_nested_class (context); if (TREE_CODE (decl) == VAR_DECL) { ! tree field = lookup_field (context, DECL_NAME (decl), 0, false); if (field == NULL_TREE || TREE_CODE (field) != VAR_DECL) error ("`%#D' is not a static member of `%#T'", decl, context); else { if (DECL_CONTEXT (field) != context) { ! if (!same_type_p (DECL_CONTEXT (field), context)) ! pedwarn ("ISO C++ does not permit `%T::%D' to be defined as `%T::%D'", ! DECL_CONTEXT (field), DECL_NAME (decl), ! context, DECL_NAME (decl)); DECL_CONTEXT (decl) = DECL_CONTEXT (field); } /* Static data member are tricky; an in-class initialization *************** start_decl (declarator, declspecs, initi *** 7809,7815 **** } else { ! tree field = check_classfn (context, decl); if (field && duplicate_decls (decl, field)) decl = field; } --- 3792,3800 ---- } else { ! tree field = check_classfn (context, decl, ! processing_template_decl ! > template_class_depth (context)); if (field && duplicate_decls (decl, field)) decl = field; } *************** start_decl (declarator, declspecs, initi *** 7840,7845 **** --- 3825,3832 ---- if (processing_template_decl) tem = push_template_decl (tem); + if (tem == error_mark_node) + return error_mark_node; #if ! defined (ASM_OUTPUT_BSS) && ! defined (ASM_OUTPUT_ALIGNED_BSS) /* Tell the back-end to use or not use .common as appropriate. If we say *************** start_decl (declarator, declspecs, initi *** 7859,7866 **** } void ! start_decl_1 (decl) ! tree decl; { tree type = TREE_TYPE (decl); int initialized = (DECL_INITIAL (decl) != NULL_TREE); --- 3846,3852 ---- } void ! start_decl_1 (tree decl) { tree type = TREE_TYPE (decl); int initialized = (DECL_INITIAL (decl) != NULL_TREE); *************** start_decl_1 (decl) *** 7868,7875 **** if (type == error_mark_node) return; - maybe_push_cleanup_level (type); - if (initialized) /* Is it valid for this decl to have an initializer at all? If not, set INITIALIZED to zero, which will indirectly --- 3854,3859 ---- *************** start_decl_1 (decl) *** 7925,7942 **** if (! initialized) DECL_INITIAL (decl) = NULL_TREE; } /* Handle initialization of references. DECL, TYPE, and INIT have the same meaning as in cp_finish_decl. *CLEANUP must be NULL on entry, but will be set to a new CLEANUP_STMT if a temporary is created ! that must be destroeyd subsequently. Returns an initializer expression to use to initialize DECL, or NULL if the initialization can be performed statically. Quotes on semantics can be found in ARM 8.4.3. */ ! static tree grok_reference_init (tree decl, tree type, tree init, tree *cleanup) { --- 3909,3934 ---- if (! initialized) DECL_INITIAL (decl) = NULL_TREE; + + /* Create a new scope to hold this declaration if necessary. + Whether or not a new scope is necessary cannot be determined + until after the type has been completed; if the type is a + specialization of a class template it is not until after + instantiation has occurred that TYPE_HAS_NONTRIVIAL_DESTRUCTOR + will be set correctly. */ + maybe_push_cleanup_level (type); } /* Handle initialization of references. DECL, TYPE, and INIT have the same meaning as in cp_finish_decl. *CLEANUP must be NULL on entry, but will be set to a new CLEANUP_STMT if a temporary is created ! that must be destroyed subsequently. Returns an initializer expression to use to initialize DECL, or NULL if the initialization can be performed statically. Quotes on semantics can be found in ARM 8.4.3. */ ! static tree grok_reference_init (tree decl, tree type, tree init, tree *cleanup) { *************** grok_reference_init (tree decl, tree typ *** 7951,7959 **** return NULL_TREE; } - if (init == error_mark_node) - return NULL_TREE; - if (TREE_CODE (init) == CONSTRUCTOR) { error ("ISO C++ forbids use of initializer list to initialize reference `%D'", decl); --- 3943,3948 ---- *************** grok_reference_init (tree decl, tree typ *** 7961,7977 **** } if (TREE_CODE (init) == TREE_LIST) ! init = build_compound_expr (init); if (TREE_CODE (TREE_TYPE (init)) == REFERENCE_TYPE) init = convert_from_reference (init); if (TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE && TREE_CODE (TREE_TYPE (init)) == ARRAY_TYPE) ! { ! /* Note: default conversion is only called in very special cases. */ ! init = default_conversion (init); ! } /* Convert INIT to the reference type TYPE. This may involve the creation of a temporary, whose lifetime must be the same as that --- 3950,3964 ---- } if (TREE_CODE (init) == TREE_LIST) ! init = build_x_compound_expr_from_list (init, "initializer"); if (TREE_CODE (TREE_TYPE (init)) == REFERENCE_TYPE) init = convert_from_reference (init); if (TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE && TREE_CODE (TREE_TYPE (init)) == ARRAY_TYPE) ! /* Note: default conversion is only called in very special cases. */ ! init = decay_conversion (init); /* Convert INIT to the reference type TYPE. This may involve the creation of a temporary, whose lifetime must be the same as that *************** grok_reference_init (tree decl, tree typ *** 8003,8011 **** situation we're in, update DECL accordingly. */ static void ! maybe_deduce_size_from_array_init (decl, init) ! tree decl; ! tree init; { tree type = TREE_TYPE (decl); --- 3990,3996 ---- situation we're in, update DECL accordingly. */ static void ! maybe_deduce_size_from_array_init (tree decl, tree init) { tree type = TREE_TYPE (decl); *************** maybe_deduce_size_from_array_init (decl, *** 8047,8054 **** any appropriate error messages regarding the layout. */ static void ! layout_var_decl (decl) ! tree decl; { tree type = TREE_TYPE (decl); #if 0 --- 4032,4038 ---- any appropriate error messages regarding the layout. */ static void ! layout_var_decl (tree decl) { tree type = TREE_TYPE (decl); #if 0 *************** layout_var_decl (decl) *** 8058,8064 **** /* If we haven't already layed out this declaration, do so now. Note that we must not call complete type for an external object because it's type might involve templates that we are not ! supposed to isntantiate yet. (And it's perfectly valid to say `extern X x' for some incomplete type `X'.) */ if (!DECL_EXTERNAL (decl)) complete_type (type); --- 4042,4048 ---- /* If we haven't already layed out this declaration, do so now. Note that we must not call complete type for an external object because it's type might involve templates that we are not ! supposed to instantiate yet. (And it's perfectly valid to say `extern X x' for some incomplete type `X'.) */ if (!DECL_EXTERNAL (decl)) complete_type (type); *************** layout_var_decl (decl) *** 8112,8119 **** instance of the variable at link-time. */ static void ! maybe_commonize_var (decl) ! tree decl; { /* Static data in a function with comdat linkage also has comdat linkage. */ --- 4096,4102 ---- instance of the variable at link-time. */ static void ! maybe_commonize_var (tree decl) { /* Static data in a function with comdat linkage also has comdat linkage. */ *************** maybe_commonize_var (decl) *** 8154,8160 **** TREE_PUBLIC (decl) = 0; DECL_COMMON (decl) = 0; cp_warning_at ("sorry: semantics of inline function static data `%#D' are wrong (you'll wind up with multiple copies)", decl); ! cp_warning_at (" you can work around this by removing the initializer", decl); } } } --- 4137,4144 ---- TREE_PUBLIC (decl) = 0; DECL_COMMON (decl) = 0; cp_warning_at ("sorry: semantics of inline function static data `%#D' are wrong (you'll wind up with multiple copies)", decl); ! warning ("%J you can work around this by removing the initializer", ! decl); } } } *************** maybe_commonize_var (decl) *** 8167,8174 **** /* Issue an error message if DECL is an uninitialized const variable. */ static void ! check_for_uninitialized_const_var (decl) ! tree decl; { tree type = TREE_TYPE (decl); --- 4151,4157 ---- /* Issue an error message if DECL is an uninitialized const variable. */ static void ! check_for_uninitialized_const_var (tree decl) { tree type = TREE_TYPE (decl); *************** reshape_init (tree type, tree *initp) *** 8228,8241 **** old_init_value = (TREE_CODE (*initp) == TREE_LIST ? TREE_VALUE (*initp) : old_init); ! /* For some parse errors, OLD_INIT_VALUE may be NULL. */ ! if (!old_init_value) ! { ! my_friendly_assert (TREE_CODE (old_init) == TREE_LIST, 20021202); ! TREE_VALUE (old_init) = error_mark_node; ! *initp = TREE_CHAIN (old_init); ! return old_init; ! } /* If the initializer is brace-enclosed, pull initializers from the enclosed elements. Advance past the brace-enclosed initializer --- 4211,4217 ---- old_init_value = (TREE_CODE (*initp) == TREE_LIST ? TREE_VALUE (*initp) : old_init); ! my_friendly_assert (old_init_value, 20030723); /* If the initializer is brace-enclosed, pull initializers from the enclosed elements. Advance past the brace-enclosed initializer *************** reshape_init (tree type, tree *initp) *** 8312,8318 **** else { /* Build a CONSTRUCTOR to hold the contents of the aggregate. */ ! new_init = build (CONSTRUCTOR, type, NULL_TREE, NULL_TREE); TREE_HAS_CONSTRUCTOR (new_init) = 1; if (CLASS_TYPE_P (type)) --- 4288,4294 ---- else { /* Build a CONSTRUCTOR to hold the contents of the aggregate. */ ! new_init = build_constructor (type, NULL_TREE); TREE_HAS_CONSTRUCTOR (new_init) = 1; if (CLASS_TYPE_P (type)) *************** reshape_init (tree type, tree *initp) *** 8329,8339 **** empty class shall have the form of an empty initializer-list {}. */ if (!brace_enclosed_p) ! { ! error ("initializer for `%T' must be brace-enclosed", ! type); ! return error_mark_node; ! } } else { --- 4305,4315 ---- empty class shall have the form of an empty initializer-list {}. */ if (!brace_enclosed_p) ! { ! error ("initializer for `%T' must be brace-enclosed", ! type); ! return error_mark_node; ! } } else { *************** reshape_init (tree type, tree *initp) *** 8358,8365 **** break; field_init = reshape_init (TREE_TYPE (field), initp); ! if (field_init == error_mark_node) ! return error_mark_node; TREE_CHAIN (field_init) = CONSTRUCTOR_ELTS (new_init); CONSTRUCTOR_ELTS (new_init) = field_init; /* [dcl.init.aggr] --- 4334,4341 ---- break; field_init = reshape_init (TREE_TYPE (field), initp); ! if (field_init == error_mark_node) ! return error_mark_node; TREE_CHAIN (field_init) = CONSTRUCTOR_ELTS (new_init); CONSTRUCTOR_ELTS (new_init) = field_init; /* [dcl.init.aggr] *************** reshape_init (tree type, tree *initp) *** 8390,8401 **** tree element_init; element_init = reshape_init (TREE_TYPE (type), initp); ! if (element_init == error_mark_node) ! return error_mark_node; TREE_CHAIN (element_init) = CONSTRUCTOR_ELTS (new_init); CONSTRUCTOR_ELTS (new_init) = element_init; if (TREE_PURPOSE (element_init)) ! index = TREE_PURPOSE (element_init); } } else --- 4366,4387 ---- tree element_init; element_init = reshape_init (TREE_TYPE (type), initp); ! if (element_init == error_mark_node) ! return error_mark_node; TREE_CHAIN (element_init) = CONSTRUCTOR_ELTS (new_init); CONSTRUCTOR_ELTS (new_init) = element_init; if (TREE_PURPOSE (element_init)) ! { ! tree next_index = TREE_PURPOSE (element_init); ! if (TREE_CODE (next_index) == IDENTIFIER_NODE) ! { ! error ("name `%D' used in a GNU-style designated " ! "initializer for an array", next_index); ! TREE_PURPOSE (element_init) = NULL_TREE; ! } ! else ! index = next_index; ! } } } else *************** static tree *** 8428,8433 **** --- 4414,4420 ---- check_initializer (tree decl, tree init, int flags, tree *cleanup) { tree type = TREE_TYPE (decl); + tree init_code = NULL; /* If `start_decl' didn't like having an initialization, ignore it now. */ if (init != NULL_TREE && DECL_INITIAL (decl) == NULL_TREE) *************** check_initializer (tree decl, tree init, *** 8491,8496 **** --- 4478,4489 ---- scalar, so just don't call it. */ if (CP_AGGREGATE_TYPE_P (type)) init = reshape_init (type, &init); + + if ((*targetm.vector_opaque_p) (type)) + { + error ("opaque vector types cannot be initialized"); + init = error_mark_node; + } } /* If DECL has an array type without a specific bound, deduce the *************** check_initializer (tree decl, tree init, *** 8538,8544 **** { dont_use_constructor: if (TREE_CODE (init) != TREE_VEC) ! init = store_init_value (decl, init); } } else if (DECL_EXTERNAL (decl)) --- 4531,4540 ---- { dont_use_constructor: if (TREE_CODE (init) != TREE_VEC) ! { ! init_code = store_init_value (decl, init); ! init = NULL; ! } } } else if (DECL_EXTERNAL (decl)) *************** check_initializer (tree decl, tree init, *** 8561,8578 **** check_for_uninitialized_const_var (decl); if (init && init != error_mark_node) ! init = build (INIT_EXPR, type, decl, init); ! return init; } /* If DECL is not a local variable, give it RTL. */ static void ! make_rtl_for_nonlocal_decl (decl, init, asmspec) ! tree decl; ! tree init; ! const char *asmspec; { int toplev = toplevel_bindings_p (); int defer_p; --- 4557,4571 ---- check_for_uninitialized_const_var (decl); if (init && init != error_mark_node) ! init_code = build (INIT_EXPR, type, decl, init); ! return init_code; } /* If DECL is not a local variable, give it RTL. */ static void ! make_rtl_for_nonlocal_decl (tree decl, tree init, const char* asmspec) { int toplev = toplevel_bindings_p (); int defer_p; *************** make_rtl_for_nonlocal_decl (decl, init, *** 8598,8604 **** /* Set the DECL_ASSEMBLER_NAME for the variable. */ if (asmspec) { ! SET_DECL_ASSEMBLER_NAME (decl, get_identifier (asmspec)); /* The `register' keyword, when used together with an asm-specification, indicates that the variable should be placed in a particular register. */ --- 4591,4597 ---- /* Set the DECL_ASSEMBLER_NAME for the variable. */ if (asmspec) { ! change_decl_assembler_name (decl, get_identifier (asmspec)); /* The `register' keyword, when used together with an asm-specification, indicates that the variable should be placed in a particular register. */ *************** make_rtl_for_nonlocal_decl (decl, init, *** 8650,8715 **** rest_of_decl_compilation (decl, asmspec, toplev, at_eof); } - /* The old ARM scoping rules injected variables declared in the - initialization statement of a for-statement into the surrounding - scope. We support this usage, in order to be backward-compatible. - DECL is a just-declared VAR_DECL; if necessary inject its - declaration into the surrounding scope. */ - - void - maybe_inject_for_scope_var (decl) - tree decl; - { - timevar_push (TV_NAME_LOOKUP); - - if (!DECL_NAME (decl)) - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, (void)0); - - /* Declarations of __FUNCTION__ and its ilk appear magically when - the variable is first used. If that happens to be inside a - for-loop, we don't want to do anything special. */ - if (DECL_PRETTY_FUNCTION_P (decl)) - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, (void)0); - - if (current_binding_level->is_for_scope) - { - struct cp_binding_level *outer - = current_binding_level->level_chain; - - /* Check to see if the same name is already bound at the outer - level, either because it was directly declared, or because a - dead for-decl got preserved. In either case, the code would - not have been valid under the ARM scope rules, so clear - is_for_scope for the current_binding_level. - - Otherwise, we need to preserve the temp slot for decl to last - into the outer binding level. */ - - cxx_binding *outer_binding - = IDENTIFIER_BINDING (DECL_NAME (decl))->previous; - - if (outer_binding && BINDING_LEVEL (outer_binding) == outer - && (TREE_CODE (BINDING_VALUE (outer_binding)) - == VAR_DECL) - && DECL_DEAD_FOR_LOCAL (BINDING_VALUE (outer_binding))) - { - BINDING_VALUE (outer_binding) - = DECL_SHADOWED_FOR_VAR (BINDING_VALUE (outer_binding)); - current_binding_level->is_for_scope = 0; - } - else if (DECL_IN_MEMORY_P (decl)) - preserve_temp_slots (DECL_RTL (decl)); - } - - timevar_pop (TV_NAME_LOOKUP); - } - /* Generate code to initialize DECL (a local variable). */ static void ! initialize_local_var (decl, init) ! tree decl; ! tree init; { tree type = TREE_TYPE (decl); tree cleanup; --- 4643,4652 ---- rest_of_decl_compilation (decl, asmspec, toplev, at_eof); } /* Generate code to initialize DECL (a local variable). */ static void ! initialize_local_var (tree decl, tree init) { tree type = TREE_TYPE (decl); tree cleanup; *************** initialize_local_var (decl, init) *** 8779,8788 **** if the (init) syntax was used. */ void ! cp_finish_decl (decl, init, asmspec_tree, flags) ! tree decl, init; ! tree asmspec_tree; ! int flags; { tree type; tree ttype = NULL_TREE; --- 4716,4722 ---- if the (init) syntax was used. */ void ! cp_finish_decl (tree decl, tree init, tree asmspec_tree, int flags) { tree type; tree ttype = NULL_TREE; *************** cp_finish_decl (decl, init, asmspec_tree *** 8790,8809 **** const char *asmspec = NULL; int was_readonly = 0; ! if (! decl) { if (init) error ("assignment (not initialization) in declaration"); return; } /* Assume no cleanup is required. */ cleanup = NULL_TREE; /* If a name was specified, get the string. */ if (global_scope_p (current_binding_level)) asmspec_tree = maybe_apply_renaming_pragma (decl, asmspec_tree); ! if (asmspec_tree) asmspec = TREE_STRING_POINTER (asmspec_tree); if (init && TREE_CODE (init) == NAMESPACE_DECL) --- 4724,4747 ---- const char *asmspec = NULL; int was_readonly = 0; ! if (decl == error_mark_node) ! return; ! else if (! decl) { if (init) error ("assignment (not initialization) in declaration"); return; } + my_friendly_assert (TREE_CODE (decl) != RESULT_DECL, 20030619); + /* Assume no cleanup is required. */ cleanup = NULL_TREE; /* If a name was specified, get the string. */ if (global_scope_p (current_binding_level)) asmspec_tree = maybe_apply_renaming_pragma (decl, asmspec_tree); ! if (asmspec_tree) asmspec = TREE_STRING_POINTER (asmspec_tree); if (init && TREE_CODE (init) == NAMESPACE_DECL) *************** cp_finish_decl (decl, init, asmspec_tree *** 8832,8838 **** type = TREE_TYPE (decl); if (type == error_mark_node) ! return; if (TYPE_HAS_MUTABLE_P (type)) TREE_READONLY (decl) = 0; --- 4770,4776 ---- type = TREE_TYPE (decl); if (type == error_mark_node) ! goto finish_end0; if (TYPE_HAS_MUTABLE_P (type)) TREE_READONLY (decl) = 0; *************** cp_finish_decl (decl, init, asmspec_tree *** 8840,8851 **** if (processing_template_decl) { /* Add this declaration to the statement-tree. */ ! if (at_function_scope_p () ! && TREE_CODE (decl) != RESULT_DECL) add_decl_stmt (decl); if (init && DECL_INITIAL (decl)) DECL_INITIAL (decl) = init; goto finish_end0; } --- 4778,4792 ---- if (processing_template_decl) { /* Add this declaration to the statement-tree. */ ! if (at_function_scope_p ()) add_decl_stmt (decl); if (init && DECL_INITIAL (decl)) DECL_INITIAL (decl) = init; + if (TREE_CODE (decl) == VAR_DECL + && !DECL_PRETTY_FUNCTION_P (decl) + && !dependent_type_p (TREE_TYPE (decl))) + maybe_deduce_size_from_array_init (decl, init); goto finish_end0; } *************** cp_finish_decl (decl, init, asmspec_tree *** 8860,8867 **** { if (TREE_TYPE (DECL_NAME (decl)) && TREE_TYPE (decl) != type) warning ("shadowing previous type declaration of `%#D'", decl); ! set_identifier_type_value (DECL_NAME (decl), type); ! CLASSTYPE_GOT_SEMICOLON (type) = 1; } /* If we have installed this as the canonical typedef for this --- 4801,4807 ---- { if (TREE_TYPE (DECL_NAME (decl)) && TREE_TYPE (decl) != type) warning ("shadowing previous type declaration of `%#D'", decl); ! set_identifier_type_value (DECL_NAME (decl), decl); } /* If we have installed this as the canonical typedef for this *************** cp_finish_decl (decl, init, asmspec_tree *** 8879,8907 **** if (TREE_CODE (decl) != FUNCTION_DECL) ttype = target_type (type); ! if (! DECL_EXTERNAL (decl) && TREE_READONLY (decl) ! && (TYPE_NEEDS_CONSTRUCTING (type) ! || TREE_CODE (type) == REFERENCE_TYPE)) { - /* Currently, GNU C++ puts constants in text space, making them - impossible to initialize. In the future, one would hope for - an operating system which understood the difference between - initialization and the running of a program. */ was_readonly = 1; ! TREE_READONLY (decl) = 0; } ! if (TREE_CODE (decl) == FIELD_DECL && asmspec) ! { ! /* This must override the asm specifier which was placed by ! grokclassfn. Lay this out fresh. */ ! SET_DECL_RTL (TREE_TYPE (decl), NULL_RTX); ! SET_DECL_ASSEMBLER_NAME (decl, get_identifier (asmspec)); ! make_decl_rtl (decl, asmspec); ! } ! else if (TREE_CODE (decl) == RESULT_DECL) ! init = check_initializer (decl, init, flags, &cleanup); ! else if (TREE_CODE (decl) == VAR_DECL) { /* Only PODs can have thread-local storage. Other types may require various kinds of non-trivial initialization. */ --- 4819,4838 ---- if (TREE_CODE (decl) != FUNCTION_DECL) ttype = target_type (type); ! ! /* Currently, GNU C++ puts constants in text space, making them ! impossible to initialize. In the future, one would hope for ! an operating system which understood the difference between ! initialization and the running of a program. */ ! if (! DECL_EXTERNAL (decl) && TREE_READONLY (decl)) { was_readonly = 1; ! if (TYPE_NEEDS_CONSTRUCTING (type) ! || TREE_CODE (type) == REFERENCE_TYPE) ! TREE_READONLY (decl) = 0; } ! if (TREE_CODE (decl) == VAR_DECL) { /* Only PODs can have thread-local storage. Other types may require various kinds of non-trivial initialization. */ *************** cp_finish_decl (decl, init, asmspec_tree *** 8956,8964 **** /* Add this declaration to the statement-tree. This needs to happen after the call to check_initializer so that the DECL_STMT for a reference temp is added before the DECL_STMT for the reference itself. */ ! if (building_stmt_tree () ! && at_function_scope_p () ! && TREE_CODE (decl) != RESULT_DECL) add_decl_stmt (decl); if (TREE_CODE (decl) == VAR_DECL) --- 4887,4893 ---- /* Add this declaration to the statement-tree. This needs to happen after the call to check_initializer so that the DECL_STMT for a reference temp is added before the DECL_STMT for the reference itself. */ ! if (at_function_scope_p ()) add_decl_stmt (decl); if (TREE_CODE (decl) == VAR_DECL) *************** cp_finish_decl (decl, init, asmspec_tree *** 8967,8974 **** /* Output the assembler code and/or RTL code for variables and functions, unless the type is an undefined structure or union. If not, it will get done when the type is completed. */ ! if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL ! || TREE_CODE (decl) == RESULT_DECL) { if (TREE_CODE (decl) == VAR_DECL) maybe_commonize_var (decl); --- 4896,4902 ---- /* Output the assembler code and/or RTL code for variables and functions, unless the type is an undefined structure or union. If not, it will get done when the type is completed. */ ! if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL) { if (TREE_CODE (decl) == VAR_DECL) maybe_commonize_var (decl); *************** cp_finish_decl (decl, init, asmspec_tree *** 8979,8986 **** || TREE_CODE (type) == METHOD_TYPE) abstract_virtuals_error (decl, strip_array_types (TREE_TYPE (type))); else ! abstract_virtuals_error (decl, strip_array_types (type)); if (TREE_CODE (decl) == FUNCTION_DECL || TREE_TYPE (decl) == error_mark_node) --- 4907,4925 ---- || TREE_CODE (type) == METHOD_TYPE) abstract_virtuals_error (decl, strip_array_types (TREE_TYPE (type))); + else if (POINTER_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE) + { + /* If it's either a pointer or an array type, strip through all + of them but the last one. If the last is an array type, issue + an error if the element type is abstract. */ + while (POINTER_TYPE_P (TREE_TYPE (type)) + || TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE) + type = TREE_TYPE (type); + if (TREE_CODE (type) == ARRAY_TYPE) + abstract_virtuals_error (decl, TREE_TYPE (type)); + } else ! abstract_virtuals_error (decl, type); if (TREE_CODE (decl) == FUNCTION_DECL || TREE_TYPE (decl) == error_mark_node) *************** cp_finish_decl (decl, init, asmspec_tree *** 8999,9006 **** if (DECL_FUNCTION_SCOPE_P (decl)) { /* This is a local declaration. */ ! if (doing_semantic_analysis_p ()) ! maybe_inject_for_scope_var (decl); /* Initialize the local variable. */ if (processing_template_decl) { --- 4938,4944 ---- if (DECL_FUNCTION_SCOPE_P (decl)) { /* This is a local declaration. */ ! maybe_inject_for_scope_var (decl); /* Initialize the local variable. */ if (processing_template_decl) { *************** cp_finish_decl (decl, init, asmspec_tree *** 9045,9058 **** if (was_readonly) TREE_READONLY (decl) = 1; } ! /* This is here for a midend callback from c-common.c */ void ! finish_decl (decl, init, asmspec_tree) ! tree decl, init; ! tree asmspec_tree; { cp_finish_decl (decl, init, asmspec_tree, 0); } --- 4983,4998 ---- if (was_readonly) TREE_READONLY (decl) = 1; + + /* If this was marked 'used', be sure it will be output. */ + if (lookup_attribute ("used", DECL_ATTRIBUTES (decl))) + mark_referenced (DECL_ASSEMBLER_NAME (decl)); } ! /* This is here for a midend callback from c-common.c. */ void ! finish_decl (tree decl, tree init, tree asmspec_tree) { cp_finish_decl (decl, init, asmspec_tree, 0); } *************** finish_decl (decl, init, asmspec_tree) *** 9065,9073 **** variables. */ tree ! declare_global_var (name, type) ! tree name; ! tree type; { tree decl; --- 5005,5011 ---- variables. */ tree ! declare_global_var (tree name, tree type) { tree decl; *************** declare_global_var (name, type) *** 9088,9094 **** `__cxa_atexit' function specified in the IA64 C++ ABI. */ static tree ! get_atexit_node () { tree atexit_fndecl; tree arg_types; --- 5026,5032 ---- `__cxa_atexit' function specified in the IA64 C++ ABI. */ static tree ! get_atexit_node (void) { tree atexit_fndecl; tree arg_types; *************** get_atexit_node () *** 9143,9149 **** atexit_fndecl = build_library_fn_ptr (name, fn_type); mark_used (atexit_fndecl); pop_lang_context (); ! atexit_node = default_conversion (atexit_fndecl); return atexit_node; } --- 5081,5087 ---- atexit_fndecl = build_library_fn_ptr (name, fn_type); mark_used (atexit_fndecl); pop_lang_context (); ! atexit_node = decay_conversion (atexit_fndecl); return atexit_node; } *************** get_atexit_node () *** 9151,9157 **** /* Returns the __dso_handle VAR_DECL. */ static tree ! get_dso_handle_node () { if (dso_handle_node) return dso_handle_node; --- 5089,5095 ---- /* Returns the __dso_handle VAR_DECL. */ static tree ! get_dso_handle_node (void) { if (dso_handle_node) return dso_handle_node; *************** get_dso_handle_node () *** 9166,9175 **** /* Begin a new function with internal linkage whose job will be simply to destroy some particular variable. */ static tree ! start_cleanup_fn () { - static int counter = 0; int old_interface_only = interface_only; int old_interface_unknown = interface_unknown; char name[32]; --- 5104,5114 ---- /* Begin a new function with internal linkage whose job will be simply to destroy some particular variable. */ + static GTY(()) int start_cleanup_cnt; + static tree ! start_cleanup_fn (void) { int old_interface_only = interface_only; int old_interface_unknown = interface_unknown; char name[32]; *************** start_cleanup_fn () *** 9196,9202 **** /* Build the function type itself. */ fntype = build_function_type (void_type_node, parmtypes); /* Build the name of the function. */ ! sprintf (name, "__tcf_%d", counter++); /* Build the function declaration. */ fndecl = build_lang_decl (FUNCTION_DECL, get_identifier (name), fntype); /* It's a function with internal linkage, generated by the --- 5135,5141 ---- /* Build the function type itself. */ fntype = build_function_type (void_type_node, parmtypes); /* Build the name of the function. */ ! sprintf (name, "__tcf_%d", start_cleanup_cnt++); /* Build the function declaration. */ fndecl = build_lang_decl (FUNCTION_DECL, get_identifier (name), fntype); /* It's a function with internal linkage, generated by the *************** start_cleanup_fn () *** 9208,9213 **** --- 5147,5154 ---- it is only called via a function pointer, but we avoid unnecessary emissions this way. */ DECL_INLINE (fndecl) = 1; + DECL_DECLARED_INLINE_P (fndecl) = 1; + DECL_INTERFACE_KNOWN (fndecl) = 1; /* Build the parameter. */ if (flag_use_cxa_atexit) { *************** start_cleanup_fn () *** 9233,9241 **** /* Finish the cleanup function begun by start_cleanup_fn. */ static void ! end_cleanup_fn () { ! expand_body (finish_function (0)); pop_from_top_level (); } --- 5174,5182 ---- /* Finish the cleanup function begun by start_cleanup_fn. */ static void ! end_cleanup_fn (void) { ! expand_or_defer_fn (finish_function (0)); pop_from_top_level (); } *************** end_cleanup_fn () *** 9244,9259 **** static storage duration. */ void ! register_dtor_fn (decl) ! tree decl; { tree cleanup; tree compound_stmt; tree args; tree fcall; - int saved_flag_access_control; - if (TYPE_HAS_TRIVIAL_DESTRUCTOR (TREE_TYPE (decl))) return; --- 5185,5197 ---- static storage duration. */ void ! register_dtor_fn (tree decl) { tree cleanup; tree compound_stmt; tree args; tree fcall; if (TYPE_HAS_TRIVIAL_DESTRUCTOR (TREE_TYPE (decl))) return; *************** register_dtor_fn (decl) *** 9269,9287 **** to the original function, rather than the anonymous one. That will make the back-end think that nested functions are in use, which causes confusion. */ ! saved_flag_access_control = flag_access_control; ! flag_access_control = 0; fcall = build_cleanup (decl); ! flag_access_control = saved_flag_access_control; /* Create the body of the anonymous function. */ ! compound_stmt = begin_compound_stmt (/*has_no_scope=*/0); finish_expr_stmt (fcall); ! finish_compound_stmt (/*has_no_scope=*/0, compound_stmt); end_cleanup_fn (); /* Call atexit with the cleanup function. */ cxx_mark_addressable (cleanup); cleanup = build_unary_op (ADDR_EXPR, cleanup, 0); if (flag_use_cxa_atexit) { --- 5207,5226 ---- to the original function, rather than the anonymous one. That will make the back-end think that nested functions are in use, which causes confusion. */ ! ! push_deferring_access_checks (dk_no_check); fcall = build_cleanup (decl); ! pop_deferring_access_checks (); /* Create the body of the anonymous function. */ ! compound_stmt = begin_compound_stmt (/*has_no_scope=*/false); finish_expr_stmt (fcall); ! finish_compound_stmt (compound_stmt); end_cleanup_fn (); /* Call atexit with the cleanup function. */ cxx_mark_addressable (cleanup); + mark_used (cleanup); cleanup = build_unary_op (ADDR_EXPR, cleanup, 0); if (flag_use_cxa_atexit) { *************** register_dtor_fn (decl) *** 9301,9312 **** and destruction of DECL. */ static void ! expand_static_init (decl, init) ! tree decl; ! tree init; { - tree oldstatic; - my_friendly_assert (TREE_CODE (decl) == VAR_DECL, 20021010); my_friendly_assert (TREE_STATIC (decl), 20021010); --- 5240,5247 ---- and destruction of DECL. */ static void ! expand_static_init (tree decl, tree init) { my_friendly_assert (TREE_CODE (decl) == VAR_DECL, 20021010); my_friendly_assert (TREE_STATIC (decl), 20021010); *************** expand_static_init (decl, init) *** 9316,9329 **** && TYPE_HAS_TRIVIAL_DESTRUCTOR (TREE_TYPE (decl))) return; ! oldstatic = value_member (decl, static_aggregates); ! ! if (oldstatic) ! { ! if (TREE_PURPOSE (oldstatic) && init != NULL_TREE) ! error ("multiple initializations given for `%D'", decl); ! } ! else if (! toplevel_bindings_p ()) { /* Emit code to perform this initialization but once. */ tree if_stmt; --- 5251,5257 ---- && TYPE_HAS_TRIVIAL_DESTRUCTOR (TREE_TYPE (decl))) return; ! if (! toplevel_bindings_p ()) { /* Emit code to perform this initialization but once. */ tree if_stmt; *************** expand_static_init (decl, init) *** 9363,9369 **** /* Begin the conditional initialization. */ if_stmt = begin_if_stmt (); finish_if_stmt_cond (get_guard_cond (guard), if_stmt); ! then_clause = begin_compound_stmt (/*has_no_scope=*/0); /* Do the initialization itself. */ assignment = init ? init : NULL_TREE; --- 5291,5297 ---- /* Begin the conditional initialization. */ if_stmt = begin_if_stmt (); finish_if_stmt_cond (get_guard_cond (guard), if_stmt); ! then_clause = begin_compound_stmt (/*has_no_scope=*/false); /* Do the initialization itself. */ assignment = init ? init : NULL_TREE; *************** expand_static_init (decl, init) *** 9378,9389 **** run until after TEMP is set to 1. */ guard_init = set_guard (guard); if (assignment) ! { ! assignment = tree_cons (NULL_TREE, assignment, ! build_tree_list (NULL_TREE, ! guard_init)); ! assignment = build_compound_expr (assignment); ! } else assignment = guard_init; finish_expr_stmt (assignment); --- 5306,5312 ---- run until after TEMP is set to 1. */ guard_init = set_guard (guard); if (assignment) ! assignment = build_compound_expr (assignment, guard_init); else assignment = guard_init; finish_expr_stmt (assignment); *************** expand_static_init (decl, init) *** 9392,9398 **** variable. */ register_dtor_fn (decl); ! finish_compound_stmt (/*has_no_scope=*/0, then_clause); finish_then_clause (if_stmt); finish_if_stmt (); } --- 5315,5321 ---- variable. */ register_dtor_fn (decl); ! finish_compound_stmt (then_clause); finish_then_clause (if_stmt); finish_if_stmt (); } *************** expand_static_init (decl, init) *** 9403,9411 **** /* Finish the declaration of a catch-parameter. */ tree ! start_handler_parms (declspecs, declarator) ! tree declspecs; ! tree declarator; { tree decl; if (declspecs) --- 5326,5332 ---- /* Finish the declaration of a catch-parameter. */ tree ! start_handler_parms (tree declspecs, tree declarator) { tree decl; if (declspecs) *************** start_handler_parms (declspecs, declarat *** 9427,9437 **** 2 if there was no information (in which case assume 0 if DO_DEFAULT). */ int ! complete_array_type (type, initial_value, do_default) ! tree type, initial_value; ! int do_default; { ! register tree maxindex = NULL_TREE; int value = 0; if (initial_value) --- 5348,5356 ---- 2 if there was no information (in which case assume 0 if DO_DEFAULT). */ int ! complete_array_type (tree type, tree initial_value, int do_default) { ! tree maxindex = NULL_TREE; int value = 0; if (initial_value) *************** complete_array_type (type, initial_value *** 9524,9532 **** message to print in that case. Otherwise, quietly return 1. */ static int ! member_function_or_else (ctype, cur_type, flags) ! tree ctype, cur_type; ! enum overload_flags flags; { if (ctype && ctype != cur_type) { --- 5443,5449 ---- message to print in that case. Otherwise, quietly return 1. */ static int ! member_function_or_else (tree ctype, tree cur_type, enum overload_flags flags) { if (ctype && ctype != cur_type) { *************** member_function_or_else (ctype, cur_type *** 9547,9556 **** This is for ARM $7.1.2. */ static void ! bad_specifiers (object, type, virtualp, quals, inlinep, friendp, raises) ! tree object; ! const char *type; ! int virtualp, quals, friendp, raises, inlinep; { if (virtualp) error ("`%D' declared as a `virtual' %s", object, type); --- 5464,5476 ---- This is for ARM $7.1.2. */ static void ! bad_specifiers (tree object, ! const char* type, ! int virtualp, ! int quals, ! int inlinep, ! int friendp, ! int raises) { if (virtualp) error ("`%D' declared as a `virtual' %s", object, type); *************** bad_specifiers (object, type, virtualp, *** 9573,9578 **** --- 5493,5499 ---- TYPE is type this FUNCTION_DECL should have, either FUNCTION_TYPE or METHOD_TYPE. DECLARATOR is the function's name. + PARMS is a chain of PARM_DECLs for the function. VIRTUALP is truthvalue of whether the function is virtual or not. FLAGS are to be passed through to `grokclassfn'. QUALS are qualifiers indicating whether the function is `const' *************** bad_specifiers (object, type, virtualp, *** 9585,9601 **** applicable error messages. */ static tree ! grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals, ! raises, check, friendp, publicp, inlinep, funcdef_flag, ! template_count, in_namespace) ! tree ctype, type; ! tree declarator; ! tree orig_declarator; ! int virtualp; ! enum overload_flags flags; ! tree quals, raises; ! int check, friendp, publicp, inlinep, funcdef_flag, template_count; ! tree in_namespace; { tree decl; int staticp = ctype && TREE_CODE (type) == FUNCTION_TYPE; --- 5506,5527 ---- applicable error messages. */ static tree ! grokfndecl (tree ctype, ! tree type, ! tree declarator, ! tree parms, ! tree orig_declarator, ! int virtualp, ! enum overload_flags flags, ! tree quals, ! tree raises, ! int check, ! int friendp, ! int publicp, ! int inlinep, ! int funcdef_flag, ! int template_count, ! tree in_namespace) { tree decl; int staticp = ctype && TREE_CODE (type) == FUNCTION_TYPE; *************** grokfndecl (ctype, type, declarator, ori *** 9606,9611 **** --- 5532,5538 ---- type = build_exception_variant (type, raises); decl = build_lang_decl (FUNCTION_DECL, declarator, type); + DECL_ARGUMENTS (decl) = parms; /* Propagate volatile out from type to decl. */ if (TYPE_VOLATILE (type)) TREE_THIS_VOLATILE (decl) = 1; *************** grokfndecl (ctype, type, declarator, ori *** 9666,9672 **** or enumeration declared in a local scope) shall not be used to declare an entity with linkage. ! Only check this for public decls for now. */ t = no_linkage_check (TREE_TYPE (decl)); if (t) { --- 5593,5599 ---- or enumeration declared in a local scope) shall not be used to declare an entity with linkage. ! Only check this for public decls for now. See core 319, 389. */ t = no_linkage_check (TREE_TYPE (decl)); if (t) { *************** grokfndecl (ctype, type, declarator, ori *** 9697,9715 **** DECL_NOT_REALLY_EXTERN (decl) = 1; } - DID_INLINE_FUNC (decl) = 0; /* If the declaration was declared inline, mark it as such. */ if (inlinep) DECL_DECLARED_INLINE_P (decl) = 1; /* We inline functions that are explicitly declared inline, or, when the user explicitly asks us to, all functions. */ ! if (DECL_DECLARED_INLINE_P (decl)) DECL_INLINE (decl) = 1; - if (flag_inline_trees == 2 && !DECL_INLINE (decl) && funcdef_flag) - { - DID_INLINE_FUNC (decl) = 1; - DECL_INLINE (decl) = 1; - } DECL_EXTERNAL (decl) = 1; if (quals != NULL_TREE && TREE_CODE (type) == FUNCTION_TYPE) --- 5624,5637 ---- DECL_NOT_REALLY_EXTERN (decl) = 1; } /* If the declaration was declared inline, mark it as such. */ if (inlinep) DECL_DECLARED_INLINE_P (decl) = 1; /* We inline functions that are explicitly declared inline, or, when the user explicitly asks us to, all functions. */ ! if (DECL_DECLARED_INLINE_P (decl) ! || (flag_inline_trees == 2 && !DECL_INLINE (decl) && funcdef_flag)) DECL_INLINE (decl) = 1; DECL_EXTERNAL (decl) = 1; if (quals != NULL_TREE && TREE_CODE (type) == FUNCTION_TYPE) *************** grokfndecl (ctype, type, declarator, ori *** 9720,9726 **** } if (IDENTIFIER_OPNAME_P (DECL_NAME (decl))) ! grok_op_properties (decl, friendp); if (ctype && decl_function_context (decl)) DECL_NO_STATIC_CHAIN (decl) = 1; --- 5642,5648 ---- } if (IDENTIFIER_OPNAME_P (DECL_NAME (decl))) ! grok_op_properties (decl, friendp, /*complain=*/true); if (ctype && decl_function_context (decl)) DECL_NO_STATIC_CHAIN (decl) = 1; *************** grokfndecl (ctype, type, declarator, ori *** 9770,9776 **** fns = TREE_OPERAND (fns, 1); } my_friendly_assert (TREE_CODE (fns) == IDENTIFIER_NODE - || TREE_CODE (fns) == LOOKUP_EXPR || TREE_CODE (fns) == OVERLOAD, 20001120); DECL_TEMPLATE_INFO (decl) = tree_cons (fns, args, NULL_TREE); --- 5692,5697 ---- *************** grokfndecl (ctype, type, declarator, ori *** 9790,9798 **** } } - if (has_default_arg) - add_defarg_fn (decl); - if (funcdef_flag) /* Make the init_value nonzero so pushdecl knows this is not tentative. error_mark_node is replaced later with the BLOCK. */ --- 5711,5716 ---- *************** grokfndecl (ctype, type, declarator, ori *** 9805,9811 **** if (check < 0) return decl; ! if (flags == NO_SPECIAL && ctype && constructor_name (ctype) == declarator) DECL_CONSTRUCTOR_P (decl) = 1; /* Function gets the ugly name, field gets the nice one. This call --- 5723,5729 ---- if (check < 0) return decl; ! if (flags == NO_SPECIAL && ctype && constructor_name_p (declarator, ctype)) DECL_CONSTRUCTOR_P (decl) = 1; /* Function gets the ugly name, field gets the nice one. This call *************** grokfndecl (ctype, type, declarator, ori *** 9827,9833 **** { tree old_decl; ! old_decl = check_classfn (ctype, decl); if (old_decl && TREE_CODE (old_decl) == TEMPLATE_DECL) /* Because grokfndecl is always supposed to return a --- 5745,5753 ---- { tree old_decl; ! old_decl = check_classfn (ctype, decl, ! processing_template_decl ! > template_class_depth (ctype)); if (old_decl && TREE_CODE (old_decl) == TEMPLATE_DECL) /* Because grokfndecl is always supposed to return a *************** grokfndecl (ctype, type, declarator, ori *** 9838,9854 **** if (old_decl && DECL_STATIC_FUNCTION_P (old_decl) && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE) ! { ! /* Remove the `this' parm added by grokclassfn. ! XXX Isn't this done in start_function, too? */ ! revert_static_member_fn (decl); ! last_function_parms = TREE_CHAIN (last_function_parms); ! } if (old_decl && DECL_ARTIFICIAL (old_decl)) error ("definition of implicitly-declared `%D'", old_decl); if (old_decl) { /* Since we've smashed OLD_DECL to its DECL_TEMPLATE_RESULT, we must do the same to DECL. */ if (TREE_CODE (decl) == TEMPLATE_DECL) --- 5758,5774 ---- if (old_decl && DECL_STATIC_FUNCTION_P (old_decl) && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE) ! /* Remove the `this' parm added by grokclassfn. ! XXX Isn't this done in start_function, too? */ ! revert_static_member_fn (decl); if (old_decl && DECL_ARTIFICIAL (old_decl)) error ("definition of implicitly-declared `%D'", old_decl); if (old_decl) { + tree ok; + bool pop_p; + /* Since we've smashed OLD_DECL to its DECL_TEMPLATE_RESULT, we must do the same to DECL. */ if (TREE_CODE (decl) == TEMPLATE_DECL) *************** grokfndecl (ctype, type, declarator, ori *** 9856,9864 **** /* Attempt to merge the declarations. This can fail, in the case of some invalid specialization declarations. */ ! if (!duplicate_decls (decl, old_decl)) ! error ("no `%#D' member function declared in class `%T'", ! decl, ctype); return old_decl; } } --- 5776,5791 ---- /* Attempt to merge the declarations. This can fail, in the case of some invalid specialization declarations. */ ! pop_p = push_scope (ctype); ! ok = duplicate_decls (decl, old_decl); ! if (pop_p) ! pop_scope (ctype); ! if (!ok) ! { ! error ("no `%#D' member function declared in class `%T'", ! decl, ctype); ! return NULL_TREE; ! } return old_decl; } } *************** grokfndecl (ctype, type, declarator, ori *** 9882,9894 **** the innermost enclosings scope. */ static tree ! grokvardecl (type, name, specbits_in, initialized, constp, scope) ! tree type; ! tree name; ! RID_BIT_TYPE *specbits_in; ! int initialized; ! int constp; ! tree scope; { tree decl; RID_BIT_TYPE specbits; --- 5809,5820 ---- the innermost enclosings scope. */ static tree ! grokvardecl (tree type, ! tree name, ! RID_BIT_TYPE * specbits_in, ! int initialized, ! int constp, ! tree scope) { tree decl; RID_BIT_TYPE specbits; *************** grokvardecl (type, name, specbits_in, in *** 10004,10010 **** tree build_ptrmemfunc_type (tree type) { ! tree fields[4]; tree t; tree unqualified_variant = NULL_TREE; --- 5930,5936 ---- tree build_ptrmemfunc_type (tree type) { ! tree field, fields; tree t; tree unqualified_variant = NULL_TREE; *************** build_ptrmemfunc_type (tree type) *** 10030,10039 **** /* ... and not really an aggregate. */ SET_IS_AGGR_TYPE (t, 0); ! fields[0] = build_decl (FIELD_DECL, pfn_identifier, type); ! fields[1] = build_decl (FIELD_DECL, delta_identifier, ! delta_type_node); ! finish_builtin_type (t, "__ptrmemfunc_type", fields, 1, ptr_type_node); /* Zap out the name so that the back-end will give us the debugging information for this anonymous RECORD_TYPE. */ --- 5956,5969 ---- /* ... and not really an aggregate. */ SET_IS_AGGR_TYPE (t, 0); ! field = build_decl (FIELD_DECL, pfn_identifier, type); ! fields = field; ! ! field = build_decl (FIELD_DECL, delta_identifier, delta_type_node); ! TREE_CHAIN (field) = fields; ! fields = field; ! ! finish_builtin_struct (t, "__ptrmemfunc_type", fields, ptr_type_node); /* Zap out the name so that the back-end will give us the debugging information for this anonymous RECORD_TYPE. */ *************** build_ptrmemfunc_type (tree type) *** 10055,10063 **** later. */ TYPE_SET_PTRMEMFUNC_TYPE (type, t); - /* Seems to be wanted. */ - CLASSTYPE_GOT_SEMICOLON (t) = 1; - return t; } --- 5985,5990 ---- *************** build_ptrmemfunc_type (tree type) *** 10066,10072 **** tree build_ptrmem_type (tree class_type, tree member_type) { ! return build_pointer_type (build_offset_type (class_type, member_type)); } /* DECL is a VAR_DECL defined in-class, whose TYPE is also given. --- 5993,6018 ---- tree build_ptrmem_type (tree class_type, tree member_type) { ! if (TREE_CODE (member_type) == METHOD_TYPE) ! { ! tree arg_types; ! ! arg_types = TYPE_ARG_TYPES (member_type); ! class_type = (cp_build_qualified_type ! (class_type, ! cp_type_quals (TREE_TYPE (TREE_VALUE (arg_types))))); ! member_type ! = build_method_type_directly (class_type, ! TREE_TYPE (member_type), ! TREE_CHAIN (arg_types)); ! return build_ptrmemfunc_type (build_pointer_type (member_type)); ! } ! else ! { ! my_friendly_assert (TREE_CODE (member_type) != FUNCTION_TYPE, ! 20030716); ! return build_offset_type (class_type, member_type); ! } } /* DECL is a VAR_DECL defined in-class, whose TYPE is also given. *************** build_ptrmem_type (tree class_type, tree *** 10075,10083 **** otherwise. */ int ! check_static_variable_definition (decl, type) ! tree decl; ! tree type; { /* Motion 10 at San Diego: If a static const integral data member is initialized with an integral constant expression, the initializer --- 6021,6027 ---- otherwise. */ int ! check_static_variable_definition (tree decl, tree type) { /* Motion 10 at San Diego: If a static const integral data member is initialized with an integral constant expression, the initializer *************** check_static_variable_definition (decl, *** 10109,10160 **** name of the thing being declared. */ tree ! compute_array_index_type (name, size) ! tree name; ! tree size; { tree itype; ! /* If this involves a template parameter, it will be a constant at ! instantiation time, but we don't know what the value is yet. ! Even if no template parameters are involved, we may an expression ! that is not a constant; we don't even simplify `1 + 2' when ! processing a template. */ ! if (processing_template_decl) { ! /* Resolve a qualified reference to an enumerator or static ! const data member of ours. */ ! if (TREE_CODE (size) == SCOPE_REF ! && TREE_OPERAND (size, 0) == current_class_type) ! { ! tree t = lookup_field (current_class_type, ! TREE_OPERAND (size, 1), 0, 0); ! if (t) ! size = t; ! } ! ! return build_index_type (build_min (MINUS_EXPR, sizetype, ! size, integer_one_node)); } /* The size might be the result of a cast. */ STRIP_TYPE_NOPS (size); /* It might be a const variable or enumeration constant. */ size = decl_constant_value (size); - /* The array bound must be an integer type. */ - if (TREE_CODE (TREE_TYPE (size)) != INTEGER_TYPE - && TREE_CODE (TREE_TYPE (size)) != ENUMERAL_TYPE - && TREE_CODE (TREE_TYPE (size)) != BOOLEAN_TYPE) - { - if (name) - error ("size of array `%D' has non-integer type", name); - else - error ("size of array has non-integer type"); - size = integer_one_node; - } - /* Normally, the array-bound will be a constant. */ if (TREE_CODE (size) == INTEGER_CST) { --- 6053,6089 ---- name of the thing being declared. */ tree ! compute_array_index_type (tree name, tree size) { + tree type = TREE_TYPE (size); tree itype; ! /* The array bound must be an integer type. */ ! if (!dependent_type_p (type) && !INTEGRAL_TYPE_P (type)) { ! if (name) ! error ("size of array `%D' has non-integral type `%T'", name, type); ! else ! error ("size of array has non-integral type `%T'", type); ! size = integer_one_node; ! type = TREE_TYPE (size); } + if (abi_version_at_least (2) + /* We should only handle value dependent expressions specially. */ + ? value_dependent_expression_p (size) + /* But for abi-1, we handled all instances in templates. This + effects the manglings produced. */ + : processing_template_decl) + return build_index_type (build_min (MINUS_EXPR, sizetype, + size, integer_one_node)); + /* The size might be the result of a cast. */ STRIP_TYPE_NOPS (size); /* It might be a const variable or enumeration constant. */ size = decl_constant_value (size); /* Normally, the array-bound will be a constant. */ if (TREE_CODE (size) == INTEGER_CST) { *************** compute_array_index_type (name, size) *** 10177,10183 **** size = integer_one_node; } /* As an extension we allow zero-sized arrays. We always allow ! them in system headers because glibc uses them. */ else if (integer_zerop (size) && pedantic && !in_system_header) { if (name) --- 6106,6112 ---- size = integer_one_node; } /* As an extension we allow zero-sized arrays. We always allow ! them in system headers because glibc uses them. */ else if (integer_zerop (size) && pedantic && !in_system_header) { if (name) *************** compute_array_index_type (name, size) *** 10195,10247 **** else error ("size of array is not an integral constant-expression"); } ! /* Compute the index of the largest element in the array. It is ! one less than the number of elements in the array. */ ! itype ! = fold (cp_build_binary_op (MINUS_EXPR, ! cp_convert (ssizetype, size), ! cp_convert (ssizetype, ! integer_one_node))); ! ! /* Check for variable-sized arrays. We allow such things as an ! extension, even though they are not allowed in ANSI/ISO C++. */ ! if (!TREE_CONSTANT (itype)) { ! if (pedantic) { ! if (name) ! pedwarn ("ISO C++ forbids variable-size array `%D'", ! name); ! else ! pedwarn ("ISO C++ forbids variable-size array"); } - - /* Create a variable-sized array index type. */ - itype = variable_size (itype); - } - /* Make sure that there was no overflow when creating to a signed - index type. (For example, on a 32-bit machine, an array with - size 2^32 - 1 is too big.) */ - else if (TREE_OVERFLOW (itype)) - { - error ("overflow in array dimension"); - TREE_OVERFLOW (itype) = 0; } /* Create and return the appropriate index type. */ return build_index_type (itype); } /* Returns an ARRAY_TYPE for an array with SIZE elements of the indicated TYPE. If non-NULL, NAME is the NAME of the declaration with this type. */ static tree ! create_array_type_for_decl (name, type, size) ! tree name; ! tree type; ! tree size; { tree itype = NULL_TREE; const char* error_msg; --- 6124,6212 ---- else error ("size of array is not an integral constant-expression"); } + else if (pedantic) + { + if (name) + pedwarn ("ISO C++ forbids variable-size array `%D'", name); + else + pedwarn ("ISO C++ forbids variable-size array"); + } ! if (processing_template_decl && !TREE_CONSTANT (size)) ! /* A variable sized array. */ ! itype = build_min (MINUS_EXPR, sizetype, size, integer_one_node); ! else { ! /* Compute the index of the largest element in the array. It is ! one less than the number of elements in the array. */ ! itype ! = fold (cp_build_binary_op (MINUS_EXPR, ! cp_convert (ssizetype, size), ! cp_convert (ssizetype, integer_one_node))); ! if (!TREE_CONSTANT (itype)) ! /* A variable sized array. */ ! itype = variable_size (itype); ! /* Make sure that there was no overflow when creating to a signed ! index type. (For example, on a 32-bit machine, an array with ! size 2^32 - 1 is too big.) */ ! else if (TREE_OVERFLOW (itype)) { ! error ("overflow in array dimension"); ! TREE_OVERFLOW (itype) = 0; } } /* Create and return the appropriate index type. */ return build_index_type (itype); } + /* Returns the scope (if any) in which the entity declared by + DECLARATOR will be located. If the entity was declared with an + unqualified name, NULL_TREE is returned. */ + + tree + get_scope_of_declarator (tree declarator) + { + if (!declarator) + return NULL_TREE; + + switch (TREE_CODE (declarator)) + { + case CALL_EXPR: + case ARRAY_REF: + case INDIRECT_REF: + case ADDR_EXPR: + /* For any of these, the main declarator is the first operand. */ + return get_scope_of_declarator (TREE_OPERAND + (declarator, 0)); + + case SCOPE_REF: + /* For a pointer-to-member, continue descending. */ + if (TREE_CODE (TREE_OPERAND (declarator, 1)) + == INDIRECT_REF) + return get_scope_of_declarator (TREE_OPERAND + (declarator, 1)); + /* Otherwise, if the declarator-id is a SCOPE_REF, the scope in + which the declaration occurs is the first operand. */ + return TREE_OPERAND (declarator, 0); + + case TREE_LIST: + /* Attributes to be applied. The declarator is TREE_VALUE. */ + return get_scope_of_declarator (TREE_VALUE (declarator)); + + default: + /* Otherwise, we have a declarator-id which is not a qualified + name; the entity will be declared in the current scope. */ + return NULL_TREE; + } + } + /* Returns an ARRAY_TYPE for an array with SIZE elements of the indicated TYPE. If non-NULL, NAME is the NAME of the declaration with this type. */ static tree ! create_array_type_for_decl (tree name, tree type, tree size) { tree itype = NULL_TREE; const char* error_msg; *************** create_array_type_for_decl (name, type, *** 10268,10277 **** error_msg = "array of references"; break; - case OFFSET_TYPE: - error_msg = "array of data members"; - break; - case METHOD_TYPE: error_msg = "array of function members"; break; --- 6233,6238 ---- *************** create_array_type_for_decl (name, type, *** 10321,10330 **** special functions. */ static tree ! check_special_function_return_type (sfk, type, optype) ! special_function_kind sfk; ! tree type; ! tree optype; { switch (sfk) { --- 6282,6290 ---- special functions. */ static tree ! check_special_function_return_type (special_function_kind sfk, ! tree type, ! tree optype) { switch (sfk) { *************** check_special_function_return_type (sfk, *** 10357,10367 **** return type; } ! /* Given declspecs and a declarator, ! determine the name and type of the object declared ! and construct a ..._DECL node for it. ! (In one case we can return a ..._TYPE node instead. ! For invalid input we sometimes return 0.) DECLSPECS is a chain of tree_list nodes whose value fields are the storage classes and type specifiers. --- 6317,6325 ---- return type; } ! /* Given declspecs and a declarator (abstract or otherwise), determine ! the name and type of the object declared and construct a DECL node ! for it. DECLSPECS is a chain of tree_list nodes whose value fields are the storage classes and type specifiers. *************** check_special_function_return_type (sfk, *** 10388,10430 **** if there are none; *ATTRLIST may be modified if attributes from inside the declarator should be applied to the declaration. ! In the TYPENAME case, DECLARATOR is really an abstract declarator. ! It may also be so in the PARM case, for a prototype where the ! argument type is specified but not the name. ! ! This function is where the complicated C meanings of `static' ! and `extern' are interpreted. ! ! For C++, if there is any monkey business to do, the function which ! calls this one must do it, i.e., prepending instance variables, ! renaming overloaded function names, etc. ! ! Note that for this C++, it is an error to define a method within a class ! which does not belong to that class. ! ! Except in the case where SCOPE_REFs are implicitly known (such as ! methods within a class being redundantly qualified), ! declarations which involve SCOPE_REFs are returned as SCOPE_REFs ! (class_name::decl_name). The caller must also deal with this. ! ! If a constructor or destructor is seen, and the context is FIELD, ! then the type gains the attribute TREE_HAS_x. If such a declaration ! is erroneous, NULL_TREE is returned. ! QUALS is used only for FUNCDEF and MEMFUNCDEF cases. For a member ! function, these are the qualifiers to give to the `this' pointer. We ! apply TYPE_QUAL_RESTRICT to the this ptr, not the object. ! May return void_type_node if the declarator turned out to be a friend. ! See grokfield for details. */ tree ! grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ! tree declspecs; ! tree declarator; ! enum decl_context decl_context; ! int initialized; ! tree *attrlist; { RID_BIT_TYPE specbits; int nclasses = 0; --- 6346,6367 ---- if there are none; *ATTRLIST may be modified if attributes from inside the declarator should be applied to the declaration. ! When this function is called, scoping variables (such as ! CURRENT_CLASS_TYPE) should reflect the scope in which the ! declaration occurs, not the scope in which the new declaration will ! be placed. For example, on: ! void S::f() { ... } ! when grokdeclarator is called for `S::f', the CURRENT_CLASS_TYPE ! should not be `S'. */ tree ! grokdeclarator (tree declarator, ! tree declspecs, ! enum decl_context decl_context, ! int initialized, ! tree* attrlist) { RID_BIT_TYPE specbits; int nclasses = 0; *************** grokdeclarator (declarator, declspecs, d *** 10449,10457 **** /* See the code below that used this. */ tree decl_attr = NULL_TREE; #endif - /* Set this to error_mark_node for FIELD_DECLs we could not handle properly. - All FIELD_DECLs we build here have `init' put into their DECL_INITIAL. */ - tree init = NULL_TREE; /* Keep track of what sort of function is being processed so that we can warn about default return values, or explicit --- 6386,6391 ---- *************** grokdeclarator (declarator, declspecs, d *** 10467,10472 **** --- 6401,6408 ---- int template_count = 0; tree in_namespace = NULL_TREE; tree returned_attrs = NULL_TREE; + tree scope = NULL_TREE; + tree parms = NULL_TREE; RIDBIT_RESET_ALL (specbits); if (decl_context == FUNCDEF) *************** grokdeclarator (declarator, declspecs, d *** 10480,10486 **** and get it as a string, for an error message. */ { tree *next = &declarator; ! register tree decl; name = NULL; while (next && *next) --- 6416,6422 ---- and get it as a string, for an error message. */ { tree *next = &declarator; ! tree decl; name = NULL; while (next && *next) *************** grokdeclarator (declarator, declspecs, d *** 10506,10512 **** my_friendly_assert (flags == NO_SPECIAL, 152); flags = DTOR_FLAG; sfk = sfk_destructor; ! if (TREE_CODE (name) == TYPE_DECL) TREE_OPERAND (decl, 0) = name = constructor_name (name); my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 153); if (ctype == NULL_TREE) --- 6442,6448 ---- my_friendly_assert (flags == NO_SPECIAL, 152); flags = DTOR_FLAG; sfk = sfk_destructor; ! if (TYPE_P (name)) TREE_OPERAND (decl, 0) = name = constructor_name (name); my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 153); if (ctype == NULL_TREE) *************** grokdeclarator (declarator, declspecs, d *** 10518,10524 **** } else { ! tree t = constructor_name (current_class_name); if (t != name) rename = t; } --- 6454,6460 ---- } else { ! tree t = constructor_name (current_class_type); if (t != name) rename = t; } *************** grokdeclarator (declarator, declspecs, d *** 10550,10596 **** break; case CALL_EXPR: - if (parmlist_is_exprlist (CALL_DECLARATOR_PARMS (decl))) - { - /* This is actually a variable declaration using - constructor syntax. We need to call start_decl and - cp_finish_decl so we can get the variable - initialized... */ - - tree attributes; - - if (decl_context != NORMAL) - { - error ("variable declaration is not allowed here"); - return error_mark_node; - } - - *next = TREE_OPERAND (decl, 0); - init = CALL_DECLARATOR_PARMS (decl); - - if (attrlist) - { - attributes = *attrlist; - } - else - { - attributes = NULL_TREE; - } - - decl = start_decl (declarator, declspecs, 1, - attributes, NULL_TREE); - decl_type_access_control (decl); - if (decl) - { - /* Look for __unused__ attribute */ - if (TREE_USED (TREE_TYPE (decl))) - TREE_USED (decl) = 1; - finish_decl (decl, init, NULL_TREE); - } - else - error ("invalid declarator"); - return NULL_TREE; - } innermost_code = TREE_CODE (decl); if (decl_context == FIELD && ctype == NULL_TREE) ctype = current_class_type; --- 6486,6491 ---- *************** grokdeclarator (declarator, declspecs, d *** 10604,10610 **** decl = *next; if (ctype != NULL_TREE && decl != NULL_TREE && flags != DTOR_FLAG ! && decl == constructor_name (ctype)) { sfk = sfk_constructor; ctor_return_type = ctype; --- 6499,6505 ---- decl = *next; if (ctype != NULL_TREE && decl != NULL_TREE && flags != DTOR_FLAG ! && constructor_name_p (decl, ctype)) { sfk = sfk_constructor; ctor_return_type = ctype; *************** grokdeclarator (declarator, declspecs, d *** 10616,10624 **** { tree fns = TREE_OPERAND (decl, 0); - if (TREE_CODE (fns) == LOOKUP_EXPR) - fns = TREE_OPERAND (fns, 0); - dname = fns; if (TREE_CODE (dname) == COMPONENT_REF) dname = TREE_OPERAND (dname, 1); --- 6511,6516 ---- *************** grokdeclarator (declarator, declspecs, d *** 10651,10659 **** flags = TYPENAME_FLAG; ctor_return_type = TREE_TYPE (dname); sfk = sfk_conversion; ! if (IDENTIFIER_GLOBAL_VALUE (dname) ! && (TREE_CODE (IDENTIFIER_GLOBAL_VALUE (dname)) ! == TYPE_DECL)) name = IDENTIFIER_POINTER (dname); else name = ""; --- 6543,6549 ---- flags = TYPENAME_FLAG; ctor_return_type = TREE_TYPE (dname); sfk = sfk_conversion; ! if (is_typename_at_global_scope (dname)) name = IDENTIFIER_POINTER (dname); else name = ""; *************** grokdeclarator (declarator, declspecs, d *** 10671,10680 **** { ctype = NULL_TREE; in_namespace = TREE_OPERAND (decl, 0); - TREE_OPERAND (decl, 0) = NULL_TREE; } else if (! is_aggr_type (cname, 1)) ! TREE_OPERAND (decl, 0) = NULL_TREE; /* Must test TREE_OPERAND (decl, 1), in case user gives us `typedef (class::memfunc)(int); memfunc *memfuncptr;' */ else if (TREE_OPERAND (decl, 1) --- 6561,6569 ---- { ctype = NULL_TREE; in_namespace = TREE_OPERAND (decl, 0); } else if (! is_aggr_type (cname, 1)) ! ctype = NULL_TREE; /* Must test TREE_OPERAND (decl, 1), in case user gives us `typedef (class::memfunc)(int); memfunc *memfuncptr;' */ else if (TREE_OPERAND (decl, 1) *************** grokdeclarator (declarator, declspecs, d *** 10691,10716 **** else if (ctype == NULL_TREE) ctype = cname; else if (TREE_COMPLEXITY (decl) == current_class_depth) ! TREE_OPERAND (decl, 0) = ctype; else { if (! UNIQUELY_DERIVED_FROM_P (cname, ctype)) { error ("type `%T' is not derived from type `%T'", cname, ctype); ! TREE_OPERAND (decl, 0) = NULL_TREE; } else ctype = cname; } ! /* If the parser sees something like "void a::b" where ! "a::b" is a namespace, it will build a SCOPE_REF with ! a NAMESPACE_DECL, rather than an IDENTIFIER_NODE, as ! the second operand. Since the SCOPE_REF is being ! used as a declarator, we recover from that here. */ ! if (TREE_CODE (TREE_OPERAND (decl, 1)) == NAMESPACE_DECL) ! TREE_OPERAND (decl, 1) = DECL_NAME (TREE_OPERAND (decl, 1)); if (ctype && TREE_CODE (TREE_OPERAND (decl, 1)) == TYPE_DECL && constructor_name_p (DECL_NAME (TREE_OPERAND (decl, 1)), --- 6580,6613 ---- else if (ctype == NULL_TREE) ctype = cname; else if (TREE_COMPLEXITY (decl) == current_class_depth) ! ; else { if (! UNIQUELY_DERIVED_FROM_P (cname, ctype)) { error ("type `%T' is not derived from type `%T'", cname, ctype); ! ctype = NULL_TREE; } else ctype = cname; } ! /* It is valid to write: ! ! class C { void f(); }; ! typedef C D; ! void D::f(); ! ! The standard is not clear about whether `typedef const C D' is ! legal; as of 2002-09-15 the committee is considering ! that question. EDG 3.0 allows that syntax. ! Therefore, we do as well. */ ! if (ctype) ! ctype = TYPE_MAIN_VARIANT (ctype); ! /* Update the declarator so that when we process it ! again the correct type is present. */ ! TREE_OPERAND (decl, 0) = ctype; if (ctype && TREE_CODE (TREE_OPERAND (decl, 1)) == TYPE_DECL && constructor_name_p (DECL_NAME (TREE_OPERAND (decl, 1)), *************** grokdeclarator (declarator, declspecs, d *** 10720,10735 **** decl = *next; if (ctype) { ! if (TREE_CODE (decl) == IDENTIFIER_NODE ! && constructor_name (ctype) == decl) { sfk = sfk_constructor; ctor_return_type = ctype; } ! else if (TREE_CODE (decl) == BIT_NOT_EXPR ! && TREE_CODE (TREE_OPERAND (decl, 0)) == IDENTIFIER_NODE ! && constructor_name_p (TREE_OPERAND (decl, 0), ! ctype)) { sfk = sfk_destructor; ctor_return_type = ctype; --- 6617,6635 ---- decl = *next; if (ctype) { ! tree name = decl; ! ! if (TREE_CODE (name) == BIT_NOT_EXPR) ! name = TREE_OPERAND (name, 0); ! ! if (!constructor_name_p (decl, ctype)) ! ; ! else if (decl == name) { sfk = sfk_constructor; ctor_return_type = ctype; } ! else { sfk = sfk_destructor; ctor_return_type = ctype; *************** grokdeclarator (declarator, declspecs, d *** 10840,10847 **** for (spec = declspecs; spec; spec = TREE_CHAIN (spec)) { ! register int i; ! register tree id; /* Certain parse errors slip through. For example, `int class;' is not caught by the parser. Try --- 6740,6747 ---- for (spec = declspecs; spec; spec = TREE_CHAIN (spec)) { ! int i; ! tree id; /* Certain parse errors slip through. For example, `int class;' is not caught by the parser. Try *************** grokdeclarator (declarator, declspecs, d *** 10909,10921 **** else if (RIDBIT_SETP (i, specbits)) pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id)); ! /* Diagnose "__thread extern". Recall that this list ! is in the reverse order seen in the text. */ ! if (i == (int)RID_THREAD) { ! if (RIDBIT_SETP (RID_EXTERN, specbits)) error ("`__thread' before `extern'"); ! if (RIDBIT_SETP (RID_STATIC, specbits)) error ("`__thread' before `static'"); } --- 6809,6820 ---- else if (RIDBIT_SETP (i, specbits)) pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id)); ! /* Diagnose "__thread extern" or "__thread static". */ ! if (RIDBIT_SETP (RID_THREAD, specbits)) { ! if (i == (int)RID_EXTERN) error ("`__thread' before `extern'"); ! else if (i == (int)RID_STATIC) error ("`__thread' before `static'"); } *************** grokdeclarator (declarator, declspecs, d *** 10946,10952 **** error ("two or more data types in declaration of `%s'", name); else if (TREE_CODE (id) == IDENTIFIER_NODE) { ! register tree t = lookup_name (id, 1); if (!t || TREE_CODE (t) != TYPE_DECL) error ("`%s' fails to be a typedef or built in type", IDENTIFIER_POINTER (id)); --- 6845,6851 ---- error ("two or more data types in declaration of `%s'", name); else if (TREE_CODE (id) == IDENTIFIER_NODE) { ! tree t = lookup_name (id, 1); if (!t || TREE_CODE (t) != TYPE_DECL) error ("`%s' fails to be a typedef or built in type", IDENTIFIER_POINTER (id)); *************** grokdeclarator (declarator, declspecs, d *** 11014,11034 **** type = integer_type_node; } - if (type && IMPLICIT_TYPENAME_P (type)) - { - /* The implicit typename extension is deprecated and will be - removed. Warn about its use now. */ - warning ("`%T' is implicitly a typename", type); - cp_deprecated ("implicit typename"); - - /* Now remove its implicitness, so that we don't warn again. - For instance this might be a typedef, and we do not want to - warn on uses of the typedef itself. Simply clearing the - TREE_TYPE is insufficient. */ - type = copy_node (type); - TREE_TYPE (type) = NULL_TREE; - } - ctype = NULL_TREE; /* Now process the modifiers that were specified --- 6913,6918 ---- *************** grokdeclarator (declarator, declspecs, d *** 11270,11276 **** else if (RIDBIT_SETP (RID_TYPEDEF, specbits)) ; else if (decl_context == FIELD ! /* C++ allows static class elements */ && RIDBIT_SETP (RID_STATIC, specbits)) /* C++ also allows inlines and signed and unsigned elements, but in those cases we don't come in here. */ --- 7154,7160 ---- else if (RIDBIT_SETP (RID_TYPEDEF, specbits)) ; else if (decl_context == FIELD ! /* C++ allows static class elements. */ && RIDBIT_SETP (RID_STATIC, specbits)) /* C++ also allows inlines and signed and unsigned elements, but in those cases we don't come in here. */ *************** grokdeclarator (declarator, declspecs, d *** 11280,11286 **** if (decl_context == FIELD) { tree tmp = NULL_TREE; ! register int op = 0; if (declarator) { --- 7164,7170 ---- if (decl_context == FIELD) { tree tmp = NULL_TREE; ! int op = 0; if (declarator) { *************** grokdeclarator (declarator, declspecs, d *** 11292,11300 **** op = IDENTIFIER_OPNAME_P (tmp); if (IDENTIFIER_TYPENAME_P (tmp)) { ! if (IDENTIFIER_GLOBAL_VALUE (tmp) ! && (TREE_CODE (IDENTIFIER_GLOBAL_VALUE (tmp)) ! == TYPE_DECL)) name = IDENTIFIER_POINTER (tmp); else name = ""; --- 7176,7182 ---- op = IDENTIFIER_OPNAME_P (tmp); if (IDENTIFIER_TYPENAME_P (tmp)) { ! if (is_typename_at_global_scope (tmp)) name = IDENTIFIER_POINTER (tmp); else name = ""; *************** grokdeclarator (declarator, declspecs, d *** 11349,11354 **** --- 7231,7238 ---- if (nclasses > 0 && friendp) error ("storage class specifiers invalid in friend function declarations"); + scope = get_scope_of_declarator (declarator); + /* Now figure out the structure of the declarator proper. Descend through it, creating more complex types, until we reach the declared identifier (or NULL_TREE, in an abstract declarator). */ *************** grokdeclarator (declarator, declspecs, d *** 11379,11385 **** if (type == error_mark_node) { ! if (TREE_CODE (declarator) == SCOPE_REF) declarator = TREE_OPERAND (declarator, 1); else declarator = TREE_OPERAND (declarator, 0); --- 7263,7271 ---- if (type == error_mark_node) { ! if (declarator == error_mark_node) ! return error_mark_node; ! else if (TREE_CODE (declarator) == SCOPE_REF) declarator = TREE_OPERAND (declarator, 1); else declarator = TREE_OPERAND (declarator, 0); *************** grokdeclarator (declarator, declspecs, d *** 11396,11402 **** tree dummy = build_decl (TYPE_DECL, NULL_TREE, type); grok_method_quals (ctype, dummy, quals); type = TREE_TYPE (dummy); - ctype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (type))); quals = NULL_TREE; } } --- 7282,7287 ---- *************** grokdeclarator (declarator, declspecs, d *** 11432,11446 **** case ARRAY_REF: { ! register tree size; ! ! size = TREE_OPERAND (declarator, 1); ! ! /* VC++ spells a zero-sized array with []. */ ! if (size == NULL_TREE && decl_context == FIELD && ! staticp ! && ! RIDBIT_SETP (RID_TYPEDEF, specbits)) ! size = integer_zero_node; ! declarator = TREE_OPERAND (declarator, 0); type = create_array_type_for_decl (dname, type, size); --- 7317,7323 ---- case ARRAY_REF: { ! tree size = TREE_OPERAND (declarator, 1); declarator = TREE_OPERAND (declarator, 0); type = create_array_type_for_decl (dname, type, size); *************** grokdeclarator (declarator, declspecs, d *** 11504,11510 **** if (ctype && sfk == sfk_conversion) TYPE_HAS_CONVERSION (ctype) = 1; ! if (ctype && constructor_name (ctype) == dname) { /* We are within a class's scope. If our declarator name is the same as the class name, and we are defining --- 7381,7387 ---- if (ctype && sfk == sfk_conversion) TYPE_HAS_CONVERSION (ctype) = 1; ! if (ctype && constructor_name_p (dname, ctype)) { /* We are within a class's scope. If our declarator name is the same as the class name, and we are defining *************** grokdeclarator (declarator, declspecs, d *** 11598,11607 **** declarator = TREE_OPERAND (declarator, 0); ! /* FIXME: This is where default args should be fully ! processed. */ ! ! arg_types = grokparms (inner_parms); if (declarator && flags == DTOR_FLAG) { --- 7475,7481 ---- declarator = TREE_OPERAND (declarator, 0); ! arg_types = grokparms (inner_parms, &parms); if (declarator && flags == DTOR_FLAG) { *************** grokdeclarator (declarator, declspecs, d *** 11615,11638 **** { error ("destructors may not have parameters"); arg_types = void_list_node; ! last_function_parms = NULL_TREE; } } /* ANSI says that `const int foo ();' does not make the function foo const. */ type = build_function_type (type, arg_types); - - { - tree t; - for (t = arg_types; t; t = TREE_CHAIN (t)) - if (TREE_PURPOSE (t) - && TREE_CODE (TREE_PURPOSE (t)) == DEFAULT_ARG) - { - add_defarg_fn (type); - break; - } - } } break; --- 7489,7501 ---- { error ("destructors may not have parameters"); arg_types = void_list_node; ! parms = NULL_TREE; } } /* ANSI says that `const int foo ();' does not make the function foo const. */ type = build_function_type (type, arg_types); } break; *************** grokdeclarator (declarator, declspecs, d *** 11677,11683 **** if (TREE_TYPE (declarator)) { ! register tree typemodlist; int erred = 0; int constp = 0; int volatilep = 0; --- 7540,7546 ---- if (TREE_TYPE (declarator)) { ! tree typemodlist; int erred = 0; int constp = 0; int volatilep = 0; *************** grokdeclarator (declarator, declspecs, d *** 11737,11780 **** if (TREE_CODE (sname) == BIT_NOT_EXPR) sname = TREE_OPERAND (sname, 0); - if (TREE_COMPLEXITY (declarator) == 0) - /* This needs to be here, in case we are called - multiple times. */ ; - else if (TREE_COMPLEXITY (declarator) == -1) - /* Namespace member. */ - pop_decl_namespace (); - else if (friendp && (TREE_COMPLEXITY (declarator) < 2)) - /* Don't fall out into global scope. Hides real bug? --eichin */ ; - else if (!TREE_OPERAND (declarator, 0) - || !IS_AGGR_TYPE_CODE - (TREE_CODE (TREE_OPERAND (declarator, 0)))) - ; - else if (TREE_COMPLEXITY (declarator) == current_class_depth) - { - /* Resolve any TYPENAME_TYPEs from the decl-specifier-seq - that refer to ctype. They couldn't be resolved earlier - because we hadn't pushed into the class yet. - Example: resolve 'B::type' in - 'B::type> B::f () { }'. */ - if (current_template_parms - && uses_template_parms (type) - && uses_template_parms (current_class_type)) - { - tree args = current_template_args (); - type = tsubst (type, args, tf_error | tf_warning, - NULL_TREE); - } - - /* This pop_nested_class corresponds to the - push_nested_class used to push into class scope for - parsing the argument list of a function decl, in - qualified_id. */ - pop_nested_class (); - TREE_COMPLEXITY (declarator) = current_class_depth; - } - else - abort (); - if (TREE_OPERAND (declarator, 0) == NULL_TREE) { /* We had a reference to a global decl, or --- 7600,7605 ---- *************** grokdeclarator (declarator, declspecs, d *** 11831,11844 **** } else if (TREE_CODE (type) == FUNCTION_TYPE) { ! if (current_class_type == NULL_TREE || friendp) ! type = build_cplus_method_type (ctype, TREE_TYPE (type), TYPE_ARG_TYPES (type)); else { error ("cannot declare member function `%T::%s' within `%T'", ctype, name, current_class_type); ! return void_type_node; } } else if (RIDBIT_SETP (RID_TYPEDEF, specbits) --- 7656,7675 ---- } else if (TREE_CODE (type) == FUNCTION_TYPE) { ! if (NEW_DELETE_OPNAME_P (sname)) ! /* Overloaded operator new and operator delete ! are always static functions. */ ! ; ! else if (current_class_type == NULL_TREE || friendp) ! type ! = build_method_type_directly (ctype, ! TREE_TYPE (type), TYPE_ARG_TYPES (type)); else { error ("cannot declare member function `%T::%s' within `%T'", ctype, name, current_class_type); ! return error_mark_node; } } else if (RIDBIT_SETP (RID_TYPEDEF, specbits) *************** grokdeclarator (declarator, declspecs, d *** 11874,11881 **** /* In this case, we will deal with it later. */ ; else if (TREE_CODE (type) == FUNCTION_TYPE) ! type = build_cplus_method_type (ctype, TREE_TYPE (type), ! TYPE_ARG_TYPES (type)); } } break; --- 7705,7713 ---- /* In this case, we will deal with it later. */ ; else if (TREE_CODE (type) == FUNCTION_TYPE) ! type = build_method_type_directly (ctype, ! TREE_TYPE (type), ! TYPE_ARG_TYPES (type)); } } break; *************** grokdeclarator (declarator, declspecs, d *** 12002,12008 **** if (decl_context == FIELD) { ! if (declarator == constructor_name (current_class_type)) pedwarn ("ISO C++ forbids nested type `%D' with same name as enclosing class", declarator); decl = build_lang_decl (TYPE_DECL, declarator, type); --- 7834,7840 ---- if (decl_context == FIELD) { ! if (constructor_name_p (declarator, current_class_type)) pedwarn ("ISO C++ forbids nested type `%D' with same name as enclosing class", declarator); decl = build_lang_decl (TYPE_DECL, declarator, type); *************** grokdeclarator (declarator, declspecs, d *** 12010,12015 **** --- 7842,7849 ---- else { decl = build_decl (TYPE_DECL, declarator, type); + if (in_namespace || ctype) + error ("%Jtypedef name may not be a nested-name-specifier", decl); if (!current_function_decl) DECL_CONTEXT (decl) = FROB_CONTEXT (current_namespace); } *************** grokdeclarator (declarator, declspecs, d *** 12050,12066 **** type with external linkage have external linkage. */ } ! if (TREE_CODE (type) == OFFSET_TYPE || TREE_CODE (type) == METHOD_TYPE) ! { ! cp_error_at ("typedef name may not be class-qualified", decl); ! return NULL_TREE; ! } ! else if (quals) { if (ctype == NULL_TREE) { if (TREE_CODE (type) != METHOD_TYPE) ! cp_error_at ("invalid type qualifier for non-member function type", decl); else ctype = TYPE_METHOD_BASETYPE (type); } --- 7884,7896 ---- type with external linkage have external linkage. */ } ! if (quals) { if (ctype == NULL_TREE) { if (TREE_CODE (type) != METHOD_TYPE) ! error ("%Jinvalid type qualifier for non-member function type", ! decl); else ctype = TYPE_METHOD_BASETYPE (type); } *************** grokdeclarator (declarator, declspecs, d *** 12089,12096 **** type = build_cplus_array_type (TREE_TYPE (type), NULL_TREE); /* Detect where we're using a typedef of function type to declare a ! function. last_function_parms will not be set, so we must create ! it now. */ if (type == typedef_type && TREE_CODE (type) == FUNCTION_TYPE) { --- 7919,7925 ---- type = build_cplus_array_type (TREE_TYPE (type), NULL_TREE); /* Detect where we're using a typedef of function type to declare a ! function. PARMS will not be set, so we must create it now. */ if (type == typedef_type && TREE_CODE (type) == FUNCTION_TYPE) { *************** grokdeclarator (declarator, declspecs, d *** 12105,12111 **** decls = decl; } ! last_function_parms = nreverse (decls); } /* If this is a type name (such as, in a cast or sizeof), --- 7934,7940 ---- decls = decl; } ! parms = nreverse (decls); } /* If this is a type name (such as, in a cast or sizeof), *************** grokdeclarator (declarator, declspecs, d *** 12150,12160 **** /* Only try to do this stuff if we didn't already give up. */ if (type != integer_type_node) { - decl_type_access_control (TYPE_NAME (type)); - /* A friendly class? */ if (current_class_type) ! make_friend_class (current_class_type, TYPE_MAIN_VARIANT (type)); else error ("trying to make class `%T' a friend of global scope", type); --- 7979,7988 ---- /* Only try to do this stuff if we didn't already give up. */ if (type != integer_type_node) { /* A friendly class? */ if (current_class_type) ! make_friend_class (current_class_type, TYPE_MAIN_VARIANT (type), ! /*complain=*/true); else error ("trying to make class `%T' a friend of global scope", type); *************** grokdeclarator (declarator, declspecs, d *** 12231,12242 **** } else if (TREE_CODE (type) == FUNCTION_TYPE) type = build_pointer_type (type); - else if (TREE_CODE (type) == OFFSET_TYPE) - type = build_pointer_type (type); } { ! register tree decl; if (decl_context == PARM) { --- 8059,8068 ---- } else if (TREE_CODE (type) == FUNCTION_TYPE) type = build_pointer_type (type); } { ! tree decl; if (decl_context == PARM) { *************** grokdeclarator (declarator, declspecs, d *** 12247,12252 **** --- 8073,8086 ---- } else if (decl_context == FIELD) { + /* The C99 flexible array extension. */ + if (!staticp && TREE_CODE (type) == ARRAY_TYPE + && TYPE_DOMAIN (type) == NULL_TREE) + { + tree itype = compute_array_index_type (dname, integer_zero_node); + type = build_cplus_array_type (TREE_TYPE (type), itype); + } + if (type == error_mark_node) { /* Happens when declaring arrays of sizes which *************** grokdeclarator (declarator, declspecs, d *** 12294,12303 **** return void_type_node; } ! if (declarator == ansi_opname (NEW_EXPR) ! || declarator == ansi_opname (VEC_NEW_EXPR) ! || declarator == ansi_opname (DELETE_EXPR) ! || declarator == ansi_opname (VEC_DELETE_EXPR)) { if (virtualp) { --- 8128,8134 ---- return void_type_node; } ! if (NEW_DELETE_OPNAME_P (declarator)) { if (virtualp) { *************** grokdeclarator (declarator, declspecs, d *** 12307,12314 **** } } else if (staticp < 2) ! type = build_cplus_method_type (ctype, TREE_TYPE (type), ! TYPE_ARG_TYPES (type)); } /* Tell grokfndecl if it needs to set TREE_PUBLIC on the node. */ --- 8138,8146 ---- } } else if (staticp < 2) ! type = build_method_type_directly (ctype, ! TREE_TYPE (type), ! TYPE_ARG_TYPES (type)); } /* Tell grokfndecl if it needs to set TREE_PUBLIC on the node. */ *************** grokdeclarator (declarator, declspecs, d *** 12319,12324 **** --- 8151,8157 ---- decl = grokfndecl (ctype, type, TREE_CODE (declarator) != TEMPLATE_ID_EXPR ? declarator : dname, + parms, declarator, virtualp, flags, quals, raises, friendp ? -1 : 0, friendp, publicp, inlinep, *************** grokdeclarator (declarator, declspecs, d *** 12365,12370 **** --- 8198,8204 ---- decl = grokfndecl (ctype, type, TREE_CODE (declarator) != TEMPLATE_ID_EXPR ? declarator : dname, + parms, declarator, virtualp, flags, quals, raises, friendp ? -1 : 0, friendp, 1, 0, funcdef_flag, *************** grokdeclarator (declarator, declspecs, d *** 12372,12378 **** if (decl == NULL_TREE) return NULL_TREE; } ! else if (!staticp && ! processing_template_decl && !COMPLETE_TYPE_P (complete_type (type)) && (TREE_CODE (type) != ARRAY_TYPE || initialized == 0)) { --- 8206,8212 ---- if (decl == NULL_TREE) return NULL_TREE; } ! else if (!staticp && !dependent_type_p (type) && !COMPLETE_TYPE_P (complete_type (type)) && (TREE_CODE (type) != ARRAY_TYPE || initialized == 0)) { *************** grokdeclarator (declarator, declspecs, d *** 12410,12442 **** /* Friends are treated specially. */ if (ctype == current_class_type) warning ("member functions are implicitly friends of their class"); ! else ! { ! tree t = NULL_TREE; ! if (decl && DECL_NAME (decl)) ! { ! if (template_class_depth (current_class_type) == 0) ! { ! decl ! = check_explicit_specialization ! (declarator, decl, ! template_count, 2 * (funcdef_flag != 0) + 4); ! if (decl == error_mark_node) ! return error_mark_node; ! } ! ! t = do_friend (ctype, declarator, decl, ! last_function_parms, *attrlist, ! flags, quals, funcdef_flag); ! } ! if (t && funcdef_flag) ! return t; ! ! return void_type_node; ! } } ! /* Structure field. It may not be a function, except for C++ */ if (decl == NULL_TREE) { --- 8244,8269 ---- /* Friends are treated specially. */ if (ctype == current_class_type) warning ("member functions are implicitly friends of their class"); ! else if (decl && DECL_NAME (decl)) ! { ! if (template_class_depth (current_class_type) == 0) ! { ! decl = check_explicit_specialization ! (declarator, decl, template_count, ! 2 * (funcdef_flag != 0) + 4); ! if (decl == error_mark_node) ! return error_mark_node; ! } ! ! decl = do_friend (ctype, declarator, decl, ! *attrlist, flags, quals, funcdef_flag); ! return decl; ! } ! else ! return void_type_node; } ! /* Structure field. It may not be a function, except for C++. */ if (decl == NULL_TREE) { *************** grokdeclarator (declarator, declspecs, d *** 12475,12490 **** return void_type_node; } - /* 9.2p13 [class.mem] */ - if (declarator == constructor_name (current_class_type) - /* The standard does not allow non-static data members - here either, but we agreed at the 10/99 meeting - to change that in TC 1 so that they are allowed in - classes with no user-defined constructors. */ - && staticp) - pedwarn ("ISO C++ forbids static data member `%D' with same name as enclosing class", - declarator); - if (staticp) { /* C++ allows static class members. All other work --- 8302,8307 ---- *************** grokdeclarator (declarator, declspecs, d *** 12509,12515 **** inlinep, friendp, raises != NULL_TREE); } } ! else if (TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == METHOD_TYPE) { tree original_name; int publicp = 0; --- 8326,8333 ---- inlinep, friendp, raises != NULL_TREE); } } ! else if (TREE_CODE (type) == FUNCTION_TYPE ! || TREE_CODE (type) == METHOD_TYPE) { tree original_name; int publicp = 0; *************** grokdeclarator (declarator, declspecs, d *** 12551,12566 **** virtualp = 0; } } ! else if (TREE_CODE (type) == FUNCTION_TYPE && staticp < 2) ! type = build_cplus_method_type (ctype, TREE_TYPE (type), ! TYPE_ARG_TYPES (type)); /* Record presence of `static'. */ publicp = (ctype != NULL_TREE || RIDBIT_SETP (RID_EXTERN, specbits) || !RIDBIT_SETP (RID_STATIC, specbits)); ! decl = grokfndecl (ctype, type, original_name, declarator, virtualp, flags, quals, raises, 1, friendp, publicp, inlinep, funcdef_flag, --- 8369,8386 ---- virtualp = 0; } } ! else if (TREE_CODE (type) == FUNCTION_TYPE && staticp < 2 ! && !NEW_DELETE_OPNAME_P (original_name)) ! type = build_method_type_directly (ctype, ! TREE_TYPE (type), ! TYPE_ARG_TYPES (type)); /* Record presence of `static'. */ publicp = (ctype != NULL_TREE || RIDBIT_SETP (RID_EXTERN, specbits) || !RIDBIT_SETP (RID_STATIC, specbits)); ! decl = grokfndecl (ctype, type, original_name, parms, declarator, virtualp, flags, quals, raises, 1, friendp, publicp, inlinep, funcdef_flag, *************** grokdeclarator (declarator, declspecs, d *** 12652,12712 **** } } - /* Tell if a parmlist/exprlist looks like an exprlist or a parmlist. - An empty exprlist is a parmlist. An exprlist which - contains only identifiers at the global level - is a parmlist. Otherwise, it is an exprlist. */ - - int - parmlist_is_exprlist (exprs) - tree exprs; - { - if (exprs == NULL_TREE || TREE_PARMLIST (exprs)) - return 0; - - if (toplevel_bindings_p ()) - { - /* At the global level, if these are all identifiers, - then it is a parmlist. */ - while (exprs) - { - if (TREE_CODE (TREE_VALUE (exprs)) != IDENTIFIER_NODE) - return 1; - exprs = TREE_CHAIN (exprs); - } - return 0; - } - return 1; - } - /* Subroutine of start_function. Ensure that each of the parameter types (as listed in PARMS) is complete, as is required for a function definition. */ static void ! require_complete_types_for_parms (parms) ! tree parms; { for (; parms; parms = TREE_CHAIN (parms)) { if (VOID_TYPE_P (TREE_TYPE (parms))) ! /* grokparms will have already issued an error */ TREE_TYPE (parms) = error_mark_node; else if (complete_type_or_else (TREE_TYPE (parms), parms)) { layout_decl (parms, 0); DECL_ARG_TYPE (parms) = type_passed_as (TREE_TYPE (parms)); } - else - TREE_TYPE (parms) = error_mark_node; } } /* Returns nonzero if T is a local variable. */ int ! local_variable_p (t) ! tree t; { if ((TREE_CODE (t) == VAR_DECL /* A VAR_DECL with a context that is a _TYPE is a static data --- 8472,8501 ---- } } /* Subroutine of start_function. Ensure that each of the parameter types (as listed in PARMS) is complete, as is required for a function definition. */ static void ! require_complete_types_for_parms (tree parms) { for (; parms; parms = TREE_CHAIN (parms)) { if (VOID_TYPE_P (TREE_TYPE (parms))) ! /* grokparms will have already issued an error. */ TREE_TYPE (parms) = error_mark_node; else if (complete_type_or_else (TREE_TYPE (parms), parms)) { layout_decl (parms, 0); DECL_ARG_TYPE (parms) = type_passed_as (TREE_TYPE (parms)); } } } /* Returns nonzero if T is a local variable. */ int ! local_variable_p (tree t) { if ((TREE_CODE (t) == VAR_DECL /* A VAR_DECL with a context that is a _TYPE is a static data *************** local_variable_p (t) *** 12725,12732 **** containing them is duplicated.) */ int ! nonstatic_local_decl_p (t) ! tree t; { return ((local_variable_p (t) && !TREE_STATIC (t)) || TREE_CODE (t) == LABEL_DECL --- 8514,8520 ---- containing them is duplicated.) */ int ! nonstatic_local_decl_p (tree t) { return ((local_variable_p (t) && !TREE_STATIC (t)) || TREE_CODE (t) == LABEL_DECL *************** nonstatic_local_decl_p (t) *** 12737,12746 **** function. */ static tree ! local_variable_p_walkfn (tp, walk_subtrees, data) ! tree *tp; ! int *walk_subtrees ATTRIBUTE_UNUSED; ! void *data ATTRIBUTE_UNUSED; { return ((local_variable_p (*tp) && !DECL_ARTIFICIAL (*tp)) ? *tp : NULL_TREE); --- 8525,8533 ---- function. */ static tree ! local_variable_p_walkfn (tree* tp, ! int* walk_subtrees ATTRIBUTE_UNUSED , ! void* data ATTRIBUTE_UNUSED ) { return ((local_variable_p (*tp) && !DECL_ARTIFICIAL (*tp)) ? *tp : NULL_TREE); *************** local_variable_p_walkfn (tp, walk_subtre *** 12752,12760 **** DECL, if there is no DECL available. */ tree ! check_default_argument (decl, arg) ! tree decl; ! tree arg; { tree var; tree decl_type; --- 8539,8545 ---- DECL, if there is no DECL available. */ tree ! check_default_argument (tree decl, tree arg) { tree var; tree decl_type; *************** check_default_argument (decl, arg) *** 12833,12843 **** flag. If unset, we append void_list_node. A parmlist declared as `(void)' is accepted as the empty parmlist. ! Also set last_function_parms to the chain of PARM_DECLs. */ static tree ! grokparms (first_parm) ! tree first_parm; { tree result = NULL_TREE; tree decls = NULL_TREE; --- 8618,8627 ---- flag. If unset, we append void_list_node. A parmlist declared as `(void)' is accepted as the empty parmlist. ! *PARMS is set to the chain of PARM_DECLs created. */ static tree ! grokparms (tree first_parm, tree *parms) { tree result = NULL_TREE; tree decls = NULL_TREE; *************** grokparms (first_parm) *** 12898,12916 **** { /* Top-level qualifiers on the parameters are ignored for function types. */ ! type = TYPE_MAIN_VARIANT (type); if (TREE_CODE (type) == METHOD_TYPE) { error ("parameter `%D' invalidly declared method type", decl); type = build_pointer_type (type); TREE_TYPE (decl) = type; } - else if (TREE_CODE (type) == OFFSET_TYPE) - { - error ("parameter `%D' invalidly declared offset type", decl); - type = build_pointer_type (type); - TREE_TYPE (decl) = type; - } else if (abstract_virtuals_error (decl, type)) any_error = 1; /* Seems like a good idea. */ else if (POINTER_TYPE_P (type)) --- 8682,8694 ---- { /* Top-level qualifiers on the parameters are ignored for function types. */ ! type = cp_build_qualified_type (type, 0); if (TREE_CODE (type) == METHOD_TYPE) { error ("parameter `%D' invalidly declared method type", decl); type = build_pointer_type (type); TREE_TYPE (decl) = type; } else if (abstract_virtuals_error (decl, type)) any_error = 1; /* Seems like a good idea. */ else if (POINTER_TYPE_P (type)) *************** grokparms (first_parm) *** 12949,12955 **** result = nreverse (result); if (!ellipsis) result = chainon (result, void_list_node); ! last_function_parms = decls; return result; } --- 8727,8733 ---- result = nreverse (result); if (!ellipsis) result = chainon (result, void_list_node); ! *parms = decls; return result; } *************** grokparms (first_parm) *** 12974,12981 **** operator. */ int ! copy_fn_p (d) ! tree d; { tree args; tree arg_type; --- 8752,8758 ---- operator. */ int ! copy_fn_p (tree d) { tree args; tree arg_type; *************** copy_fn_p (d) *** 13021,13028 **** /* Remember any special properties of member function DECL. */ ! void grok_special_member_properties (decl) ! tree decl; { if (!DECL_NONSTATIC_MEMBER_FUNCTION_P(decl)) ; /* Not special. */ --- 8798,8804 ---- /* Remember any special properties of member function DECL. */ ! void grok_special_member_properties (tree decl) { if (!DECL_NONSTATIC_MEMBER_FUNCTION_P(decl)) ; /* Not special. */ *************** void grok_special_member_properties (dec *** 13071,13078 **** if the class has a constructor of the form X(X). */ int ! grok_ctor_properties (ctype, decl) ! tree ctype, decl; { int ctor_parm = copy_fn_p (decl); --- 8847,8853 ---- if the class has a constructor of the form X(X). */ int ! grok_ctor_properties (tree ctype, tree decl) { int ctor_parm = copy_fn_p (decl); *************** grok_ctor_properties (ctype, decl) *** 13105,13112 **** /* An operator with this code is unary, but can also be binary. */ static int ! ambi_op_p (code) ! enum tree_code code; { return (code == INDIRECT_REF || code == ADDR_EXPR --- 8880,8886 ---- /* An operator with this code is unary, but can also be binary. */ static int ! ambi_op_p (enum tree_code code) { return (code == INDIRECT_REF || code == ADDR_EXPR *************** ambi_op_p (code) *** 13119,13126 **** /* An operator with this name can only be unary. */ static int ! unary_op_p (code) ! enum tree_code code; { return (code == TRUTH_NOT_EXPR || code == BIT_NOT_EXPR --- 8893,8899 ---- /* An operator with this name can only be unary. */ static int ! unary_op_p (enum tree_code code) { return (code == TRUTH_NOT_EXPR || code == BIT_NOT_EXPR *************** unary_op_p (code) *** 13128,13139 **** || code == TYPE_EXPR); } ! /* Do a little sanity-checking on how they declared their operator. */ ! void ! grok_op_properties (decl, friendp) ! tree decl; ! int friendp; { tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl)); tree argtype; --- 8901,8912 ---- || code == TYPE_EXPR); } ! /* DECL is a declaration for an overloaded operator. Returns true if ! the declaration is valid; false otherwise. If COMPLAIN is true, ! errors are issued for invalid declarations. */ ! bool ! grok_op_properties (tree decl, int friendp, bool complain) { tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl)); tree argtype; *************** grok_op_properties (decl, friendp) *** 13141,13146 **** --- 8914,8923 ---- tree name = DECL_NAME (decl); enum tree_code operator_code; int arity; + bool ok; + + /* Assume that the declaration is valid. */ + ok = true; /* Count the number of arguments. */ for (argtype = argtypes, arity = 0; *************** grok_op_properties (decl, friendp) *** 13182,13200 **** { switch (operator_code) { - case CALL_EXPR: - TYPE_OVERLOADS_CALL_EXPR (current_class_type) = 1; - break; - - case ARRAY_REF: - TYPE_OVERLOADS_ARRAY_REF (current_class_type) = 1; - break; - - case COMPONENT_REF: - case MEMBER_REF: - TYPE_OVERLOADS_ARROW (current_class_type) = 1; - break; - case NEW_EXPR: TYPE_HAS_NEW_OPERATOR (current_class_type) = 1; break; --- 8959,8964 ---- *************** grok_op_properties (decl, friendp) *** 13217,13237 **** } if (operator_code == NEW_EXPR || operator_code == VEC_NEW_EXPR) ! { ! /* When the compiler encounters the definition of A::operator new, it ! doesn't look at the class declaration to find out if it's static. */ ! if (methodp) ! revert_static_member_fn (decl); ! ! TREE_TYPE (decl) = coerce_new_type (TREE_TYPE (decl)); ! } else if (operator_code == DELETE_EXPR || operator_code == VEC_DELETE_EXPR) ! { ! if (methodp) ! revert_static_member_fn (decl); ! ! TREE_TYPE (decl) = coerce_delete_type (TREE_TYPE (decl)); ! } else { /* An operator function must either be a non-static member function --- 8981,8989 ---- } if (operator_code == NEW_EXPR || operator_code == VEC_NEW_EXPR) ! TREE_TYPE (decl) = coerce_new_type (TREE_TYPE (decl)); else if (operator_code == DELETE_EXPR || operator_code == VEC_DELETE_EXPR) ! TREE_TYPE (decl) = coerce_delete_type (TREE_TYPE (decl)); else { /* An operator function must either be a non-static member function *************** grok_op_properties (decl, friendp) *** 13247,13281 **** error ("`%D' must be a nonstatic member function", decl); else { ! tree p = argtypes; if (DECL_STATIC_FUNCTION_P (decl)) error ("`%D' must be either a non-static member function or a non-member function", decl); ! if (p) ! for (; TREE_CODE (TREE_VALUE (p)) != VOID_TYPE ; p = TREE_CHAIN (p)) ! { ! tree arg = TREE_VALUE (p); ! if (TREE_CODE (arg) == REFERENCE_TYPE) ! arg = TREE_TYPE (arg); ! /* This lets bad template code slip through. */ ! if (IS_AGGR_TYPE (arg) ! || TREE_CODE (arg) == ENUMERAL_TYPE ! || TREE_CODE (arg) == TEMPLATE_TYPE_PARM ! || TREE_CODE (arg) == BOUND_TEMPLATE_TEMPLATE_PARM) ! goto foundaggr; ! } ! error ! ("`%D' must have an argument of class or enumerated type", ! decl); ! foundaggr: ! ; } } if (operator_code == CALL_EXPR) ! return; /* No restrictions on args. */ if (IDENTIFIER_TYPENAME_P (name) && ! DECL_TEMPLATE_INFO (decl)) { --- 8999,9036 ---- error ("`%D' must be a nonstatic member function", decl); else { ! tree p; if (DECL_STATIC_FUNCTION_P (decl)) error ("`%D' must be either a non-static member function or a non-member function", decl); ! for (p = argtypes; p && p != void_list_node; p = TREE_CHAIN (p)) ! { ! tree arg = non_reference (TREE_VALUE (p)); ! /* IS_AGGR_TYPE, rather than CLASS_TYPE_P, is used ! because these checks are performed even on ! template functions. */ ! if (IS_AGGR_TYPE (arg) || TREE_CODE (arg) == ENUMERAL_TYPE) ! break; ! } ! if (!p || p == void_list_node) ! { ! if (!complain) ! return false; ! ! error ("`%D' must have an argument of class or " ! "enumerated type", ! decl); ! ok = false; ! } } } + /* There are no restrictions on the arguments to an overloaded + "operator ()". */ if (operator_code == CALL_EXPR) ! return ok; if (IDENTIFIER_TYPENAME_P (name) && ! DECL_TEMPLATE_INFO (decl)) { *************** grok_op_properties (decl, friendp) *** 13458,13468 **** } } } static const char * ! tag_name (code) ! enum tag_types code; { switch (code) { --- 9213,9224 ---- } } + + return ok; } static const char * ! tag_name (enum tag_types code) { switch (code) { *************** tag_name (code) *** 13480,13537 **** } /* Name lookup in an elaborated-type-specifier (after the keyword ! indicated by TAG_CODE) has found TYPE. If the elaborated-type-specifier is invalid, issue a diagnostic and return ! error_mark_node; otherwise, return TYPE itself. */ ! static tree check_elaborated_type_specifier (enum tag_types tag_code, ! tree type) { ! tree t; ! t = follow_tag_typedef (type); ! /* [dcl.type.elab] If the identifier resolves to a typedef-name or a ! template type-parameter, the elaborated-type-specifier is ! ill-formed. */ ! if (!t) { ! error ("using typedef-name `%D' after `%s'", ! TYPE_NAME (type), tag_name (tag_code)); ! t = error_mark_node; } ! else if (TREE_CODE (type) == TEMPLATE_TYPE_PARM) { error ("using template type parameter `%T' after `%s'", type, tag_name (tag_code)); ! t = error_mark_node; } ! return t; } ! /* Get the struct, enum or union (CODE says which) with tag NAME. Define the tag as a forward-reference if it is not defined. ! C++: If a class derivation is given, process it here, and report ! an error if multiple derivation declarations are not identical. ! If this is a definition, come in through xref_tag and only look in the current frame for the name (since C++ allows new names in any ! scope.) */ tree ! xref_tag (enum tag_types tag_code, tree name, tree attributes, ! bool globalize) { enum tree_code code; ! register tree ref, t; struct cp_binding_level *b = current_binding_level; tree context = NULL_TREE; timevar_push (TV_NAME_LOOKUP); switch (tag_code) { case record_type: --- 9236,9344 ---- } /* Name lookup in an elaborated-type-specifier (after the keyword ! indicated by TAG_CODE) has found the TYPE_DECL DECL. If the elaborated-type-specifier is invalid, issue a diagnostic and return ! error_mark_node; otherwise, return the *_TYPE to which it referred. ! If ALLOW_TEMPLATE_P is true, TYPE may be a class template. */ ! tree check_elaborated_type_specifier (enum tag_types tag_code, ! tree decl, ! bool allow_template_p) { ! tree type; ! /* In the case of: ! struct S { struct S *p; }; ! ! name lookup will find the TYPE_DECL for the implicit "S::S" ! typedef. Adjust for that here. */ ! if (DECL_SELF_REFERENCE_P (decl)) ! decl = TYPE_NAME (TREE_TYPE (decl)); ! ! type = TREE_TYPE (decl); ! ! /* [dcl.type.elab] ! ! If the identifier resolves to a typedef-name or a template ! type-parameter, the elaborated-type-specifier is ill-formed. ! ! In other words, the only legitimate declaration to use in the ! elaborated type specifier is the implicit typedef created when ! the type is declared. */ ! if (!DECL_IMPLICIT_TYPEDEF_P (decl)) { ! error ("using typedef-name `%D' after `%s'", decl, tag_name (tag_code)); ! return IS_AGGR_TYPE (type) ? type : error_mark_node; } ! ! if (TREE_CODE (type) == TEMPLATE_TYPE_PARM) { error ("using template type parameter `%T' after `%s'", type, tag_name (tag_code)); ! return error_mark_node; ! } ! else if (TREE_CODE (type) != RECORD_TYPE ! && TREE_CODE (type) != UNION_TYPE ! && tag_code != enum_type) ! { ! error ("`%T' referred to as `%s'", type, tag_name (tag_code)); ! return error_mark_node; ! } ! else if (TREE_CODE (type) != ENUMERAL_TYPE ! && tag_code == enum_type) ! { ! error ("`%T' referred to as enum", type); ! return error_mark_node; } + else if (!allow_template_p + && TREE_CODE (type) == RECORD_TYPE + && CLASSTYPE_IS_TEMPLATE (type)) + { + /* If a class template appears as elaborated type specifier + without a template header such as: ! template class C {}; ! void f(class C); // No template header here ! ! then the required template argument is missing. */ ! ! error ("template argument required for `%s %T'", ! tag_name (tag_code), ! DECL_NAME (CLASSTYPE_TI_TEMPLATE (type))); ! return error_mark_node; ! } ! ! return type; } ! /* Get the struct, enum or union (TAG_CODE says which) with tag NAME. Define the tag as a forward-reference if it is not defined. ! If a declaration is given, process it here, and report an error if ! multiple declarations are not identical. ! GLOBALIZE is false when this is also a definition. Only look in the current frame for the name (since C++ allows new names in any ! scope.) ! ! TEMPLATE_HEADER_P is true when this declaration is preceded by ! a set of template parameters. */ tree ! xref_tag (enum tag_types tag_code, tree name, ! bool globalize, bool template_header_p) { enum tree_code code; ! tree t; struct cp_binding_level *b = current_binding_level; tree context = NULL_TREE; timevar_push (TV_NAME_LOOKUP); + my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 0); + switch (tag_code) { case record_type: *************** xref_tag (enum tag_types tag_code, tree *** 13548,13640 **** abort (); } - /* If a cross reference is requested, look up the type - already defined for this tag and return it. */ - if (TYPE_P (name)) - { - t = name; - name = TYPE_IDENTIFIER (t); - } - else - t = IDENTIFIER_TYPE_VALUE (name); - - /* Warn about 'friend struct Inherited;' doing the wrong thing. */ - if (t && globalize && TREE_CODE (t) == TYPENAME_TYPE) - { - static int explained; - tree shadowed; - - warning ("`%s %T' declares a new type at namespace scope", - tag_name (tag_code), name); - if (!explained++) - warning (" names from dependent base classes are not visible to unqualified name lookup - to refer to the inherited type, say `%s %T::%T'", - tag_name (tag_code), - constructor_name (current_class_type), - TYPE_IDENTIFIER (t)); - - /* We need to remove the class scope binding for the - TYPENAME_TYPE as otherwise poplevel_class gets confused. */ - for (shadowed = b->class_shadowed; - shadowed; - shadowed = TREE_CHAIN (shadowed)) - if (TREE_TYPE (shadowed) == TYPE_NAME (t)) - { - TREE_PURPOSE (shadowed) = NULL_TREE; - break; - } - } - - if (t && TREE_CODE (t) != code && TREE_CODE (t) != TEMPLATE_TYPE_PARM - && TREE_CODE (t) != BOUND_TEMPLATE_TEMPLATE_PARM) - t = NULL_TREE; - if (! globalize) { /* If we know we are defining this tag, only look it up in this scope and don't try to find it as a type. */ ! ref = lookup_tag (code, name, b, 1); } else { ! if (t) ! { ! ref = check_elaborated_type_specifier (tag_code, t); ! if (ref == error_mark_node) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); ! } ! else ! ref = lookup_tag (code, name, b, 0); ! if (! ref) { ! /* Try finding it as a type declaration. If that wins, ! use it. */ ! ref = lookup_name (name, 1); ! if (ref != NULL_TREE ! && processing_template_decl ! && DECL_CLASS_TEMPLATE_P (ref) ! && template_class_depth (current_class_type) == 0) ! /* Since GLOBALIZE is true, we're declaring a global ! template, so we want this type. */ ! ref = DECL_TEMPLATE_RESULT (ref); ! if (ref && TREE_CODE (ref) == TYPE_DECL) ! { ! ref = check_elaborated_type_specifier (tag_code, ! TREE_TYPE (ref)); ! if (ref == error_mark_node) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); ! if (ref && TREE_CODE (ref) != code) ! ref = NULL_TREE; ! } ! else ! ref = NULL_TREE; } ! if (ref && current_class_type && template_class_depth (current_class_type) ! && PROCESSING_REAL_TEMPLATE_DECL_P ()) { /* Since GLOBALIZE is nonzero, we are not looking at a definition of this tag. Since, in addition, we are currently --- 9355,9404 ---- abort (); } if (! globalize) { /* If we know we are defining this tag, only look it up in this scope and don't try to find it as a type. */ ! t = lookup_tag (code, name, b, 1); } else { ! tree decl = lookup_name (name, 2); ! if (decl && DECL_CLASS_TEMPLATE_P (decl)) ! decl = DECL_TEMPLATE_RESULT (decl); ! ! if (decl && TREE_CODE (decl) == TYPE_DECL) { ! /* Two cases we need to consider when deciding if a class ! template is allowed as an elaborated type specifier: ! 1. It is a self reference to its own class. ! 2. It comes with a template header. ! For example: ! template class C { ! class C *c1; // DECL_SELF_REFERENCE_P is true ! class D; ! }; ! template class C; // template_header_p is true ! template class C::D { ! class C *c2; // DECL_SELF_REFERENCE_P is true ! }; */ ! ! t = check_elaborated_type_specifier (tag_code, ! decl, ! template_header_p ! | DECL_SELF_REFERENCE_P (decl)); ! if (t == error_mark_node) ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); } + else + t = NULL_TREE; ! if (t && current_class_type && template_class_depth (current_class_type) ! && template_header_p) { /* Since GLOBALIZE is nonzero, we are not looking at a definition of this tag. Since, in addition, we are currently *************** xref_tag (enum tag_types tag_code, tree *** 13672,13683 **** accomplish this by making sure that the new type we create to represent this declaration has the right TYPE_CONTEXT. */ ! context = TYPE_CONTEXT (ref); ! ref = NULL_TREE; } } ! if (! ref) { /* If no such tag is yet defined, create a forward-reference node and record it as the "definition". --- 9436,9447 ---- accomplish this by making sure that the new type we create to represent this declaration has the right TYPE_CONTEXT. */ ! context = TYPE_CONTEXT (t); ! t = NULL_TREE; } } ! if (! t) { /* If no such tag is yet defined, create a forward-reference node and record it as the "definition". *************** xref_tag (enum tag_types tag_code, tree *** 13686,13741 **** if (code == ENUMERAL_TYPE) { error ("use of enum `%#D' without previous declaration", name); ! ! ref = make_node (ENUMERAL_TYPE); ! ! /* Give the type a default layout like unsigned int ! to avoid crashing if it does not get defined. */ ! TYPE_MODE (ref) = TYPE_MODE (unsigned_type_node); ! TYPE_ALIGN (ref) = TYPE_ALIGN (unsigned_type_node); ! TYPE_USER_ALIGN (ref) = 0; ! TREE_UNSIGNED (ref) = 1; ! TYPE_PRECISION (ref) = TYPE_PRECISION (unsigned_type_node); ! TYPE_MIN_VALUE (ref) = TYPE_MIN_VALUE (unsigned_type_node); ! TYPE_MAX_VALUE (ref) = TYPE_MAX_VALUE (unsigned_type_node); ! ! /* Enable us to recognize when a type is created in class context. ! To do nested classes correctly, this should probably be cleared ! out when we leave this classes scope. Currently this in only ! done in `start_enum'. */ ! ! pushtag (name, ref, globalize); } else { ! struct cp_binding_level *old_b = class_binding_level; ! ! ref = make_aggr_type (code); ! TYPE_CONTEXT (ref) = context; ! ! #ifdef NONNESTED_CLASSES ! /* Class types don't nest the way enums do. */ ! class_binding_level = (struct cp_binding_level *)0; ! #endif ! pushtag (name, ref, globalize); ! class_binding_level = old_b; } } else { ! if (!globalize && processing_template_decl && IS_AGGR_TYPE (ref)) ! redeclare_class_template (ref, current_template_parms); } ! TYPE_ATTRIBUTES (ref) = attributes; ! ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, ref); } tree ! xref_tag_from_type (old, id, globalize) ! tree old, id; ! int globalize; { enum tag_types tag_kind; --- 9450,9475 ---- if (code == ENUMERAL_TYPE) { error ("use of enum `%#D' without previous declaration", name); ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); } else { ! t = make_aggr_type (code); ! TYPE_CONTEXT (t) = context; ! pushtag (name, t, globalize); } } else { ! if (!globalize && processing_template_decl && IS_AGGR_TYPE (t)) ! redeclare_class_template (t, current_template_parms); } ! POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); } tree ! xref_tag_from_type (tree old, tree id, int globalize) { enum tag_types tag_kind; *************** xref_tag_from_type (old, id, globalize) *** 13747,13774 **** if (id == NULL_TREE) id = TYPE_IDENTIFIER (old); ! return xref_tag (tag_kind, id, /*attributes=*/NULL_TREE, globalize); } /* REF is a type (named NAME), for which we have just seen some ! baseclasses. BINFO is a list of those baseclasses; the TREE_PURPOSE is an access_* node, and the TREE_VALUE is the type of ! the base-class. CODE_TYPE_NODE indicates whether REF is a class, struct, or union. */ void ! xref_basetypes (ref, binfo) ! tree ref; ! tree binfo; { /* In the declaration `A : X, Y, ... Z' we mark all the types (A, X, Y, ..., Z) so we can check for duplicates. */ ! tree binfos; ! tree base; ! int i, len; enum tag_types tag_code; if (TREE_CODE (ref) == UNION_TYPE) { error ("derived union `%T' invalid", ref); --- 9481,9509 ---- if (id == NULL_TREE) id = TYPE_IDENTIFIER (old); ! return xref_tag (tag_kind, id, globalize, false); } /* REF is a type (named NAME), for which we have just seen some ! baseclasses. BASE_LIST is a list of those baseclasses; the TREE_PURPOSE is an access_* node, and the TREE_VALUE is the type of ! the base-class. TREE_VIA_VIRTUAL indicates virtual ! inheritance. CODE_TYPE_NODE indicates whether REF is a class, struct, or union. */ void ! xref_basetypes (tree ref, tree base_list) { /* In the declaration `A : X, Y, ... Z' we mark all the types (A, X, Y, ..., Z) so we can check for duplicates. */ ! tree *basep; ! int i; enum tag_types tag_code; + if (ref == error_mark_node) + return; + if (TREE_CODE (ref) == UNION_TYPE) { error ("derived union `%T' invalid", ref); *************** xref_basetypes (ref, binfo) *** 13777,13837 **** tag_code = (CLASSTYPE_DECLARED_CLASS (ref) ? class_type : record_type); - len = list_length (binfo); - /* First, make sure that any templates in base-classes are instantiated. This ensures that if we call ourselves recursively we do not get confused about which classes are marked and which are not. */ ! for (base = binfo; base; base = TREE_CHAIN (base)) ! complete_type (TREE_VALUE (base)); SET_CLASSTYPE_MARKED (ref); ! BINFO_BASETYPES (TYPE_BINFO (ref)) = binfos = make_tree_vec (len); ! ! for (i = 0; binfo; binfo = TREE_CHAIN (binfo)) { ! /* The base of a derived struct is public by default. */ ! int via_public ! = (TREE_PURPOSE (binfo) == access_public_node ! || TREE_PURPOSE (binfo) == access_public_virtual_node ! || (tag_code != class_type ! && (TREE_PURPOSE (binfo) == access_default_node ! || TREE_PURPOSE (binfo) == access_default_virtual_node))); ! int via_protected ! = (TREE_PURPOSE (binfo) == access_protected_node ! || TREE_PURPOSE (binfo) == access_protected_virtual_node); ! int via_virtual ! = (TREE_PURPOSE (binfo) == access_private_virtual_node ! || TREE_PURPOSE (binfo) == access_protected_virtual_node ! || TREE_PURPOSE (binfo) == access_public_virtual_node ! || TREE_PURPOSE (binfo) == access_default_virtual_node); ! tree basetype = TREE_VALUE (binfo); ! tree base_binfo; ! ! if (basetype && TREE_CODE (basetype) == TYPE_DECL) ! basetype = TREE_TYPE (basetype); ! if (!basetype ! || (TREE_CODE (basetype) != RECORD_TYPE ! && TREE_CODE (basetype) != TYPENAME_TYPE ! && TREE_CODE (basetype) != TEMPLATE_TYPE_PARM ! && TREE_CODE (basetype) != BOUND_TEMPLATE_TEMPLATE_PARM)) ! { ! error ("base type `%T' fails to be a struct or class type", ! TREE_VALUE (binfo)); ! continue; ! } ! ! /* This code replaces similar code in layout_basetypes. ! We put the complete_type first for implicit `typename'. */ ! if (!COMPLETE_TYPE_P (basetype) ! && ! (current_template_parms && uses_template_parms (basetype))) ! { ! error ("base class `%T' has incomplete type", basetype); ! continue; ! } ! else { if (CLASSTYPE_MARKED (basetype)) { if (basetype == ref) --- 9512,9569 ---- tag_code = (CLASSTYPE_DECLARED_CLASS (ref) ? class_type : record_type); /* First, make sure that any templates in base-classes are instantiated. This ensures that if we call ourselves recursively we do not get confused about which classes are marked and which are not. */ ! basep = &base_list; ! while (*basep) ! { ! tree basetype = TREE_VALUE (*basep); ! if (!(processing_template_decl && uses_template_parms (basetype)) ! && !complete_type_or_else (basetype, NULL)) ! /* An incomplete type. Remove it from the list. */ ! *basep = TREE_CHAIN (*basep); ! else ! basep = &TREE_CHAIN (*basep); ! } SET_CLASSTYPE_MARKED (ref); ! i = list_length (base_list); ! if (i) { ! tree binfo = TYPE_BINFO (ref); ! tree binfos = make_tree_vec (i); ! tree accesses = make_tree_vec (i); ! ! BINFO_BASETYPES (binfo) = binfos; ! BINFO_BASEACCESSES (binfo) = accesses; ! ! for (i = 0; base_list; base_list = TREE_CHAIN (base_list)) { + tree access = TREE_PURPOSE (base_list); + int via_virtual = TREE_VIA_VIRTUAL (base_list); + tree basetype = TREE_VALUE (base_list); + tree base_binfo; + + if (access == access_default_node) + /* The base of a derived struct is public by default. */ + access = (tag_code == class_type + ? access_private_node : access_public_node); + + if (basetype && TREE_CODE (basetype) == TYPE_DECL) + basetype = TREE_TYPE (basetype); + if (!basetype + || (TREE_CODE (basetype) != RECORD_TYPE + && TREE_CODE (basetype) != TYPENAME_TYPE + && TREE_CODE (basetype) != TEMPLATE_TYPE_PARM + && TREE_CODE (basetype) != BOUND_TEMPLATE_TEMPLATE_PARM)) + { + error ("base type `%T' fails to be a struct or class type", + basetype); + continue; + } + if (CLASSTYPE_MARKED (basetype)) { if (basetype == ref) *************** xref_basetypes (ref, binfo) *** 13840,13887 **** error ("duplicate base type `%T' invalid", basetype); continue; } ! if (TYPE_FOR_JAVA (basetype) && (current_lang_depth () == 0)) TYPE_FOR_JAVA (ref) = 1; ! ! /* Note that the BINFO records which describe individual ! inheritances are *not* shared in the lattice! They ! cannot be shared because a given baseclass may be ! inherited with different `accessibility' by different ! derived classes. (Each BINFO record describing an ! individual inheritance contains flags which say what ! the `accessibility' of that particular inheritance is.) */ ! ! base_binfo ! = make_binfo (size_zero_node, basetype, ! CLASS_TYPE_P (basetype) ! ? TYPE_BINFO_VTABLE (basetype) : NULL_TREE, ! CLASS_TYPE_P (basetype) ! ? TYPE_BINFO_VIRTUALS (basetype) : NULL_TREE); ! TREE_VEC_ELT (binfos, i) = base_binfo; ! TREE_VIA_PUBLIC (base_binfo) = via_public; ! TREE_VIA_PROTECTED (base_binfo) = via_protected; TREE_VIA_VIRTUAL (base_binfo) = via_virtual; ! BINFO_INHERITANCE_CHAIN (base_binfo) = TYPE_BINFO (ref); ! ! /* We need to unshare the binfos now so that lookups during class ! definition work. */ ! unshare_base_binfos (base_binfo); ! SET_CLASSTYPE_MARKED (basetype); ! /* We are free to modify these bits because they are meaningless at top level, and BASETYPE is a top-level type. */ if (via_virtual || TYPE_USES_VIRTUAL_BASECLASSES (basetype)) { TYPE_USES_VIRTUAL_BASECLASSES (ref) = 1; /* Converting to a virtual base class requires looking ! up the offset of the virtual base. */ TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (ref) = 1; } ! if (CLASS_TYPE_P (basetype)) { TYPE_HAS_NEW_OPERATOR (ref) --- 9572,9612 ---- error ("duplicate base type `%T' invalid", basetype); continue; } ! if (TYPE_FOR_JAVA (basetype) && (current_lang_depth () == 0)) TYPE_FOR_JAVA (ref) = 1; ! ! if (CLASS_TYPE_P (basetype)) ! { ! base_binfo = TYPE_BINFO (basetype); ! /* This flag will be in the binfo of the base type, we must ! clear it after copying the base binfos. */ ! BINFO_DEPENDENT_BASE_P (base_binfo) ! = dependent_type_p (basetype); ! } ! else ! base_binfo = make_binfo (size_zero_node, basetype, ! NULL_TREE, NULL_TREE); ! TREE_VEC_ELT (binfos, i) = base_binfo; ! TREE_VEC_ELT (accesses, i) = access; ! /* This flag will be in the binfo of the base type, we must ! clear it after copying the base binfos. */ TREE_VIA_VIRTUAL (base_binfo) = via_virtual; ! SET_CLASSTYPE_MARKED (basetype); ! /* We are free to modify these bits because they are meaningless at top level, and BASETYPE is a top-level type. */ if (via_virtual || TYPE_USES_VIRTUAL_BASECLASSES (basetype)) { TYPE_USES_VIRTUAL_BASECLASSES (ref) = 1; /* Converting to a virtual base class requires looking ! up the offset of the virtual base. */ TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (ref) = 1; } ! if (CLASS_TYPE_P (basetype)) { TYPE_HAS_NEW_OPERATOR (ref) *************** xref_basetypes (ref, binfo) *** 13893,13928 **** TYPE_USES_MULTIPLE_INHERITANCE (ref) |= TYPE_USES_MULTIPLE_INHERITANCE (basetype); /* Likewise, if converting to a base of the base may require ! code, then we may need to generate code to convert to a ! base as well. */ TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (ref) |= TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (basetype); } ! ! i += 1; } } ! if (i) ! TREE_VEC_LENGTH (binfos) = i; ! else ! BINFO_BASETYPES (TYPE_BINFO (ref)) = NULL_TREE; ! if (i > 1) { ! TYPE_USES_MULTIPLE_INHERITANCE (ref) = 1; ! /* If there is more than one non-empty they cannot be at the same ! address. */ ! TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (ref) = 1; } /* Unmark all the types. */ ! while (--i >= 0) ! CLEAR_CLASSTYPE_MARKED (BINFO_TYPE (TREE_VEC_ELT (binfos, i))); CLEAR_CLASSTYPE_MARKED (ref); - - /* Now that we know all the base-classes, set up the list of virtual - bases. */ - get_vbase_types (ref); } --- 9618,9670 ---- TYPE_USES_MULTIPLE_INHERITANCE (ref) |= TYPE_USES_MULTIPLE_INHERITANCE (basetype); /* Likewise, if converting to a base of the base may require ! code, then we may need to generate code to convert to a ! base as well. */ TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (ref) |= TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (basetype); } ! i++; ! } ! if (i) ! TREE_VEC_LENGTH (accesses) = TREE_VEC_LENGTH (binfos) = i; ! else ! BINFO_BASEACCESSES (binfo) = BINFO_BASETYPES (binfo) = NULL_TREE; ! ! if (i > 1) ! { ! TYPE_USES_MULTIPLE_INHERITANCE (ref) = 1; ! /* If there is more than one non-empty they cannot be at the same ! address. */ ! TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (ref) = 1; } } ! ! /* Copy the base binfos, collect the virtual bases and set the ! inheritance order chain. */ ! copy_base_binfos (TYPE_BINFO (ref), ref, NULL_TREE); ! CLASSTYPE_VBASECLASSES (ref) = nreverse (CLASSTYPE_VBASECLASSES (ref)); ! if (TYPE_FOR_JAVA (ref)) { ! if (TYPE_USES_MULTIPLE_INHERITANCE (ref)) ! error ("Java class '%T' cannot have multiple bases", ref); ! if (CLASSTYPE_VBASECLASSES (ref)) ! error ("Java class '%T' cannot have virtual bases", ref); } /* Unmark all the types. */ ! while (i--) ! { ! tree basetype = BINFO_TYPE (BINFO_BASETYPE (TYPE_BINFO (ref), i)); ! ! CLEAR_CLASSTYPE_MARKED (basetype); ! if (CLASS_TYPE_P (basetype)) ! { ! TREE_VIA_VIRTUAL (TYPE_BINFO (basetype)) = 0; ! BINFO_DEPENDENT_BASE_P (TYPE_BINFO (basetype)) = 0; ! } ! } CLEAR_CLASSTYPE_MARKED (ref); } *************** xref_basetypes (ref, binfo) *** 13933,13942 **** may be used to declare the individual values as they are read. */ tree ! start_enum (name) ! tree name; { ! register tree enumtype = NULL_TREE; struct cp_binding_level *b = current_binding_level; /* If this is the real definition for a previous forward reference, --- 9675,9683 ---- may be used to declare the individual values as they are read. */ tree ! start_enum (tree name) { ! tree enumtype = NULL_TREE; struct cp_binding_level *b = current_binding_level; /* If this is the real definition for a previous forward reference, *************** start_enum (name) *** 13949,13955 **** if (enumtype != NULL_TREE && TREE_CODE (enumtype) == ENUMERAL_TYPE) { error ("multiple definition of `%#T'", enumtype); ! cp_error_at ("previous definition here", enumtype); /* Clear out TYPE_VALUES, and start again. */ TYPE_VALUES (enumtype) = NULL_TREE; } --- 9690,9696 ---- if (enumtype != NULL_TREE && TREE_CODE (enumtype) == ENUMERAL_TYPE) { error ("multiple definition of `%#T'", enumtype); ! error ("%Jprevious definition here", TYPE_MAIN_DECL (enumtype)); /* Clear out TYPE_VALUES, and start again. */ TYPE_VALUES (enumtype) = NULL_TREE; } *************** start_enum (name) *** 13967,13976 **** ENUMTYPE is the type object and VALUES a list of name-value pairs. */ void ! finish_enum (enumtype) ! tree enumtype; { ! tree pair; tree minnode; tree maxnode; tree t; --- 9708,9718 ---- ENUMTYPE is the type object and VALUES a list of name-value pairs. */ void ! finish_enum (tree enumtype) { ! tree values; ! tree decl; ! tree value; tree minnode; tree maxnode; tree t; *************** finish_enum (enumtype) *** 13978,13983 **** --- 9720,9727 ---- int lowprec; int highprec; int precision; + integer_type_kind itk; + tree underlying_type = NULL_TREE; /* We built up the VALUES in reverse order. */ TYPE_VALUES (enumtype) = nreverse (TYPE_VALUES (enumtype)); *************** finish_enum (enumtype) *** 13988,14008 **** works. */ if (processing_template_decl) { ! for (pair = TYPE_VALUES (enumtype); pair; pair = TREE_CHAIN (pair)) ! TREE_TYPE (TREE_VALUE (pair)) = enumtype; if (at_function_scope_p ()) add_stmt (build_min (TAG_DEFN, enumtype)); return; } if (TYPE_VALUES (enumtype)) { minnode = maxnode = NULL_TREE; ! for (pair = TYPE_VALUES (enumtype); pair; pair = TREE_CHAIN (pair)) { ! tree decl = TREE_VALUE (pair); ! tree value = DECL_INITIAL (decl); /* [dcl.enum]: Following the closing brace of an enum-specifier, each enumerator has the type of its enumeration. Prior to the --- 9732,9756 ---- works. */ if (processing_template_decl) { ! for (values = TYPE_VALUES (enumtype); ! values; ! values = TREE_CHAIN (values)) ! TREE_TYPE (TREE_VALUE (values)) = enumtype; if (at_function_scope_p ()) add_stmt (build_min (TAG_DEFN, enumtype)); return; } + /* Determine the minimum and maximum values of the enumerators. */ if (TYPE_VALUES (enumtype)) { minnode = maxnode = NULL_TREE; ! for (values = TYPE_VALUES (enumtype); ! values; ! values = TREE_CHAIN (values)) { ! decl = TREE_VALUE (values); /* [dcl.enum]: Following the closing brace of an enum-specifier, each enumerator has the type of its enumeration. Prior to the *************** finish_enum (enumtype) *** 14010,14015 **** --- 9758,9765 ---- initializing value. */ TREE_TYPE (decl) = enumtype; + /* Update the minimum and maximum values, if appropriate. */ + value = DECL_INITIAL (decl); /* Figure out what the minimum and maximum values of the enumerators are. */ if (!minnode) *************** finish_enum (enumtype) *** 14028,14040 **** value = DECL_INITIAL (decl) = copy_node (value); TREE_TYPE (value) = enumtype; } - - /* In addition, transform the TYPE_VALUES list to contain the - values, rather than the CONST_DECLs for them. */ - TREE_VALUE (pair) = value; } } else minnode = maxnode = integer_zero_node; /* Compute the number of bits require to represent all values of the --- 9778,9790 ---- value = DECL_INITIAL (decl) = copy_node (value); TREE_TYPE (value) = enumtype; } } } else + /* [dcl.enum] + + If the enumerator-list is empty, the underlying type is as if + the enumeration had a single enumerator with value 0. */ minnode = maxnode = integer_zero_node; /* Compute the number of bits require to represent all values of the *************** finish_enum (enumtype) *** 14046,14081 **** highprec = min_precision (maxnode, unsignedp); precision = MAX (lowprec, highprec); ! /* DR 377 ! ! IF no integral type can represent all the enumerator values, the ! enumeration is ill-formed. */ ! if (precision > TYPE_PRECISION (long_long_integer_type_node)) { error ("no integral type can represent all of the enumerator values " "for `%T'", enumtype); precision = TYPE_PRECISION (long_long_integer_type_node); } ! /* Compute the minium and maximum values for the type, the size of ! the type, and so forth. */ TYPE_PRECISION (enumtype) = precision; ! TYPE_SIZE (enumtype) = NULL_TREE; ! if (unsignedp) ! fixup_unsigned_type (enumtype); ! else ! fixup_signed_type (enumtype); ! if (flag_short_enums || (precision > TYPE_PRECISION (integer_type_node))) ! /* Use the width of the narrowest normal C type which is wide ! enough. */ ! TYPE_PRECISION (enumtype) = TYPE_PRECISION (c_common_type_for_size ! (precision, 1)); ! else ! TYPE_PRECISION (enumtype) = TYPE_PRECISION (integer_type_node); ! TYPE_SIZE (enumtype) = NULL_TREE; ! layout_type (enumtype); /* Fix up all variant types of this enum type. */ for (t = TYPE_MAIN_VARIANT (enumtype); t; t = TYPE_NEXT_VARIANT (t)) --- 9796,9871 ---- highprec = min_precision (maxnode, unsignedp); precision = MAX (lowprec, highprec); ! /* Determine the underlying type of the enumeration. ! ! [dcl.enum] ! ! The underlying type of an enumeration is an integral type that ! can represent all the enumerator values defined in the ! enumeration. It is implementation-defined which integral type is ! used as the underlying type for an enumeration except that the ! underlying type shall not be larger than int unless the value of ! an enumerator cannot fit in an int or unsigned int. ! ! We use "int" or an "unsigned int" as the underlying type, even if ! a smaller integral type would work, unless the user has ! explicitly requested that we use the smallest possible type. */ ! for (itk = (flag_short_enums ? itk_char : itk_int); ! itk != itk_none; ! itk++) ! { ! underlying_type = integer_types[itk]; ! if (TYPE_PRECISION (underlying_type) >= precision ! && TREE_UNSIGNED (underlying_type) == unsignedp) ! break; ! } ! if (itk == itk_none) { + /* DR 377 + + IF no integral type can represent all the enumerator values, the + enumeration is ill-formed. */ error ("no integral type can represent all of the enumerator values " "for `%T'", enumtype); precision = TYPE_PRECISION (long_long_integer_type_node); + underlying_type = integer_types[itk_unsigned_long_long]; } ! /* Compute the minium and maximum values for the type. ! ! [dcl.enum] ! ! For an enumeration where emin is the smallest enumerator and emax ! is the largest, the values of the enumeration are the values of the ! underlying type in the range bmin to bmax, where bmin and bmax are, ! respectively, the smallest and largest values of the smallest bit- ! field that can store emin and emax. */ TYPE_PRECISION (enumtype) = precision; ! set_min_and_max_values_for_integral_type (enumtype, precision, unsignedp); ! /* [dcl.enum] ! ! The value of sizeof() applied to an enumeration type, an object ! of an enumeration type, or an enumerator, is the value of sizeof() ! applied to the underlying type. */ ! TYPE_SIZE (enumtype) = TYPE_SIZE (underlying_type); ! TYPE_SIZE_UNIT (enumtype) = TYPE_SIZE_UNIT (underlying_type); ! TYPE_MODE (enumtype) = TYPE_MODE (underlying_type); ! TYPE_ALIGN (enumtype) = TYPE_ALIGN (underlying_type); ! TYPE_USER_ALIGN (enumtype) = TYPE_USER_ALIGN (underlying_type); ! TREE_UNSIGNED (enumtype) = TREE_UNSIGNED (underlying_type); ! /* Convert each of the enumerators to the type of the underlying ! type of the enumeration. */ ! for (values = TYPE_VALUES (enumtype); values; values = TREE_CHAIN (values)) ! { ! decl = TREE_VALUE (values); ! value = perform_implicit_conversion (underlying_type, ! DECL_INITIAL (decl)); ! TREE_TYPE (value) = enumtype; ! DECL_INITIAL (decl) = value; ! TREE_VALUE (values) = value; ! } /* Fix up all variant types of this enum type. */ for (t = TYPE_MAIN_VARIANT (enumtype); t; t = TYPE_NEXT_VARIANT (t)) *************** finish_enum (enumtype) *** 14101,14110 **** Assignment of sequential values by default is handled here. */ void ! build_enumerator (name, value, enumtype) ! tree name; ! tree value; ! tree enumtype; { tree decl; tree context; --- 9891,9897 ---- Assignment of sequential values by default is handled here. */ void ! build_enumerator (tree name, tree value, tree enumtype) { tree decl; tree context; *************** build_enumerator (name, value, enumtype) *** 14123,14129 **** if (TREE_CODE (value) == INTEGER_CST) { ! value = default_conversion (value); constant_expression_warning (value); } else --- 9910,9916 ---- if (TREE_CODE (value) == INTEGER_CST) { ! value = perform_integral_promotions (value); constant_expression_warning (value); } else *************** build_enumerator (name, value, enumtype) *** 14134,14140 **** } /* Default based on previous value. */ ! if (value == NULL_TREE && ! processing_template_decl) { tree prev_value; --- 9921,9927 ---- } /* Default based on previous value. */ ! if (value == NULL_TREE) { tree prev_value; *************** build_enumerator (name, value, enumtype) *** 14160,14165 **** --- 9947,9954 ---- /* C++ associates enums with global, function, or class declarations. */ context = current_scope (); + if (!context) + context = current_namespace; /* Build the actual enumeration constant. Note that the enumeration constants have the type of their initializers until the *************** build_enumerator (name, value, enumtype) *** 14185,14207 **** a function could mean local to a class method. */ decl = build_decl (CONST_DECL, name, type); DECL_INITIAL (decl) = value; - TREE_READONLY (decl) = 1; if (context && context == current_class_type) /* In something like `struct S { enum E { i = 7 }; };' we put `i' ! on the TYPE_FIELDS list for `S'. (That's so that you can say ! things like `S::i' later.) */ finish_member_declaration (decl); else ! { ! pushdecl (decl); ! /* Contrary to finish_member_declaration, pushdecl does not properly ! set the DECL_CONTEXT. Do that now here. Doing that before calling ! pushdecl will confuse the logic used in that function. Hopefully, ! future versions will implement a more straight logic. */ ! DECL_CONTEXT (decl) = FROB_CONTEXT (context); ! } /* Add this enumeration constant to the list for this type. */ TYPE_VALUES (enumtype) = tree_cons (name, decl, TYPE_VALUES (enumtype)); --- 9974,9990 ---- a function could mean local to a class method. */ decl = build_decl (CONST_DECL, name, type); + DECL_CONTEXT (decl) = FROB_CONTEXT (context); + TREE_CONSTANT (decl) = TREE_READONLY (decl) = 1; DECL_INITIAL (decl) = value; if (context && context == current_class_type) /* In something like `struct S { enum E { i = 7 }; };' we put `i' ! on the TYPE_FIELDS list for `S'. (That's so that you can say ! things like `S::i' later.) */ finish_member_declaration (decl); else ! pushdecl (decl); /* Add this enumeration constant to the list for this type. */ TYPE_VALUES (enumtype) = tree_cons (name, decl, TYPE_VALUES (enumtype)); *************** build_enumerator (name, value, enumtype) *** 14211,14219 **** /* We're defining DECL. Make sure that it's type is OK. */ static void ! check_function_type (decl, current_function_parms) ! tree decl; ! tree current_function_parms; { tree fntype = TREE_TYPE (decl); tree return_type = complete_type (TREE_TYPE (fntype)); --- 9994,10000 ---- /* We're defining DECL. Make sure that it's type is OK. */ static void ! check_function_type (tree decl, tree current_function_parms) { tree fntype = TREE_TYPE (decl); tree return_type = complete_type (TREE_TYPE (fntype)); *************** check_function_type (decl, current_funct *** 14231,14239 **** { tree ctype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))); TREE_TYPE (decl) ! = build_cplus_method_type (ctype, ! void_type_node, ! FUNCTION_ARG_CHAIN (decl)); } else TREE_TYPE (decl) --- 10012,10020 ---- { tree ctype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))); TREE_TYPE (decl) ! = build_method_type_directly (ctype, ! void_type_node, ! FUNCTION_ARG_CHAIN (decl)); } else TREE_TYPE (decl) *************** check_function_type (decl, current_funct *** 14270,14278 **** applied to it with the argument list [1, 2]. */ int ! start_function (declspecs, declarator, attrs, flags) ! tree declspecs, declarator, attrs; ! int flags; { tree decl1; tree ctype = NULL_TREE; --- 10051,10057 ---- applied to it with the argument list [1, 2]. */ int ! start_function (tree declspecs, tree declarator, tree attrs, int flags) { tree decl1; tree ctype = NULL_TREE; *************** start_function (declspecs, declarator, a *** 14315,14322 **** else doing_friend = 1; } - - last_function_parms = DECL_ARGUMENTS (decl1); } else { --- 10094,10099 ---- *************** start_function (declspecs, declarator, a *** 14335,14361 **** fntype = TREE_TYPE (decl1); restype = TREE_TYPE (fntype); - if (CLASS_TYPE_P (restype) && !CLASSTYPE_GOT_SEMICOLON (restype)) - { - error ("semicolon missing after declaration of `%#T'", restype); - shadow_tag (build_tree_list (NULL_TREE, restype)); - CLASSTYPE_GOT_SEMICOLON (restype) = 1; - if (TREE_CODE (fntype) == FUNCTION_TYPE) - fntype = build_function_type (integer_type_node, - TYPE_ARG_TYPES (fntype)); - else - fntype = build_cplus_method_type (build_type_variant (TYPE_METHOD_BASETYPE (fntype), TREE_READONLY (decl1), TREE_SIDE_EFFECTS (decl1)), - integer_type_node, - TYPE_ARG_TYPES (fntype)); - TREE_TYPE (decl1) = fntype; - } if (TREE_CODE (fntype) == METHOD_TYPE) ctype = TYPE_METHOD_BASETYPE (fntype); else if (DECL_MAIN_P (decl1)) { ! /* If this doesn't return integer_type, complain. */ ! if (TREE_TYPE (TREE_TYPE (decl1)) != integer_type_node) { if (pedantic || warn_return_type) pedwarn ("return type for `main' changed to `int'"); --- 10112,10125 ---- fntype = TREE_TYPE (decl1); restype = TREE_TYPE (fntype); if (TREE_CODE (fntype) == METHOD_TYPE) ctype = TYPE_METHOD_BASETYPE (fntype); else if (DECL_MAIN_P (decl1)) { ! /* If this doesn't return integer_type, or a typedef to ! integer_type, complain. */ ! if (!same_type_p (TREE_TYPE (TREE_TYPE (decl1)), integer_type_node)) { if (pedantic || warn_return_type) pedwarn ("return type for `main' changed to `int'"); *************** start_function (declspecs, declarator, a *** 14366,14373 **** if (DECL_DECLARED_INLINE_P (decl1) && lookup_attribute ("noinline", attrs)) ! warning_with_decl (decl1, ! "inline function `%s' given attribute noinline"); if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (decl1)) /* This is a constructor, we must ensure that any default args --- 10130,10136 ---- if (DECL_DECLARED_INLINE_P (decl1) && lookup_attribute ("noinline", attrs)) ! warning ("%Jinline function '%D' given attribute noinline", decl1, decl1); if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (decl1)) /* This is a constructor, we must ensure that any default args *************** start_function (declspecs, declarator, a *** 14381,14387 **** && TREE_CODE (TREE_TYPE (decl1)) == METHOD_TYPE) { revert_static_member_fn (decl1); - last_function_parms = TREE_CHAIN (last_function_parms); ctype = NULL_TREE; } --- 10144,10149 ---- *************** start_function (declspecs, declarator, a *** 14394,14402 **** /* Set up current_class_type, and enter the scope of the class, if appropriate. */ if (ctype) ! push_nested_class (ctype, 1); else if (DECL_STATIC_FUNCTION_P (decl1)) ! push_nested_class (DECL_CONTEXT (decl1), 2); /* Now that we have entered the scope of the class, we must restore the bindings for any template parameters surrounding DECL1, if it --- 10156,10164 ---- /* Set up current_class_type, and enter the scope of the class, if appropriate. */ if (ctype) ! push_nested_class (ctype); else if (DECL_STATIC_FUNCTION_P (decl1)) ! push_nested_class (DECL_CONTEXT (decl1)); /* Now that we have entered the scope of the class, we must restore the bindings for any template parameters surrounding DECL1, if it *************** start_function (declspecs, declarator, a *** 14434,14440 **** /* Save the parm names or decls from this function's declarator where store_parm_decls will find them. */ ! current_function_parms = last_function_parms; /* Make sure the parameter and return types are reasonable. When you declare a function, these types can be incomplete, but they --- 10196,10202 ---- /* Save the parm names or decls from this function's declarator where store_parm_decls will find them. */ ! current_function_parms = DECL_ARGUMENTS (decl1); /* Make sure the parameter and return types are reasonable. When you declare a function, these types can be incomplete, but they *************** start_function (declspecs, declarator, a *** 14461,14467 **** CFUN set up, and our per-function variables initialized. FIXME factor out the non-RTL stuff. */ bl = current_binding_level; ! init_function_start (decl1, input_filename, lineno); current_binding_level = bl; /* Even though we're inside a function body, we still don't want to --- 10223,10229 ---- CFUN set up, and our per-function variables initialized. FIXME factor out the non-RTL stuff. */ bl = current_binding_level; ! allocate_struct_function (decl1); current_binding_level = bl; /* Even though we're inside a function body, we still don't want to *************** start_function (declspecs, declarator, a *** 14483,14491 **** if (!processing_template_decl && !(flags & SF_PRE_PARSED)) { /* A specialization is not used to guide overload resolution. */ ! if (!DECL_TEMPLATE_SPECIALIZATION (decl1) ! && ! DECL_FUNCTION_MEMBER_P (decl1)) ! decl1 = pushdecl (decl1); else { /* We need to set the DECL_CONTEXT. */ --- 10245,10266 ---- if (!processing_template_decl && !(flags & SF_PRE_PARSED)) { /* A specialization is not used to guide overload resolution. */ ! if (!DECL_FUNCTION_MEMBER_P (decl1) ! && !(DECL_USE_TEMPLATE (decl1) && ! PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (decl1)))) ! { ! tree olddecl = pushdecl (decl1); ! ! if (olddecl == error_mark_node) ! /* If something went wrong when registering the declaration, ! use DECL1; we have to have a FUNCTION_DECL to use when ! parsing the body of the function. */ ! ; ! else ! /* Otherwise, OLDDECL is either a previous declaration of ! the same function or DECL1 itself. */ ! decl1 = olddecl; ! } else { /* We need to set the DECL_CONTEXT. */ *************** start_function (declspecs, declarator, a *** 14556,14563 **** If it belongs to someone else's interface, it is also external. This only affects inlines and template instantiations. */ else if (interface_unknown == 0 ! && (! DECL_TEMPLATE_INSTANTIATION (decl1) ! || flag_alt_external_templates)) { if (DECL_DECLARED_INLINE_P (decl1) || DECL_TEMPLATE_INSTANTIATION (decl1) --- 10331,10337 ---- If it belongs to someone else's interface, it is also external. This only affects inlines and template instantiations. */ else if (interface_unknown == 0 ! && ! DECL_TEMPLATE_INSTANTIATION (decl1)) { if (DECL_DECLARED_INLINE_P (decl1) || DECL_TEMPLATE_INSTANTIATION (decl1) *************** start_function (declspecs, declarator, a *** 14578,14585 **** DECL_INTERFACE_KNOWN (decl1) = 1; } else if (interface_unknown && interface_only ! && (! DECL_TEMPLATE_INSTANTIATION (decl1) ! || flag_alt_external_templates)) { /* If MULTIPLE_SYMBOL_SPACES is defined and we saw a #pragma interface, we will have interface_only set but not --- 10352,10358 ---- DECL_INTERFACE_KNOWN (decl1) = 1; } else if (interface_unknown && interface_only ! && ! DECL_TEMPLATE_INSTANTIATION (decl1)) { /* If MULTIPLE_SYMBOL_SPACES is defined and we saw a #pragma interface, we will have interface_only set but not *************** start_function (declspecs, declarator, a *** 14607,14614 **** DECL_INTERFACE_KNOWN (decl1) = 1; } ! pushlevel (0); ! current_binding_level->parm_flag = 1; ++function_depth; --- 10380,10386 ---- DECL_INTERFACE_KNOWN (decl1) = 1; } ! begin_scope (sk_function_parms, decl1); ++function_depth; *************** start_function (declspecs, declarator, a *** 14632,14642 **** Also install to binding contour return value identifier, if any. */ static void ! store_parm_decls (current_function_parms) ! tree current_function_parms; { ! register tree fndecl = current_function_decl; ! register tree parm; /* This is a chain of any other decls that came in among the parm declarations. If a parm is declared with enum {foo, bar} x; --- 10404,10413 ---- Also install to binding contour return value identifier, if any. */ static void ! store_parm_decls (tree current_function_parms) { ! tree fndecl = current_function_decl; ! tree parm; /* This is a chain of any other decls that came in among the parm declarations. If a parm is declared with enum {foo, bar} x; *************** store_parm_decls (current_function_parms *** 14655,14661 **** /* Must clear this because it might contain TYPE_DECLs declared at class level. */ ! storedecls (NULL_TREE); /* If we're doing semantic analysis, then we'll call pushdecl for each of these. We must do them in reverse order so that --- 10426,10432 ---- /* Must clear this because it might contain TYPE_DECLs declared at class level. */ ! current_binding_level->names = NULL; /* If we're doing semantic analysis, then we'll call pushdecl for each of these. We must do them in reverse order so that *************** store_parm_decls (current_function_parms *** 14694,14700 **** as the decl-chain of the current lexical scope. Put the enumerators in as well, at the front so that DECL_ARGUMENTS is not modified. */ ! storedecls (chainon (nonparms, DECL_ARGUMENTS (fndecl))); /* Do the starting of the exception specifications, if we have any. */ if (flag_exceptions && !processing_template_decl --- 10465,10471 ---- as the decl-chain of the current lexical scope. Put the enumerators in as well, at the front so that DECL_ARGUMENTS is not modified. */ ! current_binding_level->names = chainon (nonparms, DECL_ARGUMENTS (fndecl)); /* Do the starting of the exception specifications, if we have any. */ if (flag_exceptions && !processing_template_decl *************** store_parm_decls (current_function_parms *** 14709,14716 **** when we want to generate RTL later we know what to do. */ static void ! save_function_data (decl) ! tree decl; { struct language_function *f; --- 10480,10486 ---- when we want to generate RTL later we know what to do. */ static void ! save_function_data (tree decl) { struct language_function *f; *************** save_function_data (decl) *** 14720,14727 **** 19990908); /* Make a copy. */ ! f = ((struct language_function *) ! ggc_alloc (sizeof (struct language_function))); memcpy (f, cp_function_chain, sizeof (struct language_function)); DECL_SAVED_FUNCTION_DATA (decl) = f; --- 10490,10496 ---- 19990908); /* Make a copy. */ ! f = ggc_alloc (sizeof (struct language_function)); memcpy (f, cp_function_chain, sizeof (struct language_function)); DECL_SAVED_FUNCTION_DATA (decl) = f; *************** save_function_data (decl) *** 14732,14740 **** f->bindings = NULL; f->x_local_names = NULL; - /* When we get back here again, we will be expanding. */ - f->x_expanding_p = 1; - /* If we've already decided that we cannot inline this function, we must remember that fact when we actually go to expand the function. */ --- 10501,10506 ---- *************** save_function_data (decl) *** 14750,14756 **** fully-constructed bases and members. */ static void ! begin_constructor_body () { } --- 10516,10522 ---- fully-constructed bases and members. */ static void ! begin_constructor_body (void) { } *************** begin_constructor_body () *** 14759,14765 **** members. */ static void ! finish_constructor_body () { } --- 10525,10531 ---- members. */ static void ! finish_constructor_body (void) { } *************** finish_constructor_body () *** 14767,14773 **** vtable pointers and cleanups for bases and members. */ static void ! begin_destructor_body () { tree if_stmt; tree compound_stmt; --- 10533,10539 ---- vtable pointers and cleanups for bases and members. */ static void ! begin_destructor_body (void) { tree if_stmt; tree compound_stmt; *************** begin_destructor_body () *** 14794,14807 **** initialize the vtables.) */ finish_if_stmt_cond (boolean_true_node, if_stmt); ! compound_stmt = begin_compound_stmt (/*has_no_scope=*/0); /* Make all virtual function table pointers in non-virtual base classes point to CURRENT_CLASS_TYPE's virtual function tables. */ initialize_vtbl_ptrs (current_class_ptr); ! finish_compound_stmt (/*has_no_scope=*/0, compound_stmt); finish_then_clause (if_stmt); finish_if_stmt (); --- 10560,10573 ---- initialize the vtables.) */ finish_if_stmt_cond (boolean_true_node, if_stmt); ! compound_stmt = begin_compound_stmt (/*has_no_scope=*/false); /* Make all virtual function table pointers in non-virtual base classes point to CURRENT_CLASS_TYPE's virtual function tables. */ initialize_vtbl_ptrs (current_class_ptr); ! finish_compound_stmt (compound_stmt); finish_then_clause (if_stmt); finish_if_stmt (); *************** begin_destructor_body () *** 14814,14820 **** necessary. Do that now. */ static void ! finish_destructor_body () { tree exprstmt; --- 10580,10586 ---- necessary. Do that now. */ static void ! finish_destructor_body (void) { tree exprstmt; *************** finish_destructor_body () *** 14856,14862 **** In other functions, this isn't necessary, but it doesn't hurt. */ tree ! begin_function_body () { tree stmt; --- 10622,10628 ---- In other functions, this isn't necessary, but it doesn't hurt. */ tree ! begin_function_body (void) { tree stmt; *************** begin_function_body () *** 14866,14874 **** /* Always keep the BLOCK node associated with the outermost pair of curly braces of a function. These are needed for correct operation of dwarfout.c. */ ! keep_next_level (1); ! stmt = begin_compound_stmt (0); COMPOUND_STMT_BODY_BLOCK (stmt) = 1; if (processing_template_decl) --- 10632,10640 ---- /* Always keep the BLOCK node associated with the outermost pair of curly braces of a function. These are needed for correct operation of dwarfout.c. */ ! keep_next_level (true); ! stmt = begin_compound_stmt (/*has_no_scope=*/false); COMPOUND_STMT_BODY_BLOCK (stmt) = 1; if (processing_template_decl) *************** begin_function_body () *** 14891,14901 **** main() would also need to return 0. */ void ! finish_function_body (compstmt) ! tree compstmt; { /* Close the block. */ ! finish_compound_stmt (0, compstmt); if (processing_template_decl) /* Do nothing now. */; --- 10657,10666 ---- main() would also need to return 0. */ void ! finish_function_body (tree compstmt) { /* Close the block. */ ! finish_compound_stmt (compstmt); if (processing_template_decl) /* Do nothing now. */; *************** finish_function_body (compstmt) *** 14916,14925 **** after the class definition is complete.) */ tree ! finish_function (flags) ! int flags; { ! register tree fndecl = current_function_decl; tree fntype, ctype = NULL_TREE; int inclass_inline = (flags & 2) != 0; int nested; --- 10681,10689 ---- after the class definition is complete.) */ tree ! finish_function (int flags) { ! tree fndecl = current_function_decl; tree fntype, ctype = NULL_TREE; int inclass_inline = (flags & 2) != 0; int nested; *************** finish_function (flags) *** 14946,14953 **** which then got a warning when stored in a ptr-to-function variable. */ my_friendly_assert (building_stmt_tree (), 20000911); - - finish_fname_decls (); /* For a cloned function, we've already got all the code we need; there's no need to add any extra bits. */ --- 10710,10715 ---- *************** finish_function (flags) *** 14972,14977 **** --- 10734,10741 ---- current_eh_spec_block); } + finish_fname_decls (); + /* If we're saving up tree structure, tie off the function now. */ finish_stmt_tree (&DECL_SAVED_TREE (fndecl)); *************** finish_function (flags) *** 14988,14994 **** /* If the current binding level isn't the outermost binding level for this function, either there is a bug, or we have experienced syntax errors and the statement tree is malformed. */ ! if (current_binding_level->parm_flag != 1) { /* Make sure we have already experienced errors. */ if (errorcount == 0) --- 10752,10758 ---- /* If the current binding level isn't the outermost binding level for this function, either there is a bug, or we have experienced syntax errors and the statement tree is malformed. */ ! if (current_binding_level->kind != sk_function_parms) { /* Make sure we have already experienced errors. */ if (errorcount == 0) *************** finish_function (flags) *** 14998,15006 **** levels. */ DECL_SAVED_TREE (fndecl) = build_stmt (COMPOUND_STMT, NULL_TREE); ! while (current_binding_level->parm_flag != 1) { ! if (current_binding_level->parm_flag == 2) pop_nested_class (); else poplevel (0, 0, 0); --- 10762,10770 ---- levels. */ DECL_SAVED_TREE (fndecl) = build_stmt (COMPOUND_STMT, NULL_TREE); ! while (current_binding_level->kind != sk_function_parms) { ! if (current_binding_level->kind == sk_class) pop_nested_class (); else poplevel (0, 0, 0); *************** finish_function (flags) *** 15008,15013 **** --- 10772,10781 ---- } poplevel (1, 0, 1); + /* Statements should always be full-expressions at the outermost set + of curly braces for a function. */ + my_friendly_assert (stmts_are_full_exprs_p (), 19990831); + /* Set up the named return value optimization, if we can. Here, we eliminate the copy from the nrv into the RESULT_DECL and any cleanup for the nrv. genrtl_start_function and declare_return_variable *************** finish_function (flags) *** 15020,15031 **** if (r != error_mark_node /* This is only worth doing for fns that return in memory--and simpler, since we don't have to worry about promoted modes. */ ! && aggregate_value_p (TREE_TYPE (TREE_TYPE (fndecl))) /* Only allow this for variables declared in the outer scope of the function so we know that their lifetime always ends with a return; see g++.dg/opt/nrv6.C. We could be more flexible if we were to do this optimization in tree-ssa. */ ! && (outer = BLOCK_SUBBLOCKS (DECL_INITIAL (fndecl)), chain_member (r, BLOCK_VARS (outer)))) { --- 10788,10800 ---- if (r != error_mark_node /* This is only worth doing for fns that return in memory--and simpler, since we don't have to worry about promoted modes. */ ! && aggregate_value_p (TREE_TYPE (TREE_TYPE (fndecl)), fndecl) /* Only allow this for variables declared in the outer scope of the function so we know that their lifetime always ends with a return; see g++.dg/opt/nrv6.C. We could be more flexible if we were to do this optimization in tree-ssa. */ ! /* Skip the artificial function body block. */ ! && (outer = BLOCK_SUBBLOCKS (BLOCK_SUBBLOCKS (DECL_INITIAL (fndecl))), chain_member (r, BLOCK_VARS (outer)))) { *************** finish_function (flags) *** 15068,15090 **** /* Complain if there's just no return statement. */ if (warn_return_type - && !processing_template_decl && TREE_CODE (TREE_TYPE (fntype)) != VOID_TYPE && !current_function_returns_value && !current_function_returns_null /* Don't complain if we abort or throw. */ && !current_function_returns_abnormally && !DECL_NAME (DECL_RESULT (fndecl)) /* Normally, with -Wreturn-type, flow will complain. Unless we're an inline function, as we might never be compiled separately. */ ! && DECL_INLINE (fndecl)) warning ("no return statement in function returning non-void"); ! ! /* Clear out memory we no longer need. */ ! free_after_parsing (cfun); ! /* Since we never call rest_of_compilation, we never clear ! CFUN. Do so explicitly. */ ! free_after_compilation (cfun); cfun = NULL; /* If this is an in-class inline definition, we may have to pop the bindings for the template parameters that we added in --- 10837,10857 ---- /* Complain if there's just no return statement. */ if (warn_return_type && TREE_CODE (TREE_TYPE (fntype)) != VOID_TYPE + && !dependent_type_p (TREE_TYPE (fntype)) && !current_function_returns_value && !current_function_returns_null /* Don't complain if we abort or throw. */ && !current_function_returns_abnormally && !DECL_NAME (DECL_RESULT (fndecl)) /* Normally, with -Wreturn-type, flow will complain. Unless we're an inline function, as we might never be compiled separately. */ ! && (DECL_INLINE (fndecl) || processing_template_decl)) warning ("no return statement in function returning non-void"); ! ! /* We're leaving the context of this function, so zap cfun. It's still in ! DECL_SAVED_INSNS, and we'll restore it in tree_rest_of_compilation. */ cfun = NULL; + current_function_decl = NULL; /* If this is an in-class inline definition, we may have to pop the bindings for the template parameters that we added in *************** finish_function (flags) *** 15131,15145 **** CHANGES TO CODE IN `grokfield'. */ tree ! start_method (declspecs, declarator, attrlist) ! tree declarator, declspecs, attrlist; { tree fndecl = grokdeclarator (declarator, declspecs, MEMFUNCDEF, 0, &attrlist); ! /* Something too ugly to handle. */ ! if (fndecl == NULL_TREE) ! return NULL_TREE; if (attrlist) cplus_decl_attributes (&fndecl, attrlist, 0); --- 10898,10916 ---- CHANGES TO CODE IN `grokfield'. */ tree ! start_method (tree declspecs, tree declarator, tree attrlist) { tree fndecl = grokdeclarator (declarator, declspecs, MEMFUNCDEF, 0, &attrlist); ! if (fndecl == error_mark_node) ! return error_mark_node; ! ! if (fndecl == NULL || TREE_CODE (fndecl) != FUNCTION_DECL) ! { ! error ("invalid member function declaration"); ! return error_mark_node; ! } if (attrlist) cplus_decl_attributes (&fndecl, attrlist, 0); *************** start_method (declspecs, declarator, att *** 15148,15157 **** if (fndecl == void_type_node) return fndecl; - if (TREE_CODE (fndecl) != FUNCTION_DECL) - /* Not a function, tell parser to report parse error. */ - return NULL_TREE; - if (DECL_IN_AGGR_P (fndecl)) { if (IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (fndecl)) != current_class_type) --- 10919,10924 ---- *************** start_method (declspecs, declarator, att *** 15167,15180 **** check_template_shadow (fndecl); DECL_DECLARED_INLINE_P (fndecl) = 1; - - DID_INLINE_FUNC (fndecl) = 0; if (flag_default_inline) DECL_INLINE (fndecl) = 1; /* We process method specializations in finish_struct_1. */ if (processing_template_decl && !DECL_TEMPLATE_SPECIALIZATION (fndecl)) ! fndecl = push_template_decl (fndecl); if (! DECL_FRIEND_P (fndecl)) { --- 10934,10949 ---- check_template_shadow (fndecl); DECL_DECLARED_INLINE_P (fndecl) = 1; if (flag_default_inline) DECL_INLINE (fndecl) = 1; /* We process method specializations in finish_struct_1. */ if (processing_template_decl && !DECL_TEMPLATE_SPECIALIZATION (fndecl)) ! { ! fndecl = push_template_decl (fndecl); ! if (fndecl == error_mark_node) ! return fndecl; ! } if (! DECL_FRIEND_P (fndecl)) { *************** start_method (declspecs, declarator, att *** 15188,15196 **** cp_finish_decl (fndecl, NULL_TREE, NULL_TREE, 0); ! /* Make a place for the parms */ ! pushlevel (0); ! current_binding_level->parm_flag = 1; DECL_IN_AGGR_P (fndecl) = 1; return fndecl; --- 10957,10964 ---- cp_finish_decl (fndecl, NULL_TREE, NULL_TREE, 0); ! /* Make a place for the parms. */ ! begin_scope (sk_function_parms, fndecl); DECL_IN_AGGR_P (fndecl) = 1; return fndecl; *************** start_method (declspecs, declarator, att *** 15209,15221 **** DECL is the ..._DECL that `start_method' provided. */ tree ! finish_method (decl) ! tree decl; { ! register tree fndecl = decl; tree old_initial; ! register tree link; if (decl == void_type_node) return decl; --- 10977,10988 ---- DECL is the ..._DECL that `start_method' provided. */ tree ! finish_method (tree decl) { ! tree fndecl = decl; tree old_initial; ! tree link; if (decl == void_type_node) return decl; *************** finish_method (decl) *** 15262,15269 **** we can lay it out later, when and if its type becomes complete. */ void ! maybe_register_incomplete_var (var) ! tree var; { my_friendly_assert (TREE_CODE (var) == VAR_DECL, 20020406); --- 11029,11035 ---- we can lay it out later, when and if its type becomes complete. */ void ! maybe_register_incomplete_var (tree var) { my_friendly_assert (TREE_CODE (var) == VAR_DECL, 20020406); *************** maybe_register_incomplete_var (var) *** 15290,15297 **** declaration, update them now. */ void ! complete_vars (type) ! tree type; { tree *list = &incomplete_vars; --- 11056,11062 ---- declaration, update them now. */ void ! complete_vars (tree type) { tree *list = &incomplete_vars; *************** complete_vars (type) *** 15316,15323 **** here. */ tree ! cxx_maybe_build_cleanup (decl) ! tree decl; { tree type = TREE_TYPE (decl); --- 11081,11087 ---- here. */ tree ! cxx_maybe_build_cleanup (tree decl) { tree type = TREE_TYPE (decl); *************** cxx_maybe_build_cleanup (decl) *** 15344,15351 **** if (TYPE_USES_VIRTUAL_BASECLASSES (type) && ! TYPE_HAS_DESTRUCTOR (type)) ! rval = build_compound_expr (tree_cons (NULL_TREE, rval, ! build_tree_list (NULL_TREE, build_vbase_delete (type, decl)))); return rval; } --- 11108,11114 ---- if (TYPE_USES_VIRTUAL_BASECLASSES (type) && ! TYPE_HAS_DESTRUCTOR (type)) ! rval = build_compound_expr (rval, build_vbase_delete (type, decl)); return rval; } *************** cxx_maybe_build_cleanup (decl) *** 15355,15361 **** /* When a stmt has been parsed, this function is called. */ void ! finish_stmt () { /* Always assume this statement was not an expression statement. If it actually was an expression statement, its our callers --- 11118,11124 ---- /* When a stmt has been parsed, this function is called. */ void ! finish_stmt (void) { /* Always assume this statement was not an expression statement. If it actually was an expression statement, its our callers *************** finish_stmt () *** 15367,15374 **** but turned out to be static. Update it accordingly. */ void ! revert_static_member_fn (decl) ! tree decl; { tree tmp; tree function = TREE_TYPE (decl); --- 11130,11136 ---- but turned out to be static. Update it accordingly. */ void ! revert_static_member_fn (tree decl) { tree tmp; tree function = TREE_TYPE (decl); *************** revert_static_member_fn (decl) *** 15394,15422 **** function. */ void ! cxx_push_function_context (f) ! struct function *f; { struct language_function *p ! = ((struct language_function *) ! ggc_alloc_cleared (sizeof (struct language_function))); f->language = p; - /* It takes an explicit call to expand_body to generate RTL for a - function. */ - expanding_p = 0; - /* Whenever we start a new function, we destroy temporaries in the usual way. */ current_stmt_tree ()->stmts_are_full_exprs_p = 1; } /* Free the language-specific parts of F, now that we've finished compiling the function. */ void ! cxx_pop_function_context (f) ! struct function *f; { f->language = 0; } --- 11156,11200 ---- function. */ void ! cxx_push_function_context (struct function * f) { struct language_function *p ! = ggc_alloc_cleared (sizeof (struct language_function)); f->language = p; /* Whenever we start a new function, we destroy temporaries in the usual way. */ current_stmt_tree ()->stmts_are_full_exprs_p = 1; + + if (f->decl) + { + tree fn = f->decl; + + if (DECL_SAVED_FUNCTION_DATA (fn)) + { + /* If we already parsed this function, and we're just expanding it + now, restore saved state. */ + *cp_function_chain = *DECL_SAVED_FUNCTION_DATA (fn); + + /* If we decided that we didn't want to inline this function, + make sure the back-end knows that. */ + if (!current_function_cannot_inline) + current_function_cannot_inline = cp_function_chain->cannot_inline; + + /* We don't need the saved data anymore. Unless this is an inline + function; we need the named return value info for + cp_copy_res_decl_for_inlining. */ + if (! DECL_INLINE (fn)) + DECL_SAVED_FUNCTION_DATA (fn) = NULL; + } + } } /* Free the language-specific parts of F, now that we've finished compiling the function. */ void ! cxx_pop_function_context (struct function * f) { f->language = 0; } *************** cxx_pop_function_context (f) *** 15425,15459 **** one of the language-independent trees. */ enum cp_tree_node_structure_enum ! cp_tree_node_structure (t) ! union lang_tree_node *t; { switch (TREE_CODE (&t->generic)) { ! case DEFAULT_ARG: return TS_CP_IDENTIFIER; case IDENTIFIER_NODE: return TS_CP_IDENTIFIER; case OVERLOAD: return TS_CP_OVERLOAD; case TEMPLATE_PARM_INDEX: return TS_CP_TPI; case PTRMEM_CST: return TS_CP_PTRMEM; case WRAPPER: return TS_CP_WRAPPER; - case SRCLOC: return TS_CP_SRCLOC; default: return TS_CP_GENERIC; } } - /* Return the IDENTIFIER_GLOBAL_VALUE of T, for use in common code, since - the definition of IDENTIFIER_GLOBAL_VALUE is different for C and C++. */ - - tree - identifier_global_value (t) - tree t; - { - return IDENTIFIER_GLOBAL_VALUE (t); - } - /* Build the void_list_node (void_type_node having been created). */ tree ! build_void_list_node () { tree t = build_tree_list (NULL_TREE, void_type_node); TREE_PARMLIST (t) = 1; --- 11203,11226 ---- one of the language-independent trees. */ enum cp_tree_node_structure_enum ! cp_tree_node_structure (union lang_tree_node * t) { switch (TREE_CODE (&t->generic)) { ! case DEFAULT_ARG: return TS_CP_DEFAULT_ARG; case IDENTIFIER_NODE: return TS_CP_IDENTIFIER; case OVERLOAD: return TS_CP_OVERLOAD; case TEMPLATE_PARM_INDEX: return TS_CP_TPI; case PTRMEM_CST: return TS_CP_PTRMEM; + case BASELINK: return TS_CP_BASELINK; case WRAPPER: return TS_CP_WRAPPER; default: return TS_CP_GENERIC; } } /* Build the void_list_node (void_type_node having been created). */ tree ! build_void_list_node (void) { tree t = build_tree_list (NULL_TREE, void_type_node); TREE_PARMLIST (t) = 1; *************** build_void_list_node () *** 15461,15468 **** } static int ! cp_missing_noreturn_ok_p (decl) ! tree decl; { /* A missing noreturn is ok for the `main' function. */ return DECL_MAIN_P (decl); --- 11228,11234 ---- } static int ! cp_missing_noreturn_ok_p (tree decl) { /* A missing noreturn is ok for the `main' function. */ return DECL_MAIN_P (decl); diff -Nrc3pad gcc-3.3.3/gcc/cp/decl.h gcc-3.4.0/gcc/cp/decl.h *** gcc-3.3.3/gcc/cp/decl.h 2003-06-20 01:18:44.000000000 +0000 --- gcc-3.4.0/gcc/cp/decl.h 2004-03-20 00:13:12.000000000 +0000 *************** *** 1,20 **** /* Variables and structures for declaration processing. Copyright (C) 1993, 2000, 2002 Free Software Foundation, Inc. ! This file is part of GNU CC. ! GNU CC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ --- 1,20 ---- /* Variables and structures for declaration processing. Copyright (C) 1993, 2000, 2002 Free Software Foundation, Inc. ! This file is part of GCC. ! GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ *************** enum decl_context *** 31,42 **** }; /* We need this in here to get the decl_context definition. */ ! extern tree grokdeclarator PARAMS ((tree, tree, enum decl_context, int, ! tree *)); ! ! /* Parsing a function declarator leaves a list of parameter names ! or a chain or parameter decls here. */ ! extern GTY(()) tree last_function_parms; #ifdef DEBUG_CP_BINDING_LEVELS /* Purely for debugging purposes. */ --- 31,37 ---- }; /* We need this in here to get the decl_context definition. */ ! extern tree grokdeclarator (tree, tree, enum decl_context, int, tree*); #ifdef DEBUG_CP_BINDING_LEVELS /* Purely for debugging purposes. */ diff -Nrc3pad gcc-3.3.3/gcc/cp/dump.c gcc-3.4.0/gcc/cp/dump.c *** gcc-3.3.3/gcc/cp/dump.c 2002-12-30 13:41:17.000000000 +0000 --- gcc-3.4.0/gcc/cp/dump.c 2003-12-08 20:29:15.000000000 +0000 *************** *** 2,43 **** Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Written by Mark Mitchell ! This file is part of GNU CC. ! GNU CC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "config.h" #include "system.h" #include "tree.h" #include "cp-tree.h" #include "tree-dump.h" ! static void dump_access ! PARAMS ((dump_info_p, tree)); ! static void dump_op ! PARAMS ((dump_info_p, tree)); /* Dump a representation of the accessibility information associated with T. */ static void ! dump_access (di, t) ! dump_info_p di; ! tree t; { if (TREE_PROTECTED(t)) dump_string (di, "protected"); --- 2,41 ---- Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Written by Mark Mitchell ! This file is part of GCC. ! GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "config.h" #include "system.h" + #include "coretypes.h" + #include "tm.h" #include "tree.h" #include "cp-tree.h" #include "tree-dump.h" ! static void dump_access (dump_info_p, tree); ! static void dump_op (dump_info_p, tree); /* Dump a representation of the accessibility information associated with T. */ static void ! dump_access (dump_info_p di, tree t) { if (TREE_PROTECTED(t)) dump_string (di, "protected"); *************** dump_access (di, t) *** 51,59 **** operator associated with node t. */ static void ! dump_op (di, t) ! dump_info_p di; ! tree t; { switch (DECL_OVERLOADED_OPERATOR_P (t)) { case NEW_EXPR: --- 49,55 ---- operator associated with node t. */ static void ! dump_op (dump_info_p di, tree t) { switch (DECL_OVERLOADED_OPERATOR_P (t)) { case NEW_EXPR: *************** dump_op (di, t) *** 206,215 **** } } ! int ! cp_dump_tree (dump_info, t) ! void *dump_info; ! tree t; { enum tree_code code; dump_info_p di = (dump_info_p) dump_info; --- 202,209 ---- } } ! bool ! cp_dump_tree (void* dump_info, tree t) { enum tree_code code; dump_info_p di = (dump_info_p) dump_info; *************** cp_dump_tree (dump_info, t) *** 220,226 **** if (DECL_P (t)) { if (DECL_LANG_SPECIFIC (t) && DECL_LANGUAGE (t) != lang_cplusplus) ! dump_string (di, language_to_string (DECL_LANGUAGE (t), 0)); } switch (code) --- 214,220 ---- if (DECL_P (t)) { if (DECL_LANG_SPECIFIC (t) && DECL_LANGUAGE (t) != lang_cplusplus) ! dump_string (di, language_to_string (DECL_LANGUAGE (t))); } switch (code) *************** cp_dump_tree (dump_info, t) *** 229,276 **** if (IDENTIFIER_OPNAME_P (t)) { dump_string (di, "operator"); ! return 1; } else if (IDENTIFIER_TYPENAME_P (t)) { dump_child ("tynm", TREE_TYPE (t)); ! return 1; ! } ! else if (t == anonymous_namespace_name) ! { ! dump_string (di, "unnamed"); ! return 1; } break; ! case POINTER_TYPE: ! if (TYPE_PTRMEM_P (t)) ! { ! dump_string (di, "ptrmem"); ! dump_child ("ptd", TYPE_PTRMEM_POINTED_TO_TYPE (t)); ! dump_child ("cls", TYPE_PTRMEM_CLASS_TYPE (t)); ! return 1; ! } ! break; case RECORD_TYPE: - case UNION_TYPE: if (TYPE_PTRMEMFUNC_P (t)) { dump_string (di, "ptrmem"); dump_child ("ptd", TYPE_PTRMEM_POINTED_TO_TYPE (t)); dump_child ("cls", TYPE_PTRMEM_CLASS_TYPE (t)); ! return 1; } /* Is it a type used as a base? */ if (TYPE_CONTEXT (t) && TREE_CODE (TYPE_CONTEXT (t)) == TREE_CODE (t) && CLASSTYPE_AS_BASE (TYPE_CONTEXT (t)) == t) { dump_child ("bfld", TYPE_CONTEXT (t)); ! return 1; } dump_child ("vfld", TYPE_VFIELD (t)); if (CLASSTYPE_TEMPLATE_SPECIALIZATION(t)) dump_string(di, "spec"); --- 223,265 ---- if (IDENTIFIER_OPNAME_P (t)) { dump_string (di, "operator"); ! return true; } else if (IDENTIFIER_TYPENAME_P (t)) { dump_child ("tynm", TREE_TYPE (t)); ! return true; } break; ! case OFFSET_TYPE: ! dump_string (di, "ptrmem"); ! dump_child ("ptd", TYPE_PTRMEM_POINTED_TO_TYPE (t)); ! dump_child ("cls", TYPE_PTRMEM_CLASS_TYPE (t)); ! return true; case RECORD_TYPE: if (TYPE_PTRMEMFUNC_P (t)) { dump_string (di, "ptrmem"); dump_child ("ptd", TYPE_PTRMEM_POINTED_TO_TYPE (t)); dump_child ("cls", TYPE_PTRMEM_CLASS_TYPE (t)); ! return true; } + /* Fall through. */ + case UNION_TYPE: /* Is it a type used as a base? */ if (TYPE_CONTEXT (t) && TREE_CODE (TYPE_CONTEXT (t)) == TREE_CODE (t) && CLASSTYPE_AS_BASE (TYPE_CONTEXT (t)) == t) { dump_child ("bfld", TYPE_CONTEXT (t)); ! return true; } + if (! IS_AGGR_TYPE (t)) + break; + dump_child ("vfld", TYPE_VFIELD (t)); if (CLASSTYPE_TEMPLATE_SPECIALIZATION(t)) dump_string(di, "spec"); *************** cp_dump_tree (dump_info, t) *** 325,345 **** dump_string (di, "destructor"); if (DECL_CONV_FN_P (t)) dump_string (di, "conversion"); ! if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t)) ! { ! if (DECL_GLOBAL_CTOR_P (t)) ! dump_string (di, "global init"); ! if (DECL_GLOBAL_DTOR_P (t)) ! dump_string (di, "global fini"); ! } if (DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)) dump_string (di, "pseudo tmpl"); } else { dump_string (di, "thunk"); ! dump_int (di, "dlta", THUNK_DELTA (t)); ! dump_child ("vcll", THUNK_VCALL_OFFSET (t)); dump_child ("fn", DECL_INITIAL (t)); } break; --- 314,342 ---- dump_string (di, "destructor"); if (DECL_CONV_FN_P (t)) dump_string (di, "conversion"); ! if (DECL_GLOBAL_CTOR_P (t)) ! dump_string (di, "global init"); ! if (DECL_GLOBAL_DTOR_P (t)) ! dump_string (di, "global fini"); if (DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)) dump_string (di, "pseudo tmpl"); } else { + tree virt = THUNK_VIRTUAL_OFFSET (t); + dump_string (di, "thunk"); ! if (DECL_THIS_THUNK_P (t)) ! dump_string (di, "this adjusting"); ! else ! { ! dump_string (di, "result adjusting"); ! if (virt) ! virt = BINFO_VPTR_FIELD (virt); ! } ! dump_int (di, "fixd", THUNK_FIXED_OFFSET (t)); ! if (virt) ! dump_int (di, "virt", tree_low_cst (virt, 0)); dump_child ("fn", DECL_INITIAL (t)); } break; diff -Nrc3pad gcc-3.3.3/gcc/cp/error.c gcc-3.4.0/gcc/cp/error.c *** gcc-3.3.3/gcc/cp/error.c 2003-11-08 08:36:14.000000000 +0000 --- gcc-3.4.0/gcc/cp/error.c 2004-03-01 21:09:47.000000000 +0000 *************** *** 1,26 **** /* Call-backs for C++ error reporting. This code is non-reentrant. ! Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002 ! Free Software Foundation, Inc. ! This file is part of GNU CC. ! GNU CC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "config.h" #include "system.h" #include "tree.h" #include "cp-tree.h" #include "real.h" --- 1,28 ---- /* Call-backs for C++ error reporting. This code is non-reentrant. ! Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, ! 2003 Free Software Foundation, Inc. ! This file is part of GCC. ! GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "config.h" #include "system.h" + #include "coretypes.h" + #include "tm.h" #include "tree.h" #include "cp-tree.h" #include "real.h" *************** Boston, MA 02111-1307, USA. */ *** 28,137 **** #include "flags.h" #include "diagnostic.h" #include "langhooks-def.h" enum pad { none, before, after }; ! #define sorry_for_unsupported_tree(T) \ ! sorry ("`%s' not supported by %s", tree_code_name[(int) TREE_CODE (T)], \ ! __FUNCTION__) ! ! #define print_scope_operator(BUFFER) output_add_string ((BUFFER), "::") ! #define print_left_paren(BUFFER) output_add_character ((BUFFER), '(') ! #define print_right_paren(BUFFER) output_add_character ((BUFFER), ')') ! #define print_left_bracket(BUFFER) output_add_character ((BUFFER), '[') ! #define print_right_bracket(BUFFER) output_add_character ((BUFFER), ']') ! #define print_template_argument_list_start(BUFFER) \ ! print_non_consecutive_character ((BUFFER), '<') ! #define print_template_argument_list_end(BUFFER) \ ! print_non_consecutive_character ((BUFFER), '>') ! #define print_tree_identifier(BUFFER, TID) \ ! output_add_string ((BUFFER), IDENTIFIER_POINTER (TID)) ! #define print_identifier(BUFFER, ID) output_add_string ((BUFFER), (ID)) ! #define separate_with_comma(BUFFER) output_add_string ((BUFFER), ", ") /* The global buffer where we dump everything. It is there only for transitional purpose. It is expected, in the near future, to be completely removed. */ ! static output_buffer scratch_buffer_rec; ! static output_buffer *scratch_buffer = &scratch_buffer_rec; # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T))) #define reinit_global_formatting_buffer() \ output_clear_message_text (scratch_buffer) ! static const char *args_to_string PARAMS ((tree, int)); ! static const char *assop_to_string PARAMS ((enum tree_code, int)); ! static const char *code_to_string PARAMS ((enum tree_code, int)); ! static const char *cv_to_string PARAMS ((tree, int)); ! static const char *decl_to_string PARAMS ((tree, int)); ! static const char *expr_to_string PARAMS ((tree, int)); ! static const char *fndecl_to_string PARAMS ((tree, int)); ! static const char *op_to_string PARAMS ((enum tree_code, int)); ! static const char *parm_to_string PARAMS ((int, int)); ! static const char *type_to_string PARAMS ((tree, int)); ! static void dump_type PARAMS ((tree, int)); ! static void dump_typename PARAMS ((tree, int)); ! static void dump_simple_decl PARAMS ((tree, tree, int)); ! static void dump_decl PARAMS ((tree, int)); ! static void dump_template_decl PARAMS ((tree, int)); ! static void dump_function_decl PARAMS ((tree, int)); ! static void dump_expr PARAMS ((tree, int)); ! static void dump_unary_op PARAMS ((const char *, tree, int)); ! static void dump_binary_op PARAMS ((const char *, tree, int)); ! static void dump_aggr_type PARAMS ((tree, int)); ! static enum pad dump_type_prefix PARAMS ((tree, int)); ! static void dump_type_suffix PARAMS ((tree, int)); ! static void dump_function_name PARAMS ((tree, int)); ! static void dump_expr_list PARAMS ((tree, int)); ! static void dump_global_iord PARAMS ((tree)); ! static enum pad dump_qualifiers PARAMS ((tree, enum pad)); ! static void dump_char PARAMS ((int)); ! static void dump_parameters PARAMS ((tree, int)); ! static void dump_exception_spec PARAMS ((tree, int)); ! static const char *class_key_or_enum PARAMS ((tree)); ! static void dump_template_argument PARAMS ((tree, int)); ! static void dump_template_argument_list PARAMS ((tree, int)); ! static void dump_template_parameter PARAMS ((tree, int)); ! static void dump_template_bindings PARAMS ((tree, tree)); ! static void dump_scope PARAMS ((tree, int)); ! static void dump_template_parms PARAMS ((tree, int, int)); ! static const char *function_category PARAMS ((tree)); ! static void maybe_print_instantiation_context PARAMS ((diagnostic_context *)); ! static void print_instantiation_full_context PARAMS ((diagnostic_context *)); ! static void print_instantiation_partial_context PARAMS ((diagnostic_context *, ! tree, ! const char *, int)); ! static void cp_diagnostic_starter PARAMS ((diagnostic_context *, ! diagnostic_info *)); ! static void cp_diagnostic_finalizer PARAMS ((diagnostic_context *, ! diagnostic_info *)); ! static void cp_print_error_function PARAMS ((diagnostic_context *, ! diagnostic_info *)); ! static bool cp_printer PARAMS ((output_buffer *, text_info *)); ! static void print_non_consecutive_character PARAMS ((output_buffer *, int)); ! static void print_integer PARAMS ((output_buffer *, HOST_WIDE_INT)); ! static tree locate_error PARAMS ((const char *, va_list)); void ! init_error () { diagnostic_starter (global_dc) = cp_diagnostic_starter; diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer; diagnostic_format_decoder (global_dc) = cp_printer; ! init_output_buffer (scratch_buffer, /* prefix */NULL, /* line-width */0); } /* Dump a scope, if deemed necessary. */ static void ! dump_scope (scope, flags) ! tree scope; ! int flags; { int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF)); --- 30,122 ---- #include "flags.h" #include "diagnostic.h" #include "langhooks-def.h" + #include "cxx-pretty-print.h" enum pad { none, before, after }; ! #define pp_template_argument_list_start(PP) \ ! pp_non_consecutive_character (PP, '<') ! #define pp_template_argument_list_end(PP) \ ! pp_non_consecutive_character (PP, '>') ! #define pp_separate_with_comma(PP) pp_string (PP, ", ") /* The global buffer where we dump everything. It is there only for transitional purpose. It is expected, in the near future, to be completely removed. */ ! static cxx_pretty_printer scratch_pretty_printer; ! #define cxx_pp (&scratch_pretty_printer) # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T))) #define reinit_global_formatting_buffer() \ output_clear_message_text (scratch_buffer) ! static const char *args_to_string (tree, int); ! static const char *assop_to_string (enum tree_code); ! static const char *code_to_string (enum tree_code); ! static const char *cv_to_string (tree, int); ! static const char *decl_to_string (tree, int); ! static const char *expr_to_string (tree); ! static const char *fndecl_to_string (tree, int); ! static const char *op_to_string (enum tree_code); ! static const char *parm_to_string (int); ! static const char *type_to_string (tree, int); ! static void dump_type (tree, int); ! static void dump_typename (tree, int); ! static void dump_simple_decl (tree, tree, int); ! static void dump_decl (tree, int); ! static void dump_template_decl (tree, int); ! static void dump_function_decl (tree, int); ! static void dump_expr (tree, int); ! static void dump_unary_op (const char *, tree, int); ! static void dump_binary_op (const char *, tree, int); ! static void dump_aggr_type (tree, int); ! static enum pad dump_type_prefix (tree, int); ! static void dump_type_suffix (tree, int); ! static void dump_function_name (tree, int); ! static void dump_expr_list (tree, int); ! static void dump_global_iord (tree); ! static enum pad dump_qualifiers (tree, enum pad); ! static void dump_parameters (tree, int); ! static void dump_exception_spec (tree, int); ! static const char *class_key_or_enum (tree); ! static void dump_template_argument (tree, int); ! static void dump_template_argument_list (tree, int); ! static void dump_template_parameter (tree, int); ! static void dump_template_bindings (tree, tree); ! static void dump_scope (tree, int); ! static void dump_template_parms (tree, int, int); ! static const char *function_category (tree); ! static void maybe_print_instantiation_context (diagnostic_context *); ! static void print_instantiation_full_context (diagnostic_context *); ! static void print_instantiation_partial_context (diagnostic_context *, ! tree, location_t); ! static void cp_diagnostic_starter (diagnostic_context *, diagnostic_info *); ! static void cp_diagnostic_finalizer (diagnostic_context *, diagnostic_info *); ! static void cp_print_error_function (diagnostic_context *, diagnostic_info *); ! static bool cp_printer (pretty_printer *, text_info *); ! static void pp_non_consecutive_character (cxx_pretty_printer *, int); ! static tree locate_error (const char *, va_list); ! static location_t location_of (tree); void ! init_error (void) { diagnostic_starter (global_dc) = cp_diagnostic_starter; diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer; diagnostic_format_decoder (global_dc) = cp_printer; ! pp_construct (pp_base (cxx_pp), NULL, 0); ! pp_cxx_pretty_printer_init (cxx_pp); } /* Dump a scope, if deemed necessary. */ static void ! dump_scope (tree scope, int flags) { int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF)); *************** dump_scope (scope, flags) *** 143,160 **** if (scope != global_namespace) { dump_decl (scope, f); ! print_scope_operator (scratch_buffer); } } else if (AGGREGATE_TYPE_P (scope)) { dump_type (scope, f); ! print_scope_operator (scratch_buffer); } else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL) { dump_function_decl (scope, f); ! print_scope_operator (scratch_buffer); } } --- 128,145 ---- if (scope != global_namespace) { dump_decl (scope, f); ! pp_colon_colon (cxx_pp); } } else if (AGGREGATE_TYPE_P (scope)) { dump_type (scope, f); ! pp_colon_colon (cxx_pp); } else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL) { dump_function_decl (scope, f); ! pp_colon_colon (cxx_pp); } } *************** dump_scope (scope, flags) *** 162,170 **** indication of whether we dumped something. */ static enum pad ! dump_qualifiers (t, p) ! tree t; ! enum pad p; { static const int masks[] = {TYPE_QUAL_CONST, TYPE_QUAL_VOLATILE, TYPE_QUAL_RESTRICT}; --- 147,153 ---- indication of whether we dumped something. */ static enum pad ! dump_qualifiers (tree t, enum pad p) { static const int masks[] = {TYPE_QUAL_CONST, TYPE_QUAL_VOLATILE, TYPE_QUAL_RESTRICT}; *************** dump_qualifiers (t, p) *** 180,207 **** if (masks[ix] & quals) { if (p == before) ! output_add_space (scratch_buffer); p = before; ! print_identifier (scratch_buffer, names[ix]); } if (do_after) ! output_add_space (scratch_buffer); } else p = none; return p; } - /* This must be large enough to hold any printed integer or floating-point - value. */ - static char digit_buffer[128]; - /* Dump the template ARGument under control of FLAGS. */ static void ! dump_template_argument (arg, flags) ! tree arg; ! int flags; { if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL) dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM); --- 163,184 ---- if (masks[ix] & quals) { if (p == before) ! pp_space (cxx_pp); p = before; ! pp_identifier (cxx_pp, names[ix]); } if (do_after) ! pp_space (cxx_pp); } else p = none; return p; } /* Dump the template ARGument under control of FLAGS. */ static void ! dump_template_argument (tree arg, int flags) { if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL) dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM); *************** dump_template_argument (arg, flags) *** 213,221 **** of FLAGS. */ static void ! dump_template_argument_list (args, flags) ! tree args; ! int flags; { int n = TREE_VEC_LENGTH (args); int need_comma = 0; --- 190,196 ---- of FLAGS. */ static void ! dump_template_argument_list (tree args, int flags) { int n = TREE_VEC_LENGTH (args); int need_comma = 0; *************** dump_template_argument_list (args, flags *** 224,230 **** for (i = 0; i< n; ++i) { if (need_comma) ! separate_with_comma (scratch_buffer); dump_template_argument (TREE_VEC_ELT (args, i), flags); need_comma = 1; } --- 199,205 ---- for (i = 0; i< n; ++i) { if (need_comma) ! pp_separate_with_comma (cxx_pp); dump_template_argument (TREE_VEC_ELT (args, i), flags); need_comma = 1; } *************** dump_template_argument_list (args, flags *** 233,241 **** /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */ static void ! dump_template_parameter (parm, flags) ! tree parm; ! int flags; { tree p = TREE_VALUE (parm); tree a = TREE_PURPOSE (parm); --- 208,214 ---- /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */ static void ! dump_template_parameter (tree parm, int flags) { tree p = TREE_VALUE (parm); tree a = TREE_PURPOSE (parm); *************** dump_template_parameter (parm, flags) *** 244,267 **** { if (flags & TFF_DECL_SPECIFIERS) { ! print_identifier (scratch_buffer, "class"); if (DECL_NAME (p)) { ! output_add_space (scratch_buffer); ! print_tree_identifier (scratch_buffer, DECL_NAME (p)); } } else if (DECL_NAME (p)) ! print_tree_identifier (scratch_buffer, DECL_NAME (p)); else ! print_identifier (scratch_buffer, "{template default argument error}"); } else dump_decl (p, flags | TFF_DECL_SPECIFIERS); if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE) { ! output_add_string (scratch_buffer, " = "); if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL) dump_type (a, flags & ~TFF_CHASE_TYPEDEF); else --- 217,240 ---- { if (flags & TFF_DECL_SPECIFIERS) { ! pp_identifier (cxx_pp, "class"); if (DECL_NAME (p)) { ! pp_space (cxx_pp); ! pp_tree_identifier (cxx_pp, DECL_NAME (p)); } } else if (DECL_NAME (p)) ! pp_tree_identifier (cxx_pp, DECL_NAME (p)); else ! pp_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p)); } else dump_decl (p, flags | TFF_DECL_SPECIFIERS); if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE) { ! pp_string (cxx_pp, " = "); if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL) dump_type (a, flags & ~TFF_CHASE_TYPEDEF); else *************** dump_template_parameter (parm, flags) *** 274,281 **** TREE_VEC. */ static void ! dump_template_bindings (parms, args) ! tree parms, args; { int need_comma = 0; --- 247,253 ---- TREE_VEC. */ static void ! dump_template_bindings (tree parms, tree args) { int need_comma = 0; *************** dump_template_bindings (parms, args) *** 299,311 **** } if (need_comma) ! separate_with_comma (scratch_buffer); dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER); ! output_add_string (scratch_buffer, " = "); if (arg) dump_template_argument (arg, TFF_PLAIN_IDENTIFIER); else ! print_identifier (scratch_buffer, ""); ++arg_idx; need_comma = 1; --- 271,283 ---- } if (need_comma) ! pp_separate_with_comma (cxx_pp); dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER); ! pp_string (cxx_pp, " = "); if (arg) dump_template_argument (arg, TFF_PLAIN_IDENTIFIER); else ! pp_identifier (cxx_pp, ""); ++arg_idx; need_comma = 1; *************** dump_template_bindings (parms, args) *** 319,327 **** format. */ static void ! dump_type (t, flags) ! tree t; ! int flags; { if (t == NULL_TREE) return; --- 291,297 ---- format. */ static void ! dump_type (tree t, int flags) { if (t == NULL_TREE) return; *************** dump_type (t, flags) *** 332,338 **** switch (TREE_CODE (t)) { case UNKNOWN_TYPE: ! print_identifier (scratch_buffer, ""); break; case TREE_LIST: --- 302,308 ---- switch (TREE_CODE (t)) { case UNKNOWN_TYPE: ! pp_identifier (cxx_pp, ""); break; case TREE_LIST: *************** dump_type (t, flags) *** 341,347 **** break; case IDENTIFIER_NODE: ! print_tree_identifier (scratch_buffer, t); break; case TREE_VEC: --- 311,317 ---- break; case IDENTIFIER_NODE: ! pp_tree_identifier (cxx_pp, t); break; case TREE_VEC: *************** dump_type (t, flags) *** 361,440 **** ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags); break; } ! /* else fallthrough */ case TEMPLATE_DECL: case NAMESPACE_DECL: dump_decl (t, flags & ~TFF_DECL_SPECIFIERS); break; - case COMPLEX_TYPE: - output_add_string (scratch_buffer, "__complex__ "); - dump_type (TREE_TYPE (t), flags); - break; - - case VECTOR_TYPE: - output_add_string (scratch_buffer, "vector "); - { - /* The subtype of a VECTOR_TYPE is something like intQI_type_node, - which has no name and is not very useful for diagnostics. So - look up the equivalent C type and print its name. */ - tree elt = TREE_TYPE (t); - elt = c_common_type_for_mode (TYPE_MODE (elt), TREE_UNSIGNED (elt)); - dump_type (elt, flags); - } - break; - case INTEGER_TYPE: - if (!TREE_UNSIGNED (TYPE_MAIN_VARIANT (t)) && TREE_UNSIGNED (t)) - output_add_string (scratch_buffer, "unsigned "); - else if (TREE_UNSIGNED (TYPE_MAIN_VARIANT (t)) && !TREE_UNSIGNED (t)) - output_add_string (scratch_buffer, "signed "); - - /* fall through. */ case REAL_TYPE: case VOID_TYPE: case BOOLEAN_TYPE: ! { ! tree type; ! dump_qualifiers (t, after); ! type = flags & TFF_CHASE_TYPEDEF ? TYPE_MAIN_VARIANT (t) : t; ! if (TYPE_NAME (type) && TYPE_IDENTIFIER (type)) ! print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (type)); ! else ! /* Types like intQI_type_node and friends have no names. ! These don't come up in user error messages, but it's nice ! to be able to print them from the debugger. */ ! print_identifier (scratch_buffer, ""); ! } break; case TEMPLATE_TEMPLATE_PARM: /* For parameters inside template signature. */ if (TYPE_IDENTIFIER (t)) ! print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (t)); else ! print_identifier ! (scratch_buffer, ""); break; case BOUND_TEMPLATE_TEMPLATE_PARM: { tree args = TYPE_TI_ARGS (t); ! print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (t)); ! print_template_argument_list_start (scratch_buffer); dump_template_argument_list (args, flags); ! print_template_argument_list_end (scratch_buffer); } break; case TEMPLATE_TYPE_PARM: dump_qualifiers (t, after); if (TYPE_IDENTIFIER (t)) ! print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (t)); else ! print_identifier ! (scratch_buffer, ""); break; /* This is not always necessary for pointers and such, but doing this --- 331,378 ---- ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags); break; } ! /* Else fall through. */ case TEMPLATE_DECL: case NAMESPACE_DECL: dump_decl (t, flags & ~TFF_DECL_SPECIFIERS); break; case INTEGER_TYPE: case REAL_TYPE: case VOID_TYPE: case BOOLEAN_TYPE: ! case COMPLEX_TYPE: ! case VECTOR_TYPE: ! pp_base (cxx_pp)->padding = pp_none; ! pp_type_specifier_seq (cxx_pp, t); break; case TEMPLATE_TEMPLATE_PARM: /* For parameters inside template signature. */ if (TYPE_IDENTIFIER (t)) ! pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t)); else ! pp_cxx_canonical_template_parameter (cxx_pp, t); break; case BOUND_TEMPLATE_TEMPLATE_PARM: { tree args = TYPE_TI_ARGS (t); ! pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t)); ! pp_template_argument_list_start (cxx_pp); dump_template_argument_list (args, flags); ! pp_template_argument_list_end (cxx_pp); } break; case TEMPLATE_TYPE_PARM: dump_qualifiers (t, after); if (TYPE_IDENTIFIER (t)) ! pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t)); else ! pp_cxx_canonical_template_parameter ! (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t)); break; /* This is not always necessary for pointers and such, but doing this *************** dump_type (t, flags) *** 452,481 **** break; } case TYPENAME_TYPE: ! if (!IMPLICIT_TYPENAME_P (t)) ! output_add_string (scratch_buffer, "typename "); dump_typename (t, flags); break; case UNBOUND_CLASS_TEMPLATE: dump_type (TYPE_CONTEXT (t), flags); ! print_scope_operator (scratch_buffer); ! print_identifier (scratch_buffer, "template "); dump_type (DECL_NAME (TYPE_NAME (t)), flags); break; case TYPEOF_TYPE: ! output_add_string (scratch_buffer, "__typeof ("); dump_expr (TYPE_FIELDS (t), flags & ~TFF_EXPR_IN_PARENS); ! print_right_paren (scratch_buffer); break; default: ! sorry_for_unsupported_tree (t); /* Fall through to error. */ case ERROR_MARK: ! print_identifier (scratch_buffer, ""); break; } } --- 390,419 ---- break; } case TYPENAME_TYPE: ! dump_qualifiers (t, after); ! pp_string (cxx_pp, "typename "); dump_typename (t, flags); break; case UNBOUND_CLASS_TEMPLATE: dump_type (TYPE_CONTEXT (t), flags); ! pp_colon_colon (cxx_pp); ! pp_identifier (cxx_pp, "template "); dump_type (DECL_NAME (TYPE_NAME (t)), flags); break; case TYPEOF_TYPE: ! pp_string (cxx_pp, "__typeof ("); dump_expr (TYPE_FIELDS (t), flags & ~TFF_EXPR_IN_PARENS); ! pp_right_paren (cxx_pp); break; default: ! pp_unsupported_tree (cxx_pp, t); /* Fall through to error. */ case ERROR_MARK: ! pp_identifier (cxx_pp, ""); break; } } *************** dump_type (t, flags) *** 484,492 **** a TYPENAME_TYPE. */ static void ! dump_typename (t, flags) ! tree t; ! int flags; { tree ctx = TYPE_CONTEXT (t); --- 422,428 ---- a TYPENAME_TYPE. */ static void ! dump_typename (tree t, int flags) { tree ctx = TYPE_CONTEXT (t); *************** dump_typename (t, flags) *** 494,508 **** dump_typename (ctx, flags); else dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM); ! print_scope_operator (scratch_buffer); dump_decl (TYPENAME_TYPE_FULLNAME (t), flags); } /* Return the name of the supplied aggregate, or enumeral type. */ static const char * ! class_key_or_enum (t) ! tree t; { if (TREE_CODE (t) == ENUMERAL_TYPE) return "enum"; --- 430,443 ---- dump_typename (ctx, flags); else dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM); ! pp_colon_colon (cxx_pp); dump_decl (TYPENAME_TYPE_FULLNAME (t), flags); } /* Return the name of the supplied aggregate, or enumeral type. */ static const char * ! class_key_or_enum (tree t) { if (TREE_CODE (t) == ENUMERAL_TYPE) return "enum"; *************** class_key_or_enum (t) *** 518,526 **** in the form `class foo'. */ static void ! dump_aggr_type (t, flags) ! tree t; ! int flags; { tree name; const char *variety = class_key_or_enum (t); --- 453,459 ---- in the form `class foo'. */ static void ! dump_aggr_type (tree t, int flags) { tree name; const char *variety = class_key_or_enum (t); *************** dump_aggr_type (t, flags) *** 531,538 **** if (flags & TFF_CLASS_KEY_OR_ENUM) { ! print_identifier (scratch_buffer, variety); ! output_add_space (scratch_buffer); } if (flags & TFF_CHASE_TYPEDEF) --- 464,471 ---- if (flags & TFF_CLASS_KEY_OR_ENUM) { ! pp_identifier (cxx_pp, variety); ! pp_space (cxx_pp); } if (flags & TFF_CHASE_TYPEDEF) *************** dump_aggr_type (t, flags) *** 566,577 **** if (name == 0 || ANON_AGGRNAME_P (name)) { if (flags & TFF_CLASS_KEY_OR_ENUM) ! print_identifier (scratch_buffer, ""); else ! output_printf (scratch_buffer, "", variety); } else ! print_tree_identifier (scratch_buffer, name); if (tmplate) dump_template_parms (TYPE_TEMPLATE_INFO (t), !CLASSTYPE_USE_TEMPLATE (t), --- 499,510 ---- if (name == 0 || ANON_AGGRNAME_P (name)) { if (flags & TFF_CLASS_KEY_OR_ENUM) ! pp_identifier (cxx_pp, ""); else ! pp_printf (pp_base (cxx_pp), "", variety); } else ! pp_tree_identifier (cxx_pp, name); if (tmplate) dump_template_parms (TYPE_TEMPLATE_INFO (t), !CLASSTYPE_USE_TEMPLATE (t), *************** dump_aggr_type (t, flags) *** 593,601 **** want to pad non-*, non-& cores, but not pad * or & types. */ static enum pad ! dump_type_prefix (t, flags) ! tree t; ! int flags; { enum pad padding = before; --- 526,532 ---- want to pad non-*, non-& cores, but not pad * or & types. */ static enum pad ! dump_type_prefix (tree t, int flags) { enum pad padding = before; *************** dump_type_prefix (t, flags) *** 613,631 **** tree sub = TREE_TYPE (t); padding = dump_type_prefix (sub, flags); ! /* A tree for a member pointer looks like pointer to offset, ! so let the OFFSET_TYPE case handle it. */ ! if (!TYPE_PTRMEM_P (t)) { ! if (TREE_CODE (sub) == ARRAY_TYPE) ! { ! output_add_space (scratch_buffer); ! print_left_paren (scratch_buffer); ! } ! output_add_character ! (scratch_buffer, "&*"[TREE_CODE (t) == POINTER_TYPE]); ! padding = dump_qualifiers (t, before); } } break; --- 544,556 ---- tree sub = TREE_TYPE (t); padding = dump_type_prefix (sub, flags); ! if (TREE_CODE (sub) == ARRAY_TYPE) { ! pp_space (cxx_pp); ! pp_left_paren (cxx_pp); } + pp_character (cxx_pp, "&*"[TREE_CODE (t) == POINTER_TYPE]); + padding = dump_qualifiers (t, before); } break; *************** dump_type_prefix (t, flags) *** 635,645 **** if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */ { if (padding != none) ! output_add_space (scratch_buffer); dump_type (TYPE_OFFSET_BASETYPE (t), flags); ! print_scope_operator (scratch_buffer); } ! output_add_character (scratch_buffer, '*'); padding = dump_qualifiers (t, none); break; --- 560,570 ---- if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */ { if (padding != none) ! pp_space (cxx_pp); dump_type (TYPE_OFFSET_BASETYPE (t), flags); ! pp_colon_colon (cxx_pp); } ! pp_star (cxx_pp); padding = dump_qualifiers (t, none); break; *************** dump_type_prefix (t, flags) *** 648,666 **** case FUNCTION_TYPE: padding = dump_type_prefix (TREE_TYPE (t), flags); if (padding != none) ! output_add_space (scratch_buffer); ! print_left_paren (scratch_buffer); padding = none; break; case METHOD_TYPE: padding = dump_type_prefix (TREE_TYPE (t), flags); if (padding != none) ! output_add_space (scratch_buffer); ! print_left_paren (scratch_buffer); padding = none; dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags); ! print_scope_operator (scratch_buffer); break; case ARRAY_TYPE: --- 573,591 ---- case FUNCTION_TYPE: padding = dump_type_prefix (TREE_TYPE (t), flags); if (padding != none) ! pp_space (cxx_pp); ! pp_left_paren (cxx_pp); padding = none; break; case METHOD_TYPE: padding = dump_type_prefix (TREE_TYPE (t), flags); if (padding != none) ! pp_space (cxx_pp); ! pp_left_paren (cxx_pp); padding = none; dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags); ! pp_colon_colon (cxx_pp); break; case ARRAY_TYPE: *************** dump_type_prefix (t, flags) *** 691,700 **** break; default: ! sorry_for_unsupported_tree (t); /* fall through. */ case ERROR_MARK: ! print_identifier (scratch_buffer, ""); break; } return padding; --- 616,625 ---- break; default: ! pp_unsupported_tree (cxx_pp, t); /* fall through. */ case ERROR_MARK: ! pp_identifier (cxx_pp, ""); break; } return padding; *************** dump_type_prefix (t, flags) *** 704,712 **** which appears after the identifier (or function parms). */ static void ! dump_type_suffix (t, flags) ! tree t; ! int flags; { if (TYPE_PTRMEMFUNC_P (t)) t = TYPE_PTRMEMFUNC_FN_TYPE (t); --- 629,635 ---- which appears after the identifier (or function parms). */ static void ! dump_type_suffix (tree t, int flags) { if (TYPE_PTRMEMFUNC_P (t)) t = TYPE_PTRMEMFUNC_FN_TYPE (t); *************** dump_type_suffix (t, flags) *** 717,732 **** case REFERENCE_TYPE: case OFFSET_TYPE: if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE) ! print_right_paren (scratch_buffer); dump_type_suffix (TREE_TYPE (t), flags); break; ! /* Can only be reached through function pointer */ case FUNCTION_TYPE: case METHOD_TYPE: { tree arg; ! print_right_paren (scratch_buffer); arg = TYPE_ARG_TYPES (t); if (TREE_CODE (t) == METHOD_TYPE) arg = TREE_CHAIN (arg); --- 640,655 ---- case REFERENCE_TYPE: case OFFSET_TYPE: if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE) ! pp_right_paren (cxx_pp); dump_type_suffix (TREE_TYPE (t), flags); break; ! /* Can only be reached through function pointer. */ case FUNCTION_TYPE: case METHOD_TYPE: { tree arg; ! pp_right_paren (cxx_pp); arg = TYPE_ARG_TYPES (t); if (TREE_CODE (t) == METHOD_TYPE) arg = TREE_CHAIN (arg); *************** dump_type_suffix (t, flags) *** 744,756 **** } case ARRAY_TYPE: ! print_left_bracket (scratch_buffer); if (TYPE_DOMAIN (t)) { if (host_integerp (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0)) ! print_integer ! (scratch_buffer, ! tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0) + 1); else if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (t))) == MINUS_EXPR) dump_expr (TREE_OPERAND (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0), flags & ~TFF_EXPR_IN_PARENS); --- 667,678 ---- } case ARRAY_TYPE: ! pp_left_bracket (cxx_pp); if (TYPE_DOMAIN (t)) { if (host_integerp (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0)) ! pp_wide_integer ! (cxx_pp, tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0) + 1); else if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (t))) == MINUS_EXPR) dump_expr (TREE_OPERAND (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0), flags & ~TFF_EXPR_IN_PARENS); *************** dump_type_suffix (t, flags) *** 760,766 **** integer_one_node)), flags & ~TFF_EXPR_IN_PARENS); } ! print_right_bracket (scratch_buffer); dump_type_suffix (TREE_TYPE (t), flags); break; --- 682,688 ---- integer_one_node)), flags & ~TFF_EXPR_IN_PARENS); } ! pp_right_bracket (cxx_pp); dump_type_suffix (TREE_TYPE (t), flags); break; *************** dump_type_suffix (t, flags) *** 786,792 **** break; default: ! sorry_for_unsupported_tree (t); case ERROR_MARK: /* Don't mark it here, we should have already done in dump_type_prefix. */ --- 708,714 ---- break; default: ! pp_unsupported_tree (cxx_pp, t); case ERROR_MARK: /* Don't mark it here, we should have already done in dump_type_prefix. */ *************** dump_type_suffix (t, flags) *** 795,802 **** } static void ! dump_global_iord (t) ! tree t; { const char *p = NULL; --- 717,723 ---- } static void ! dump_global_iord (tree t) { const char *p = NULL; *************** dump_global_iord (t) *** 807,832 **** else abort (); ! output_printf (scratch_buffer, "(static %s for %s)", p, input_filename); } static void ! dump_simple_decl (t, type, flags) ! tree t; ! tree type; ! int flags; { if (flags & TFF_DECL_SPECIFIERS) { if (dump_type_prefix (type, flags) != none) ! output_add_space (scratch_buffer); } if (!DECL_INITIAL (t) || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX) dump_scope (CP_DECL_CONTEXT (t), flags); if (DECL_NAME (t)) dump_decl (DECL_NAME (t), flags); else ! print_identifier (scratch_buffer, ""); if (flags & TFF_DECL_SPECIFIERS) dump_type_suffix (type, flags); } --- 728,750 ---- else abort (); ! pp_printf (pp_base (cxx_pp), "(static %s for %s)", p, input_filename); } static void ! dump_simple_decl (tree t, tree type, int flags) { if (flags & TFF_DECL_SPECIFIERS) { if (dump_type_prefix (type, flags) != none) ! pp_space (cxx_pp); } if (!DECL_INITIAL (t) || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX) dump_scope (CP_DECL_CONTEXT (t), flags); if (DECL_NAME (t)) dump_decl (DECL_NAME (t), flags); else ! pp_identifier (cxx_pp, ""); if (flags & TFF_DECL_SPECIFIERS) dump_type_suffix (type, flags); } *************** dump_simple_decl (t, type, flags) *** 834,842 **** /* Dump a human readable string for the decl T under control of FLAGS. */ static void ! dump_decl (t, flags) ! tree t; ! int flags; { if (t == NULL_TREE) return; --- 752,758 ---- /* Dump a human readable string for the decl T under control of FLAGS. */ static void ! dump_decl (tree t, int flags) { if (t == NULL_TREE) return; *************** dump_decl (t, flags) *** 851,864 **** if ((flags & TFF_DECL_SPECIFIERS) && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM) /* Say `class T' not just `T'. */ ! output_add_string (scratch_buffer, "class "); dump_type (TREE_TYPE (t), flags); break; } } if (flags & TFF_DECL_SPECIFIERS) ! output_add_string (scratch_buffer, "typedef "); dump_simple_decl (t, DECL_ORIGINAL_TYPE (t) ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags); --- 767,780 ---- if ((flags & TFF_DECL_SPECIFIERS) && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM) /* Say `class T' not just `T'. */ ! pp_string (cxx_pp, "class "); dump_type (TREE_TYPE (t), flags); break; } } if (flags & TFF_DECL_SPECIFIERS) ! pp_string (cxx_pp, "typedef "); dump_simple_decl (t, DECL_ORIGINAL_TYPE (t) ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags); *************** dump_decl (t, flags) *** 867,907 **** case VAR_DECL: if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t))) { ! output_add_string (scratch_buffer, "vtable for "); my_friendly_assert (TYPE_P (DECL_CONTEXT (t)), 20010720); dump_type (DECL_CONTEXT (t), flags); break; } ! /* else fall through */ case FIELD_DECL: case PARM_DECL: dump_simple_decl (t, TREE_TYPE (t), flags); break; case RESULT_DECL: ! output_add_string (scratch_buffer, " "); dump_simple_decl (t, TREE_TYPE (t), flags); break; case NAMESPACE_DECL: ! dump_scope (CP_DECL_CONTEXT (t), flags); ! if (DECL_NAME (t) == anonymous_namespace_name) ! print_identifier (scratch_buffer, ""); else ! print_tree_identifier (scratch_buffer, DECL_NAME (t)); break; case SCOPE_REF: dump_decl (TREE_OPERAND (t, 0), flags & ~TFF_DECL_SPECIFIERS); ! print_scope_operator (scratch_buffer); dump_decl (TREE_OPERAND (t, 1), flags); break; case ARRAY_REF: dump_decl (TREE_OPERAND (t, 0), flags); ! print_left_bracket (scratch_buffer); dump_decl (TREE_OPERAND (t, 1), flags); ! print_right_bracket (scratch_buffer); break; /* So that we can do dump_decl on an aggr type. */ --- 783,829 ---- case VAR_DECL: if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t))) { ! pp_string (cxx_pp, "vtable for "); my_friendly_assert (TYPE_P (DECL_CONTEXT (t)), 20010720); dump_type (DECL_CONTEXT (t), flags); break; } ! /* Else fall through. */ case FIELD_DECL: case PARM_DECL: + case ALIAS_DECL: dump_simple_decl (t, TREE_TYPE (t), flags); break; case RESULT_DECL: ! pp_string (cxx_pp, " "); dump_simple_decl (t, TREE_TYPE (t), flags); break; case NAMESPACE_DECL: ! if (flags & TFF_DECL_SPECIFIERS) ! pp_cxx_declaration (cxx_pp, t); else ! { ! dump_scope (CP_DECL_CONTEXT (t), flags); ! if (DECL_NAME (t) == NULL_TREE) ! pp_identifier (cxx_pp, ""); ! else ! pp_tree_identifier (cxx_pp, DECL_NAME (t)); ! } break; case SCOPE_REF: dump_decl (TREE_OPERAND (t, 0), flags & ~TFF_DECL_SPECIFIERS); ! pp_colon_colon (cxx_pp); dump_decl (TREE_OPERAND (t, 1), flags); break; case ARRAY_REF: dump_decl (TREE_OPERAND (t, 0), flags); ! pp_left_bracket (cxx_pp); dump_decl (TREE_OPERAND (t, 1), flags); ! pp_right_bracket (cxx_pp); break; /* So that we can do dump_decl on an aggr type. */ *************** dump_decl (t, flags) *** 911,916 **** --- 833,845 ---- dump_type (t, flags); break; + case BIT_NOT_EXPR: + /* This is a pseudo destructor call which has not been folded into + a PSEUDO_DTOR_EXPR yet. */ + pp_complement (cxx_pp); + dump_type (TREE_OPERAND (t, 0), flags); + break; + case TYPE_EXPR: abort (); break; *************** dump_decl (t, flags) *** 920,932 **** case IDENTIFIER_NODE: if (IDENTIFIER_TYPENAME_P (t)) { ! output_add_string (scratch_buffer, "operator "); /* Not exactly IDENTIFIER_TYPE_VALUE. */ dump_type (TREE_TYPE (t), flags); break; } else ! print_tree_identifier (scratch_buffer, t); break; case OVERLOAD: --- 849,861 ---- case IDENTIFIER_NODE: if (IDENTIFIER_TYPENAME_P (t)) { ! pp_string (cxx_pp, "operator "); /* Not exactly IDENTIFIER_TYPE_VALUE. */ dump_type (TREE_TYPE (t), flags); break; } else ! pp_tree_identifier (cxx_pp, t); break; case OVERLOAD: *************** dump_decl (t, flags) *** 936,947 **** if (DECL_CLASS_SCOPE_P (t)) { dump_type (DECL_CONTEXT (t), flags); ! output_add_string (scratch_buffer, "::"); } else if (DECL_CONTEXT (t)) { dump_decl (DECL_CONTEXT (t), flags); ! output_add_string (scratch_buffer, "::"); } dump_decl (DECL_NAME (t), flags); break; --- 865,876 ---- if (DECL_CLASS_SCOPE_P (t)) { dump_type (DECL_CONTEXT (t), flags); ! pp_colon_colon (cxx_pp); } else if (DECL_CONTEXT (t)) { dump_decl (DECL_CONTEXT (t), flags); ! pp_colon_colon (cxx_pp); } dump_decl (DECL_NAME (t), flags); break; *************** dump_decl (t, flags) *** 956,962 **** if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t)) dump_global_iord (t); else if (! DECL_LANG_SPECIFIC (t)) ! print_identifier (scratch_buffer, ""); else dump_function_decl (t, flags); break; --- 885,891 ---- if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t)) dump_global_iord (t); else if (! DECL_LANG_SPECIFIC (t)) ! pp_identifier (cxx_pp, ""); else dump_function_decl (t, flags); break; *************** dump_decl (t, flags) *** 967,994 **** case TEMPLATE_ID_EXPR: { - tree args; tree name = TREE_OPERAND (t, 0); if (is_overloaded_fn (name)) name = DECL_NAME (get_first_fn (name)); dump_decl (name, flags); ! print_template_argument_list_start (scratch_buffer); ! for (args = TREE_OPERAND (t, 1); args; args = TREE_CHAIN (args)) ! { ! dump_template_argument (TREE_VALUE (args), flags); ! if (TREE_CHAIN (args)) ! separate_with_comma (scratch_buffer); ! } ! print_template_argument_list_end (scratch_buffer); } break; - case LOOKUP_EXPR: - dump_decl (TREE_OPERAND (t, 0), flags); - break; - case LABEL_DECL: ! print_tree_identifier (scratch_buffer, DECL_NAME (t)); break; case CONST_DECL: --- 896,915 ---- case TEMPLATE_ID_EXPR: { tree name = TREE_OPERAND (t, 0); + if (is_overloaded_fn (name)) name = DECL_NAME (get_first_fn (name)); dump_decl (name, flags); ! pp_template_argument_list_start (cxx_pp); ! if (TREE_OPERAND (t, 1)) ! dump_template_argument_list (TREE_OPERAND (t, 1), flags); ! pp_template_argument_list_end (cxx_pp); } break; case LABEL_DECL: ! pp_tree_identifier (cxx_pp, DECL_NAME (t)); break; case CONST_DECL: *************** dump_decl (t, flags) *** 1001,1013 **** else if (DECL_INITIAL (t)) dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS); else ! print_identifier (scratch_buffer, "enumerator"); break; case USING_DECL: ! output_add_string (scratch_buffer, "using "); dump_type (DECL_INITIAL (t), flags); ! print_scope_operator (scratch_buffer); dump_decl (DECL_NAME (t), flags); break; --- 922,934 ---- else if (DECL_INITIAL (t)) dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS); else ! pp_identifier (cxx_pp, ""); break; case USING_DECL: ! pp_string (cxx_pp, "using "); dump_type (DECL_INITIAL (t), flags); ! pp_colon_colon (cxx_pp); dump_decl (DECL_NAME (t), flags); break; *************** dump_decl (t, flags) *** 1015,1026 **** dump_decl (BASELINK_FUNCTIONS (t), flags); break; default: ! sorry_for_unsupported_tree (t); /* Fallthrough to error. */ case ERROR_MARK: ! print_identifier (scratch_buffer, ""); break; } } --- 936,958 ---- dump_decl (BASELINK_FUNCTIONS (t), flags); break; + case NON_DEPENDENT_EXPR: + dump_expr (t, flags); + break; + + case TEMPLATE_TYPE_PARM: + if (flags & TFF_DECL_SPECIFIERS) + pp_cxx_declaration (cxx_pp, t); + else + pp_type_id (cxx_pp, t); + break; + default: ! pp_unsupported_tree (cxx_pp, t); /* Fallthrough to error. */ case ERROR_MARK: ! pp_identifier (cxx_pp, ""); break; } } *************** dump_decl (t, flags) *** 1029,1037 **** 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */ static void ! dump_template_decl (t, flags) ! tree t; ! int flags; { tree orig_parms = DECL_TEMPLATE_PARMS (t); tree parms; --- 961,967 ---- 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */ static void ! dump_template_decl (tree t, int flags) { tree orig_parms = DECL_TEMPLATE_PARMS (t); tree parms; *************** dump_template_decl (t, flags) *** 1046,1052 **** tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms); int len = TREE_VEC_LENGTH (inner_parms); ! output_add_string (scratch_buffer, "template<"); /* If we've shown the template prefix, we'd better show the parameters' and decl's type too. */ --- 976,982 ---- tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms); int len = TREE_VEC_LENGTH (inner_parms); ! pp_string (cxx_pp, "template<"); /* If we've shown the template prefix, we'd better show the parameters' and decl's type too. */ *************** dump_template_decl (t, flags) *** 1055,1071 **** for (i = 0; i < len; i++) { if (i) ! separate_with_comma (scratch_buffer); dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags); } ! print_template_argument_list_end (scratch_buffer); ! output_add_space (scratch_buffer); } nreverse(orig_parms); if (DECL_TEMPLATE_TEMPLATE_PARM_P (t)) /* Say `template class TT' not just `template TT'. */ ! output_add_string (scratch_buffer, "class "); } if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL) --- 985,1001 ---- for (i = 0; i < len; i++) { if (i) ! pp_separate_with_comma (cxx_pp); dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags); } ! pp_template_argument_list_end (cxx_pp); ! pp_space (cxx_pp); } nreverse(orig_parms); if (DECL_TEMPLATE_TEMPLATE_PARM_P (t)) /* Say `template class TT' not just `template TT'. */ ! pp_string (cxx_pp, "class "); } if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL) *************** dump_template_decl (t, flags) *** 1097,1105 **** is %D which doesn't print the throw specs, and %F which does. */ static void ! dump_function_decl (t, flags) ! tree t; ! int flags; { tree fntype; tree parmtypes; --- 1027,1033 ---- is %D which doesn't print the throw specs, and %F which does. */ static void ! dump_function_decl (tree t, int flags) { tree fntype; tree parmtypes; *************** dump_function_decl (t, flags) *** 1130,1145 **** if (DECL_CLASS_SCOPE_P (t)) cname = DECL_CONTEXT (t); ! /* this is for partially instantiated template methods */ else if (TREE_CODE (fntype) == METHOD_TYPE) cname = TREE_TYPE (TREE_VALUE (parmtypes)); if (!(flags & TFF_DECL_SPECIFIERS)) /* OK */; else if (DECL_STATIC_FUNCTION_P (t)) ! print_identifier (scratch_buffer, "static "); else if (DECL_VIRTUAL_P (t)) ! print_identifier (scratch_buffer, "virtual "); /* Print the return type? */ if (show_return) --- 1058,1073 ---- if (DECL_CLASS_SCOPE_P (t)) cname = DECL_CONTEXT (t); ! /* This is for partially instantiated template methods. */ else if (TREE_CODE (fntype) == METHOD_TYPE) cname = TREE_TYPE (TREE_VALUE (parmtypes)); if (!(flags & TFF_DECL_SPECIFIERS)) /* OK */; else if (DECL_STATIC_FUNCTION_P (t)) ! pp_identifier (cxx_pp, "static "); else if (DECL_VIRTUAL_P (t)) ! pp_identifier (cxx_pp, "virtual "); /* Print the return type? */ if (show_return) *************** dump_function_decl (t, flags) *** 1148,1161 **** if (show_return) { dump_type_prefix (TREE_TYPE (fntype), flags); ! output_add_space (scratch_buffer); } /* Print the function name. */ if (cname) { dump_type (cname, flags); ! print_scope_operator (scratch_buffer); } else dump_scope (CP_DECL_CONTEXT (t), flags); --- 1076,1089 ---- if (show_return) { dump_type_prefix (TREE_TYPE (fntype), flags); ! pp_space (cxx_pp); } /* Print the function name. */ if (cname) { dump_type (cname, flags); ! pp_colon_colon (cxx_pp); } else dump_scope (CP_DECL_CONTEXT (t), flags); *************** dump_function_decl (t, flags) *** 1180,1188 **** /* If T is a template instantiation, dump the parameter binding. */ if (template_parms != NULL_TREE && template_args != NULL_TREE) { ! output_add_string (scratch_buffer, " [with "); dump_template_bindings (template_parms, template_args); ! print_right_bracket (scratch_buffer); } } --- 1108,1116 ---- /* If T is a template instantiation, dump the parameter binding. */ if (template_parms != NULL_TREE && template_args != NULL_TREE) { ! pp_string (cxx_pp, " [with "); dump_template_bindings (template_parms, template_args); ! pp_right_bracket (cxx_pp); } } *************** dump_function_decl (t, flags) *** 1191,1237 **** already been removed. */ static void ! dump_parameters (parmtypes, flags) ! tree parmtypes; ! int flags; { int first; ! print_left_paren (scratch_buffer); for (first = 1; parmtypes != void_list_node; parmtypes = TREE_CHAIN (parmtypes)) { if (!first) ! separate_with_comma (scratch_buffer); first = 0; if (!parmtypes) { ! print_identifier (scratch_buffer, "..."); break; } dump_type (TREE_VALUE (parmtypes), flags); if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes)) { ! output_add_string (scratch_buffer, " = "); dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS); } } ! print_right_paren (scratch_buffer); } /* Print an exception specification. T is the exception specification. */ static void ! dump_exception_spec (t, flags) ! tree t; ! int flags; { if (t) { ! output_add_string (scratch_buffer, " throw ("); if (TREE_VALUE (t) != NULL_TREE) while (1) { --- 1119,1161 ---- already been removed. */ static void ! dump_parameters (tree parmtypes, int flags) { int first; ! pp_left_paren (cxx_pp); for (first = 1; parmtypes != void_list_node; parmtypes = TREE_CHAIN (parmtypes)) { if (!first) ! pp_separate_with_comma (cxx_pp); first = 0; if (!parmtypes) { ! pp_identifier (cxx_pp, "..."); break; } dump_type (TREE_VALUE (parmtypes), flags); if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes)) { ! pp_string (cxx_pp, " = "); dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS); } } ! pp_right_paren (cxx_pp); } /* Print an exception specification. T is the exception specification. */ static void ! dump_exception_spec (tree t, int flags) { if (t) { ! pp_string (cxx_pp, " throw ("); if (TREE_VALUE (t) != NULL_TREE) while (1) { *************** dump_exception_spec (t, flags) *** 1239,1247 **** t = TREE_CHAIN (t); if (!t) break; ! separate_with_comma (scratch_buffer); } ! print_right_paren (scratch_buffer); } } --- 1163,1171 ---- t = TREE_CHAIN (t); if (!t) break; ! pp_separate_with_comma (cxx_pp); } ! pp_right_paren (cxx_pp); } } *************** dump_exception_spec (t, flags) *** 1249,1257 **** and destructors properly. */ static void ! dump_function_name (t, flags) ! tree t; ! int flags; { tree name = DECL_NAME (t); --- 1173,1179 ---- and destructors properly. */ static void ! dump_function_name (tree t, int flags) { tree name = DECL_NAME (t); *************** dump_function_name (t, flags) *** 1265,1271 **** if (DECL_DESTRUCTOR_P (t)) { ! output_add_character (scratch_buffer, '~'); dump_decl (name, TFF_PLAIN_IDENTIFIER); } else if (DECL_CONV_FN_P (t)) --- 1187,1193 ---- if (DECL_DESTRUCTOR_P (t)) { ! pp_complement (cxx_pp); dump_decl (name, TFF_PLAIN_IDENTIFIER); } else if (DECL_CONV_FN_P (t)) *************** dump_function_name (t, flags) *** 1276,1286 **** declarations, both will have the same name, yet the types will be different, hence the TREE_TYPE field of the first name will be clobbered by the second. */ ! output_add_string (scratch_buffer, "operator "); dump_type (TREE_TYPE (TREE_TYPE (t)), flags); } else if (IDENTIFIER_OPNAME_P (name)) ! print_tree_identifier (scratch_buffer, name); else dump_decl (name, flags); --- 1198,1208 ---- declarations, both will have the same name, yet the types will be different, hence the TREE_TYPE field of the first name will be clobbered by the second. */ ! pp_string (cxx_pp, "operator "); dump_type (TREE_TYPE (TREE_TYPE (t)), flags); } else if (IDENTIFIER_OPNAME_P (name)) ! pp_tree_identifier (cxx_pp, name); else dump_decl (name, flags); *************** dump_function_name (t, flags) *** 1300,1356 **** decoration. */ static void ! dump_template_parms (info, primary, flags) ! tree info; ! int primary; ! int flags; { tree args = info ? TI_ARGS (info) : NULL_TREE; if (primary && flags & TFF_TEMPLATE_NAME) return; flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME); ! print_template_argument_list_start (scratch_buffer); /* Be careful only to print things when we have them, so as not to crash producing error messages. */ if (args && !primary) { ! int len = 0; ! int ix = 0; ! int need_comma = 0; ! if (TREE_CODE (args) == TREE_VEC) ! { ! if (TREE_VEC_LENGTH (args) > 0 ! && TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC) ! args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1); ! len = TREE_VEC_LENGTH (args); ! } ! else if (TREE_CODE (args) == TREE_LIST) ! len = -1; ! while (ix != len && args) { ! tree arg; ! if (len >= 0) ! { ! arg = TREE_VEC_ELT (args, ix); ! ix++; ! } ! else ! { ! arg = TREE_VALUE (args); ! args = TREE_CHAIN (args); ! } ! if (need_comma) ! separate_with_comma (scratch_buffer); if (!arg) ! print_identifier (scratch_buffer, "